diff -Nrcpad gcc-16-20260111/ChangeLog gcc-16-20260118/ChangeLog
*** gcc-16-20260111/ChangeLog	Sun Jan 11 22:32:05 2026
--- gcc-16-20260118/ChangeLog	Sun Jan 18 22:32:05 2026
***************
*** 1,3 ****
--- 1,15 ----
+ 2026-01-14  Vineet Gupta  <vineet.gupta@linux.dev>
+ 
+ 	* MAINTAINERS: Update to my linux.dev email.
+ 
+ 2026-01-14  Jason Merrill  <jason@redhat.com>
+ 
+ 	* MAINTAINERS: Update Paolo Carlini email address.
+ 
+ 2026-01-14  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* MAINTAINERS: Add myself to write after approval.
+ 
  2026-01-10  Jakub Jelinek  <jakub@redhat.com>
  
  	PR ada/123490
diff -Nrcpad gcc-16-20260111/LAST_UPDATED gcc-16-20260118/LAST_UPDATED
*** gcc-16-20260111/LAST_UPDATED	Sun Jan 11 22:32:21 2026
--- gcc-16-20260118/LAST_UPDATED	Sun Jan 18 22:32:21 2026
***************
*** 1 ****
! Obtained from git: master revision 8e4107a1b3d430f5d3938c8068c6cd512f661e95
--- 1 ----
! Obtained from git: master revision db873dbcafd37a9a58cc7b26892d16336e6d0c56
diff -Nrcpad gcc-16-20260111/MAINTAINERS gcc-16-20260118/MAINTAINERS
*** gcc-16-20260111/MAINTAINERS	Sun Jan 11 22:32:05 2026
--- gcc-16-20260118/MAINTAINERS	Sun Jan 18 22:32:05 2026
*************** callgraph               Jan Hubicka
*** 211,217 ****
  debugging code          Jim Wilson              <wilson@tuliptree.org>
  dwarf debugging code    Jason Merrill           <jason@redhat.com>
  dwarf debugging code    Cary Coutant            <ccoutant@gmail.com>
! c++ runtime libs        Paolo Carlini           <paolo.carlini@oracle.com>
  c++ runtime libs        Ulrich Drepper          <drepper@gmail.com>
  c++ runtime libs        Benjamin De Kosnik      <bkoz@gnu.org>
  c++ runtime libs        Jonathan Wakely         <jwakely@redhat.com>
--- 211,217 ----
  debugging code          Jim Wilson              <wilson@tuliptree.org>
  dwarf debugging code    Jason Merrill           <jason@redhat.com>
  dwarf debugging code    Cary Coutant            <ccoutant@gmail.com>
! c++ runtime libs        Paolo Carlini           <pcarlini@gmail.com>
  c++ runtime libs        Ulrich Drepper          <drepper@gmail.com>
  c++ runtime libs        Benjamin De Kosnik      <bkoz@gnu.org>
  c++ runtime libs        Jonathan Wakely         <jwakely@redhat.com>
*************** Scott Bambrough                 -
*** 360,365 ****
--- 360,366 ----
  Wolfgang Bangerth               -               <bangerth@dealii.org>
  Claudio Bantaloukas             rdfm            <claudio.bantaloukas@arm.com>
  Gergö Barany                    -               <gergo@codesourcery.com>
+ Daniel Barboza                  dbarboza        <daniel.barboza@oss.qualcomm.com>
  Thiago Jung Bauermann           -               <thiago.bauermann@linaro.org>
  Charles Baylis                  cbaylis         <charles.baylis@linaro.org>
  Tejas Belagod                   belagod         <tejas.belagod@arm.com>
*************** Andrew Burgess                  aburgess
*** 406,412 ****
  Tobias Burnus                   burnus          <tburnus@baylibre.com>
  Adam Butcher                    abutcher        <adam@jessamine.co.uk>
  Andrew Cagney                   cagney          <cagney@gnu.org>
! Paolo Carlini                   paolo           <paolo.carlini@oracle.com>
  Alice Carlotti                  acarlotti       <alice.carlotti@arm.com>
  Daniel Carrera                  dcarrera        <dcarrera@gmail.com>
  Stephane Carrez                 ciceron         <stcarrez@nerim.fr>
--- 407,413 ----
  Tobias Burnus                   burnus          <tburnus@baylibre.com>
  Adam Butcher                    abutcher        <adam@jessamine.co.uk>
  Andrew Cagney                   cagney          <cagney@gnu.org>
! Paolo Carlini                   paolo           <pcarlini@gmail.com>
  Alice Carlotti                  acarlotti       <alice.carlotti@arm.com>
  Daniel Carrera                  dcarrera        <dcarrera@gmail.com>
  Stephane Carrez                 ciceron         <stcarrez@nerim.fr>
*************** Haochen Gui                     guihaoc
*** 518,524 ****
  Jiufu Guo                       guojiufu        <guojiufu@linux.ibm.com>
  Xuepeng Guo                     xguo            <terry.xpguo@gmail.com>
  Wei Guozhi                      carrot          <carrot@google.com>
! Vineet Gupta                    vineetg         <vineetg@rivosinc.com>
  Naveen H.S                      naveenh         <naveenh@marvell.com>
  Mostafa Hagog                   hagog           <hagog@gcc.gnu.org>
  Olivier Hainque                 hainque         <hainque@adacore.com>
--- 519,525 ----
  Jiufu Guo                       guojiufu        <guojiufu@linux.ibm.com>
  Xuepeng Guo                     xguo            <terry.xpguo@gmail.com>
  Wei Guozhi                      carrot          <carrot@google.com>
! Vineet Gupta                    vineetg         <vineet.gupta@linux.dev>
  Naveen H.S                      naveenh         <naveenh@marvell.com>
  Mostafa Hagog                   hagog           <hagog@gcc.gnu.org>
  Olivier Hainque                 hainque         <hainque@adacore.com>
diff -Nrcpad gcc-16-20260111/MD5SUMS gcc-16-20260118/MD5SUMS
*** gcc-16-20260111/MD5SUMS	Sun Jan 11 22:32:26 2026
--- gcc-16-20260118/MD5SUMS	Sun Jan 18 22:32:26 2026
***************
*** 1,5 ****
  # This file contains the MD5 checksums of the files in the
! # gcc-16-20260111.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-20260118.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
*************** ac5a8807f431d3dab46a7425b96379e4  .gitig
*** 24,35 ****
  fe60d87048567d4fe8c8a0ed2448bcc8  COPYING.RUNTIME
  d32239bcb673463ab874e80d47fae504  COPYING3
  6a6a8e020838b23406c81b19c1d46df6  COPYING3.LIB
! 49229febc3231b9084ae3a2ffb1e2512  ChangeLog
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 6ec6d7cefdb5c1857b877a0bdb5203ef  LAST_UPDATED
! 08fb2f3486704b0914fae8f2213c686d  MAINTAINERS
  af43617880b3cd9c10627c97e639d29e  Makefile.def
  1ce83cd940f8facbf202979ac1b7b2c4  Makefile.in
  98d7e10ec29466105ecf01effa809a77  Makefile.tpl
--- 24,35 ----
  fe60d87048567d4fe8c8a0ed2448bcc8  COPYING.RUNTIME
  d32239bcb673463ab874e80d47fae504  COPYING3
  6a6a8e020838b23406c81b19c1d46df6  COPYING3.LIB
! 243dd1bdcd5e3905dd1b373d187f42f4  ChangeLog
  fd4ecdf5d672efe2b0e409aca9cf9446  ChangeLog.jit
  09538b708302f1735f6fa05b622ecf5e  ChangeLog.tree-ssa
  24ab760126489e69436a43185dc3d202  INSTALL/README
! 8f7af9543352e508e17f70676ff23560  LAST_UPDATED
! ece8de36482829e6305842f511825712  MAINTAINERS
  af43617880b3cd9c10627c97e639d29e  Makefile.def
  1ce83cd940f8facbf202979ac1b7b2c4  Makefile.in
  98d7e10ec29466105ecf01effa809a77  Makefile.tpl
*************** a22e70b3f29292d0e628450f4bb11e62  fixinc
*** 514,525 ****
  8baab8698bb83c6b90ef4091c00ddc1e  fixincludes/tests/base/unistd.h
  75d75572793b62bdd8ff4d1504e0cb4c  fixincludes/tests/base/yvals.h
  f15bc3c5de22eac0bdd4f611502139a0  gcc/ABOUT-GCC-NLS
! 53616a121511fe4a40151eda04e30c2c  gcc/BASE-VER
  59530bdf33659b29e73d4adb9f9f6552  gcc/COPYING
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 98b221b7971cd62195b2215e8718ce63  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
--- 514,525 ----
  8baab8698bb83c6b90ef4091c00ddc1e  fixincludes/tests/base/unistd.h
  75d75572793b62bdd8ff4d1504e0cb4c  fixincludes/tests/base/yvals.h
  f15bc3c5de22eac0bdd4f611502139a0  gcc/ABOUT-GCC-NLS
! 6704751b7d65aa3e9c886d485219a2ec  gcc/BASE-VER
  59530bdf33659b29e73d4adb9f9f6552  gcc/COPYING
  a916467b91076e631dd8edb7424769c7  gcc/COPYING.LIB
  d32239bcb673463ab874e80d47fae504  gcc/COPYING3
  6a6a8e020838b23406c81b19c1d46df6  gcc/COPYING3.LIB
! 13f803b4cb81351cfb47f98e77c83c86  gcc/ChangeLog
  51281e73aa07fb62394bd72f3c9299ba  gcc/ChangeLog-1997
  f77af8c9ac412064886b00c5506123b5  gcc/ChangeLog-1998
  00a2e4ead1b289bf69bca0196fed6f9f  gcc/ChangeLog-1999
*************** fb3fadb88e1d2b3b640cfaaa5ff11780  gcc/Ch
*** 557,575 ****
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! fe42a73648af032e85ee3fbcbeac70c2  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  a817c5577f2b35f8d2481c787e3ff7e2  gcc/LANGUAGES
! db853c821f5edd5c6cdef6432b7df927  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  c8c9dd1eaee4ffd4d5d9f3ab70fddd4b  gcc/README.Portability
  ad60bbbc1a86c00cde3257eac7028538  gcc/acinclude.m4
  e74733ebf762151e601c9e0aa1461a20  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! eb6d89e82a3c4590e0467e716fdb14a9  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
--- 557,575 ----
  3eb07e0b2e542409bf73d359f7f65609  gcc/ChangeLog.ptr
  e13638e26743ba41e6011b76cc00d9a9  gcc/ChangeLog.tree-ssa
  739ab47f6425bcea1d05e4fc0542de54  gcc/ChangeLog.tuples
! 5e8586b72b2fd5ad862cf6780abbf2c6  gcc/DATESTAMP
  deb513e591f23901188e22323bd3b1d4  gcc/DEV-PHASE
  eb92e1ff5e982ca07e173e0eb286d243  gcc/FSFChangeLog
  30e1e33411566388b3164558482dc5e6  gcc/FSFChangeLog.10
  36698274bb69e2ada20f5cc434f3caa5  gcc/FSFChangeLog.11
  a817c5577f2b35f8d2481c787e3ff7e2  gcc/LANGUAGES
! 2ee667f2715e04f707186820f083d854  gcc/Makefile.in
  ec6799501b2eb2923d5de6a66169dbd2  gcc/ONEWS
  c8c9dd1eaee4ffd4d5d9f3ab70fddd4b  gcc/README.Portability
  ad60bbbc1a86c00cde3257eac7028538  gcc/acinclude.m4
  e74733ebf762151e601c9e0aa1461a20  gcc/aclocal.m4
  16a499934b71eb6cf7c0d6899cd6006a  gcc/ada/.gitignore
! 95e0bbdbdd5010f59e985710d27b2170  gcc/ada/ChangeLog
  c2094c0d3135f9ac89917f162046ee04  gcc/ada/ChangeLog-2001
  fa410b57f5d814d5d3ac3b45f486cdcf  gcc/ada/ChangeLog-2002
  2dbefa7bdc8dc28ec746002028861278  gcc/ada/ChangeLog-2003
*************** a84d191dad3158db125ec48c285b9667  gcc/ad
*** 767,773 ****
  371cc0c543b5d2502352758eb7b73e8f  gcc/ada/exp_ch13.ads
  ace7dfdd53834601d964efef9557e0f4  gcc/ada/exp_ch2.adb
  aec86f795b370fca1379a25f37651fdf  gcc/ada/exp_ch2.ads
! feb310c3fee6ab9ba273ecc0d2a426b6  gcc/ada/exp_ch3.adb
  52ca7939bd6b0e1da9e20d902813d109  gcc/ada/exp_ch3.ads
  629380143b0e6151369479581deb68ab  gcc/ada/exp_ch4.adb
  2d9cf8b148fdc7a07edde2cf9fbb59f8  gcc/ada/exp_ch4.ads
--- 767,773 ----
  371cc0c543b5d2502352758eb7b73e8f  gcc/ada/exp_ch13.ads
  ace7dfdd53834601d964efef9557e0f4  gcc/ada/exp_ch2.adb
  aec86f795b370fca1379a25f37651fdf  gcc/ada/exp_ch2.ads
! bfede432412bc3d7ee70e14cbda137e3  gcc/ada/exp_ch3.adb
  52ca7939bd6b0e1da9e20d902813d109  gcc/ada/exp_ch3.ads
  629380143b0e6151369479581deb68ab  gcc/ada/exp_ch4.adb
  2d9cf8b148fdc7a07edde2cf9fbb59f8  gcc/ada/exp_ch4.ads
*************** d22c314f3748309f812d78f5217dda61  gcc/ad
*** 3060,3072 ****
  06b46bffb1b84e16a6f48b29177f42c4  gcc/ada/xutil.ads
  faeebcb240c1559aceb7d9c18c8e6b89  gcc/addresses.h
  ebe64421041bf4ef9153e26a6dc60532  gcc/adjust-alignment.cc
! 8cd9d196d061d32dcff1ed199842c4e6  gcc/algol68/ChangeLog
! 72e24e697017a755b01872ad9e6389e9  gcc/algol68/Make-lang.in
  7479907efeefafc7c6d3bc2aaa5c6a83  gcc/algol68/README
  fb43be530798e23528ffc144413b80a9  gcc/algol68/a68-diagnostics.cc
  5a0aa2bd361bf3a8eef0d814a0d93611  gcc/algol68/a68-exports.cc
  237db35c9725eb65027ad7adf2f0527e  gcc/algol68/a68-imports.cc
! 2921b54f3347652a098efd4c0cfe9810  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
--- 3060,3072 ----
  06b46bffb1b84e16a6f48b29177f42c4  gcc/ada/xutil.ads
  faeebcb240c1559aceb7d9c18c8e6b89  gcc/addresses.h
  ebe64421041bf4ef9153e26a6dc60532  gcc/adjust-alignment.cc
! d3456bf6ebdc8ab28cfccdf4263475c4  gcc/algol68/ChangeLog
! f60acb6e085140c1368b22851361db0e  gcc/algol68/Make-lang.in
  7479907efeefafc7c6d3bc2aaa5c6a83  gcc/algol68/README
  fb43be530798e23528ffc144413b80a9  gcc/algol68/a68-diagnostics.cc
  5a0aa2bd361bf3a8eef0d814a0d93611  gcc/algol68/a68-exports.cc
  237db35c9725eb65027ad7adf2f0527e  gcc/algol68/a68-imports.cc
! 2b877e415f61b5e4d7c165c68ed6d1d8  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
*************** c3c90ed30df176e0dc435306dae0d9c4  gcc/al
*** 3105,3113 ****
  6baa8156d0ef99a4587af1b6793d2303  gcc/algol68/a68-parser-modes.cc
  451910827918a165063a77e10deebc2a  gcc/algol68/a68-parser-moids-check.cc
  eb200628692c30c1ade0eaeabcddf008  gcc/algol68/a68-parser-moids-coerce.cc
! 21df1102d7944e20f83a720318e21de8  gcc/algol68/a68-parser-moids-equivalence.cc
  6f1acfebba6072c81c25a2597686d0e4  gcc/algol68/a68-parser-pragmat.cc
! 18997e4290bcc70872233ad1749e5505  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
--- 3105,3113 ----
  6baa8156d0ef99a4587af1b6793d2303  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
! ed6e5b2ef21d30868bed30fc4c3286df  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
*************** bb6a9492686645cd8ede63a3aa41bb2e  gcc/al
*** 3122,3130 ****
  2aa6a9aa482a9480003b283ca10c1e55  gcc/algol68/a68.h
  cbc2ddca0589edc81c7df109b1a1927b  gcc/algol68/a68spec.cc
  ca4abac71b91773df74abdea22798551  gcc/algol68/config-lang.in
  3944dc558e8139d69cdc73ffdbe90cc7  gcc/algol68/ga68-exports.pk
  f150e2c760036b980e94ec7bb14e1172  gcc/algol68/ga68-internals.texi
! 77a20cd81f7a359e74259fa6fca89f6b  gcc/algol68/ga68.texi
  4810fa1d976ad329fa7a115292ce8fe8  gcc/algol68/ga68.vw
  0a91d85c360d5ee3eb6258aecdab4636  gcc/algol68/lang-specs.h
  23116c655524d162c1277db4c2d6e91f  gcc/algol68/lang.opt
--- 3122,3131 ----
  2aa6a9aa482a9480003b283ca10c1e55  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
! 134461dbe268cea8ffb628b21566d048  gcc/algol68/ga68.texi
  4810fa1d976ad329fa7a115292ce8fe8  gcc/algol68/ga68.vw
  0a91d85c360d5ee3eb6258aecdab4636  gcc/algol68/lang-specs.h
  23116c655524d162c1277db4c2d6e91f  gcc/algol68/lang.opt
*************** b7dd8bd2dd68f81643704bf0b73553a1  gcc/al
*** 3134,3140 ****
  71901705cb0e11732bae53ff9de25faf  gcc/align.h
  f2345b2fdc9d2d5a75fe90d30444a114  gcc/alloc-pool.cc
  7657598f465321837951c858ab918f57  gcc/alloc-pool.h
! 64d5af545cf0da8750a12f6af7815fbe  gcc/analyzer/ChangeLog
  a53ebffbaabe6bc3664d659c554fedb3  gcc/analyzer/access-diagram.cc
  c41fa6be7ca91f40a15a7b8f03732d25  gcc/analyzer/access-diagram.h
  d97e417faf9694fdbd68f91aee129bd2  gcc/analyzer/ana-state-to-diagnostic-state.cc
--- 3135,3141 ----
  71901705cb0e11732bae53ff9de25faf  gcc/align.h
  f2345b2fdc9d2d5a75fe90d30444a114  gcc/alloc-pool.cc
  7657598f465321837951c858ab918f57  gcc/alloc-pool.h
! 2412f2c9f6f450dd1e55d9d269912ea9  gcc/analyzer/ChangeLog
  a53ebffbaabe6bc3664d659c554fedb3  gcc/analyzer/access-diagram.cc
  c41fa6be7ca91f40a15a7b8f03732d25  gcc/analyzer/access-diagram.h
  d97e417faf9694fdbd68f91aee129bd2  gcc/analyzer/ana-state-to-diagnostic-state.cc
*************** f2a1d7a4677cd4523c0638208513d259  gcc/an
*** 3173,3179 ****
  7d0cf2441abcd960f97e29dd071829e5  gcc/analyzer/constraint-manager.h
  3c8e0418577bb1e5cf6542a8bcbeba45  gcc/analyzer/diagnostic-manager.cc
  ca695b2d13762f05a1ab6018eba991c7  gcc/analyzer/diagnostic-manager.h
! 7a72ded62b58bce70e3b8223e727fdb8  gcc/analyzer/engine.cc
  42e3e00aa33d20f2e141615939577290  gcc/analyzer/engine.h
  f35c6c791ba815800582950c54998869  gcc/analyzer/event-loc-info.h
  dac4d88af8620f1805a41dfb31dd5c1b  gcc/analyzer/exploded-graph.h
--- 3174,3180 ----
  7d0cf2441abcd960f97e29dd071829e5  gcc/analyzer/constraint-manager.h
  3c8e0418577bb1e5cf6542a8bcbeba45  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
*************** d5dc5c09dcee6d8ab4accc7a925cf7bc  gcc/an
*** 3190,3197 ****
  a1b024e224c36f32b98b3265e76e36fd  gcc/analyzer/kf.cc
  0652b497ab69835a3ec50cb920b8a973  gcc/analyzer/known-function-manager.cc
  d065f64c3be7da8efff67c73024dd990  gcc/analyzer/known-function-manager.h
! 31a1a293bc454402f44d17c73f904eab  gcc/analyzer/ops.cc
! bb6b2611498a44d4df3fb212f59eb216  gcc/analyzer/ops.h
  54c7e7321ac6942f1c7f2be80207e644  gcc/analyzer/pending-diagnostic.cc
  83f167b1c386352684ebdd1ca0e408c2  gcc/analyzer/pending-diagnostic.h
  77b023b2349d390847d2dd7baa9d75db  gcc/analyzer/program-point.cc
--- 3191,3198 ----
  a1b024e224c36f32b98b3265e76e36fd  gcc/analyzer/kf.cc
  0652b497ab69835a3ec50cb920b8a973  gcc/analyzer/known-function-manager.cc
  d065f64c3be7da8efff67c73024dd990  gcc/analyzer/known-function-manager.h
! cac91a789fdfacaa1976b3d8668cc2d3  gcc/analyzer/ops.cc
! 96054b25dd18f7e6b3d43ca7c65a9367  gcc/analyzer/ops.h
  54c7e7321ac6942f1c7f2be80207e644  gcc/analyzer/pending-diagnostic.cc
  83f167b1c386352684ebdd1ca0e408c2  gcc/analyzer/pending-diagnostic.h
  77b023b2349d390847d2dd7baa9d75db  gcc/analyzer/program-point.cc
*************** b667de4f07c660c4cd4e91834ea39073  gcc/an
*** 3228,3238 ****
  8a3af8bab2c3a2bb873540dfd49ae5c5  gcc/analyzer/state-purge.h
  a8d6b4d8364f6bbf134baf90f710602c  gcc/analyzer/store.cc
  0f38935467be8fc612e0a9d28483421d  gcc/analyzer/store.h
! 79b6b0657b31636cb7a6e27760e4e2ca  gcc/analyzer/supergraph-fixup-locations.cc
  2b1f8d482dc79d6594c1772d53f983a3  gcc/analyzer/supergraph-manipulation.h
! 164077871160e1b7595a73e6a4d7cea8  gcc/analyzer/supergraph-simplify.cc
! 22c09b58f303cfb3a5b0aa5d6817f5aa  gcc/analyzer/supergraph-sorting.cc
! 8974a0e726aff5c22fa0903a18c754a9  gcc/analyzer/supergraph.cc
  e5cf2ee934b248fcec986cf188b85409  gcc/analyzer/supergraph.h
  5620ff92fa073a6385bf7d8574454084  gcc/analyzer/svalue.cc
  992bf0306be187e739133fed9070510b  gcc/analyzer/svalue.h
--- 3229,3239 ----
  8a3af8bab2c3a2bb873540dfd49ae5c5  gcc/analyzer/state-purge.h
  a8d6b4d8364f6bbf134baf90f710602c  gcc/analyzer/store.cc
  0f38935467be8fc612e0a9d28483421d  gcc/analyzer/store.h
! 33d9be73a4d262226af82d56d077167b  gcc/analyzer/supergraph-fixup-locations.cc
  2b1f8d482dc79d6594c1772d53f983a3  gcc/analyzer/supergraph-manipulation.h
! 466a7599dd2372bf97c1a40ec8d04feb  gcc/analyzer/supergraph-simplify.cc
! fa9e08e646a34adeb4f02012756b3d74  gcc/analyzer/supergraph-sorting.cc
! a016ed244edf8129b300a1ef13e7f736  gcc/analyzer/supergraph.cc
  e5cf2ee934b248fcec986cf188b85409  gcc/analyzer/supergraph.h
  5620ff92fa073a6385bf7d8574454084  gcc/analyzer/svalue.cc
  992bf0306be187e739133fed9070510b  gcc/analyzer/svalue.h
*************** ea987115b0f67bce5cc4745e6d5bc4d1  gcc/at
*** 3250,3260 ****
  2d462a57a0a7bbe8bcb22db63f9377ef  gcc/attr-callback.h
  cbe63f3e975481a17ed49898fbbb9d2a  gcc/attr-fnspec.h
  3d7a71537ed817b2c8f0c30cd04c9201  gcc/attr-urls.def
! ef156947bf32a24ceb8316e7243ba421  gcc/attribs.cc
  feed071e9f711f8ebbc91f8636422f93  gcc/attribs.h
  bd317e24faffad6f2106396f1c3401b1  gcc/auto-inc-dec.cc
  fc353966a860a12cbc161a87f5619b51  gcc/auto-obstack.h
! b255ef9fc0e9dec259addd704d9b7265  gcc/auto-profile.cc
  fbf9a8443f1c2d9cdb04294c02e8e280  gcc/auto-profile.h
  9f64ea996dbb8ee9d49398ceb6c57a85  gcc/avoid-store-forwarding.cc
  f20bc0002fcd380d3eb4447839800715  gcc/avoid-store-forwarding.h
--- 3251,3261 ----
  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
! 765c378053f0808752b738ff984ab7fc  gcc/auto-profile.cc
  fbf9a8443f1c2d9cdb04294c02e8e280  gcc/auto-profile.h
  9f64ea996dbb8ee9d49398ceb6c57a85  gcc/avoid-store-forwarding.cc
  f20bc0002fcd380d3eb4447839800715  gcc/avoid-store-forwarding.h
*************** ebb1ceb69d6cf8ac2cdc227ae45f0eca  gcc/bi
*** 3271,3285 ****
  01cf1a4cec8cf9b7fbe2345f7a4993f3  gcc/builtins.cc
  4dbe6686097ec6c197a24ac373bb9554  gcc/builtins.def
  99d9ddd60ff804d8e24732db43d38bca  gcc/builtins.h
! 65f147821760d0db152a9802a744ebc0  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
! cc19602b099edb07a1a751be261fd186  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
! b55f12f2fd9602fd63704637dad83d93  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
--- 3272,3286 ----
  01cf1a4cec8cf9b7fbe2345f7a4993f3  gcc/builtins.cc
  4dbe6686097ec6c197a24ac373bb9554  gcc/builtins.def
  99d9ddd60ff804d8e24732db43d38bca  gcc/builtins.h
! 5a7b6b4bc39b0d1c9d95fd8c315c5e56  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
*************** ea821c9d267c64dd8b74aad9d0189834  gcc/c-
*** 3307,3335 ****
  01c192d46b70ed6bbb440272922e8aad  gcc/c-family/c-ubsan.cc
  298f1278576690ff4398c33310700f52  gcc/c-family/c-ubsan.h
  29b7425b7315dcfbd0c9f89296e90df0  gcc/c-family/c-warn.cc
! 7c6c98249c8177e107b56378d8f0fb0b  gcc/c-family/c.opt
! 948638055773c6edb8ccff82f57f401d  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
! 94ffc40bc6bc7fbaf1f66d112da01229  gcc/c/ChangeLog
  0586ab6ff2671f06da9bce04f0604810  gcc/c/Make-lang.in
  3920e3ee16f5b5955d40584fea53c441  gcc/c/c-aux-info.cc
  cd5bab8a4deeaa0369ae59b9403d06a2  gcc/c/c-convert.cc
! fbd29146e27cf6bc36caae9e75c87135  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
! 5026df6cec293e0cae821c8b3f347ab7  gcc/c/c-parser.cc
  f6b634d7c0204c419cf4fb7b48193fad  gcc/c/c-parser.h
  4db955734effe2d0c9aac0379d2e6a8c  gcc/c/c-tree.def
! f4a48347d76a6befa1983195ec67be26  gcc/c/c-tree.h
! b83a5c51a20627c3bcbd3e5f443bfef6  gcc/c/c-typeck.cc
  5804f7ee3eccdfb7c9a64e40b20ccc79  gcc/c/config-lang.in
  58370619d5c4739b7d81d5f899913a0c  gcc/c/gccspec.cc
  3ae90e1d8085765b7e7488ac9673a927  gcc/c/gimple-parser.cc
--- 3308,3336 ----
  01c192d46b70ed6bbb440272922e8aad  gcc/c-family/c-ubsan.cc
  298f1278576690ff4398c33310700f52  gcc/c-family/c-ubsan.h
  29b7425b7315dcfbd0c9f89296e90df0  gcc/c-family/c-warn.cc
! 923e28be72edf53f40e2219adf762998  gcc/c-family/c.opt
! bbd7c2ca628c9e8a51b01ac834384d4a  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
*************** efcac12e876ea7fc2018badafb6fddb5  gcc/cf
*** 3348,3421 ****
  1759b500ef3ebaa71f165d1004be0c28  gcc/cfgbuild.h
  7204450de7c4cc506ca7b77a17060d34  gcc/cfgcleanup.cc
  19b842f671a6c6284b654d712d52e513  gcc/cfgcleanup.h
! cd2f1fd68f8e9a8fc806f19378534349  gcc/cfgexpand.cc
  7bcce78536f3bff0e046d9a3ece5ea9a  gcc/cfgexpand.h
  7574fabaac9f09b71e48110e0f7eb1e6  gcc/cfghooks.cc
  7331a5536e5d2c3be4ee9196f8b90a90  gcc/cfghooks.h
  9739bc392def15d91a473ac8e1020ae2  gcc/cfgloop.cc
  e401a5a5a7e802aea0c860de79cf4639  gcc/cfgloop.h
  f18b9392122c866e0f6862690656ebd5  gcc/cfgloopanal.cc
! bb6ef58139ccc882c4baa66602a19f89  gcc/cfgloopmanip.cc
! de9793fd9fd7a5c56b076dc10237845f  gcc/cfgloopmanip.h
  e9a1353e830f1ac8eca66727f2911679  gcc/cfgrtl.cc
  c41525a1de6e78cabd4414d6a8c3dac9  gcc/cfgrtl.h
! 81a3319248c49dabd64c78fd63852870  gcc/cgraph.cc
  36c074c6a2c861a5fa311704a308cd61  gcc/cgraph.h
  de90956fd0fa66b3093b818874bbb4f4  gcc/cgraphbuild.cc
  1a06be3556807c21f91d629f5878d022  gcc/cgraphclones.cc
  47d3701e9292c4ac632243a124a843ed  gcc/cgraphunit.cc
  2a45e3be9216480f88930217fee8fc7b  gcc/channels.h
  931fe41c17df7e7a6074418f8e41f010  gcc/cif-code.def
! d22dc4427da5be1ad6fccf5322358e13  gcc/cobol/ChangeLog
  56c564c4cfd3395214baa46684218f3d  gcc/cobol/Make-lang.in
  0a84e784d2bc4066654d2377fc6a2930  gcc/cobol/TODO
! d2b0dd7d8414ce5776a1038d19ac8153  gcc/cobol/cbldiag.h
  030342886cc720f11f17d7691f6f24ae  gcc/cobol/cdf-copy.cc
! 7b441a0ea8a6967bb4e5f0431e492df6  gcc/cobol/cdf.y
  b916ef498fa1cc9821e56ab612f00f3a  gcc/cobol/cdfval.h
  fb65c7259141f1223fa29175a2e441ed  gcc/cobol/cobol-system.h
! 2f8a556a844e8b896460a4dbc10e5be6  gcc/cobol/cobol1.cc
  8b7f26d4855e5bb69a66eecc586d9742  gcc/cobol/config-lang.in
  aab9bcdb44bef72e1c3a8cd069bfcccd  gcc/cobol/convert.cc
  bdd6fbf13776c7983a16ac857615424c  gcc/cobol/copybook.h
  3f5a0424b32cd09b107e8858af9cf15f  gcc/cobol/dts.h
  7964cb9d308b0a857a3dac0a7fac1320  gcc/cobol/except.cc
  dfdc874741e086c131fcd03117c339cf  gcc/cobol/exceptg.h
! 4e726128e0c090e4f3a71efddf5ffa8c  gcc/cobol/gcobc
! 5245a60caec2a280da4cfb250ec8d966  gcc/cobol/gcobol.1
  527925049a81a36c06220d368570f55a  gcc/cobol/gcobol.3
  bb45f2a58867f5547facd31b076fa3f5  gcc/cobol/gcobolspec.cc
! 28dbdde18c0c42e943ea3d7c65e1d78f  gcc/cobol/genapi.cc
! d77aff76631397333b43e387383acce2  gcc/cobol/genapi.h
  3286fac63d9197d8ec07ca505dbae672  gcc/cobol/gengen.cc
  eeb2d20d7d0d4521acb2468dee246887  gcc/cobol/gengen.h
! 2d93a2650a93b8fc3da87f5ba15d0780  gcc/cobol/genmath.cc
  d44e8c86d57fb704b6c1fbab3464fb9a  gcc/cobol/genmath.h
! fc78b78c0e88e56d8a5bc08ac67ee843  gcc/cobol/genutil.cc
  37f3bc2a2f07d757ac3f9e33027c2e3b  gcc/cobol/genutil.h
  7b9c1ead6f9d3661133f7f732811719c  gcc/cobol/help.gen
  0fa33dbe050697f40b5e8df91896da9a  gcc/cobol/inspect.h
! fd52a00ee627385048b4901c68152fd3  gcc/cobol/lang-specs.h
! b06a920d40ae69abce6ffc69695162d0  gcc/cobol/lang.opt
! 27fcbbb7a8eb5ed2cb9e2afff4e05f7e  gcc/cobol/lang.opt.urls
! 7639e435c94d2da10156ddd3db927e9e  gcc/cobol/lexio.cc
  5953c820cdc03feb815bfbf28c10730c  gcc/cobol/lexio.h
! 112b5088144c95f653839c42f9763cb8  gcc/cobol/messages.cc
! a1dc6074f38f10cc7f2f266756cb68af  gcc/cobol/parse.y
! 8fc9d7761aa85dad9d0496a9f34f0c6b  gcc/cobol/parse_ante.h
  e141e23293fb343e7ccbaa2fe6bcef33  gcc/cobol/parse_util.h
! e3e66753004317b7e01c95f9bb63b4c0  gcc/cobol/scan.l
! 5e2a225de732765807b4efebb7b8d944  gcc/cobol/scan_ante.h
  b807722da738ed05d7e57e96dc9b2f1e  gcc/cobol/scan_post.h
! 423be730276839377810c3c8c4207cad  gcc/cobol/show_parse.h
! c53ffb5b1f39680588d8ace8a3a44953  gcc/cobol/structs.cc
  6a12fdf051ff87867b239b5ae272fd55  gcc/cobol/structs.h
! a321b3d018a8db3f4608065a83923990  gcc/cobol/symbols.cc
! 57380914575ad634afed4e4e986208b4  gcc/cobol/symbols.h
  56876c7f6bf3230239c8142eb049a183  gcc/cobol/symfind.cc
! ccb41d4e6733c464561a8425ed5e090e  gcc/cobol/token_names.h
  434f4899280e27d0717b2e56d5bf12f2  gcc/cobol/udf/stored-char-length.cbl
! 06c49d4c5d6ac24da188be5b1d0a3a66  gcc/cobol/util.cc
  6cc175185e4fa5a6a21bdc88a66d3956  gcc/cobol/util.h
  c1bcbb8330a34acab1f51487c3d5b89f  gcc/collect-utils.cc
  70025ae15b4018e75f6bfcbaa4db4fca  gcc/collect-utils.h
--- 3349,3422 ----
  1759b500ef3ebaa71f165d1004be0c28  gcc/cfgbuild.h
  7204450de7c4cc506ca7b77a17060d34  gcc/cfgcleanup.cc
  19b842f671a6c6284b654d712d52e513  gcc/cfgcleanup.h
! ad2c040bc0ead61e306b35e1c0ee8600  gcc/cfgexpand.cc
  7bcce78536f3bff0e046d9a3ece5ea9a  gcc/cfgexpand.h
  7574fabaac9f09b71e48110e0f7eb1e6  gcc/cfghooks.cc
  7331a5536e5d2c3be4ee9196f8b90a90  gcc/cfghooks.h
  9739bc392def15d91a473ac8e1020ae2  gcc/cfgloop.cc
  e401a5a5a7e802aea0c860de79cf4639  gcc/cfgloop.h
  f18b9392122c866e0f6862690656ebd5  gcc/cfgloopanal.cc
! a2a7ae398fff29279976ba196a37dccb  gcc/cfgloopmanip.cc
! 83651ace7d1e40ee81b35f32a6a05179  gcc/cfgloopmanip.h
  e9a1353e830f1ac8eca66727f2911679  gcc/cfgrtl.cc
  c41525a1de6e78cabd4414d6a8c3dac9  gcc/cfgrtl.h
! 219f47766fc5f1a2993a77606da060af  gcc/cgraph.cc
  36c074c6a2c861a5fa311704a308cd61  gcc/cgraph.h
  de90956fd0fa66b3093b818874bbb4f4  gcc/cgraphbuild.cc
  1a06be3556807c21f91d629f5878d022  gcc/cgraphclones.cc
  47d3701e9292c4ac632243a124a843ed  gcc/cgraphunit.cc
  2a45e3be9216480f88930217fee8fc7b  gcc/channels.h
  931fe41c17df7e7a6074418f8e41f010  gcc/cif-code.def
! 2ec02a3b58ccde87f5d6fcfcf3e7bec7  gcc/cobol/ChangeLog
  56c564c4cfd3395214baa46684218f3d  gcc/cobol/Make-lang.in
  0a84e784d2bc4066654d2377fc6a2930  gcc/cobol/TODO
! 27054fd6ae13f617da51f4df0026904e  gcc/cobol/cbldiag.h
  030342886cc720f11f17d7691f6f24ae  gcc/cobol/cdf-copy.cc
! 7ba30136fc69f049bcfc1ebdf80c298e  gcc/cobol/cdf.y
  b916ef498fa1cc9821e56ab612f00f3a  gcc/cobol/cdfval.h
  fb65c7259141f1223fa29175a2e441ed  gcc/cobol/cobol-system.h
! 68ed2917eb0043eb0bfe48f5d0494cf1  gcc/cobol/cobol1.cc
  8b7f26d4855e5bb69a66eecc586d9742  gcc/cobol/config-lang.in
  aab9bcdb44bef72e1c3a8cd069bfcccd  gcc/cobol/convert.cc
  bdd6fbf13776c7983a16ac857615424c  gcc/cobol/copybook.h
  3f5a0424b32cd09b107e8858af9cf15f  gcc/cobol/dts.h
  7964cb9d308b0a857a3dac0a7fac1320  gcc/cobol/except.cc
  dfdc874741e086c131fcd03117c339cf  gcc/cobol/exceptg.h
! fa5c36c4b4863c8f410d851d2d404869  gcc/cobol/gcobc
! f67634943eb42bf86ec69714cecc53e6  gcc/cobol/gcobol.1
  527925049a81a36c06220d368570f55a  gcc/cobol/gcobol.3
  bb45f2a58867f5547facd31b076fa3f5  gcc/cobol/gcobolspec.cc
! ee1950a6d1b1a2e742627eaea0d9d3c3  gcc/cobol/genapi.cc
! 0c4734774af3bdae4d59b55a5c25bda6  gcc/cobol/genapi.h
  3286fac63d9197d8ec07ca505dbae672  gcc/cobol/gengen.cc
  eeb2d20d7d0d4521acb2468dee246887  gcc/cobol/gengen.h
! f2574a875a5d091597cc2618d3a25852  gcc/cobol/genmath.cc
  d44e8c86d57fb704b6c1fbab3464fb9a  gcc/cobol/genmath.h
! c716e3cd5b0166ad4a18c1eca6ab3210  gcc/cobol/genutil.cc
  37f3bc2a2f07d757ac3f9e33027c2e3b  gcc/cobol/genutil.h
  7b9c1ead6f9d3661133f7f732811719c  gcc/cobol/help.gen
  0fa33dbe050697f40b5e8df91896da9a  gcc/cobol/inspect.h
! 9cc40563a4476537055f06deeb3799a4  gcc/cobol/lang-specs.h
! c6614b1981d39f0ff3b160d116de9cc0  gcc/cobol/lang.opt
! 2924af2e9df185e08e5e225631897dc5  gcc/cobol/lang.opt.urls
! f25056b154c14dde0fb10a159520eb1b  gcc/cobol/lexio.cc
  5953c820cdc03feb815bfbf28c10730c  gcc/cobol/lexio.h
! d40dcad3e5d2596c1ac4fe4a5d21db61  gcc/cobol/messages.cc
! be6f0881f8bfc7a37d7f3e1c83f0ed2f  gcc/cobol/parse.y
! c05dcae814d5281eb740cbf833009de3  gcc/cobol/parse_ante.h
  e141e23293fb343e7ccbaa2fe6bcef33  gcc/cobol/parse_util.h
! 671d08c34c0753b924145233054f8c7c  gcc/cobol/scan.l
! 52616f0eace7ada273d249ed8b7e3d49  gcc/cobol/scan_ante.h
  b807722da738ed05d7e57e96dc9b2f1e  gcc/cobol/scan_post.h
! 4633d4d89ae923e2fb816c83d5babb05  gcc/cobol/show_parse.h
! 4d378cd01e0aa67ff81cbac13cafd094  gcc/cobol/structs.cc
  6a12fdf051ff87867b239b5ae272fd55  gcc/cobol/structs.h
! 547a2c0244e9e228e618fe1cf9510de5  gcc/cobol/symbols.cc
! 46e9939b9c7a3a96903695e3dfd540a6  gcc/cobol/symbols.h
  56876c7f6bf3230239c8142eb049a183  gcc/cobol/symfind.cc
! 0b45e8af0c2c2f064b378c02368657f3  gcc/cobol/token_names.h
  434f4899280e27d0717b2e56d5bf12f2  gcc/cobol/udf/stored-char-length.cbl
! 62b07e99537a619077b9ce54c435d014  gcc/cobol/util.cc
  6cc175185e4fa5a6a21bdc88a66d3956  gcc/cobol/util.h
  c1bcbb8330a34acab1f51487c3d5b89f  gcc/collect-utils.cc
  70025ae15b4018e75f6bfcbaa4db4fca  gcc/collect-utils.h
*************** a56f67bf9504f1f91df64d23b9ce6f3b  gcc/co
*** 3425,3431 ****
  d48c86bc52a7b8ee38281d6069d3eb6a  gcc/collect2.h
  9b54c6ade2ed5ee11859b498e663936e  gcc/color-macros.h
  903401554d90de06743fb9a836e6a45b  gcc/combine-stack-adj.cc
! 309d11c786eb83543c1a7828b119f353  gcc/combine.cc
  9f2835a8fa18cfce2249127014eb7edd  gcc/common.md
  ae73fd34ceb3593aed87399d2e92ba9f  gcc/common.opt
  40215d7288fffc3b0c3524fd9bb23dbd  gcc/common.opt.urls
--- 3426,3432 ----
  d48c86bc52a7b8ee38281d6069d3eb6a  gcc/collect2.h
  9b54c6ade2ed5ee11859b498e663936e  gcc/color-macros.h
  903401554d90de06743fb9a836e6a45b  gcc/combine-stack-adj.cc
! 1eaa0b8ac46c5909996bbdf92a027da6  gcc/combine.cc
  9f2835a8fa18cfce2249127014eb7edd  gcc/common.md
  ae73fd34ceb3593aed87399d2e92ba9f  gcc/common.opt
  40215d7288fffc3b0c3524fd9bb23dbd  gcc/common.opt.urls
*************** d3b8ce30c6110489fd0b57d6792f3f29  gcc/co
*** 3489,3497 ****
  084002dad8536fd331b1095b203b12d6  gcc/compare-elim.cc
  6137f3da8f70ec4262acab21bb549148  gcc/conditions.h
  4250c8b8d57bf1315174cf436a74a88b  gcc/config.build
! 75cbb122dae205816db91faf1eb4f47a  gcc/config.gcc
! da298edfbff21f203cb6351768538647  gcc/config.host
! bea580e5a232aa66db366df9132d1d42  gcc/config.in
  8e697813dc96ca90f5d0f4c196efe2cc  gcc/config/README
  09ab460c021260083d94d95ece3cdb5d  gcc/config/aarch64/aarch64-abi-ms-protos.h
  c47b4191f7bac0196ab63ca2c66bfa98  gcc/config/aarch64/aarch64-abi-ms.cc
--- 3490,3498 ----
  084002dad8536fd331b1095b203b12d6  gcc/compare-elim.cc
  6137f3da8f70ec4262acab21bb549148  gcc/conditions.h
  4250c8b8d57bf1315174cf436a74a88b  gcc/config.build
! e79f179731e459618f26ffec15fea288  gcc/config.gcc
! d8b0b26795a60b3a991dfbdafe4cd756  gcc/config.host
! 0f37365a87254fc2d1b3e0b970cc2a8e  gcc/config.in
  8e697813dc96ca90f5d0f4c196efe2cc  gcc/config/README
  09ab460c021260083d94d95ece3cdb5d  gcc/config/aarch64/aarch64-abi-ms-protos.h
  c47b4191f7bac0196ab63ca2c66bfa98  gcc/config/aarch64/aarch64-abi-ms.cc
*************** b824341b8f6fdb8eb1667425adf63db8  gcc/co
*** 3540,3573 ****
  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
! 914a6cc4b2d43f07b8292af54288552b  gcc/config/aarch64/aarch64-simd.md
! b35811882cef1ced6e0ef9ad050ba669  gcc/config/aarch64/aarch64-sme.md
  680d9861c361f5e0db24978600b2a134  gcc/config/aarch64/aarch64-speculation.cc
  1553cfc68bdd19cb61a2755767842c1c  gcc/config/aarch64/aarch64-sve-builtins-base.cc
! 887300f6cfb084d9f5b099779c5711f3  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/config/aarch64/aarch64-sve-builtins-shapes.cc
  97c5fdc23b65bcb2ba85ccd1ce66af2e  gcc/config/aarch64/aarch64-sve-builtins-shapes.h
  37015c038f8cceef0df52b2e378636d3  gcc/config/aarch64/aarch64-sve-builtins-sme.cc
! 1dbb624d4688c0b38f958f12bd01e744  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
! 92f26e9c66de974baad453c488b8a714  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
! 810d1e39130923635a175fda1263df94  gcc/config/aarch64/aarch64-sve-builtins.def
  88f4473ff255da227dee1dbc66c11a5f  gcc/config/aarch64/aarch64-sve-builtins.h
! 34909171e9f648aaf8ec33db84aa361a  gcc/config/aarch64/aarch64-sve.md
! 4cbc27a6323a82f66f9564995f3a91a8  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
! 2ee2fcb73cc3f7cb6873f5fe2619e62e  gcc/config/aarch64/aarch64.cc
  1e616694750b4b74f9712a90feb26349  gcc/config/aarch64/aarch64.h
! 73b5d2061272172fc3fc298e6c8fcb89  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
--- 3541,3574 ----
  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
! 2851130dd526fc94e82e45471b52caa6  gcc/config/aarch64/aarch64-simd.md
! 58e8a552660da7a83191b677bdb2d085  gcc/config/aarch64/aarch64-sme.md
  680d9861c361f5e0db24978600b2a134  gcc/config/aarch64/aarch64-speculation.cc
  1553cfc68bdd19cb61a2755767842c1c  gcc/config/aarch64/aarch64-sve-builtins-base.cc
! 47473ccabf94b113f5f0f7ac17515bb9  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/config/aarch64/aarch64-sve-builtins-shapes.cc
  97c5fdc23b65bcb2ba85ccd1ce66af2e  gcc/config/aarch64/aarch64-sve-builtins-shapes.h
  37015c038f8cceef0df52b2e378636d3  gcc/config/aarch64/aarch64-sve-builtins-sme.cc
! f60f559e16317ace3075d5c23701efa7  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
! e283b5c1347d2becaeae860065de842b  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
! 54cd200e7b5e4011a92368f8295c9f6e  gcc/config/aarch64/aarch64-sve-builtins.def
  88f4473ff255da227dee1dbc66c11a5f  gcc/config/aarch64/aarch64-sve-builtins.h
! d6f209ee035b95de0cce16ada74728c0  gcc/config/aarch64/aarch64-sve.md
! 94a9e386bef1df97ca60737b81b7ca8e  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
! a4d987e3bcd77940c0bdef3ff56d85d1  gcc/config/aarch64/aarch64.cc
  1e616694750b4b74f9712a90feb26349  gcc/config/aarch64/aarch64.h
! 16af5735a7e9ee1f0036cf68fc9b5502  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
*************** b80cf07c2c72294b3852130ec8c93494  gcc/co
*** 3585,3591 ****
  eb03dfcd266d8fc8f127a62e436447db  gcc/config/aarch64/check-sve-md.awk
  73b78efd3b80c813fe75cc2b519996be  gcc/config/aarch64/constraints.md
  3c41ca007a195244b101219701a3bcb0  gcc/config/aarch64/cortex-a57-fma-steering.cc
! e1f4785d0ac413258532cb101a2f75d4  gcc/config/aarch64/cygming.h
  b6d18d11750027a9e7159f7100cbc2df  gcc/config/aarch64/driver-aarch64.cc
  f16190eb3167c87740aaff80ebc646b5  gcc/config/aarch64/fractional-cost.h
  f7165d62ef852e1929a8fc9a85c01ab2  gcc/config/aarch64/gcc-auto-profile
--- 3586,3592 ----
  eb03dfcd266d8fc8f127a62e436447db  gcc/config/aarch64/check-sve-md.awk
  73b78efd3b80c813fe75cc2b519996be  gcc/config/aarch64/constraints.md
  3c41ca007a195244b101219701a3bcb0  gcc/config/aarch64/cortex-a57-fma-steering.cc
! dc252994bb63e3b3bb9aa44e233b100d  gcc/config/aarch64/cygming.h
  b6d18d11750027a9e7159f7100cbc2df  gcc/config/aarch64/driver-aarch64.cc
  f16190eb3167c87740aaff80ebc646b5  gcc/config/aarch64/fractional-cost.h
  f7165d62ef852e1929a8fc9a85c01ab2  gcc/config/aarch64/gcc-auto-profile
*************** cf8b9e265eb733c7c120218863142390  gcc/co
*** 3996,4002 ****
  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
  5b3453e9a19ac4b2f17661e06da0e52e  gcc/config/default-d.cc
  a737c318913b7cb9fc65ab79d8bce975  gcc/config/default-jit.cc
--- 3997,4003 ----
  9d8acb6c9358ead72b77fe0f6c52ad36  gcc/config/darwin.cc
  f64c0a8e3e79c445281147d0e4547e36  gcc/config/darwin.h
  148592c1bf513e56d281629f94b70d9b  gcc/config/darwin.opt
! 5495a685c233676cec677f3286eb2d37  gcc/config/darwin.opt.urls
  4a5f649b74df564d653882eaeaa75adf  gcc/config/default-c.cc
  5b3453e9a19ac4b2f17661e06da0e52e  gcc/config/default-d.cc
  a737c318913b7cb9fc65ab79d8bce975  gcc/config/default-jit.cc
*************** d03b97264ba80bd58afc0bd371bb210b  gcc/co
*** 4006,4012 ****
  79c743492f58c4f2684ba7d7ae7eee85  gcc/config/dragonfly-stdint.h
  2d37b7e29414d2e47b06e9838594fc5f  gcc/config/dragonfly.h
  d9cda3c2aeebdbb202a646b7fc80a42a  gcc/config/dragonfly.opt
! fa845c4f738a01074c524fcb3bdb12fe  gcc/config/dragonfly.opt.urls
  89c387a2e0ffc5b672c9b9c9e4015ad7  gcc/config/elfos.h
  c7967649d7ebce88af774f54ce092852  gcc/config/epiphany/constraints.md
  6ad872d5e627d93723179397b19d71a2  gcc/config/epiphany/epiphany-modes.def
--- 4007,4013 ----
  79c743492f58c4f2684ba7d7ae7eee85  gcc/config/dragonfly-stdint.h
  2d37b7e29414d2e47b06e9838594fc5f  gcc/config/dragonfly.h
  d9cda3c2aeebdbb202a646b7fc80a42a  gcc/config/dragonfly.opt
! 224d377be0df21ebab1d38cec27a7743  gcc/config/dragonfly.opt.urls
  89c387a2e0ffc5b672c9b9c9e4015ad7  gcc/config/elfos.h
  c7967649d7ebce88af774f54ce092852  gcc/config/epiphany/constraints.md
  6ad872d5e627d93723179397b19d71a2  gcc/config/epiphany/epiphany-modes.def
*************** f1b078455af524b97e3635c4619d8225  gcc/co
*** 4039,4045 ****
  3c7dc08394c68470b93c9c20c3dfa0b9  gcc/config/freebsd-stdint.h
  94796d5b3c1334f3037950c3a893385f  gcc/config/freebsd.h
  d34244fbab1499815af9daf85e3419ee  gcc/config/freebsd.opt
! 99cb7233f9a82b54a0075f62b0e068d9  gcc/config/freebsd.opt.urls
  5a9d58cb608ea3b6c71428376e34ff7c  gcc/config/frv/constraints.md
  519bf882eb6c169cc6c1912a1bbecb85  gcc/config/frv/frv-asm.h
  3bd2954fa2c4cdb09efe5656244facac  gcc/config/frv/frv-modes.def
--- 4040,4046 ----
  3c7dc08394c68470b93c9c20c3dfa0b9  gcc/config/freebsd-stdint.h
  94796d5b3c1334f3037950c3a893385f  gcc/config/freebsd.h
  d34244fbab1499815af9daf85e3419ee  gcc/config/freebsd.opt
! 84b8b8c9bc52cd476a47aea89dccdadc  gcc/config/freebsd.opt.urls
  5a9d58cb608ea3b6c71428376e34ff7c  gcc/config/frv/constraints.md
  519bf882eb6c169cc6c1912a1bbecb85  gcc/config/frv/frv-asm.h
  3bd2954fa2c4cdb09efe5656244facac  gcc/config/frv/frv-modes.def
*************** a3c2585b76667370d90aecdc90a8348a  gcc/co
*** 4098,4104 ****
  f7dbf0f3812abaef9d76addce925c5b3  gcc/config/gnu-d.cc
  4bbd3e3f513f3e7d6af9fde4879f9144  gcc/config/gnu-user.h
  1858c32ede1f620203ed638ba8e6b3c2  gcc/config/gnu-user.opt
! d039ad9b715903a97cd9d68a8116fe71  gcc/config/gnu-user.opt.urls
  0afc87f8213cdff05820de461c45fece  gcc/config/gnu.h
  762caed3032d23c497832b0f920ad5df  gcc/config/h8300/addsub.md
  cddc64825ce6e6e92692684251745f9e  gcc/config/h8300/bitfield.md
--- 4099,4105 ----
  f7dbf0f3812abaef9d76addce925c5b3  gcc/config/gnu-d.cc
  4bbd3e3f513f3e7d6af9fde4879f9144  gcc/config/gnu-user.h
  1858c32ede1f620203ed638ba8e6b3c2  gcc/config/gnu-user.opt
! 2cb362bb1c09d24903fe9b726080dae5  gcc/config/gnu-user.opt.urls
  0afc87f8213cdff05820de461c45fece  gcc/config/gnu.h
  762caed3032d23c497832b0f920ad5df  gcc/config/h8300/addsub.md
  cddc64825ce6e6e92692684251745f9e  gcc/config/h8300/bitfield.md
*************** e8b4e410c4f2d071ff10704541480828  gcc/co
*** 4131,4136 ****
--- 4132,4138 ----
  d081ffdb5e6fda6471818cb2912ae68a  gcc/config/h8300/testcompare.md
  5cff983f537ab15144cef370302148a1  gcc/config/host-darwin.cc
  ea7d0f3fec8f9d7d0c263808b5e56f11  gcc/config/host-darwin.h
+ bb74991f4617b918293845016b78bd3a  gcc/config/host-freebsd.cc
  7ad6be638eba111b2e8fc1eddf7835c1  gcc/config/host-hpux.cc
  be95fbbee07cf09eb6a8fb9ce86af55a  gcc/config/host-linux.cc
  5d43584d85ba4cc7620a53ed7bb40e7a  gcc/config/host-netbsd.cc
*************** e0cfa2d30528afe7d96718b2c0d2f042  gcc/co
*** 4138,4144 ****
  7b5daafe15fce1b864492af648812dc4  gcc/config/host-solaris.cc
  2c191e2d8d033611c6fccc8362d9e8f0  gcc/config/hpux-stdint.h
  849dbe36cd177425793947131ae0c4e4  gcc/config/hpux11.opt
! 6fb8f575d2ba05a77e86b2a4670259bb  gcc/config/hpux11.opt.urls
  bce047f0ce185b9d2357065eaf595063  gcc/config/i386/adxintrin.h
  caa03bda7825e35f017ef5dbdda08600  gcc/config/i386/ammintrin.h
  f7b9dc5925af22e4c4a1fc76255fbff5  gcc/config/i386/amxavx512intrin.h
--- 4140,4146 ----
  7b5daafe15fce1b864492af648812dc4  gcc/config/host-solaris.cc
  2c191e2d8d033611c6fccc8362d9e8f0  gcc/config/hpux-stdint.h
  849dbe36cd177425793947131ae0c4e4  gcc/config/hpux11.opt
! 920453e0474a9540e058dfd64f52c234  gcc/config/hpux11.opt.urls
  bce047f0ce185b9d2357065eaf595063  gcc/config/i386/adxintrin.h
  caa03bda7825e35f017ef5dbdda08600  gcc/config/i386/ammintrin.h
  f7b9dc5925af22e4c4a1fc76255fbff5  gcc/config/i386/amxavx512intrin.h
*************** e31d20e57fcc6b9a15aa65c66ea05643  gcc/co
*** 4220,4231 ****
  9d1f00af3ca4af046e932a8894eed704  gcc/config/i386/cpuid.h
  b7a784ebc5b7a408ce934c4c77d2f0df  gcc/config/i386/cross-stdarg.h
  eea748dea33c931f2a0211ffd279bd9d  gcc/config/i386/crtdll.h
! e57633de2ee2540593731fecd0c1e724  gcc/config/i386/cygming.h
  2769aec1ba034a4aeb65b6a57299886f  gcc/config/i386/cygwin-stdint.h
  7a00aae17af7149d2d3b820963bc170f  gcc/config/i386/cygwin-w64.h
  7fa24da4effe0d45e3129f720aef22ab  gcc/config/i386/cygwin.h
  caf754940377d593ccf417ef5d1a2b71  gcc/config/i386/cygwin.opt
! 3b362955aab83912528fe683b571c289  gcc/config/i386/cygwin.opt.urls
  38cb64d1c7c2478dab3692e54e60f46d  gcc/config/i386/darwin.h
  700269de5ce36bf877a561acd6a85d17  gcc/config/i386/darwin32-biarch.h
  1ebe9b73a1eb0eedca8986697cd94b89  gcc/config/i386/darwin64-biarch.h
--- 4222,4233 ----
  9d1f00af3ca4af046e932a8894eed704  gcc/config/i386/cpuid.h
  b7a784ebc5b7a408ce934c4c77d2f0df  gcc/config/i386/cross-stdarg.h
  eea748dea33c931f2a0211ffd279bd9d  gcc/config/i386/crtdll.h
! 0d7ae9af88d5e9352bee035c1dfb0fbf  gcc/config/i386/cygming.h
  2769aec1ba034a4aeb65b6a57299886f  gcc/config/i386/cygwin-stdint.h
  7a00aae17af7149d2d3b820963bc170f  gcc/config/i386/cygwin-w64.h
  7fa24da4effe0d45e3129f720aef22ab  gcc/config/i386/cygwin.h
  caf754940377d593ccf417ef5d1a2b71  gcc/config/i386/cygwin.opt
! b25762a5bb631eb36ee26c45ceb09b50  gcc/config/i386/cygwin.opt.urls
  38cb64d1c7c2478dab3692e54e60f46d  gcc/config/i386/darwin.h
  700269de5ce36bf877a561acd6a85d17  gcc/config/i386/darwin32-biarch.h
  1ebe9b73a1eb0eedca8986697cd94b89  gcc/config/i386/darwin64-biarch.h
*************** c28514790f4784d421517c5a6b2f7d4f  gcc/co
*** 4288,4296 ****
  25b3947a11eb9ca52892133ddb36f3f2  gcc/config/i386/i386-rust.h
  f4b1b0a3decbbd9c9345ef2a42fededd  gcc/config/i386/i386.cc
  49356da2e6c692df89e135b567156466  gcc/config/i386/i386.h
! 1a26851344ed9b09f71cf6d05c6a77a2  gcc/config/i386/i386.md
! fd4760641df033254f7b7c258d968431  gcc/config/i386/i386.opt
! ab37b1a6526c4ed87f53f795354f6487  gcc/config/i386/i386.opt.urls
  7570cb8763bf53e7144db7d6cd97f846  gcc/config/i386/i386elf.h
  e91dbbea4abdb9b61d892b20c00503a9  gcc/config/i386/ia32intrin.h
  045de1254b57ade50e2bc57081860a9b  gcc/config/i386/iamcu.h
--- 4290,4298 ----
  25b3947a11eb9ca52892133ddb36f3f2  gcc/config/i386/i386-rust.h
  f4b1b0a3decbbd9c9345ef2a42fededd  gcc/config/i386/i386.cc
  49356da2e6c692df89e135b567156466  gcc/config/i386/i386.h
! 8d7171c2d59a73707e6b828a2c65a955  gcc/config/i386/i386.md
! 3daf30a120b25bf169610339d8911e50  gcc/config/i386/i386.opt
! b9e680863ab278314c1f2990d2d04fcc  gcc/config/i386/i386.opt.urls
  7570cb8763bf53e7144db7d6cd97f846  gcc/config/i386/i386elf.h
  e91dbbea4abdb9b61d892b20c00503a9  gcc/config/i386/ia32intrin.h
  045de1254b57ade50e2bc57081860a9b  gcc/config/i386/iamcu.h
*************** bc129bffab46f1b3f4e8385e129dad2d  gcc/co
*** 4314,4320 ****
  55b88c976269e37a537664690c4fab53  gcc/config/i386/mingw-w64.opt.urls
  cbcab4624612809c185831072d24010d  gcc/config/i386/mm3dnow.h
  aea42afde883cdcf14febc5bd88dba2f  gcc/config/i386/mmintrin.h
! fc6494513d92c52f8da4d2cdc25efe78  gcc/config/i386/mmx.md
  fff495daa14e84982509339259b2cf60  gcc/config/i386/movdirintrin.h
  67270a67aaa79980333c4d8c2a80f360  gcc/config/i386/movrsintrin.h
  378170cac6027b6537c718aced0ca31c  gcc/config/i386/mwaitintrin.h
--- 4316,4322 ----
  55b88c976269e37a537664690c4fab53  gcc/config/i386/mingw-w64.opt.urls
  cbcab4624612809c185831072d24010d  gcc/config/i386/mm3dnow.h
  aea42afde883cdcf14febc5bd88dba2f  gcc/config/i386/mmintrin.h
! cbf34c7ea2fe49bdf228565632d6de3d  gcc/config/i386/mmx.md
  fff495daa14e84982509339259b2cf60  gcc/config/i386/movdirintrin.h
  67270a67aaa79980333c4d8c2a80f360  gcc/config/i386/movrsintrin.h
  378170cac6027b6537c718aced0ca31c  gcc/config/i386/mwaitintrin.h
*************** db114ac74c87743a142214fddaad2687  gcc/co
*** 4350,4356 ****
  94b0dab281a8deeed2a925444aed552a  gcc/config/i386/sm3intrin.h
  92210572b9f9f6481e4649a42d9ac3b0  gcc/config/i386/sm4intrin.h
  5298b8261e081859bbf068b710158e8f  gcc/config/i386/smmintrin.h
! af18b59dc9ad6145a7e8e616631eb316  gcc/config/i386/sol2.h
  120fd3c7f3954860fecc55f08834f646  gcc/config/i386/sse.md
  52e0114cb9ab8d55aac3c17d06657d71  gcc/config/i386/ssemath.h
  8a6ab9e02097018bc9f1c2b347d29cfa  gcc/config/i386/stringop.def
--- 4352,4358 ----
  94b0dab281a8deeed2a925444aed552a  gcc/config/i386/sm3intrin.h
  92210572b9f9f6481e4649a42d9ac3b0  gcc/config/i386/sm4intrin.h
  5298b8261e081859bbf068b710158e8f  gcc/config/i386/smmintrin.h
! 61d4d68f483393371bc476896ba80ac3  gcc/config/i386/sol2.h
  120fd3c7f3954860fecc55f08834f646  gcc/config/i386/sse.md
  52e0114cb9ab8d55aac3c17d06657d71  gcc/config/i386/ssemath.h
  8a6ab9e02097018bc9f1c2b347d29cfa  gcc/config/i386/stringop.def
*************** f50630bc28d0cff997f62a47976c06cb  gcc/co
*** 4391,4397 ****
  4272ea3ba0e60b762c87a3e48f914506  gcc/config/i386/vxworksae.h
  e3308e06d10bddaf8d2e97a08a1ca887  gcc/config/i386/waitpkgintrin.h
  fd2a5bbf6a001535a3999e9dce998fe2  gcc/config/i386/wbnoinvdintrin.h
! b60494d53d08e39def55bcf62076b56c  gcc/config/i386/winnt-utf8.manifest
  980a631552df5c4d22de20b462c4dd14  gcc/config/i386/wmmintrin.h
  b4cde95b709fc93c90bf4d6b3edc7fd0  gcc/config/i386/x-cygwin
  1ab2099a92787dd158135dbcaceb0bf9  gcc/config/i386/x-darwin
--- 4393,4399 ----
  4272ea3ba0e60b762c87a3e48f914506  gcc/config/i386/vxworksae.h
  e3308e06d10bddaf8d2e97a08a1ca887  gcc/config/i386/waitpkgintrin.h
  fd2a5bbf6a001535a3999e9dce998fe2  gcc/config/i386/wbnoinvdintrin.h
! 9a292a1c009424b9775979c1b7e8e169  gcc/config/i386/winnt-utf8.manifest
  980a631552df5c4d22de20b462c4dd14  gcc/config/i386/wmmintrin.h
  b4cde95b709fc93c90bf4d6b3edc7fd0  gcc/config/i386/x-cygwin
  1ab2099a92787dd158135dbcaceb0bf9  gcc/config/i386/x-darwin
*************** c22e895e5b7e6b98c7223b26982a5d20  gcc/co
*** 4404,4410 ****
  0f7aabe76b19950e5c2ac36e9fec15a0  gcc/config/i386/x86-tune-sched-bd.cc
  864e537089cc92c5002cefd76ede977a  gcc/config/i386/x86-tune-sched-core.cc
  67c586fe54bcfe3f719ae50164d063ca  gcc/config/i386/x86-tune-sched.cc
! bf79a7f80aab5db5a4151d2e06dd170b  gcc/config/i386/x86-tune.def
  75b1f0e8f79cfd04f898a4099aff669d  gcc/config/i386/x86gprintrin.h
  e5335d55cec73bd3270862ccac7a02e8  gcc/config/i386/x86intrin.h
  76f88cf5ac857d392ddb81b244c5b9b0  gcc/config/i386/xm-cygwin.h
--- 4406,4412 ----
  0f7aabe76b19950e5c2ac36e9fec15a0  gcc/config/i386/x86-tune-sched-bd.cc
  864e537089cc92c5002cefd76ede977a  gcc/config/i386/x86-tune-sched-core.cc
  67c586fe54bcfe3f719ae50164d063ca  gcc/config/i386/x86-tune-sched.cc
! faecf7254852e8b92d6ef29347de0d73  gcc/config/i386/x86-tune.def
  75b1f0e8f79cfd04f898a4099aff669d  gcc/config/i386/x86gprintrin.h
  e5335d55cec73bd3270862ccac7a02e8  gcc/config/i386/x86intrin.h
  76f88cf5ac857d392ddb81b244c5b9b0  gcc/config/i386/xm-cygwin.h
*************** c7eeb48ab4223ecfdb09fa5e4ce61d71  gcc/co
*** 4523,4531 ****
  dadec2097ca9c4947a49a5766ac8ee89  gcc/config/loongarch/loongarch-str.h
  7ccddf81e7d405d89aab58e4ff863b49  gcc/config/loongarch/loongarch-target-attr.cc
  3cfb174db8bc99a9361e597a3e9bd35e  gcc/config/loongarch/loongarch-tune.h
! fa91f33d59fb07338bb81a43e345984b  gcc/config/loongarch/loongarch.cc
  57abfb8c653a24903f61e5cf93ac929f  gcc/config/loongarch/loongarch.h
! c90a939b076f04e9840bebee19388548  gcc/config/loongarch/loongarch.md
  62f9bea81246c3dac622d969dabefc1b  gcc/config/loongarch/loongarch.opt
  387011bb9dde5e25493f3602b2fd17bb  gcc/config/loongarch/loongarch.opt.urls
  8a90e5171c01a3ce4c5a78cf857008c8  gcc/config/loongarch/lsx.md
--- 4525,4533 ----
  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
*************** b509852d4359316090bcd55202a1613c  gcc/co
*** 4646,4652 ****
  3a09de115b6947874ec185e5164e8f69  gcc/config/mingw/cygwin-d.cc
  8aa59f703b6d8957ff655113267f7404  gcc/config/mingw/mingw-stdint.h
  dbcb030a5a374a20a894ab55346eb2a0  gcc/config/mingw/mingw.opt
! 19d5796358fa93b7d6fe22a02604a407  gcc/config/mingw/mingw.opt.urls
  1d5f1a57665738292d79250735b11e47  gcc/config/mingw/mingw32.h
  1e94c126fd81c1bcb376905cbf579a7f  gcc/config/mingw/msformat-c.cc
  da2e1484517c66fece1fadd07669571d  gcc/config/mingw/t-cygming
--- 4648,4654 ----
  3a09de115b6947874ec185e5164e8f69  gcc/config/mingw/cygwin-d.cc
  8aa59f703b6d8957ff655113267f7404  gcc/config/mingw/mingw-stdint.h
  dbcb030a5a374a20a894ab55346eb2a0  gcc/config/mingw/mingw.opt
! 12a42cc3d132d3ae1aef1548655fabaa  gcc/config/mingw/mingw.opt.urls
  1d5f1a57665738292d79250735b11e47  gcc/config/mingw/mingw32.h
  1e94c126fd81c1bcb376905cbf579a7f  gcc/config/mingw/msformat-c.cc
  da2e1484517c66fece1fadd07669571d  gcc/config/mingw/t-cygming
*************** a0561d5189d936a2b3f76e586c0a2aa1  gcc/co
*** 4711,4717 ****
  345d90586064a6b98108ed27f48d4599  gcc/config/mips/mips-tables.opt
  216c87627424d946f6245f736be7b5f1  gcc/config/mips/mips-tables.opt.urls
  d721b62b45e3d41cf231605ad9646ea0  gcc/config/mips/mips.cc
! d8cff3d7f2a0ddc1889b2bb8e369468a  gcc/config/mips/mips.h
  62c91047998070c0f017a68e2a78fbe7  gcc/config/mips/mips.md
  09db4f2e8c03333595305c1b1c1c0fc7  gcc/config/mips/mips.opt
  7742c648c8bee18fe57e3e21bd7c846b  gcc/config/mips/mips.opt.urls
--- 4713,4719 ----
  345d90586064a6b98108ed27f48d4599  gcc/config/mips/mips-tables.opt
  216c87627424d946f6245f736be7b5f1  gcc/config/mips/mips-tables.opt.urls
  d721b62b45e3d41cf231605ad9646ea0  gcc/config/mips/mips.cc
! c3f89a44da0bb860a7ac949f008546b1  gcc/config/mips/mips.h
  62c91047998070c0f017a68e2a78fbe7  gcc/config/mips/mips.md
  09db4f2e8c03333595305c1b1c1c0fc7  gcc/config/mips/mips.opt
  7742c648c8bee18fe57e3e21bd7c846b  gcc/config/mips/mips.opt.urls
*************** a8e6872a63592d6d7b17cb1654d424c9  gcc/co
*** 4846,4853 ****
  120193c34d751f4cf8ab9113848c4fad  gcc/config/nds32/nds32.cc
  63a74b74ef6ce025798a026c2ef864ba  gcc/config/nds32/nds32.h
  5683ba48791fba79d913c4f0742a9cc6  gcc/config/nds32/nds32.md
! c15d1e028afacb53a272202e5688af30  gcc/config/nds32/nds32.opt
! b8bd0fec844385cadc7734346b116eb3  gcc/config/nds32/nds32.opt.urls
  c09acceb380f58ddb795ee3e973945d7  gcc/config/nds32/nds32_init.inc
  4e39d1b69768be76a7437a80a2039198  gcc/config/nds32/nds32_intrinsic.h
  6241ca722fb83eeb99584fbc59ab4fc6  gcc/config/nds32/nds32_isr.h
--- 4848,4855 ----
  120193c34d751f4cf8ab9113848c4fad  gcc/config/nds32/nds32.cc
  63a74b74ef6ce025798a026c2ef864ba  gcc/config/nds32/nds32.h
  5683ba48791fba79d913c4f0742a9cc6  gcc/config/nds32/nds32.md
! 70126739fc43ac4b6e9ff569899872fb  gcc/config/nds32/nds32.opt
! f78aa0badf7dd1439d951eab3c0e183e  gcc/config/nds32/nds32.opt.urls
  c09acceb380f58ddb795ee3e973945d7  gcc/config/nds32/nds32_init.inc
  4e39d1b69768be76a7437a80a2039198  gcc/config/nds32/nds32_intrinsic.h
  6241ca722fb83eeb99584fbc59ab4fc6  gcc/config/nds32/nds32_isr.h
*************** b9e847901fb2e435797aeade3fb92c9f  gcc/co
*** 4867,4873 ****
  871a27f0ae567107ebd56667037727b0  gcc/config/netbsd.cc
  b387f44c9f6daa48b14d057ccae84727  gcc/config/netbsd.h
  88611fe131aba45ab23f2e786330c503  gcc/config/netbsd.opt
! 2d8ddf3cb6445f1f788bf4c1f6f61300  gcc/config/netbsd.opt.urls
  958232e96bda3ed0b2a13a05b79de780  gcc/config/newlib-stdint.h
  d5fbbf2154f81230db9bf181bb64b2d6  gcc/config/nvptx/gen-copyright.sh
  95aea124a7e2233915c866d785e70014  gcc/config/nvptx/gen-h.sh
--- 4869,4875 ----
  871a27f0ae567107ebd56667037727b0  gcc/config/netbsd.cc
  b387f44c9f6daa48b14d057ccae84727  gcc/config/netbsd.h
  88611fe131aba45ab23f2e786330c503  gcc/config/netbsd.opt
! 1706a6c14a0046347090996f2fa0cf60  gcc/config/netbsd.opt.urls
  958232e96bda3ed0b2a13a05b79de780  gcc/config/newlib-stdint.h
  d5fbbf2154f81230db9bf181bb64b2d6  gcc/config/nvptx/gen-copyright.sh
  95aea124a7e2233915c866d785e70014  gcc/config/nvptx/gen-h.sh
*************** e8a3a49db2057340b383556c9f01ca93  gcc/co
*** 4888,4894 ****
  1962ec9fc83ea07e67ce77f805096639  gcc/config/nvptx/nvptx.h
  b73220c606bf6c1705b780468fa1a60b  gcc/config/nvptx/nvptx.md
  0dd240a520cbaf46208d6e0c3e44c89e  gcc/config/nvptx/nvptx.opt
! 53bbd40023718a97e82988becbb44969  gcc/config/nvptx/nvptx.opt.urls
  6dfcaf98ccebde10c0048561ac4b5a75  gcc/config/nvptx/offload.h
  e5b7e572a77f7a504a29fda1e6e163d9  gcc/config/nvptx/t-nvptx
  0611c8534afbbbca5fe6378a13849c46  gcc/config/nvptx/t-omp-device
--- 4890,4896 ----
  1962ec9fc83ea07e67ce77f805096639  gcc/config/nvptx/nvptx.h
  b73220c606bf6c1705b780468fa1a60b  gcc/config/nvptx/nvptx.md
  0dd240a520cbaf46208d6e0c3e44c89e  gcc/config/nvptx/nvptx.opt
! 6272eb233aa489d900bc644f9502493c  gcc/config/nvptx/nvptx.opt.urls
  6dfcaf98ccebde10c0048561ac4b5a75  gcc/config/nvptx/offload.h
  e5b7e572a77f7a504a29fda1e6e163d9  gcc/config/nvptx/t-nvptx
  0611c8534afbbbca5fe6378a13849c46  gcc/config/nvptx/t-omp-device
*************** dcff4e0a502ca3e4e910113907cd17a5  gcc/co
*** 4898,4904 ****
  9f7ed215196feac2290a9c21bba850c3  gcc/config/openbsd-stdint.h
  689fd4b9905adc4409c5df7a78aaae20  gcc/config/openbsd.h
  25ba43afb88cc3e986953ddbb6680337  gcc/config/openbsd.opt
! f2528020fcdc72755829904c1e2bd9cd  gcc/config/openbsd.opt.urls
  0a4bab19970fc553c7efb3f359b95067  gcc/config/or1k/constraints.md
  d4be91a79300843f584011862102a230  gcc/config/or1k/elf.h
  ea47b9aaff57a2a9d2393ed60a70f379  gcc/config/or1k/elf.opt
--- 4900,4906 ----
  9f7ed215196feac2290a9c21bba850c3  gcc/config/openbsd-stdint.h
  689fd4b9905adc4409c5df7a78aaae20  gcc/config/openbsd.h
  25ba43afb88cc3e986953ddbb6680337  gcc/config/openbsd.opt
! aa09fe3d5d6d95f4db3ade89617f8d76  gcc/config/openbsd.opt.urls
  0a4bab19970fc553c7efb3f359b95067  gcc/config/or1k/constraints.md
  d4be91a79300843f584011862102a230  gcc/config/or1k/elf.h
  ea47b9aaff57a2a9d2393ed60a70f379  gcc/config/or1k/elf.opt
*************** ad743ffd510350de1ccc398970040dc3  gcc/co
*** 4985,4991 ****
  d3ebca987828ada71f6114f160741ada  gcc/config/pru/pru.h
  f4bcd512aee9c63ac876027f329af5ae  gcc/config/pru/pru.md
  07fb21318d917df2d4ba319221cb730c  gcc/config/pru/pru.opt
! a75e468f9ce2e3115c4b7f638be7a433  gcc/config/pru/pru.opt.urls
  c767f7420ba1d03bdc9c8683304f60b9  gcc/config/pru/t-multilib
  d14e87abdaf32035777f39d2369df790  gcc/config/pru/t-pru
  24fcf4723ce4bbe23722598936ad33e9  gcc/config/riscv/andes-23-series.md
--- 4987,4993 ----
  d3ebca987828ada71f6114f160741ada  gcc/config/pru/pru.h
  f4bcd512aee9c63ac876027f329af5ae  gcc/config/pru/pru.md
  07fb21318d917df2d4ba319221cb730c  gcc/config/pru/pru.opt
! ef116c044d43c2dfc0d66c90cb68f1e4  gcc/config/pru/pru.opt.urls
  c767f7420ba1d03bdc9c8683304f60b9  gcc/config/pru/t-multilib
  d14e87abdaf32035777f39d2369df790  gcc/config/pru/t-pru
  24fcf4723ce4bbe23722598936ad33e9  gcc/config/riscv/andes-23-series.md
*************** f4143eaeb6de99083ec3a0020c13454c  gcc/co
*** 5002,5008 ****
  73b5c51e2550dc86b2b7a1ae5129e48c  gcc/config/riscv/autovec-opt.md
  4305a1e3cb8aac959b8bc9cad1032c39  gcc/config/riscv/autovec.md
  098363f130229da2a5e56c9c7e7ace93  gcc/config/riscv/bitmanip.md
! 814b2d5320849a6de4c4c29012eb401e  gcc/config/riscv/constraints.md
  4e0968dc35562b151fd162778542718f  gcc/config/riscv/corev.def
  3541ce4817aa1b4ca8a8e3799ba716d8  gcc/config/riscv/corev.md
  7756abda53649ea4167327df7a1dd51a  gcc/config/riscv/crypto.md
--- 5004,5010 ----
  73b5c51e2550dc86b2b7a1ae5129e48c  gcc/config/riscv/autovec-opt.md
  4305a1e3cb8aac959b8bc9cad1032c39  gcc/config/riscv/autovec.md
  098363f130229da2a5e56c9c7e7ace93  gcc/config/riscv/bitmanip.md
! 9a8c3c567d897ebcb2cfe1b14c449222  gcc/config/riscv/constraints.md
  4e0968dc35562b151fd162778542718f  gcc/config/riscv/corev.def
  3541ce4817aa1b4ca8a8e3799ba716d8  gcc/config/riscv/corev.md
  7756abda53649ea4167327df7a1dd51a  gcc/config/riscv/crypto.md
*************** d249eb7fdcb1f194794f37ab61535314  gcc/co
*** 5077,5087 ****
  a04b8f75edb78335fe98963c4cc2072a  gcc/config/riscv/riscv-vsetvl.cc
  10ae51c30c9b8e6dce66f20016fae344  gcc/config/riscv/riscv-vsetvl.def
  85dee253312a7f85a1d4f8554a601105  gcc/config/riscv/riscv-zicfilp.cc
! 12587280e8c32ffca9415a1ef12840d9  gcc/config/riscv/riscv.cc
  cff2fc59ab1defbd178f75bdcd643bcc  gcc/config/riscv/riscv.h
  69bf57d0406b6ab66b5fd796932171e7  gcc/config/riscv/riscv.md
  2d23f30f1a22bd9edff8821ece67599e  gcc/config/riscv/riscv.opt
! 731a9b07f44d3d9b9c70a5418441b8d1  gcc/config/riscv/riscv.opt.urls
  fab1eef01628cdb4fc6f7a48edf3ff51  gcc/config/riscv/riscv_bitmanip.h
  3458c159fa70b8544ae65132baa36477  gcc/config/riscv/riscv_crypto.h
  919b77d98a332a298929861b56886aaa  gcc/config/riscv/riscv_th_vector.h
--- 5079,5089 ----
  a04b8f75edb78335fe98963c4cc2072a  gcc/config/riscv/riscv-vsetvl.cc
  10ae51c30c9b8e6dce66f20016fae344  gcc/config/riscv/riscv-vsetvl.def
  85dee253312a7f85a1d4f8554a601105  gcc/config/riscv/riscv-zicfilp.cc
! caabc1df8c298b59318d1c7317088c90  gcc/config/riscv/riscv.cc
  cff2fc59ab1defbd178f75bdcd643bcc  gcc/config/riscv/riscv.h
  69bf57d0406b6ab66b5fd796932171e7  gcc/config/riscv/riscv.md
  2d23f30f1a22bd9edff8821ece67599e  gcc/config/riscv/riscv.opt
! 5347f266751815cd3cb80c0de985c3b8  gcc/config/riscv/riscv.opt.urls
  fab1eef01628cdb4fc6f7a48edf3ff51  gcc/config/riscv/riscv_bitmanip.h
  3458c159fa70b8544ae65132baa36477  gcc/config/riscv/riscv_crypto.h
  919b77d98a332a298929861b56886aaa  gcc/config/riscv/riscv_th_vector.h
*************** cf5e812e9a79fb52359bbbe481b92261  gcc/co
*** 5132,5138 ****
  619dc6299815cdf10ebe571a1e57eafe  gcc/config/rl78/rl78.h
  ebbceacded87efe37fb6bbc894f7f0d5  gcc/config/rl78/rl78.md
  7549cde2462d8ce47201e563f43f72a6  gcc/config/rl78/rl78.opt
! 94f33f52754b0d952ade61882bb66631  gcc/config/rl78/rl78.opt.urls
  5c258b0f94ee73e8ae71fa8dd144ab24  gcc/config/rl78/t-rl78
  abc0cdce92f661e664fc8de0c36c56dc  gcc/config/rpath.opt
  1ba216c6712cc1a82121154d5193a339  gcc/config/rpath.opt.urls
--- 5134,5140 ----
  619dc6299815cdf10ebe571a1e57eafe  gcc/config/rl78/rl78.h
  ebbceacded87efe37fb6bbc894f7f0d5  gcc/config/rl78/rl78.md
  7549cde2462d8ce47201e563f43f72a6  gcc/config/rl78/rl78.opt
! 627f7814959fdb52d10a7da79edccf25  gcc/config/rl78/rl78.opt.urls
  5c258b0f94ee73e8ae71fa8dd144ab24  gcc/config/rl78/t-rl78
  abc0cdce92f661e664fc8de0c36c56dc  gcc/config/rpath.opt
  1ba216c6712cc1a82121154d5193a339  gcc/config/rpath.opt.urls
*************** cbcf88f781d3b1c5edd096738693a993  gcc/co
*** 5152,5158 ****
  a8b1f3ddfb1f6f99004ac2db6cd9dc74  gcc/config/rs6000/aix-stdint.h
  d0faac423dbdf9cf30ccf83ac9d2e60d  gcc/config/rs6000/aix.h
  1fceb97e97a40dc3014fd5d2a8ab5d07  gcc/config/rs6000/aix64.opt
! d70f08b893e019d12b16dc9a70754ef9  gcc/config/rs6000/aix64.opt.urls
  7a458de4c2e17a9a5c5b134cd5307283  gcc/config/rs6000/aix71.h
  20f4005e48ef1b44aaa1abcda010edb0  gcc/config/rs6000/aix72.h
  f6a351fafc8d9c1ddd46b271f0c859c9  gcc/config/rs6000/aix73.h
--- 5154,5160 ----
  a8b1f3ddfb1f6f99004ac2db6cd9dc74  gcc/config/rs6000/aix-stdint.h
  d0faac423dbdf9cf30ccf83ac9d2e60d  gcc/config/rs6000/aix.h
  1fceb97e97a40dc3014fd5d2a8ab5d07  gcc/config/rs6000/aix64.opt
! e4a4b03789e35b9e456f990006a38179  gcc/config/rs6000/aix64.opt.urls
  7a458de4c2e17a9a5c5b134cd5307283  gcc/config/rs6000/aix71.h
  20f4005e48ef1b44aaa1abcda010edb0  gcc/config/rs6000/aix72.h
  f6a351fafc8d9c1ddd46b271f0c859c9  gcc/config/rs6000/aix73.h
*************** ee17a95e2411ef6ef4f1588d17e2cf66  gcc/co
*** 5167,5173 ****
  abeb41de7dfa216c254877ecd48052f1  gcc/config/rs6000/crypto.md
  841aa28da573ce031fe43ae0fb24bfd9  gcc/config/rs6000/darwin.h
  8c9c110a4faa8e47a4c4caef834d7c1d  gcc/config/rs6000/darwin.md
! 3ef696fd19e45e7df0438e794191dfff  gcc/config/rs6000/darwin.opt
  465e67f2fa0bad834639122551e17ab2  gcc/config/rs6000/darwin.opt.urls
  471c1c90d29bbc60848dc1c9b242e893  gcc/config/rs6000/darwin32-biarch.h
  55bc665ef0bfd0b8ede2200d532c97c4  gcc/config/rs6000/darwin64-biarch.h
--- 5169,5175 ----
  abeb41de7dfa216c254877ecd48052f1  gcc/config/rs6000/crypto.md
  841aa28da573ce031fe43ae0fb24bfd9  gcc/config/rs6000/darwin.h
  8c9c110a4faa8e47a4c4caef834d7c1d  gcc/config/rs6000/darwin.md
! 8ef5306087b5e728b308cf63664b051d  gcc/config/rs6000/darwin.opt
  465e67f2fa0bad834639122551e17ab2  gcc/config/rs6000/darwin.opt.urls
  471c1c90d29bbc60848dc1c9b242e893  gcc/config/rs6000/darwin32-biarch.h
  55bc665ef0bfd0b8ede2200d532c97c4  gcc/config/rs6000/darwin64-biarch.h
*************** ce8de9a27f36b759a69194616c02eb38  gcc/co
*** 5248,5255 ****
  afbfbc950d6708ec07548eeef4268905  gcc/config/rs6000/rs6000.cc
  838ab0dea9bee1b30cbf4cb875917f74  gcc/config/rs6000/rs6000.h
  a575dd5c5592c7d23a9b53b985c01120  gcc/config/rs6000/rs6000.md
! a18f1722f90d43e91edd4f704951f50c  gcc/config/rs6000/rs6000.opt
! d46cc498f0b6a0445ba8e61e7054ed20  gcc/config/rs6000/rs6000.opt.urls
  89d4cadf8216efa86b72204e660cc4b0  gcc/config/rs6000/rs64.md
  d57d0eb0a8e2193f5cef2aaf1ad6d722  gcc/config/rs6000/rtems.h
  35eccfb56f965c2de296ac00355253e0  gcc/config/rs6000/secureplt.h
--- 5250,5257 ----
  afbfbc950d6708ec07548eeef4268905  gcc/config/rs6000/rs6000.cc
  838ab0dea9bee1b30cbf4cb875917f74  gcc/config/rs6000/rs6000.h
  a575dd5c5592c7d23a9b53b985c01120  gcc/config/rs6000/rs6000.md
! fc53ceb489fffb4124155c557c54157f  gcc/config/rs6000/rs6000.opt
! 8d1e7c3e054e591cdac1e57832d63b7f  gcc/config/rs6000/rs6000.opt.urls
  89d4cadf8216efa86b72204e660cc4b0  gcc/config/rs6000/rs64.md
  d57d0eb0a8e2193f5cef2aaf1ad6d722  gcc/config/rs6000/rtems.h
  35eccfb56f965c2de296ac00355253e0  gcc/config/rs6000/secureplt.h
*************** b1a1f1ea8636fe96381989b926619397  gcc/co
*** 5258,5265 ****
  016514c870054ecd799330bad9520a9d  gcc/config/rs6000/spu2vmx.h
  0955c6a2d639cf6eaade88aa538b81b8  gcc/config/rs6000/sync.md
  e8c76038df323d77e90f69c78138b1fd  gcc/config/rs6000/sysv4.h
! cb7315d9dc4f288ef4cb92bb573bcfbd  gcc/config/rs6000/sysv4.opt
! 7f522328581e3628376aac8c8887013c  gcc/config/rs6000/sysv4.opt.urls
  70c9ce454104e71a94ca85d02060e59c  gcc/config/rs6000/sysv4le.h
  38641efeb21dd097d73b2d9208aefb09  gcc/config/rs6000/t-aix52
  889ba001a8d4b18df30d57995b9a1e9e  gcc/config/rs6000/t-aix64
--- 5260,5267 ----
  016514c870054ecd799330bad9520a9d  gcc/config/rs6000/spu2vmx.h
  0955c6a2d639cf6eaade88aa538b81b8  gcc/config/rs6000/sync.md
  e8c76038df323d77e90f69c78138b1fd  gcc/config/rs6000/sysv4.h
! e51499a69ac94adadb730c6c5491b97d  gcc/config/rs6000/sysv4.opt
! 0dd83e9726419c15b715507e201b8354  gcc/config/rs6000/sysv4.opt.urls
  70c9ce454104e71a94ca85d02060e59c  gcc/config/rs6000/sysv4le.h
  38641efeb21dd097d73b2d9208aefb09  gcc/config/rs6000/t-aix52
  889ba001a8d4b18df30d57995b9a1e9e  gcc/config/rs6000/t-aix64
*************** e37cfdac5f4b92aac6cd0fbfbb97bd8f  gcc/co
*** 5302,5308 ****
  8fcc5623d6cebfe1cae3796824258927  gcc/config/rs6000/xmmintrin.h
  72e453813ce37399211efaef724554e7  gcc/config/rtems.h
  6a9ab905fd4d638dc60efc778b54c3e0  gcc/config/rtems.opt
! 63d27d06289d5f9814baae9a6feaa996  gcc/config/rtems.opt.urls
  f67f80a8f1bd3161efb391f094501313  gcc/config/rx/constraints.md
  4616a7d31fd4d03afbea82ed634db44a  gcc/config/rx/elf.opt
  495c9b539f4b3f5645b59d1084a92957  gcc/config/rx/elf.opt.urls
--- 5304,5310 ----
  8fcc5623d6cebfe1cae3796824258927  gcc/config/rs6000/xmmintrin.h
  72e453813ce37399211efaef724554e7  gcc/config/rtems.h
  6a9ab905fd4d638dc60efc778b54c3e0  gcc/config/rtems.opt
! a8ed5cd6684f7b30ba53a0dd1dc0da4f  gcc/config/rtems.opt.urls
  f67f80a8f1bd3161efb391f094501313  gcc/config/rx/constraints.md
  4616a7d31fd4d03afbea82ed634db44a  gcc/config/rx/elf.opt
  495c9b539f4b3f5645b59d1084a92957  gcc/config/rx/elf.opt.urls
*************** cc1176df362777967ec78fe3d96e72a2  gcc/co
*** 5314,5321 ****
  ae726748d180fff39a94bdf7ef28615d  gcc/config/rx/rx.cc
  a941959b1d010160d6e46cb0c0688ad7  gcc/config/rx/rx.h
  af202939e77f64a897608f3ee32327c4  gcc/config/rx/rx.md
! db3a1c5717990219716b8cd4baa68d57  gcc/config/rx/rx.opt
! a426ed371d1dfa94041a6af161a28a0c  gcc/config/rx/rx.opt.urls
  032cf36abc28f171fc24229e32796402  gcc/config/rx/t-linux
  1eda7db55de98b3960fa4105d31c529e  gcc/config/rx/t-rx
  03b77d73823fa1f9bfb7143d562835e4  gcc/config/s390/2064.md
--- 5316,5323 ----
  ae726748d180fff39a94bdf7ef28615d  gcc/config/rx/rx.cc
  a941959b1d010160d6e46cb0c0688ad7  gcc/config/rx/rx.h
  af202939e77f64a897608f3ee32327c4  gcc/config/rx/rx.md
! 0329c06217618ce2a83cd6bbd4458da8  gcc/config/rx/rx.opt
! 1823f8ae7b80bcaf2f3428c53ab91c64  gcc/config/rx/rx.opt.urls
  032cf36abc28f171fc24229e32796402  gcc/config/rx/t-linux
  1eda7db55de98b3960fa4105d31c529e  gcc/config/rx/t-rx
  03b77d73823fa1f9bfb7143d562835e4  gcc/config/s390/2064.md
*************** aa396b24681954cbcd0cd64bf19d469c  gcc/co
*** 5347,5354 ****
  2874eaba4ab63b9d68d097ac547defc1  gcc/config/s390/s390.cc
  c945413f70f4d804e12812f916b8d87b  gcc/config/s390/s390.h
  444b1475af5bc7cb791449a4e0359625  gcc/config/s390/s390.md
! afdcf9930ca926ad7f3dcb6c64118ba3  gcc/config/s390/s390.opt
! 21324a6e6f740c5b725bbd086a12a078  gcc/config/s390/s390.opt.urls
  07efe01a921b4fb261d6e59abf21a268  gcc/config/s390/s390intrin.h
  aa64c0eb4310add8b8e0d1bba0537540  gcc/config/s390/s390x.h
  5b66afdee0c1d8a1d41b95cf731492ac  gcc/config/s390/subst.md
--- 5349,5356 ----
  2874eaba4ab63b9d68d097ac547defc1  gcc/config/s390/s390.cc
  c945413f70f4d804e12812f916b8d87b  gcc/config/s390/s390.h
  444b1475af5bc7cb791449a4e0359625  gcc/config/s390/s390.md
! ae1754efd7785ad08c6cc930dd08c7ae  gcc/config/s390/s390.opt
! 90a97a731513f3119bb12e022497e9ab  gcc/config/s390/s390.opt.urls
  07efe01a921b4fb261d6e59abf21a268  gcc/config/s390/s390intrin.h
  aa64c0eb4310add8b8e0d1bba0537540  gcc/config/s390/s390x.h
  5b66afdee0c1d8a1d41b95cf731492ac  gcc/config/s390/subst.md
*************** aa64c0eb4310add8b8e0d1bba0537540  gcc/co
*** 5356,5363 ****
  16ce1fc97d4445d3e77bc0f8be121c6a  gcc/config/s390/t-s390
  1a98dd23822e07fe6f355626f930b7c3  gcc/config/s390/tpf.h
  3c4521f48b40967fc37e74e960257cb8  gcc/config/s390/tpf.md
! 1dc2db872da7e5589149bcf19db265b1  gcc/config/s390/tpf.opt
! 34c54b547202715f11db388829243402  gcc/config/s390/tpf.opt.urls
  6e57eb27fae922ae85136ef1822dd1c6  gcc/config/s390/vecintrin.h
  e8b75f93abf4433fa4697e458ba8d736  gcc/config/s390/vector.md
  b678ee5bccc44afcfafc641ff868a547  gcc/config/s390/vx-builtins.md
--- 5358,5365 ----
  16ce1fc97d4445d3e77bc0f8be121c6a  gcc/config/s390/t-s390
  1a98dd23822e07fe6f355626f930b7c3  gcc/config/s390/tpf.h
  3c4521f48b40967fc37e74e960257cb8  gcc/config/s390/tpf.md
! f5e56d5ff903f46152f37df8bef42eb8  gcc/config/s390/tpf.opt
! 7f0f09b66533c13922e5fc6da2950d60  gcc/config/s390/tpf.opt.urls
  6e57eb27fae922ae85136ef1822dd1c6  gcc/config/s390/vecintrin.h
  e8b75f93abf4433fa4697e458ba8d736  gcc/config/s390/vector.md
  b678ee5bccc44afcfafc641ff868a547  gcc/config/s390/vx-builtins.md
*************** fb8513c0c66fb1a6e8d5cde7b08975c5  gcc/co
*** 5383,5390 ****
  67a2d7b88e15f48d7d66fe63c810b635  gcc/config/sh/sh.cc
  de5433ad4ca4e28cd54d4ff7e2862435  gcc/config/sh/sh.h
  4d09c48cdaa1d61ff15475e4604442ea  gcc/config/sh/sh.md
! 4eebdb5a081598aa8184742f9119b19c  gcc/config/sh/sh.opt
! ca21eab48fde6654a92d33174c7c3a73  gcc/config/sh/sh.opt.urls
  95f5ec03805045e1d73c1e77a70ac975  gcc/config/sh/sh1.md
  f7f855e92d56b1d5449835012d70c86b  gcc/config/sh/sh4-300.md
  fe9e266cedb0e7598f71d98357d80284  gcc/config/sh/sh4.md
--- 5385,5392 ----
  67a2d7b88e15f48d7d66fe63c810b635  gcc/config/sh/sh.cc
  de5433ad4ca4e28cd54d4ff7e2862435  gcc/config/sh/sh.h
  4d09c48cdaa1d61ff15475e4604442ea  gcc/config/sh/sh.md
! 10ed22d9ca9d7ec14fcf6b1a936fbf8d  gcc/config/sh/sh.opt
! 91c8fef4a8f6144843c56e928fed09f7  gcc/config/sh/sh.opt.urls
  95f5ec03805045e1d73c1e77a70ac975  gcc/config/sh/sh1.md
  f7f855e92d56b1d5449835012d70c86b  gcc/config/sh/sh4-300.md
  fe9e266cedb0e7598f71d98357d80284  gcc/config/sh/sh4.md
*************** f8b2917f3bac10c9a81564048cb3f9f6  gcc/co
*** 5411,5428 ****
  0aea82043a2789e23591a9cf906946d3  gcc/config/sol2.cc
  7fe617504e2cd89c4e419a886e5f1b48  gcc/config/sol2.h
  a3e05cf44f1642f41e92d74831e44995  gcc/config/sol2.opt
! 714fd827cfd0d250f642639930eee093  gcc/config/sol2.opt.urls
  9b6245dbf34b906e35664b2135d3d709  gcc/config/sparc/biarch64.h
  818ae981defa95f6482131d6f51ac789  gcc/config/sparc/constraints.md
  bc82d702b596981bb91f981bbbc6233c  gcc/config/sparc/cypress.md
  e45de214cf1939cc532d11bc572c1f50  gcc/config/sparc/default64.h
  ec8945a03b75df608d0200a2fab4849e  gcc/config/sparc/driver-sparc.cc
! 2106fb85b27cddf30110aec4ea5520c6  gcc/config/sparc/freebsd.h
  76eaed7e11b7466b1d7f3909f63ebbf5  gcc/config/sparc/hypersparc.md
  317a3821a6e057d7e79a896e8aefa285  gcc/config/sparc/leon.md
  ddd74ec4e215155b9bd7fcf86cb557d3  gcc/config/sparc/leon5.md
! a76b667568a2fd591eb3da6a95086cc5  gcc/config/sparc/linux.h
! f56a44e18a168abf023148dde0e785e4  gcc/config/sparc/linux64.h
  d8eefec8a2e47b94d9630ff012104529  gcc/config/sparc/long-double-switch.opt
  4d77ec43ed4c960c7b17df26f8ad8add  gcc/config/sparc/long-double-switch.opt.urls
  e9a80477655a2f8a6508f965d1561c04  gcc/config/sparc/m8.md
--- 5413,5430 ----
  0aea82043a2789e23591a9cf906946d3  gcc/config/sol2.cc
  7fe617504e2cd89c4e419a886e5f1b48  gcc/config/sol2.h
  a3e05cf44f1642f41e92d74831e44995  gcc/config/sol2.opt
! c0886a1ebdf6bfb65128d60974a8a2f2  gcc/config/sol2.opt.urls
  9b6245dbf34b906e35664b2135d3d709  gcc/config/sparc/biarch64.h
  818ae981defa95f6482131d6f51ac789  gcc/config/sparc/constraints.md
  bc82d702b596981bb91f981bbbc6233c  gcc/config/sparc/cypress.md
  e45de214cf1939cc532d11bc572c1f50  gcc/config/sparc/default64.h
  ec8945a03b75df608d0200a2fab4849e  gcc/config/sparc/driver-sparc.cc
! ec18494fb2f7b84b3cfd91563d0c15f9  gcc/config/sparc/freebsd.h
  76eaed7e11b7466b1d7f3909f63ebbf5  gcc/config/sparc/hypersparc.md
  317a3821a6e057d7e79a896e8aefa285  gcc/config/sparc/leon.md
  ddd74ec4e215155b9bd7fcf86cb557d3  gcc/config/sparc/leon5.md
! e7283cc71135321f648a2d8b735fd198  gcc/config/sparc/linux.h
! 3e14e90bc54d72b05ed06f3dbf24fcac  gcc/config/sparc/linux64.h
  d8eefec8a2e47b94d9630ff012104529  gcc/config/sparc/long-double-switch.opt
  4d77ec43ed4c960c7b17df26f8ad8add  gcc/config/sparc/long-double-switch.opt.urls
  e9a80477655a2f8a6508f965d1561c04  gcc/config/sparc/m8.md
*************** a1c9987d514eacbf834fccc97fef96d2  gcc/co
*** 5435,5441 ****
  64fe279e7a27fef34a421155ee183359  gcc/config/sparc/openbsd64.h
  2becc8854942c6d1c3d3dd32d69fbe75  gcc/config/sparc/predicates.md
  0e3ca8313908d01701f4bca0bbe21809  gcc/config/sparc/rtemself.h
! 9c677479494778f2b04e4506f0b24c19  gcc/config/sparc/sol2.h
  658e923ccceee24531666bb5c16ba3bd  gcc/config/sparc/sp-elf.h
  1044ce82c4661c68f92349547f5431d1  gcc/config/sparc/sp64-elf.h
  00ea42a9d0e99fa77faecdc46e0a1c44  gcc/config/sparc/sparc-c.cc
--- 5437,5443 ----
  64fe279e7a27fef34a421155ee183359  gcc/config/sparc/openbsd64.h
  2becc8854942c6d1c3d3dd32d69fbe75  gcc/config/sparc/predicates.md
  0e3ca8313908d01701f4bca0bbe21809  gcc/config/sparc/rtemself.h
! 7218d95589bb4a7f5aa2a3063e9aa0e8  gcc/config/sparc/sol2.h
  658e923ccceee24531666bb5c16ba3bd  gcc/config/sparc/sp-elf.h
  1044ce82c4661c68f92349547f5431d1  gcc/config/sparc/sp64-elf.h
  00ea42a9d0e99fa77faecdc46e0a1c44  gcc/config/sparc/sparc-c.cc
*************** c08812561648d9be8b2c465101f02f55  gcc/co
*** 5445,5455 ****
  0e6d2d27c24d8850325e5f39541238c9  gcc/config/sparc/sparc-opts.h
  710bcf4b6ac9924f665a6ed578c037f2  gcc/config/sparc/sparc-passes.def
  24d69dfb87c13754d1f394397cf82632  gcc/config/sparc/sparc-protos.h
! cc346672b41fd54100b4631c82c65c87  gcc/config/sparc/sparc.cc
! 36fd4b289d933febeb21a05fd6113f60  gcc/config/sparc/sparc.h
! a8a9389a82af1fc4c6e905c766600650  gcc/config/sparc/sparc.md
  d35b9f07de59a46cdbdd2bfb5aefaa3e  gcc/config/sparc/sparc.opt
! 7ff9e17b6f09214676df797c8319a497  gcc/config/sparc/sparc.opt.urls
  9f81c8d12f43312c44cdc761076ad0bc  gcc/config/sparc/sparclet.md
  a7407ca22825387cdc231ae6e63d1e81  gcc/config/sparc/supersparc.md
  08a50a355fea2f1c48da944343f27c90  gcc/config/sparc/sync.md
--- 5447,5457 ----
  0e6d2d27c24d8850325e5f39541238c9  gcc/config/sparc/sparc-opts.h
  710bcf4b6ac9924f665a6ed578c037f2  gcc/config/sparc/sparc-passes.def
  24d69dfb87c13754d1f394397cf82632  gcc/config/sparc/sparc-protos.h
! 4aa1dff3885ce113dbe0d29d0a9959f0  gcc/config/sparc/sparc.cc
! 358486046ade8fd892a884aef662715d  gcc/config/sparc/sparc.h
! 6a687fd90e794e412fd74f87944a0cc8  gcc/config/sparc/sparc.md
  d35b9f07de59a46cdbdd2bfb5aefaa3e  gcc/config/sparc/sparc.opt
! 7989b30c48125e3c3acf6b37e76bd44f  gcc/config/sparc/sparc.opt.urls
  9f81c8d12f43312c44cdc761076ad0bc  gcc/config/sparc/sparclet.md
  a7407ca22825387cdc231ae6e63d1e81  gcc/config/sparc/supersparc.md
  08a50a355fea2f1c48da944343f27c90  gcc/config/sparc/sync.md
*************** c90feae4dc229fd768d6878a76dfdaf3  gcc/co
*** 5512,5523 ****
  06dccda38b7e87c7353448e1074cb5b3  gcc/config/v850/v850.cc
  08cf605028683a2d3dbca9f092c2c8bb  gcc/config/v850/v850.h
  b629ef0cf84f9ef283531894fedaafd4  gcc/config/v850/v850.md
! 1cab48679bb0d88873575dfb59e55466  gcc/config/v850/v850.opt
! cc745ac54041dcd561dc8b894c6423af  gcc/config/v850/v850.opt.urls
  b55a79e904d7bbb3894641908def0bc7  gcc/config/vax/builtins.md
  0884e1ab0679a8f449e7ede0b4ace6e7  gcc/config/vax/constraints.md
  17424c78d2c99dfdedc917b9c3b95ac7  gcc/config/vax/elf.h
! 9f61aa213a67d680e351f029c07f4046  gcc/config/vax/elf.opt
  ffe8c3dbf2e5ade855212ca387dfd0ac  gcc/config/vax/elf.opt.urls
  c684a36c8d565777dc40e1ae3ba54892  gcc/config/vax/linux.h
  9726a6591936975a3c7b06146ea94b6e  gcc/config/vax/netbsd-elf.h
--- 5514,5525 ----
  06dccda38b7e87c7353448e1074cb5b3  gcc/config/v850/v850.cc
  08cf605028683a2d3dbca9f092c2c8bb  gcc/config/v850/v850.h
  b629ef0cf84f9ef283531894fedaafd4  gcc/config/v850/v850.md
! e8ebe9a5424ed0ffed76cc88afcd41a4  gcc/config/v850/v850.opt
! 33a2c1a7efd99fed074b6e8bef8e0d75  gcc/config/v850/v850.opt.urls
  b55a79e904d7bbb3894641908def0bc7  gcc/config/vax/builtins.md
  0884e1ab0679a8f449e7ede0b4ace6e7  gcc/config/vax/constraints.md
  17424c78d2c99dfdedc917b9c3b95ac7  gcc/config/vax/elf.h
! 466afbb0aa9b805023728e566c8e55e5  gcc/config/vax/elf.opt
  ffe8c3dbf2e5ade855212ca387dfd0ac  gcc/config/vax/elf.opt.urls
  c684a36c8d565777dc40e1ae3ba54892  gcc/config/vax/linux.h
  9726a6591936975a3c7b06146ea94b6e  gcc/config/vax/netbsd-elf.h
*************** e330137b852b8bc5bc7ba14d58094399  gcc/co
*** 5530,5536 ****
  fb9ccdbabb11cadb867f4a1b06d19211  gcc/config/vax/vax.h
  7115d5e1b893a9248a6df26b34e64edb  gcc/config/vax/vax.md
  c7013330181453774d802642df37d913  gcc/config/vax/vax.opt
! 3308df8b4869da439d89972a63ceb7c5  gcc/config/vax/vax.opt.urls
  f3e64f50532fcd26c0ddd45f2a5ba1ca  gcc/config/visium/constraints.md
  dcf10059c5ded1ecbf1dd22a55284cb5  gcc/config/visium/elf.h
  30a28c7956b8371fe34677b89bcc5a56  gcc/config/visium/gr5.md
--- 5532,5538 ----
  fb9ccdbabb11cadb867f4a1b06d19211  gcc/config/vax/vax.h
  7115d5e1b893a9248a6df26b34e64edb  gcc/config/vax/vax.md
  c7013330181453774d802642df37d913  gcc/config/vax/vax.opt
! 6b9aaec7f058b5b0ddbc9c5cd1f028c3  gcc/config/vax/vax.opt.urls
  f3e64f50532fcd26c0ddd45f2a5ba1ca  gcc/config/visium/constraints.md
  dcf10059c5ded1ecbf1dd22a55284cb5  gcc/config/visium/elf.h
  30a28c7956b8371fe34677b89bcc5a56  gcc/config/visium/gr5.md
*************** f8a0009eac88f5ab515601ae54b55cb1  gcc/co
*** 5544,5550 ****
  822831e7b5f292deaee34d44008ce23a  gcc/config/visium/visium.cc
  328d4024b64b9a4b2f4203f0f80e02b6  gcc/config/visium/visium.h
  104eb550ddf9cc976851bd4d1e3e9d7d  gcc/config/visium/visium.md
! 32f71f204ebea589969f01c7b5c3787b  gcc/config/visium/visium.opt
  7a0d924f742d55d1f16c844de561f075  gcc/config/visium/visium.opt.urls
  aa7aaadd68d34888760a4211e46f08aa  gcc/config/vms/make-crtlmap.awk
  45d0e4dd9c352329976ea74a927e1147  gcc/config/vms/t-vms
--- 5546,5552 ----
  822831e7b5f292deaee34d44008ce23a  gcc/config/visium/visium.cc
  328d4024b64b9a4b2f4203f0f80e02b6  gcc/config/visium/visium.h
  104eb550ddf9cc976851bd4d1e3e9d7d  gcc/config/visium/visium.md
! 3cff36cc3705e28c0fe358569d10ed56  gcc/config/visium/visium.opt
  7a0d924f742d55d1f16c844de561f075  gcc/config/visium/visium.opt.urls
  aa7aaadd68d34888760a4211e46f08aa  gcc/config/vms/make-crtlmap.awk
  45d0e4dd9c352329976ea74a927e1147  gcc/config/vms/t-vms
*************** e98fe0b0d84ec790b9f655d1674e58dc  gcc/co
*** 5559,5565 ****
  f2caf80293ce10d06176ef71e44c8b0c  gcc/config/vms/vms-stdint.h
  69741391f9975d09233f411c486fc261  gcc/config/vms/vms.cc
  76eb950dc973b4807d828a286ecab3ea  gcc/config/vms/vms.h
! 1d2b93da32dded922d5410054852cce0  gcc/config/vms/vms.opt
  4cc4a480573474816840755220793eea  gcc/config/vms/vms.opt.urls
  0131ec30118dce0e850f95bd56d74733  gcc/config/vms/x-vms
  1739b1102621ee9bb19b4b21262af91f  gcc/config/vms/xm-vms.h
--- 5561,5567 ----
  f2caf80293ce10d06176ef71e44c8b0c  gcc/config/vms/vms-stdint.h
  69741391f9975d09233f411c486fc261  gcc/config/vms/vms.cc
  76eb950dc973b4807d828a286ecab3ea  gcc/config/vms/vms.h
! 14a81459406b3ea6d3e25c68905a2295  gcc/config/vms/vms.opt
  4cc4a480573474816840755220793eea  gcc/config/vms/vms.opt.urls
  0131ec30118dce0e850f95bd56d74733  gcc/config/vms/x-vms
  1739b1102621ee9bb19b4b21262af91f  gcc/config/vms/xm-vms.h
*************** efe651fefed822acd4237bb025cb3565  gcc/co
*** 5574,5580 ****
  593a177aa59bd59157c21460946e04ab  gcc/config/vxworks.cc
  0a5b4e36490dd463718f4d33722b25c2  gcc/config/vxworks.h
  debf4738e76f8015e074d08e09ec4879  gcc/config/vxworks.opt
! 3452aecee51149d81f83ff52b39acead  gcc/config/vxworks.opt.urls
  36a893b52ae4d79dd9eb41107ead34be  gcc/config/vxworks/_vxworks-versions.h
  2c7fb7482d87758a9305ce4fec4c94ea  gcc/config/vxworks/_yvals-wrapper.h
  83f08d69839ac4c7dc87a99be6c69a2b  gcc/config/vxworks/_yvals.h
--- 5576,5582 ----
  593a177aa59bd59157c21460946e04ab  gcc/config/vxworks.cc
  0a5b4e36490dd463718f4d33722b25c2  gcc/config/vxworks.h
  debf4738e76f8015e074d08e09ec4879  gcc/config/vxworks.opt
! 9769aed7c4ddd277f27419583c35a522  gcc/config/vxworks.opt.urls
  36a893b52ae4d79dd9eb41107ead34be  gcc/config/vxworks/_vxworks-versions.h
  2c7fb7482d87758a9305ce4fec4c94ea  gcc/config/vxworks/_yvals-wrapper.h
  83f08d69839ac4c7dc87a99be6c69a2b  gcc/config/vxworks/_yvals.h
*************** a219c55e070e157b7e641e6e777efedc  gcc/co
*** 5589,5594 ****
--- 5591,5597 ----
  3cb868c65fb9ce79204c1d3a4f5b7986  gcc/config/winnt-rust.cc
  5cc0a69d6149e22cb7ea38c2206a2af3  gcc/config/x-cflags-O1
  459b5094b535d46dc221505b9407603b  gcc/config/x-darwin
+ c95bdaddf0553f4e23f345c8662b75f7  gcc/config/x-freebsd
  6f4ad358c209ab9f624d9537b4f0be78  gcc/config/x-hpux
  27f861c423e98f281006be5bd86283ef  gcc/config/x-linux
  17f9168a86db5596e32e2a9091f99d7f  gcc/config/x-netbsd
*************** d1f0574334c3415c01f4bf5316d1db02  gcc/co
*** 5602,5608 ****
  9285338d5a521a6e3491cd5697e5c2f6  gcc/config/xtensa/predicates.md
  d7ad137d80301227f4b8b064f7daaf29  gcc/config/xtensa/t-xtensa
  b9d32ba32a1d5a0ba75c688198f72ff8  gcc/config/xtensa/uclinux.h
! 85c01da4bb230878cec3d33a5ee09a4d  gcc/config/xtensa/uclinux.opt
  83fbfe1c588f31edbd8e4a77807087fb  gcc/config/xtensa/uclinux.opt.urls
  6ffda24346906b56c23b732dee11ec56  gcc/config/xtensa/xtensa-dynconfig.cc
  9a9ea234526c2b6ec2dde5659d16935c  gcc/config/xtensa/xtensa-opts.h
--- 5605,5611 ----
  9285338d5a521a6e3491cd5697e5c2f6  gcc/config/xtensa/predicates.md
  d7ad137d80301227f4b8b064f7daaf29  gcc/config/xtensa/t-xtensa
  b9d32ba32a1d5a0ba75c688198f72ff8  gcc/config/xtensa/uclinux.h
! dbd5811fcd8a1caf49e4e9091afdc18c  gcc/config/xtensa/uclinux.opt
  83fbfe1c588f31edbd8e4a77807087fb  gcc/config/xtensa/uclinux.opt.urls
  6ffda24346906b56c23b732dee11ec56  gcc/config/xtensa/xtensa-dynconfig.cc
  9a9ea234526c2b6ec2dde5659d16935c  gcc/config/xtensa/xtensa-opts.h
*************** a231b8dcedff0ce87223fbe871f45021  gcc/co
*** 5611,5620 ****
  9cbe8086eb269277f7af9e9df8866802  gcc/config/xtensa/xtensa.cc
  c60f07bed189e2a8fb8abfe19368e9f9  gcc/config/xtensa/xtensa.h
  2341d28c3ca91d40bbe37ba41a733448  gcc/config/xtensa/xtensa.md
! 9e6ba36c473af09e3679080d1cb72a3c  gcc/config/xtensa/xtensa.opt
  db57d7603312357e8c0cfb21c32353d1  gcc/config/xtensa/xtensa.opt.urls
! 9be312182b34a64ecbdaf0cf961549c6  gcc/configure
! 8a161ae94b14f1fee8f7daed10518324  gcc/configure.ac
  1f52ef379dc4198df7f2c7ab63c8b70e  gcc/configure.tgt
  8a46839a73059f70ef105be9706c2554  gcc/context.cc
  08023c1005def168a8b675813b95d9f4  gcc/context.h
--- 5614,5623 ----
  9cbe8086eb269277f7af9e9df8866802  gcc/config/xtensa/xtensa.cc
  c60f07bed189e2a8fb8abfe19368e9f9  gcc/config/xtensa/xtensa.h
  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
*************** c5ad0142a191862e3e81ecd3573754b3  gcc/co
*** 5625,5631 ****
  55a33ae415bde0fd2e36ba584894e50b  gcc/coroutine-passes.cc
  7c2ad47e271f9b832badf1740a09c77e  gcc/coverage.cc
  8524318f81a8af8cfaa8d35966d8fdc2  gcc/coverage.h
! 38fee2537ca44d84dbae4945e32b1dc6  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
--- 5628,5634 ----
  55a33ae415bde0fd2e36ba584894e50b  gcc/coroutine-passes.cc
  7c2ad47e271f9b832badf1740a09c77e  gcc/coverage.cc
  8524318f81a8af8cfaa8d35966d8fdc2  gcc/coverage.h
! d8eb0ff0c5864b683fca5349ba0d7ad4  gcc/cp/ChangeLog
  70c059f2b75a2fc1bb95a526b21b8cd7  gcc/cp/ChangeLog-1993
  7cbd106e10a0ba7c052bee3fe20671c2  gcc/cp/ChangeLog-1994
  3b1e3ed23ad4363f75e6fd2fbb583dee  gcc/cp/ChangeLog-1995
*************** bcf7c5d02934e40f17edeb18d58c4d4d  gcc/cp
*** 5661,5728 ****
  f39635970f98bbc4591f6363fe70504b  gcc/cp/ChangeLog-2025
  c1c7801b9b0f379e702a4f6cb83972e7  gcc/cp/ChangeLog.ptr
  9aa3cd9f75c785de9f51446e3f295515  gcc/cp/ChangeLog.tree-ssa
! c71ee7974305e9c1f9cb02cac21455a4  gcc/cp/Make-lang.in
! 383c5fa2df03c25f978ef8320cbb7e5d  gcc/cp/call.cc
  144dd1ae510a7436b569b007470b62da  gcc/cp/cfns.gperf
  39dd4c5a96c7ea132eb3c7ed039a065e  gcc/cp/cfns.h
! 440d46b907e572f805c01dca892b719a  gcc/cp/class.cc
! 7e29ac7b2bbdddcb2361c2e4a39cf91d  gcc/cp/config-lang.in
! cddbc22a16068bc30210f31e7bd210aa  gcc/cp/constexpr.cc
! 3e67469baa4ecb608abd2307ad172588  gcc/cp/constraint.cc
  a64fe7cc5ccde7066aea6b97c300a103  gcc/cp/contracts.cc
  8879da565f6e94b207c0df0a49c8178d  gcc/cp/contracts.h
! f160f037e979da7caa04db7ad8db7234  gcc/cp/coroutines.cc
  1817def94193f0cfabd4fa5b321af011  gcc/cp/coroutines.h
! 0700447ba9109c489557236b1eea78fc  gcc/cp/cp-gimplify.cc
  9e1ca3d04fdc65b5e7817d5ca8e96146  gcc/cp/cp-lang.cc
  1a3e309babdfdd0ff5e03d09e6b5870d  gcc/cp/cp-name-hint.h
! 14d7bef02a92dd40b9fb1f4480303034  gcc/cp/cp-objcp-common.cc
  370b42bcdf211125186c37665052c30c  gcc/cp/cp-objcp-common.h
! 99f4b67f8ef26f58f35166be5ae39170  gcc/cp/cp-trait.def
! f0658a23973205c9426ffc664f9e10c1  gcc/cp/cp-tree.def
! 4137f8cb07d7935c14a16a75faed0214  gcc/cp/cp-tree.h
  e2854dfa428fab45fc41bf58fef71e61  gcc/cp/cp-ubsan.cc
! c95f3acc7a4e28b424f5aab353b3d116  gcc/cp/cvt.cc
! d3b511fdc206a8853cbd32baa492e292  gcc/cp/cxx-pretty-print.cc
  1d04eec9859d91686ca501e9221f30ac  gcc/cp/cxx-pretty-print.h
  82a41d873e1c90067158c89e6c1bd4bb  gcc/cp/cxxapi-data.csv
! 1f9c33ad11eafb3e25c7e96eeb5d98a1  gcc/cp/decl.cc
  6b0c9433f7d3f129a44b59d54babb4eb  gcc/cp/decl.h
! ddee710dc7717680bde449ea807af2ad  gcc/cp/decl2.cc
  12ccd5244973d74a0536adf58261b416  gcc/cp/dump.cc
! 7a5a259501d384b8641e71312ca468a4  gcc/cp/error.cc
  59d3d272a504a462c1f7081637e7f3e5  gcc/cp/except.cc
  70f36ac126d5a18ee7be5d40cf58c2c9  gcc/cp/expr.cc
  447ddbe59eba62b9a389b9ba11701cfc  gcc/cp/friend.cc
  014d3891b4172014c0ad5386223c4f4c  gcc/cp/g++spec.cc
  a29b3e9192657e81a1574fb99466348d  gcc/cp/gen-cxxapi-file.py
! 4679a129b0a165b0bd1b9937cf391666  gcc/cp/init.cc
  dcc164c09c53fdba9fb51ac5bc9d2710  gcc/cp/lambda.cc
  bc388fb8287f2de7cdf4d78eb8f5d998  gcc/cp/lang-specs.h
! b7d55920c9138f5282037c81a5654355  gcc/cp/lex.cc
  e4ccdd9cbe95dde4cce27394a7613dd9  gcc/cp/logic.cc
! bc4bdecb50b56da6d295f4504eb153ba  gcc/cp/mangle.cc
  3d68343c4a9d614bb00b91ad53e79a0b  gcc/cp/mapper-client.cc
  27465babcaf6195d4f438ed36bdd6aff  gcc/cp/mapper-client.h
  4be7487ea09330ba02fb0695bc32c905  gcc/cp/mapper-resolver.cc
! ec65b1d710e2bfa80232bcbd39b7b0c5  gcc/cp/method.cc
! 9de6a2092245fb9cea4ed4bd80ecea73  gcc/cp/module.cc
! 87bd0b5c70141f74b88978609b40c1eb  gcc/cp/name-lookup.cc
  00ce2aa60b041d84cd6cdcd75cb30271  gcc/cp/name-lookup.h
! 69424bc70704122b31cd493a0fd5cdd6  gcc/cp/operators.def
  9efebf39da56d681d4405dfb9e55e3f5  gcc/cp/optimize.cc
! b9fa88c6ae01d33d33e88a5b1d0e23ab  gcc/cp/parser.cc
  7973a34c47e3d3c580832655a3a5c3c2  gcc/cp/parser.h
! 510e3f7eda4dfc924b391d595b4e86fc  gcc/cp/pt.cc
  25322928eaff39cf167372554c639e02  gcc/cp/ptree.cc
  97df067b24bdcb46ea1a2ca984c26a33  gcc/cp/rtti.cc
! ffb187ecec9980c57512b0c07dc0ad01  gcc/cp/search.cc
! 32b2db1f500c222ba9d51f38cf3c3ce6  gcc/cp/semantics.cc
  64c36b2ea66c9f8f477b19d24e06a2cb  gcc/cp/std-name-hint.gperf
  15cc409f13a8952feb90e94d99ecefa2  gcc/cp/std-name-hint.h
! 56b24663242adaa217aaa6bbf5fb982f  gcc/cp/tree.cc
  01e9a381e6fcf3d016d0170ee0ad71d7  gcc/cp/type-utils.h
! 7b89a2a92181bee121ecf349ed1f8602  gcc/cp/typeck.cc
  fa2059a62914b51814221a48ce5dec3a  gcc/cp/typeck2.cc
  12d19e5abc1e436004b8885cde4765f0  gcc/cp/vtable-class-hierarchy.cc
  556f791fb43a25890d32717884f67cd1  gcc/cppbuiltin.cc
--- 5664,5734 ----
  f39635970f98bbc4591f6363fe70504b  gcc/cp/ChangeLog-2025
  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
! 5dbb1d3fe13e2d5cdd00aa4a228a41f6  gcc/cp/class.cc
! e51f295e858583af5f9cf88b9530adf7  gcc/cp/config-lang.in
! 03017b40beb05674e252bb00b1392e8f  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
! 25bec934feeda249eb98cb8617eb534d  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
! 1bca2f9d6892e98a7b6585d563412a18  gcc/cp/decl2.cc
  12ccd5244973d74a0536adf58261b416  gcc/cp/dump.cc
! 1be2f9764d51e88964ee290314f203a1  gcc/cp/error.cc
  59d3d272a504a462c1f7081637e7f3e5  gcc/cp/except.cc
  70f36ac126d5a18ee7be5d40cf58c2c9  gcc/cp/expr.cc
  447ddbe59eba62b9a389b9ba11701cfc  gcc/cp/friend.cc
  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
! a7f156860f6d3903ea3db9960f8f3cd9  gcc/cp/mangle.cc
  3d68343c4a9d614bb00b91ad53e79a0b  gcc/cp/mapper-client.cc
  27465babcaf6195d4f438ed36bdd6aff  gcc/cp/mapper-client.h
  4be7487ea09330ba02fb0695bc32c905  gcc/cp/mapper-resolver.cc
! dbe7f85bef21f77e4dfb595f46c84491  gcc/cp/metafns.gperf
! 1d59a5b63998591cb8eac5b9581b7556  gcc/cp/metafns.h
! 99dcd5706d056d3c446e2d90d8060632  gcc/cp/method.cc
! 7461d63cc03067885d58c224b25bb8d7  gcc/cp/module.cc
! 01cd575c95be317ed15b7f0e0009434c  gcc/cp/name-lookup.cc
  00ce2aa60b041d84cd6cdcd75cb30271  gcc/cp/name-lookup.h
! b98d31c57aa038618db60991b17e0d35  gcc/cp/operators.def
  9efebf39da56d681d4405dfb9e55e3f5  gcc/cp/optimize.cc
! e6e5f975bbd74ee146a1dedf9f2b64b3  gcc/cp/parser.cc
  7973a34c47e3d3c580832655a3a5c3c2  gcc/cp/parser.h
! e1d4b6e8dc1b80d20ae7efe8767d5e39  gcc/cp/pt.cc
  25322928eaff39cf167372554c639e02  gcc/cp/ptree.cc
+ 1eaf0da3c5a5974f0fa039389f4864a0  gcc/cp/reflect.cc
  97df067b24bdcb46ea1a2ca984c26a33  gcc/cp/rtti.cc
! b9408f726725803049cb0278946364b9  gcc/cp/search.cc
! 2d26600599a1e1dca260684fdfa6105c  gcc/cp/semantics.cc
  64c36b2ea66c9f8f477b19d24e06a2cb  gcc/cp/std-name-hint.gperf
  15cc409f13a8952feb90e94d99ecefa2  gcc/cp/std-name-hint.h
! 8e816da0a83632e0796dac4801805570  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
*************** c7362bfcde6697a2d4479f37eb016010  gcc/db
*** 6007,6013 ****
  f03ba47b25bafaac3f55372667e49d7c  gcc/ddg.h
  fc9508a813d61f77432f8e52b0a237ee  gcc/debug.cc
  cd6813f98d48b81321bcd8927ab8331a  gcc/debug.h
! 7391b58560096326672a8181c2b7e498  gcc/defaults.h
  e9fa9536951db6e9abcb8db4a451ec79  gcc/dep-fusion.cc
  aa5b6daea5bb76571584ecd5c953cb2b  gcc/df-core.cc
  dc4e9b2936fd89e9bbb64758de3ebb16  gcc/df-problems.cc
--- 6013,6019 ----
  f03ba47b25bafaac3f55372667e49d7c  gcc/ddg.h
  fc9508a813d61f77432f8e52b0a237ee  gcc/debug.cc
  cd6813f98d48b81321bcd8927ab8331a  gcc/debug.h
! f2f75ccf17260675395d4d9f0e1dc7a4  gcc/defaults.h
  e9fa9536951db6e9abcb8db4a451ec79  gcc/dep-fusion.cc
  aa5b6daea5bb76571584ecd5c953cb2b  gcc/df-core.cc
  dc4e9b2936fd89e9bbb64758de3ebb16  gcc/df-problems.cc
*************** ee65c9e3e7c3fb1fd0128c23f4130e51  gcc/do
*** 6105,6111 ****
  301ed7e567732d1f0d5899a624068bdd  gcc/doc/cppinternals.texi
  83be088f2c39877aca4c1c22345a4626  gcc/doc/cppopts.texi
  a81171f3f74292eb0bfae02a153da3b1  gcc/doc/cppwarnopts.texi
! a2efc42a2ad0b1e4fe927cb8836f68f2  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
  83be088f2c39877aca4c1c22345a4626  gcc/doc/cppopts.texi
  a81171f3f74292eb0bfae02a153da3b1  gcc/doc/cppwarnopts.texi
! cca0c31e607254535ee4e617ed7fabdb  gcc/doc/extend.texi
  483a7b956113f0370528460e842ff7b0  gcc/doc/fragments.texi
  7fb1e4199b2e70228fda69b8065d83c4  gcc/doc/frontends.texi
  23b032ef72e5208469d1a736f460b6a1  gcc/doc/gcc.texi
*************** f47d236d7ee7e48319a13461771035d6  gcc/do
*** 6129,6135 ****
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
  56c2841adbededa23954430aa287e021  gcc/doc/install.texi
  30a2209eee0a2bed76e2d9ff3bd646f2  gcc/doc/install.texi2html
! 15947ed95d66f20285df0bc2952c3a78  gcc/doc/invoke.texi
  dd9d4097ebfa9e936c41913343807268  gcc/doc/languages.texi
  46d2bbbd37002bb71569d0b1f27d7a5a  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
--- 6135,6141 ----
  e9b8122841fbfbbc30fee8ed6613c399  gcc/doc/include/texinfo.tex
  56c2841adbededa23954430aa287e021  gcc/doc/install.texi
  30a2209eee0a2bed76e2d9ff3bd646f2  gcc/doc/install.texi2html
! 9427c7e3c64390a6259b2c1521f3ffb5  gcc/doc/invoke.texi
  dd9d4097ebfa9e936c41913343807268  gcc/doc/languages.texi
  46d2bbbd37002bb71569d0b1f27d7a5a  gcc/doc/libgcc.texi
  ef4f00c423089323edef1d3cff31a4a2  gcc/doc/libgdiagnostics/Makefile
*************** df86d4116f050c5e09b21441b286f26c  gcc/dw
*** 6206,6212 ****
  2d9cf6bbe6a4ec143049dcca966ba581  gcc/dwarf2codeview.h
  a6c484f3c915c3d2ca47c185e95fbba4  gcc/dwarf2ctf.cc
  6c4236fa6ead686398b8d5e7f89f8118  gcc/dwarf2ctf.h
! 002957d998f3be648f71ed7691465e75  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
! 349885d101640a964118a23e3276abaa  gcc/dwarf2out.cc
  5df3b4a58dc58c2bfafddd393d55496b  gcc/dwarf2out.h
  5f6d1c1c6b68b50c4051ffa41f4aed26  gcc/early-remat.cc
  db4d79959e99b05eb2b5704c5e7c3bcb  gcc/emit-rtl.cc
*************** b7acc1416256e60e8eadae80487e48b4  gcc/fl
*** 6239,6248 ****
  85741de0b8ea9e109ee1355d60bfd397  gcc/flags.h
  c9b372f2374febdee268840281f4cb66  gcc/fold-const-call.cc
  0b4405bca4b699887c6a47e1d25b216c  gcc/fold-const-call.h
! 4e7e5f3758c78c85e7cfda49743201f7  gcc/fold-const.cc
  0ec02a37dbbe9cb267f0ea1263085ed3  gcc/fold-const.h
  764b231c53a63f6a622c187ac0d381d0  gcc/fold-mem-offsets.cc
! 09258722efc0107af849a7b5ae52c5df  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
--- 6245,6254 ----
  85741de0b8ea9e109ee1355d60bfd397  gcc/flags.h
  c9b372f2374febdee268840281f4cb66  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
! 34cc2a28d84aa0f290109570e4795cf5  gcc/fortran/ChangeLog
  083c53fadafdcf3be46713838a51e36c  gcc/fortran/ChangeLog-2002
  2a4ca18d211fb2603139354fd16398ed  gcc/fortran/ChangeLog-2003
  e7462609ebd0dd7c874e0fc00e2833aa  gcc/fortran/ChangeLog-2004
*************** c38eb0f2f19a6cb4b79be761670131e8  gcc/fo
*** 6271,6277 ****
  181571ce035e2781f9d8141b9163749a  gcc/fortran/Make-lang.in
  bcb129d4d143e6ec42b4ddec1fea30b8  gcc/fortran/arith.cc
  1f3ee645ab25a3d858b555c00c0327ae  gcc/fortran/arith.h
! 674de39a89713ed01b619e2851d5f4c9  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
! 050ec8fef64e7238a868c03f6b68aefd  gcc/fortran/array.cc
  bc40e87bca719f86583a020eff2d6a73  gcc/fortran/bbt.cc
  46445812eae3031e15aec7c4fea31772  gcc/fortran/check.cc
  11a823a64183cc8fffbce6e17dca0f76  gcc/fortran/class.cc
*************** fce6d9fd438656556bd5a852e81a0fea  gcc/fo
*** 6289,6307 ****
  b66b99368e3cd17573ae64a38e36c1de  gcc/fortran/dependency.h
  fe0fcd93ad74f370b736a7f318964506  gcc/fortran/dump-parse-tree.cc
  65aa25da09bdeee948cdad39cfc4d960  gcc/fortran/error.cc
! a73bc5afffa1abeeb6b6288f08852f67  gcc/fortran/expr.cc
  354927f6cb797cd538c0ab8ab0e552bb  gcc/fortran/f95-lang.cc
  d162511ebc8080669ebdf414e36c7d62  gcc/fortran/frontend-passes.cc
  c85c9309a4274609c6ff6466621c90f6  gcc/fortran/gfc-diagnostic.def
  afb07146daad7f36a59c52e053f6772f  gcc/fortran/gfc-internals.texi
! 0d5fcff396488b3b5cec6ddbb9bb5ccd  gcc/fortran/gfortran.h
  d9a929f27348cdaafaa92a2fa0caa9c8  gcc/fortran/gfortran.texi
  9da0114ccf35340d3035f21f8a0f3325  gcc/fortran/gfortranspec.cc
  e74b62dc22fe7098c12db5035b41ff3a  gcc/fortran/interface.cc
  4793e9c888307d569c02b46f858468a4  gcc/fortran/intrinsic.cc
  ec9496f868f02a839c7e138123458eec  gcc/fortran/intrinsic.h
  c393d50c88b7e4359760b320a2b2717d  gcc/fortran/intrinsic.texi
! 8e1d064a97ee855b08b4f45eaf31ae4f  gcc/fortran/invoke.texi
  3deea9e38b884bce9d11233d65e4b1f7  gcc/fortran/io.cc
  02af2e093ad4f92649a6370fa6dc3215  gcc/fortran/ioparm.def
  055779edaa3837593a06176a4a7f8bef  gcc/fortran/iresolve.cc
--- 6295,6313 ----
  b66b99368e3cd17573ae64a38e36c1de  gcc/fortran/dependency.h
  fe0fcd93ad74f370b736a7f318964506  gcc/fortran/dump-parse-tree.cc
  65aa25da09bdeee948cdad39cfc4d960  gcc/fortran/error.cc
! 8733cfc2753e62375657a319c4fd1242  gcc/fortran/expr.cc
  354927f6cb797cd538c0ab8ab0e552bb  gcc/fortran/f95-lang.cc
  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
  ec9496f868f02a839c7e138123458eec  gcc/fortran/intrinsic.h
  c393d50c88b7e4359760b320a2b2717d  gcc/fortran/intrinsic.texi
! 312a2ab5d69163ee17f8571a964085b9  gcc/fortran/invoke.texi
  3deea9e38b884bce9d11233d65e4b1f7  gcc/fortran/io.cc
  02af2e093ad4f92649a6370fa6dc3215  gcc/fortran/ioparm.def
  055779edaa3837593a06176a4a7f8bef  gcc/fortran/iresolve.cc
*************** b59741c468360dc1ed1ff70bb5b9ffbc  gcc/fo
*** 6322,6328 ****
  14bfc8cce7689afc9682a2e91f76a037  gcc/fortran/parse.cc
  c97a1f016de974126c688bb9c805f323  gcc/fortran/parse.h
  c5246d76c04dbc669841c906598db57e  gcc/fortran/primary.cc
! 6e94d52acfd1ab37c6a3d204ae941b4a  gcc/fortran/resolve.cc
  4b8c563657dd74d2fa1431a1004eb549  gcc/fortran/scanner.cc
  18963b3f6aacca960fd6aa72b429a9d2  gcc/fortran/scanner.h
  715d95102faf740da2fefc9701cb655c  gcc/fortran/simplify.cc
--- 6328,6334 ----
  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
*************** d92b6f7feff3882a660f0f7c2c60b7b0  gcc/fo
*** 6336,6342 ****
  98960d7450a15e1ecc9789bd0bde16a7  gcc/fortran/trans-const.cc
  0d5cf4117521dba2aea9c8fd7ac67888  gcc/fortran/trans-const.h
  442c63ff75d2642195a08d5b1ccdc775  gcc/fortran/trans-decl.cc
! 6d125b6238e3880e26e909ec79945105  gcc/fortran/trans-expr.cc
  811dc438c87b8d4bfc6ef1ed8633da28  gcc/fortran/trans-intrinsic.cc
  8a57cfea30bf3f2ccc14a884e7b0d1da  gcc/fortran/trans-io.cc
  06841cda6c842aae9f09268cec2b1f95  gcc/fortran/trans-openmp.cc
--- 6342,6348 ----
  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
*************** e56083fc2c4890d3e4802c5a64dd00f5  gcc/fo
*** 6353,6359 ****
  fe144e1c2a0da30ffc9946e5adab7e6f  gcc/function-abi.h
  45679bb0d98b3e87046958f7576b3770  gcc/function-tests.cc
  f2774a60d96892a29e473edce69ca505  gcc/function.cc
! f95449b702e34eff4fd67b6863516433  gcc/function.h
  96e0cc03035051e1904d130ab24fdfb4  gcc/fwprop.cc
  d705e3338b1c8fc644a83604dd1d0211  gcc/gcc-ar.cc
  03bc1e813e5f46e9869b22d270bd598b  gcc/gcc-attribute-urlifier.cc
--- 6359,6365 ----
  fe144e1c2a0da30ffc9946e5adab7e6f  gcc/function-abi.h
  45679bb0d98b3e87046958f7576b3770  gcc/function-tests.cc
  f2774a60d96892a29e473edce69ca505  gcc/function.cc
! 797473d7b92327caaa0bc2b71c14bc0d  gcc/function.h
  96e0cc03035051e1904d130ab24fdfb4  gcc/fwprop.cc
  d705e3338b1c8fc644a83604dd1d0211  gcc/gcc-ar.cc
  03bc1e813e5f46e9869b22d270bd598b  gcc/gcc-attribute-urlifier.cc
*************** e4981e3b10513f53ed20b58620dfc56f  gcc/gc
*** 6367,6373 ****
  4ab35668d1ea7ab6cac04625e0bc9d91  gcc/gcc-urlifier.cc
  3ba51d67080efcd8791ea2eaf4103d72  gcc/gcc-urlifier.def
  9110b89a48e29f0f75e8c76eca85c6e2  gcc/gcc-urlifier.h
! e4aea4cebb9d1d00ed9e4ff145fe34da  gcc/gcc.cc
  09d73a192ef597ac58c7300df5ae4eb3  gcc/gcc.h
  1edfbdaab776ee29780fe98d767e67ed  gcc/gcov-counter.def
  2076f7754bf36008845d58c1fffc6fdd  gcc/gcov-dump.cc
--- 6373,6379 ----
  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
*************** f625775d4290d87f0c15fb36855776b1  gcc/gi
*** 6445,6451 ****
  a7d47404d5fd61c66fd504e78960fac2  gcc/gimple-laddress.cc
  b8f35f8e0e2003ccbebac105a9aa5a81  gcc/gimple-loop-interchange.cc
  f1824ea9d0d35fb768daabd8649d44b3  gcc/gimple-loop-jam.cc
! a70302a3c0d98af88b54cb5af58bfc44  gcc/gimple-loop-versioning.cc
  3c3cd33fb8d571f0cf6646b95fd1a87d  gcc/gimple-low.cc
  a6a5de8424eee65e836bba5b21f32a6b  gcc/gimple-low.h
  66429f6a61ccc2eac30fedfe56dd8919  gcc/gimple-lower-bitint.cc
--- 6451,6457 ----
  a7d47404d5fd61c66fd504e78960fac2  gcc/gimple-laddress.cc
  b8f35f8e0e2003ccbebac105a9aa5a81  gcc/gimple-loop-interchange.cc
  f1824ea9d0d35fb768daabd8649d44b3  gcc/gimple-loop-jam.cc
! b829ca99c85ee53d8741a9e6bd0842cc  gcc/gimple-loop-versioning.cc
  3c3cd33fb8d571f0cf6646b95fd1a87d  gcc/gimple-low.cc
  a6a5de8424eee65e836bba5b21f32a6b  gcc/gimple-low.h
  66429f6a61ccc2eac30fedfe56dd8919  gcc/gimple-lower-bitint.cc
*************** fc046378b00fb047e166e06622975ba0  gcc/gi
*** 6456,6462 ****
  cc3bc9f050d83e91dde135d1aaa4aa45  gcc/gimple-predicate-analysis.cc
  2c11e59cf64a0fe28fb4b27481d61771  gcc/gimple-predicate-analysis.h
  47be556d1ffdffe8df16fdea25e9fe0e  gcc/gimple-predict.h
! 704c2374e8273c4c2fc98982f0c3466e  gcc/gimple-pretty-print.cc
  188a3366d8d8b4ba413f704fa241a1e2  gcc/gimple-pretty-print.h
  34865803d801f526fc01f3f4bbc75024  gcc/gimple-range-cache.cc
  c7aea08144ac3dfedef02e2efd73b2e9  gcc/gimple-range-cache.h
--- 6462,6468 ----
  cc3bc9f050d83e91dde135d1aaa4aa45  gcc/gimple-predicate-analysis.cc
  2c11e59cf64a0fe28fb4b27481d61771  gcc/gimple-predicate-analysis.h
  47be556d1ffdffe8df16fdea25e9fe0e  gcc/gimple-predict.h
! 507f851a06264c7415919c28e6afa3da  gcc/gimple-pretty-print.cc
  188a3366d8d8b4ba413f704fa241a1e2  gcc/gimple-pretty-print.h
  34865803d801f526fc01f3f4bbc75024  gcc/gimple-range-cache.cc
  c7aea08144ac3dfedef02e2efd73b2e9  gcc/gimple-range-cache.h
*************** d8ef080a2b3ba3ee183a04862d435ab7  gcc/ha
*** 6620,6625 ****
--- 6626,6633 ----
  f29265526da54525b91c67ebc2565517  gcc/hash-table.cc
  027dad09ee00b59074ece8f86d324827  gcc/hash-table.h
  3b4fcd577cfae3f9ca00bc037eb76173  gcc/hash-traits.h
+ 64ca744dca2bf3ddacff66fab9e2e717  gcc/hierarchical_discriminator.cc
+ 58ea52bda41b7c2ba23508437b398f91  gcc/hierarchical_discriminator.h
  8331c0d9ba20de52efcd84cb64aeb05c  gcc/highlev-plugin-common.h
  5d2d5bad62f22fa9f35d1bb56a0c7466  gcc/hooks.cc
  a69f44bb2f29f2861e02a4e8ac64c734  gcc/hooks.h
*************** f5de8589d497c4d607cadff1ce88dd5c  gcc/hw
*** 6630,6644 ****
  665c1d736f4909ccb17f662f7f060fd7  gcc/hw-doloop.h
  e5e51e93d7d72e1822440531e4d79d1d  gcc/hwint.cc
  b6b1b7e364f00e9287ee1f56254b9be1  gcc/hwint.h
! b6b3ead34d704f77e03120f622cbe07e  gcc/ifcvt.cc
  e2229f9ecac43014084b083ddf2d4637  gcc/ifcvt.h
  370b4a8b9decbb822392c32f5fb92a72  gcc/inchash.cc
  bad6404ce4e7f42ff46ce6ae70c77e99  gcc/inchash.h
  984873a66208a127d95460985f7a8950  gcc/incpath.cc
  17ffbeb68fc11afc463c1f060838519d  gcc/incpath.h
  5aa4092ef811b7dfc5987dcd38205bb6  gcc/init-regs.cc
! 4db63b1a84d91edbac6a86d3bd481479  gcc/input.cc
! 775f94245ab68c10124a70718d7df09c  gcc/input.h
  80bc6558521a56fa4936fc0de8d01aca  gcc/insn-addr.h
  7b76bd07f7eca4ab18a5cb546ce1c919  gcc/insn-notes.def
  c7c9628cd16fe3e0263939ceb0a865fa  gcc/int-vector-builder.h
--- 6638,6652 ----
  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
  984873a66208a127d95460985f7a8950  gcc/incpath.cc
  17ffbeb68fc11afc463c1f060838519d  gcc/incpath.h
  5aa4092ef811b7dfc5987dcd38205bb6  gcc/init-regs.cc
! ea168cbe279a9f5955218fc5d10d09c5  gcc/input.cc
! 27f736f8d8cba5e5dd1c30bbe7272db1  gcc/input.h
  80bc6558521a56fa4936fc0de8d01aca  gcc/insn-addr.h
  7b76bd07f7eca4ab18a5cb546ce1c919  gcc/insn-notes.def
  c7c9628cd16fe3e0263939ceb0a865fa  gcc/int-vector-builder.h
*************** c7c9628cd16fe3e0263939ceb0a865fa  gcc/in
*** 6648,6657 ****
  8a34b6abb2591b8c30c7fb4187261ee3  gcc/intl.cc
  22c5866f6858fea288e5e2f1adc96e40  gcc/intl.h
  920db3effdd509146b3f00be906c0885  gcc/ipa-comdats.cc
! 30a9a7ba5cbf3f3c008bcc0030d35e87  gcc/ipa-cp.cc
  0f1e7b6760c2459ae3d8d6b55d4020cc  gcc/ipa-cp.h
  2db0720673179e23a6e269afc34e1abd  gcc/ipa-devirt.cc
! 5acba45657d959b80448fb42eae3b751  gcc/ipa-fnsummary.cc
  179f7c3a6fbca4d8bf253b9fc8e5b21f  gcc/ipa-fnsummary.h
  5f829e6402cf407fdcc61ddc5b23f7f1  gcc/ipa-free-lang-data.cc
  bd8846ab41db2000eb2e2f0acea327ea  gcc/ipa-icf-gimple.cc
--- 6656,6665 ----
  8a34b6abb2591b8c30c7fb4187261ee3  gcc/intl.cc
  22c5866f6858fea288e5e2f1adc96e40  gcc/intl.h
  920db3effdd509146b3f00be906c0885  gcc/ipa-comdats.cc
! bc26d1c89032a321ada5015cbec7103b  gcc/ipa-cp.cc
  0f1e7b6760c2459ae3d8d6b55d4020cc  gcc/ipa-cp.h
  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
*************** ed3caa191ea3399d582433dc0f2ddb09  gcc/ip
*** 6695,6702 ****
  0618c6fb3d26b6bb6d5ab0249895d4ee  gcc/ira-costs.cc
  214cd984de0f99f1fe85cbf9560c5837  gcc/ira-emit.cc
  620499663821b1d3f210ec72e11415a0  gcc/ira-int.h
! ce3cb1462fd918525698aa8397015c45  gcc/ira-lives.cc
! c6f39a89e6699f0a41ecb7774a96e91b  gcc/ira.cc
  788d1861bee2322ed419d2c51e2f738e  gcc/ira.h
  9542ea2b8797fa5a935893fafae08ef3  gcc/is-a.h
  090239f8ee6f441be82d0c8cbeaa00de  gcc/iterator-utils.h
--- 6703,6710 ----
  0618c6fb3d26b6bb6d5ab0249895d4ee  gcc/ira-costs.cc
  214cd984de0f99f1fe85cbf9560c5837  gcc/ira-emit.cc
  620499663821b1d3f210ec72e11415a0  gcc/ira-int.h
! 0613274c3547e43cf06feb4dd8f59c0d  gcc/ira-lives.cc
! 92aa55d8016ef791959cf2bf0791c63e  gcc/ira.cc
  788d1861bee2322ed419d2c51e2f738e  gcc/ira.h
  9542ea2b8797fa5a935893fafae08ef3  gcc/is-a.h
  090239f8ee6f441be82d0c8cbeaa00de  gcc/iterator-utils.h
*************** c6ab645f373e1d6e9ddd212bfc3a95ba  gcc/lo
*** 6828,6834 ****
  d49cf408f9415ef037523414c6e80764  gcc/lower-subreg.h
  1bd7d17fdacf9c764629a3def0c81b48  gcc/lra-assigns.cc
  5d1aa184ea3e3c5990e02acbdc762f00  gcc/lra-coalesce.cc
! 6cfe0f0d7284f1b535b5cc7c23572eba  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
! c111eca8c5e23d9f439571bdfd28d41e  gcc/lra-constraints.cc
  2f34a2e53204408e2578f69fb831b0ac  gcc/lra-eliminations.cc
  b998a06aae46793940f70ad156ce33db  gcc/lra-int.h
  57ce9967bab48c81b11b698d319f4d8d  gcc/lra-lives.cc
*************** a7e9e00378501c6078d977c5ea3fabb3  gcc/lt
*** 6850,6856 ****
  6c99c98c397a53a6a56da792d20092b0  gcc/lto-streamer.cc
  2d378e58ffe32f0e50ca9de25f61ef5f  gcc/lto-streamer.h
  94324166b434227347ae7dfce80321ab  gcc/lto-wrapper.cc
! 4429722021296a8fad05fa3d5c243fac  gcc/lto/ChangeLog
  df1dcca39d7c8f8db6cbab8fef4394e3  gcc/lto/Make-lang.in
  107bbf87618e39ff03662c0cd52a3f35  gcc/lto/common.cc
  eb5f3398fbf5d50b50c315e2d5891e25  gcc/lto/common.h
--- 6858,6864 ----
  6c99c98c397a53a6a56da792d20092b0  gcc/lto-streamer.cc
  2d378e58ffe32f0e50ca9de25f61ef5f  gcc/lto-streamer.h
  94324166b434227347ae7dfce80321ab  gcc/lto-wrapper.cc
! 306a1f468a1869d6f169dca6b2c1f454  gcc/lto/ChangeLog
  df1dcca39d7c8f8db6cbab8fef4394e3  gcc/lto/Make-lang.in
  107bbf87618e39ff03662c0cd52a3f35  gcc/lto/common.cc
  eb5f3398fbf5d50b50c315e2d5891e25  gcc/lto/common.h
*************** f9608e9005487c369e6c38949ab36fa1  gcc/m2
*** 7849,7855 ****
  2a18164ee5f162ac117e6fedb58158a2  gcc/machmode.def
  0c9209452a934f189aa0860038b3a65c  gcc/machmode.h
  197298337dae14fdd7ab928a1f03bec6  gcc/main.cc
! f2da752d22aaf767957bf31a131faaa5  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
! ab4045f3e8ba086d64007e166964500b  gcc/match.pd
  b106a08a1793a5495dd87c412456484b  gcc/mcf.cc
  897c541ca992e145ad451c98941c7647  gcc/mem-stats-traits.h
  4f86eeea7af520ce0b773c1f2e34b5b4  gcc/mem-stats.h
*************** fef443de1557117f8c2847206a2ea8f5  gcc/or
*** 7941,7947 ****
  7c8d7dc194f39f5b8c69d7f0d05bc335  gcc/output.h
  5f96d548f10507478f5096f298505278  gcc/pair-fusion.cc
  69198894caa672a2294267474e494d8b  gcc/pair-fusion.h
! dca46c7c8f5b58536899ee307fb5f9b0  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  ce920ed7f2cc74b4a9bc390c39f4cbee  gcc/pass_manager.h
  1780eb05a432e44c4898abd2e995a024  gcc/passes.cc
--- 7949,7955 ----
  7c8d7dc194f39f5b8c69d7f0d05bc335  gcc/output.h
  5f96d548f10507478f5096f298505278  gcc/pair-fusion.cc
  69198894caa672a2294267474e494d8b  gcc/pair-fusion.h
! 00ac12ab399aee55d3dbe0bfd241cfc1  gcc/params.opt
  2cc794e23d80a8c9f057a7e402c65fb8  gcc/params.opt.urls
  ce920ed7f2cc74b4a9bc390c39f4cbee  gcc/pass_manager.h
  1780eb05a432e44c4898abd2e995a024  gcc/passes.cc
*************** b1408122718335443829fcfe2d5dbcf3  gcc/pr
*** 7994,8000 ****
  cfcb5ae7d574d818b280534a26a461bb  gcc/pretty-print.h
  902a3ede86fca66395915f9462f949f2  gcc/prime-paths.cc
  4791763965e448615fab35a2eda1f6bd  gcc/print-rtl-function.cc
! 4758c429c7ff8273cbb1ba5ad8f65d49  gcc/print-rtl.cc
  2cd52b1a67b570ee31c684eb846def0f  gcc/print-rtl.h
  f26f8ff623fefa8bdfe18ead347e914f  gcc/print-tree.cc
  db24d9f938cefb2027e91a5068f5f1d0  gcc/print-tree.h
--- 8002,8008 ----
  cfcb5ae7d574d818b280534a26a461bb  gcc/pretty-print.h
  902a3ede86fca66395915f9462f949f2  gcc/prime-paths.cc
  4791763965e448615fab35a2eda1f6bd  gcc/print-rtl-function.cc
! d5f4d51ce4820711109250de99f6a757  gcc/print-rtl.cc
  2cd52b1a67b570ee31c684eb846def0f  gcc/print-rtl.h
  f26f8ff623fefa8bdfe18ead347e914f  gcc/print-tree.cc
  db24d9f938cefb2027e91a5068f5f1d0  gcc/print-tree.h
*************** eab7365dceccf86b8e9a8ccbb365afc3  gcc/rt
*** 8071,8077 ****
  27956813d0124f5b5ec60d5a48840a34  gcc/rtl.cc
  a9ad8cbba3c33e3fbc0b79c6938a0295  gcc/rtl.def
  1ddd2444adb70f3c6e041e2e5bc3bb1c  gcc/rtl.h
! bc05097d2022054a2e2c3f52d1ef2f0f  gcc/rtlanal.cc
  57073d447ccb92aa7b0276e4471824df  gcc/rtlanal.h
  9a5e61517f096479200fef046f8b2d35  gcc/rtlhash.cc
  0c917b0591a65e7996befc0d1e294cc3  gcc/rtlhash.h
--- 8079,8085 ----
  27956813d0124f5b5ec60d5a48840a34  gcc/rtl.cc
  a9ad8cbba3c33e3fbc0b79c6938a0295  gcc/rtl.def
  1ddd2444adb70f3c6e041e2e5bc3bb1c  gcc/rtl.h
! 4f8b2fc85712e3182add8b883b1c77ee  gcc/rtlanal.cc
  57073d447ccb92aa7b0276e4471824df  gcc/rtlanal.h
  9a5e61517f096479200fef046f8b2d35  gcc/rtlhash.cc
  0c917b0591a65e7996befc0d1e294cc3  gcc/rtlhash.h
*************** ff662645190de703b9423727e52d659c  gcc/rt
*** 8082,8093 ****
  92e356710b1aae5aaabc8f47d6977fff  gcc/run-rtl-passes.cc
  f4eae48a3e90b34e88b5789e54f5f29a  gcc/run-rtl-passes.h
  add9bd82fcec23469a4d0f7df03d9589  gcc/rust/CONTRIBUTING.md
! fd11d558d15e710cd332691f6c590aeb  gcc/rust/ChangeLog
  89327dc2e4ee3db867f710bb5ba2bcd7  gcc/rust/Make-lang.in
  f3527e161e6e2827d299c1a928ebe1c6  gcc/rust/README.md
! e312907ea93c5b6acdaa9199cf811abd  gcc/rust/ast/rust-ast-builder.cc
  42fae33495c936d810abbb9d15742352  gcc/rust/ast/rust-ast-builder.h
! 2308dc5a30af47207f3f0e78adb445b8  gcc/rust/ast/rust-ast-collector.cc
  7a301538185e9078a7214ea00f4bbc3d  gcc/rust/ast/rust-ast-collector.h
  f1f02065f6fa34f6a0d1213440038fbb  gcc/rust/ast/rust-ast-dump.cc
  38611e3e0301a3d1544ca50839f1ff83  gcc/rust/ast/rust-ast-dump.h
--- 8090,8101 ----
  92e356710b1aae5aaabc8f47d6977fff  gcc/run-rtl-passes.cc
  f4eae48a3e90b34e88b5789e54f5f29a  gcc/run-rtl-passes.h
  add9bd82fcec23469a4d0f7df03d9589  gcc/rust/CONTRIBUTING.md
! 650dab2be8e7cbab328dfb2a58df47fe  gcc/rust/ChangeLog
  89327dc2e4ee3db867f710bb5ba2bcd7  gcc/rust/Make-lang.in
  f3527e161e6e2827d299c1a928ebe1c6  gcc/rust/README.md
! 8579ce4df2aa8500c0a48f4cf0765b2c  gcc/rust/ast/rust-ast-builder.cc
  42fae33495c936d810abbb9d15742352  gcc/rust/ast/rust-ast-builder.h
! 53839cec81f684e985ce0654fc99401b  gcc/rust/ast/rust-ast-collector.cc
  7a301538185e9078a7214ea00f4bbc3d  gcc/rust/ast/rust-ast-collector.h
  f1f02065f6fa34f6a0d1213440038fbb  gcc/rust/ast/rust-ast-dump.cc
  38611e3e0301a3d1544ca50839f1ff83  gcc/rust/ast/rust-ast-dump.h
*************** d27f26e206e8e58bbf206df6c491ad3d  gcc/ru
*** 8097,8107 ****
  00ca322cecd6a261aaeea375344973b1  gcc/rust/ast/rust-ast-fragment.h
  8a0625357ceab97cdd866ddac976341e  gcc/rust/ast/rust-ast-full-decls.h
  ce8b5c065e370de22a7a9314f5030d5a  gcc/rust/ast/rust-ast-full.h
! 235c9ccf9cf09f05dc9f64509cc02c74  gcc/rust/ast/rust-ast-pointer-visitor.cc
  9151fa14ced36f111fd8504361d1909f  gcc/rust/ast/rust-ast-pointer-visitor.h
! 5a7bd3cc8266d91e947b32d94f1a2cd2  gcc/rust/ast/rust-ast-visitor.cc
  4c108252be3366f961c9ae9470ea8290  gcc/rust/ast/rust-ast-visitor.h
! 49089e5b3f8f63ade50b783c8d559d48  gcc/rust/ast/rust-ast.cc
  25f52e8e064b2ce769d23e5201d85a6e  gcc/rust/ast/rust-ast.h
  15a29678516152e3a7190d2b2a01a7e5  gcc/rust/ast/rust-builtin-ast-nodes.h
  a80235d705e48446e91e5fc731dbcfff  gcc/rust/ast/rust-collect-lang-items.cc
--- 8105,8115 ----
  00ca322cecd6a261aaeea375344973b1  gcc/rust/ast/rust-ast-fragment.h
  8a0625357ceab97cdd866ddac976341e  gcc/rust/ast/rust-ast-full-decls.h
  ce8b5c065e370de22a7a9314f5030d5a  gcc/rust/ast/rust-ast-full.h
! 5f69b288fc819b3b819fa23aef3edbcb  gcc/rust/ast/rust-ast-pointer-visitor.cc
  9151fa14ced36f111fd8504361d1909f  gcc/rust/ast/rust-ast-pointer-visitor.h
! 32f92b9152dddb47c222a43a44b5fe44  gcc/rust/ast/rust-ast-visitor.cc
  4c108252be3366f961c9ae9470ea8290  gcc/rust/ast/rust-ast-visitor.h
! cc2cf467dbdccaf730ac2740efc429be  gcc/rust/ast/rust-ast.cc
  25f52e8e064b2ce769d23e5201d85a6e  gcc/rust/ast/rust-ast.h
  15a29678516152e3a7190d2b2a01a7e5  gcc/rust/ast/rust-builtin-ast-nodes.h
  a80235d705e48446e91e5fc731dbcfff  gcc/rust/ast/rust-collect-lang-items.cc
*************** a80235d705e48446e91e5fc731dbcfff  gcc/ru
*** 8109,8123 ****
  ac77ecd9f07e83ede58b369bb61f6282  gcc/rust/ast/rust-cond-compilation.h
  24dbf3c38fb03d11f689a07bf80d0702  gcc/rust/ast/rust-desugar-apit.cc
  7785d3724ea38550b82ec443936ca4d6  gcc/rust/ast/rust-desugar-apit.h
! 280e0cf6255f3bf9bc7fb3a5ebb9c7d9  gcc/rust/ast/rust-desugar-for-loops.cc
  d35d0a34436011c1d4dfbb2ee0f343fe  gcc/rust/ast/rust-desugar-for-loops.h
! 1234967847ba62b9af0a227152e190c7  gcc/rust/ast/rust-desugar-question-mark.cc
  e6c47c7d5c58b601dbebb5a0bd1b263a  gcc/rust/ast/rust-desugar-question-mark.h
  12bf30c81c0344947492baff8d2cf494  gcc/rust/ast/rust-desugar-try-block.cc
  dcbe24ad7f60ad58e14a2b40bb7b7580  gcc/rust/ast/rust-desugar-try-block.h
! 40bd1a75a882cd675b72fabe3be74695  gcc/rust/ast/rust-desugar-while-let.cc
  0a24ad8baedd9b3f104f4ba1efceab02  gcc/rust/ast/rust-desugar-while-let.h
! 7f6eff12162e1cc482a362739c4c6199  gcc/rust/ast/rust-expr.h
  0746b32151c484e3ff44eef8e94d2f1a  gcc/rust/ast/rust-expression-yeast.cc
  626bbb6526780507e2d8c0727b9ddef9  gcc/rust/ast/rust-expression-yeast.h
  e10c652a02b59d0bbfc3ed60e3ba6a67  gcc/rust/ast/rust-fmt.cc
--- 8117,8131 ----
  ac77ecd9f07e83ede58b369bb61f6282  gcc/rust/ast/rust-cond-compilation.h
  24dbf3c38fb03d11f689a07bf80d0702  gcc/rust/ast/rust-desugar-apit.cc
  7785d3724ea38550b82ec443936ca4d6  gcc/rust/ast/rust-desugar-apit.h
! b786dad2cf26b3f5ae02e1d426b61f03  gcc/rust/ast/rust-desugar-for-loops.cc
  d35d0a34436011c1d4dfbb2ee0f343fe  gcc/rust/ast/rust-desugar-for-loops.h
! 18012c546a4ef63f95aba627e43ef940  gcc/rust/ast/rust-desugar-question-mark.cc
  e6c47c7d5c58b601dbebb5a0bd1b263a  gcc/rust/ast/rust-desugar-question-mark.h
  12bf30c81c0344947492baff8d2cf494  gcc/rust/ast/rust-desugar-try-block.cc
  dcbe24ad7f60ad58e14a2b40bb7b7580  gcc/rust/ast/rust-desugar-try-block.h
! 3e3e3c4baf7a69aefb9fd989d8b7b491  gcc/rust/ast/rust-desugar-while-let.cc
  0a24ad8baedd9b3f104f4ba1efceab02  gcc/rust/ast/rust-desugar-while-let.h
! bb96dcccc26b2ed79a72f022a3dfa6d0  gcc/rust/ast/rust-expr.h
  0746b32151c484e3ff44eef8e94d2f1a  gcc/rust/ast/rust-expression-yeast.cc
  626bbb6526780507e2d8c0727b9ddef9  gcc/rust/ast/rust-expression-yeast.h
  e10c652a02b59d0bbfc3ed60e3ba6a67  gcc/rust/ast/rust-fmt.cc
*************** fd2bc9cab100ad48a45eff369cdaa1af  gcc/ru
*** 8140,8146 ****
  f6ccf3e6550e5f3d1e7f0903fad16e00  gcc/rust/backend/rust-compile-block.h
  84d2efe344d04876bdef59c09e170495  gcc/rust/backend/rust-compile-context.cc
  6bc78d73b506cf623b5f0e27fdc8326e  gcc/rust/backend/rust-compile-context.h
! b1d760f48371e2aea119f3e095ce4773  gcc/rust/backend/rust-compile-expr.cc
  02d50055305164dd0cc5fff5dd879d8d  gcc/rust/backend/rust-compile-expr.h
  d2787752d55665c5f6a670bcb3949817  gcc/rust/backend/rust-compile-extern.h
  154038c60400f9e4a8ead9dcc5ea2388  gcc/rust/backend/rust-compile-fnparam.cc
--- 8148,8154 ----
  f6ccf3e6550e5f3d1e7f0903fad16e00  gcc/rust/backend/rust-compile-block.h
  84d2efe344d04876bdef59c09e170495  gcc/rust/backend/rust-compile-context.cc
  6bc78d73b506cf623b5f0e27fdc8326e  gcc/rust/backend/rust-compile-context.h
! cf5cbb6a5b5050a69fc274ef81180fa3  gcc/rust/backend/rust-compile-expr.cc
  02d50055305164dd0cc5fff5dd879d8d  gcc/rust/backend/rust-compile-expr.h
  d2787752d55665c5f6a670bcb3949817  gcc/rust/backend/rust-compile-extern.h
  154038c60400f9e4a8ead9dcc5ea2388  gcc/rust/backend/rust-compile-fnparam.cc
*************** f7b06cf79a55c9659bdf40d25e0bf4b1  gcc/ru
*** 8282,8288 ****
  8a47aa2db46c3e82da2be3ad19266b53  gcc/rust/checks/errors/rust-ast-validation.h
  416d1fccc2865b23f92847324938d76f  gcc/rust/checks/errors/rust-const-checker.cc
  d3f6a661ad0409e35772697ad7e9e506  gcc/rust/checks/errors/rust-const-checker.h
! 5c558e7c07479722b448dc3ab4382957  gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
  f8bbf6383cf2f4051c4c724c78c03f28  gcc/rust/checks/errors/rust-hir-pattern-analysis.h
  ce0954d8a72edb61be6d8e646c61c6cf  gcc/rust/checks/errors/rust-readonly-check.cc
  7853e036ce1dfe09f579bf6a04994461  gcc/rust/checks/errors/rust-readonly-check.h
--- 8290,8296 ----
  8a47aa2db46c3e82da2be3ad19266b53  gcc/rust/checks/errors/rust-ast-validation.h
  416d1fccc2865b23f92847324938d76f  gcc/rust/checks/errors/rust-const-checker.cc
  d3f6a661ad0409e35772697ad7e9e506  gcc/rust/checks/errors/rust-const-checker.h
! ef3d07dad43ab68ffb80b64df271e2b1  gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
  f8bbf6383cf2f4051c4c724c78c03f28  gcc/rust/checks/errors/rust-hir-pattern-analysis.h
  ce0954d8a72edb61be6d8e646c61c6cf  gcc/rust/checks/errors/rust-readonly-check.cc
  7853e036ce1dfe09f579bf6a04994461  gcc/rust/checks/errors/rust-readonly-check.h
*************** ddda12b4ef89f90ebd869a2cd0dc7665  gcc/ru
*** 8294,8307 ****
  7736c7e109bf69846c9a92e9d82e7c67  gcc/rust/checks/lints/rust-lint-scan-deadcode.h
  9196027f8d3a8a0754559b8a381e1229  gcc/rust/checks/lints/rust-lint-unused-var.cc
  56160d4d1424a0469b62ce3dc9ef7886  gcc/rust/checks/lints/rust-lint-unused-var.h
! fe12e28b3bafae9e8f7c1dedf3dde507  gcc/rust/checks/lints/unused/rust-unused-checker.cc
! ae6c75352a1c447e7acd676cac59cde0  gcc/rust/checks/lints/unused/rust-unused-checker.h
! 7bef7b3b0ac00b367f95e9ecb50cffdd  gcc/rust/checks/lints/unused/rust-unused-collector.cc
! add3c50c1fac5f1cc578ea4b8fadc1f1  gcc/rust/checks/lints/unused/rust-unused-collector.h
! 45995fd2a1714987e816e878c547536b  gcc/rust/checks/lints/unused/rust-unused-context.cc
! d944dfb08da3796efb5124a41f7f2963  gcc/rust/checks/lints/unused/rust-unused-context.h
  a5565d318380d1fcdf7d319909cb2fc8  gcc/rust/config-lang.in
! 113d8453d876f5ce232510ec85c0ee71  gcc/rust/expand/rust-cfg-strip.cc
  37fb676f1f8b4f1a0324374289928721  gcc/rust/expand/rust-cfg-strip.h
  15c672a8ef02cfa0073a820f65f8b90a  gcc/rust/expand/rust-derive-clone.cc
  79d1eb8e6eeece040b532c2494bd883f  gcc/rust/expand/rust-derive-clone.h
--- 8302,8315 ----
  7736c7e109bf69846c9a92e9d82e7c67  gcc/rust/checks/lints/rust-lint-scan-deadcode.h
  9196027f8d3a8a0754559b8a381e1229  gcc/rust/checks/lints/rust-lint-unused-var.cc
  56160d4d1424a0469b62ce3dc9ef7886  gcc/rust/checks/lints/rust-lint-unused-var.h
! 592b536a06472e982bd43174060bd44e  gcc/rust/checks/lints/unused/rust-unused-checker.cc
! 8011e26d35cb365bb2aeec924948cb11  gcc/rust/checks/lints/unused/rust-unused-checker.h
! bd02f07bc0449d5332cbe841ea6407f2  gcc/rust/checks/lints/unused/rust-unused-collector.cc
! 255b7bc523902935456fdefb815a91e0  gcc/rust/checks/lints/unused/rust-unused-collector.h
! 747ddc08d2d075789af43eefe97866a1  gcc/rust/checks/lints/unused/rust-unused-context.cc
! 853df2211803f255982f2b5aca075734  gcc/rust/checks/lints/unused/rust-unused-context.h
  a5565d318380d1fcdf7d319909cb2fc8  gcc/rust/config-lang.in
! 6cdd2cc037f218e33468a73b0841cc02  gcc/rust/expand/rust-cfg-strip.cc
  37fb676f1f8b4f1a0324374289928721  gcc/rust/expand/rust-cfg-strip.h
  15c672a8ef02cfa0073a820f65f8b90a  gcc/rust/expand/rust-derive-clone.cc
  79d1eb8e6eeece040b532c2494bd883f  gcc/rust/expand/rust-derive-clone.h
*************** caff0b7b7e1a0fb05ef4f8575614fb41  gcc/ru
*** 8327,8338 ****
  32cdbc32d6a40f91930b408f13f78df8  gcc/rust/expand/rust-expand-format-args.h
  0ed15619e4d039aeded24780b7d11f55  gcc/rust/expand/rust-expand-visitor.cc
  51845c2672c451625d56c09b616d80e8  gcc/rust/expand/rust-expand-visitor.h
! 06b20e4f4c2d35e181d595f5fadc9bd6  gcc/rust/expand/rust-macro-builtins-asm.cc
  48269c7df7dead67e4185d80b217a76a  gcc/rust/expand/rust-macro-builtins-asm.h
! 5b096f868bb2c663c7cd7580ffedd427  gcc/rust/expand/rust-macro-builtins-format-args.cc
! 7ea169062aa14e9d7e75f99722e0186b  gcc/rust/expand/rust-macro-builtins-helpers.cc
  26c45cd5c08834c9402a74d292e4f355  gcc/rust/expand/rust-macro-builtins-helpers.h
! 03be6df88b2e26a010eba43d607e1202  gcc/rust/expand/rust-macro-builtins-include.cc
  8ec129a05e6e88dcd3ff02e4fe57e423  gcc/rust/expand/rust-macro-builtins-location.cc
  3cc7a61e5653feaa71171c95515773f3  gcc/rust/expand/rust-macro-builtins-log-debug.cc
  3056a545c61cc2eac5db256ee4360c75  gcc/rust/expand/rust-macro-builtins-offset-of.cc
--- 8335,8346 ----
  32cdbc32d6a40f91930b408f13f78df8  gcc/rust/expand/rust-expand-format-args.h
  0ed15619e4d039aeded24780b7d11f55  gcc/rust/expand/rust-expand-visitor.cc
  51845c2672c451625d56c09b616d80e8  gcc/rust/expand/rust-expand-visitor.h
! 3628942d6eb2dc1c553b94271a4d592e  gcc/rust/expand/rust-macro-builtins-asm.cc
  48269c7df7dead67e4185d80b217a76a  gcc/rust/expand/rust-macro-builtins-asm.h
! f27b7d7665a02b4f5288be721ee7cd3e  gcc/rust/expand/rust-macro-builtins-format-args.cc
! bc1e13e9ae89f76aed9dae3ec38022a3  gcc/rust/expand/rust-macro-builtins-helpers.cc
  26c45cd5c08834c9402a74d292e4f355  gcc/rust/expand/rust-macro-builtins-helpers.h
! e78b00ce2aed15088c09bf10baaf4265  gcc/rust/expand/rust-macro-builtins-include.cc
  8ec129a05e6e88dcd3ff02e4fe57e423  gcc/rust/expand/rust-macro-builtins-location.cc
  3cc7a61e5653feaa71171c95515773f3  gcc/rust/expand/rust-macro-builtins-log-debug.cc
  3056a545c61cc2eac5db256ee4360c75  gcc/rust/expand/rust-macro-builtins-offset-of.cc
*************** caff0b7b7e1a0fb05ef4f8575614fb41  gcc/ru
*** 8341,8347 ****
  907f65abd4676d9291ef7277bcf5425a  gcc/rust/expand/rust-macro-builtins-utility.cc
  7c2ef170018db6c9883bce9f1dfa3277  gcc/rust/expand/rust-macro-builtins.cc
  6d3373d4b93bdf7e0fd90d0eec8de32e  gcc/rust/expand/rust-macro-builtins.h
! a74dd51257086ce50a4ed143e80fad2a  gcc/rust/expand/rust-macro-expand.cc
  8931445aa7288e8b9d970b69512abe2c  gcc/rust/expand/rust-macro-expand.h
  56fa9876960fce0333f6daff613dc814  gcc/rust/expand/rust-macro-invoc-lexer.cc
  37a63a63dddbbfe7c7c06823dd48c120  gcc/rust/expand/rust-macro-invoc-lexer.h
--- 8349,8355 ----
  907f65abd4676d9291ef7277bcf5425a  gcc/rust/expand/rust-macro-builtins-utility.cc
  7c2ef170018db6c9883bce9f1dfa3277  gcc/rust/expand/rust-macro-builtins.cc
  6d3373d4b93bdf7e0fd90d0eec8de32e  gcc/rust/expand/rust-macro-builtins.h
! a7ba454607c9c66a0319960af6faf270  gcc/rust/expand/rust-macro-expand.cc
  8931445aa7288e8b9d970b69512abe2c  gcc/rust/expand/rust-macro-expand.h
  56fa9876960fce0333f6daff613dc814  gcc/rust/expand/rust-macro-invoc-lexer.cc
  37a63a63dddbbfe7c7c06823dd48c120  gcc/rust/expand/rust-macro-invoc-lexer.h
*************** a0c671745a0452dc6c2af541125edfd1  gcc/ru
*** 8357,8363 ****
  ca14a49fa6fa023bf2ead8a67420cfa5  gcc/rust/hir/rust-ast-lower-base.h
  388369f5656aba1972999bdfa496f3b0  gcc/rust/hir/rust-ast-lower-block.h
  054c79e824e2ba6f9c8c4337571f8654  gcc/rust/hir/rust-ast-lower-enumitem.h
! 7b63274b0cff710659a26c26111a5ecd  gcc/rust/hir/rust-ast-lower-expr.cc
  26ed1e5107bba0bda3e49e0747aad013  gcc/rust/hir/rust-ast-lower-expr.h
  0a8a648826ab2d693d37d1ef6db621ac  gcc/rust/hir/rust-ast-lower-extern.h
  af24f6b3af1cef0fedb4b6e50d0859db  gcc/rust/hir/rust-ast-lower-format-args.cc
--- 8365,8371 ----
  ca14a49fa6fa023bf2ead8a67420cfa5  gcc/rust/hir/rust-ast-lower-base.h
  388369f5656aba1972999bdfa496f3b0  gcc/rust/hir/rust-ast-lower-block.h
  054c79e824e2ba6f9c8c4337571f8654  gcc/rust/hir/rust-ast-lower-enumitem.h
! bfdac26328fe0c39f15b5a0a0af2abb4  gcc/rust/hir/rust-ast-lower-expr.cc
  26ed1e5107bba0bda3e49e0747aad013  gcc/rust/hir/rust-ast-lower-expr.h
  0a8a648826ab2d693d37d1ef6db621ac  gcc/rust/hir/rust-ast-lower-extern.h
  af24f6b3af1cef0fedb4b6e50d0859db  gcc/rust/hir/rust-ast-lower-format-args.cc
*************** edace426f0e4e28c4397a27133ae4cdd  gcc/ru
*** 8373,8388 ****
  09e01bbdd69f01beb32affaaca018c86  gcc/rust/hir/rust-ast-lower-struct-field-expr.h
  484c747a04a639463ce0de8d16a792dc  gcc/rust/hir/rust-ast-lower-type.cc
  117bb38f7e034f149d3f509bf5a3e24b  gcc/rust/hir/rust-ast-lower-type.h
! 4ecbb35653c71a46bfaef084abe765d6  gcc/rust/hir/rust-ast-lower.cc
  c1ece1677d7766c75e292c36ec7d4d74  gcc/rust/hir/rust-ast-lower.h
! aa95a4ba2db866e264e9bcb69e44edbc  gcc/rust/hir/rust-hir-dump.cc
  0e7e3cab911dea4b76dcbb3b282da69d  gcc/rust/hir/rust-hir-dump.h
  ad963c766284e28d038c5e5060f161f4  gcc/rust/hir/tree/rust-hir-attrs.h
  8875627643bf7c32d8c894b557d7b80e  gcc/rust/hir/tree/rust-hir-bound-abstract.h
  bb82f5f58359c8b7381de361d22141dd  gcc/rust/hir/tree/rust-hir-bound.h
  e8f36ea5922fc0698c18a2e7c67757db  gcc/rust/hir/tree/rust-hir-expr-abstract.h
! 4d59cde8cc687bf0b722489f08b83089  gcc/rust/hir/tree/rust-hir-expr.cc
! c869ea671f9c93bb0c91dcc01fecd1cb  gcc/rust/hir/tree/rust-hir-expr.h
  0c65bbe0083a42d47006a772a150f2af  gcc/rust/hir/tree/rust-hir-full-decls.h
  c614345abe86d83c7906a4aacb42e8c8  gcc/rust/hir/tree/rust-hir-full.h
  2db585f68d3310e8eb15a16de2b77777  gcc/rust/hir/tree/rust-hir-generic-param.cc
--- 8381,8396 ----
  09e01bbdd69f01beb32affaaca018c86  gcc/rust/hir/rust-ast-lower-struct-field-expr.h
  484c747a04a639463ce0de8d16a792dc  gcc/rust/hir/rust-ast-lower-type.cc
  117bb38f7e034f149d3f509bf5a3e24b  gcc/rust/hir/rust-ast-lower-type.h
! 56c1bab9d335b848e8039bae8152b445  gcc/rust/hir/rust-ast-lower.cc
  c1ece1677d7766c75e292c36ec7d4d74  gcc/rust/hir/rust-ast-lower.h
! b3f934462bc485ce6a92229957587b2d  gcc/rust/hir/rust-hir-dump.cc
  0e7e3cab911dea4b76dcbb3b282da69d  gcc/rust/hir/rust-hir-dump.h
  ad963c766284e28d038c5e5060f161f4  gcc/rust/hir/tree/rust-hir-attrs.h
  8875627643bf7c32d8c894b557d7b80e  gcc/rust/hir/tree/rust-hir-bound-abstract.h
  bb82f5f58359c8b7381de361d22141dd  gcc/rust/hir/tree/rust-hir-bound.h
  e8f36ea5922fc0698c18a2e7c67757db  gcc/rust/hir/tree/rust-hir-expr-abstract.h
! a853cdc6069a599fed623d914c219216  gcc/rust/hir/tree/rust-hir-expr.cc
! d69ed1dc862f9b0191138c8e62a6fb8e  gcc/rust/hir/tree/rust-hir-expr.h
  0c65bbe0083a42d47006a772a150f2af  gcc/rust/hir/tree/rust-hir-full-decls.h
  c614345abe86d83c7906a4aacb42e8c8  gcc/rust/hir/tree/rust-hir-full.h
  2db585f68d3310e8eb15a16de2b77777  gcc/rust/hir/tree/rust-hir-generic-param.cc
*************** fe7399a4085a4706a055e17069f80d80  gcc/ru
*** 8406,8414 ****
  ec54250775efe40c60973c75aa15aa8c  gcc/rust/hir/tree/rust-hir-type.h
  28694ce0adef371fb0e422776f9e7f99  gcc/rust/hir/tree/rust-hir-visibility.h
  06acb5efb0cabb2e97bc67d95da8073e  gcc/rust/hir/tree/rust-hir-visitable.h
! 8110925cc09470bc2cda651ac677509d  gcc/rust/hir/tree/rust-hir-visitor.cc
  2f5012f50779b2cc8f0110750a33b31d  gcc/rust/hir/tree/rust-hir-visitor.h
! 2200e7ce4a218c64ff4086fb26451308  gcc/rust/hir/tree/rust-hir.cc
  740a251c7a11b6b3d56b5a01f9912174  gcc/rust/hir/tree/rust-hir.h
  f357dcf5713381e22c7036dfc40716f1  gcc/rust/lang-specs.h
  143e38307d731778484b18ab2291c687  gcc/rust/lang.opt
--- 8414,8422 ----
  ec54250775efe40c60973c75aa15aa8c  gcc/rust/hir/tree/rust-hir-type.h
  28694ce0adef371fb0e422776f9e7f99  gcc/rust/hir/tree/rust-hir-visibility.h
  06acb5efb0cabb2e97bc67d95da8073e  gcc/rust/hir/tree/rust-hir-visitable.h
! 014ac187cd84944fce4caa0e1d257b34  gcc/rust/hir/tree/rust-hir-visitor.cc
  2f5012f50779b2cc8f0110750a33b31d  gcc/rust/hir/tree/rust-hir-visitor.h
! d07a3a5f5b9d7004ca327b9c691c2427  gcc/rust/hir/tree/rust-hir.cc
  740a251c7a11b6b3d56b5a01f9912174  gcc/rust/hir/tree/rust-hir.h
  f357dcf5713381e22c7036dfc40716f1  gcc/rust/lang-specs.h
  143e38307d731778484b18ab2291c687  gcc/rust/lang.opt
*************** fe40f8618a9f5a5f007bc1a81fe45d3a  gcc/ru
*** 8426,8474 ****
  3c95bac9fe222be525b70cdb0ef90efb  gcc/rust/metadata/rust-import-archive.cc
  49cc95ebbf4be31888b54c4de40364fa  gcc/rust/metadata/rust-imports.cc
  659356fda258855d3d26c1eff1e24215  gcc/rust/metadata/rust-imports.h
! 6157b499aceab0b9b632eea936bc0f0d  gcc/rust/parse/rust-cfg-parser.cc
  dcbc600defe89f418c72fb56de980c97  gcc/rust/parse/rust-cfg-parser.h
! 5e7176ca7694264423219e80fb6926e0  gcc/rust/parse/rust-parse-error.h
  93ddc039830b0a6b587d38bb393ae6bd  gcc/rust/parse/rust-parse-impl-attribute.hxx
! f789836e639b70fbdecc97f72a80084c  gcc/rust/parse/rust-parse-impl-expr.hxx
  7cd5687bb8dc329dfcb8bfbc99b456e1  gcc/rust/parse/rust-parse-impl-lexer.cc
  123b237f788df6a919268f90d2188425  gcc/rust/parse/rust-parse-impl-macro.cc
  9b0425456c50b968cfb7e36b64f0f362  gcc/rust/parse/rust-parse-impl-macro.hxx
! d4942126b99c4e50f2d86dfeac466eba  gcc/rust/parse/rust-parse-impl-path.hxx
  3535076fa8d48befa963fce350256f23  gcc/rust/parse/rust-parse-impl-pattern.hxx
  3312ee1b49edc2bd989314358c23c6bf  gcc/rust/parse/rust-parse-impl-proc-macro.cc
! ffb11ea63669a2bc383d29cde2036010  gcc/rust/parse/rust-parse-impl-ttree.hxx
  c29fa936687b478a9889f3380ee0df68  gcc/rust/parse/rust-parse-impl-utils.hxx
! 9db34818ff3b5d108f551d7cd8afa501  gcc/rust/parse/rust-parse-impl.hxx
  8188f5994da36c8911bcd5425a5ff10d  gcc/rust/parse/rust-parse-utils.h
  d60ac257492f0b2d13c8c305707dd04a  gcc/rust/parse/rust-parse.cc
! 47d6f72222477ca5e39c824ea88e1dc1  gcc/rust/parse/rust-parse.h
  2f3ffa4e5b28a059fadd881c085fd620  gcc/rust/resolve/rust-ast-resolve.h
! c0938b166e2c3fa6ae09551cb00224d0  gcc/rust/resolve/rust-default-resolver.cc
  78f4e66ab101849c94b73d6c79773c15  gcc/rust/resolve/rust-default-resolver.h
! 928b52ab39f227af6f82c2b2ae06b610  gcc/rust/resolve/rust-early-name-resolver-2.0.cc
  fc0abd50175cbce9ceb647ef3334c0e4  gcc/rust/resolve/rust-early-name-resolver-2.0.h
  82c418bb5349b09785721ca6acf8a1f1  gcc/rust/resolve/rust-finalize-imports-2.0.cc
  5acd0bef3549fcc295bac20555a779cf  gcc/rust/resolve/rust-finalize-imports-2.0.h
  8a259cbd5ed5a4471451f6fedf12e7c8  gcc/rust/resolve/rust-forever-stack.cc
! a6c36b2526f5e699072f39dc440d324a  gcc/rust/resolve/rust-forever-stack.h
! a65f536dd409d2c8865001f62bf9f7be  gcc/rust/resolve/rust-forever-stack.hxx
  6d2f86dd0b3642cf5cc02bcfc48e7658  gcc/rust/resolve/rust-ice-finalizer.cc
  ba641854f27f5fd4a0cca8fbf125da14  gcc/rust/resolve/rust-ice-finalizer.h
  590df3e3e06f373943c90c7a8fef8040  gcc/rust/resolve/rust-immutable-name-resolution-context.cc
  f5c7461be946307b11f49c3acf706f34  gcc/rust/resolve/rust-immutable-name-resolution-context.h
! a4a6d23830710c8378890fc3e212d24e  gcc/rust/resolve/rust-late-name-resolver-2.0.cc
  196fd10d86327529bddea39566bca9d7  gcc/rust/resolve/rust-late-name-resolver-2.0.h
  6ef317c46f7fd8b8face1a849bdeaceb  gcc/rust/resolve/rust-name-resolution-context.cc
! 3d04e30d10d795c22a100b45cf09ae7f  gcc/rust/resolve/rust-name-resolution-context.h
  a756853116b3325b286f3bd09e0cd537  gcc/rust/resolve/rust-name-resolver.cc
  911f8f5bc652cdde8e16ec56e7e35266  gcc/rust/resolve/rust-name-resolver.h
  783acc8c1bd927a5890bd0b703c5a1ae  gcc/rust/resolve/rust-resolve-builtins.cc
  9f7080d5a5a44fbb1d53e8db861f55d6  gcc/rust/resolve/rust-resolve-builtins.h
  f0ecfa8102b52040dd8aa3421fec33bf  gcc/rust/resolve/rust-rib.cc
  6d6d5eff194daa39d1f0a1ba704ee2e8  gcc/rust/resolve/rust-rib.h
! e839903f69c2186eb08dd7ca7d870ab0  gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
! d13c61166eab65421c14ff8bff682a63  gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
  3f2008592c4958821acded6d659117c0  gcc/rust/rust-attribs.cc
  f1b5a4dd8502cad9b868c27742da2158  gcc/rust/rust-backend.h
  62c087c1db091a2df864b1a43c5fd9e6  gcc/rust/rust-diagnostics.cc
--- 8434,8482 ----
  3c95bac9fe222be525b70cdb0ef90efb  gcc/rust/metadata/rust-import-archive.cc
  49cc95ebbf4be31888b54c4de40364fa  gcc/rust/metadata/rust-imports.cc
  659356fda258855d3d26c1eff1e24215  gcc/rust/metadata/rust-imports.h
! 28dcb6b3b1ae5727b2fc184e9b1b6af1  gcc/rust/parse/rust-cfg-parser.cc
  dcbc600defe89f418c72fb56de980c97  gcc/rust/parse/rust-cfg-parser.h
! 9d5da297a43d8d6f3fe1813c29879937  gcc/rust/parse/rust-parse-error.h
  93ddc039830b0a6b587d38bb393ae6bd  gcc/rust/parse/rust-parse-impl-attribute.hxx
! 91b72c1881e7e606d49611b17772291b  gcc/rust/parse/rust-parse-impl-expr.hxx
  7cd5687bb8dc329dfcb8bfbc99b456e1  gcc/rust/parse/rust-parse-impl-lexer.cc
  123b237f788df6a919268f90d2188425  gcc/rust/parse/rust-parse-impl-macro.cc
  9b0425456c50b968cfb7e36b64f0f362  gcc/rust/parse/rust-parse-impl-macro.hxx
! d62839a7e1b61c00aa41b146304cd729  gcc/rust/parse/rust-parse-impl-path.hxx
  3535076fa8d48befa963fce350256f23  gcc/rust/parse/rust-parse-impl-pattern.hxx
  3312ee1b49edc2bd989314358c23c6bf  gcc/rust/parse/rust-parse-impl-proc-macro.cc
! ebc262f7414d034296b72ab859fdc482  gcc/rust/parse/rust-parse-impl-ttree.hxx
  c29fa936687b478a9889f3380ee0df68  gcc/rust/parse/rust-parse-impl-utils.hxx
! b437fdaa6e9bb0a09dac90235d77c51b  gcc/rust/parse/rust-parse-impl.hxx
  8188f5994da36c8911bcd5425a5ff10d  gcc/rust/parse/rust-parse-utils.h
  d60ac257492f0b2d13c8c305707dd04a  gcc/rust/parse/rust-parse.cc
! e7be1e34aaef2afbe2bb08ed6b74b2c7  gcc/rust/parse/rust-parse.h
  2f3ffa4e5b28a059fadd881c085fd620  gcc/rust/resolve/rust-ast-resolve.h
! ae9d11bb4a4f39e919862eef7e568f14  gcc/rust/resolve/rust-default-resolver.cc
  78f4e66ab101849c94b73d6c79773c15  gcc/rust/resolve/rust-default-resolver.h
! 76b72c2c48aec37d067dc6e194dec855  gcc/rust/resolve/rust-early-name-resolver-2.0.cc
  fc0abd50175cbce9ceb647ef3334c0e4  gcc/rust/resolve/rust-early-name-resolver-2.0.h
  82c418bb5349b09785721ca6acf8a1f1  gcc/rust/resolve/rust-finalize-imports-2.0.cc
  5acd0bef3549fcc295bac20555a779cf  gcc/rust/resolve/rust-finalize-imports-2.0.h
  8a259cbd5ed5a4471451f6fedf12e7c8  gcc/rust/resolve/rust-forever-stack.cc
! 5cfe93a0829300ce00e9ac1b9fd4961c  gcc/rust/resolve/rust-forever-stack.h
! a6cc0af1ec51b8a14328fb6f16587ac8  gcc/rust/resolve/rust-forever-stack.hxx
  6d2f86dd0b3642cf5cc02bcfc48e7658  gcc/rust/resolve/rust-ice-finalizer.cc
  ba641854f27f5fd4a0cca8fbf125da14  gcc/rust/resolve/rust-ice-finalizer.h
  590df3e3e06f373943c90c7a8fef8040  gcc/rust/resolve/rust-immutable-name-resolution-context.cc
  f5c7461be946307b11f49c3acf706f34  gcc/rust/resolve/rust-immutable-name-resolution-context.h
! 471be2f408ae0f38c1d586602f7365cc  gcc/rust/resolve/rust-late-name-resolver-2.0.cc
  196fd10d86327529bddea39566bca9d7  gcc/rust/resolve/rust-late-name-resolver-2.0.h
  6ef317c46f7fd8b8face1a849bdeaceb  gcc/rust/resolve/rust-name-resolution-context.cc
! d82be567510449c6379c392331bc6055  gcc/rust/resolve/rust-name-resolution-context.h
  a756853116b3325b286f3bd09e0cd537  gcc/rust/resolve/rust-name-resolver.cc
  911f8f5bc652cdde8e16ec56e7e35266  gcc/rust/resolve/rust-name-resolver.h
  783acc8c1bd927a5890bd0b703c5a1ae  gcc/rust/resolve/rust-resolve-builtins.cc
  9f7080d5a5a44fbb1d53e8db861f55d6  gcc/rust/resolve/rust-resolve-builtins.h
  f0ecfa8102b52040dd8aa3421fec33bf  gcc/rust/resolve/rust-rib.cc
  6d6d5eff194daa39d1f0a1ba704ee2e8  gcc/rust/resolve/rust-rib.h
! 6314de93955577cd9b6fc3a686fb45c0  gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
! c92385bb955360b66f0493c3199e514d  gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
  3f2008592c4958821acded6d659117c0  gcc/rust/rust-attribs.cc
  f1b5a4dd8502cad9b868c27742da2158  gcc/rust/rust-backend.h
  62c087c1db091a2df864b1a43c5fd9e6  gcc/rust/rust-diagnostics.cc
*************** f9d17454f9a3f63a28b2f424a4b54cc0  gcc/ru
*** 8509,8515 ****
  0f4ab4291d61b503e020bfb9289414b9  gcc/rust/typecheck/rust-hir-type-check-base.h
  b4f6bbf96b92718fc689ccfa1cc4e564  gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
  f4277ce8c7f84fcad6d767403000509d  gcc/rust/typecheck/rust-hir-type-check-enumitem.h
! e39fc3d1e508fa5b3e53165e17339bca  gcc/rust/typecheck/rust-hir-type-check-expr.cc
  86eebb1a9fdc10e3b3db716be9495378  gcc/rust/typecheck/rust-hir-type-check-expr.h
  538448510eee83d3cdd5e11139979114  gcc/rust/typecheck/rust-hir-type-check-implitem.cc
  b5767f59e24736d3d41a91868444e0cc  gcc/rust/typecheck/rust-hir-type-check-implitem.h
--- 8517,8523 ----
  0f4ab4291d61b503e020bfb9289414b9  gcc/rust/typecheck/rust-hir-type-check-base.h
  b4f6bbf96b92718fc689ccfa1cc4e564  gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
  f4277ce8c7f84fcad6d767403000509d  gcc/rust/typecheck/rust-hir-type-check-enumitem.h
! 9c5b8831c5a3b1bb314bb71cfda38b86  gcc/rust/typecheck/rust-hir-type-check-expr.cc
  86eebb1a9fdc10e3b3db716be9495378  gcc/rust/typecheck/rust-hir-type-check-expr.h
  538448510eee83d3cdd5e11139979114  gcc/rust/typecheck/rust-hir-type-check-implitem.cc
  b5767f59e24736d3d41a91868444e0cc  gcc/rust/typecheck/rust-hir-type-check-implitem.h
*************** fcb02130c7b685b134f835bf25092f50  gcc/ru
*** 8543,8549 ****
  4b763a53685364f24c7281fe201c9658  gcc/rust/typecheck/rust-tyty-variance-analysis.cc
  d745c17e84fc1621534e477f38dac840  gcc/rust/typecheck/rust-tyty-variance-analysis.h
  ec0d5651a6bc455064668a10e90fd80d  gcc/rust/typecheck/rust-tyty-visitor.h
! 9f37570809a04b76243f8a367aaf0bcf  gcc/rust/typecheck/rust-tyty.cc
  7bd82ff84815b8f9280565b9c799eff7  gcc/rust/typecheck/rust-tyty.h
  aacae8d8512a124e932526c2a1030503  gcc/rust/typecheck/rust-unify.cc
  b9ed06a06760418d2aa26129aee56348  gcc/rust/typecheck/rust-unify.h
--- 8551,8557 ----
  4b763a53685364f24c7281fe201c9658  gcc/rust/typecheck/rust-tyty-variance-analysis.cc
  d745c17e84fc1621534e477f38dac840  gcc/rust/typecheck/rust-tyty-variance-analysis.h
  ec0d5651a6bc455064668a10e90fd80d  gcc/rust/typecheck/rust-tyty-visitor.h
! 798e96fff48f83dac8a7486848ef2251  gcc/rust/typecheck/rust-tyty.cc
  7bd82ff84815b8f9280565b9c799eff7  gcc/rust/typecheck/rust-tyty.h
  aacae8d8512a124e932526c2a1030503  gcc/rust/typecheck/rust-unify.cc
  b9ed06a06760418d2aa26129aee56348  gcc/rust/typecheck/rust-unify.h
*************** eb1bfe030c9849086601bd0822a7e35a  gcc/ru
*** 8555,8561 ****
  28960566056dffb6dd86b0c3ad60bf39  gcc/rust/util/rust-abi.cc
  a85e112c6426c604dd9a3a9af712e53b  gcc/rust/util/rust-abi.h
  961e1004e5c1f984212c31357b8c006e  gcc/rust/util/rust-attribute-values.h
! e922a6ce7a61bbd41d4bd9355b10770c  gcc/rust/util/rust-attributes.cc
  a701c002ae75ba8b23aaad3b4195e443  gcc/rust/util/rust-attributes.h
  f7a4957c1c7c3fc0e851a38ef997ce72  gcc/rust/util/rust-base62.cc
  a674c0d71a00cc704ca2d16c25f4ba3e  gcc/rust/util/rust-base62.h
--- 8563,8569 ----
  28960566056dffb6dd86b0c3ad60bf39  gcc/rust/util/rust-abi.cc
  a85e112c6426c604dd9a3a9af712e53b  gcc/rust/util/rust-abi.h
  961e1004e5c1f984212c31357b8c006e  gcc/rust/util/rust-attribute-values.h
! 59ab4aad52dc6095283a2b40abe4b753  gcc/rust/util/rust-attributes.cc
  a701c002ae75ba8b23aaad3b4195e443  gcc/rust/util/rust-attributes.h
  f7a4957c1c7c3fc0e851a38ef997ce72  gcc/rust/util/rust-base62.cc
  a674c0d71a00cc704ca2d16c25f4ba3e  gcc/rust/util/rust-base62.h
*************** c5e97158cfb2af3204a5d8562aefaf85  gcc/sh
*** 8624,8630 ****
  3f3d94e6f52cc07f64e195e1a75dc485  gcc/signop.h
  b4c90fe064bba484ce5c18adb1a9e544  gcc/simple-diagnostic-path.cc
  7affe31db6f7cb9c7fc77937feef0758  gcc/simple-diagnostic-path.h
! 2d49adc30093a9f8b6e3a4fdcc782691  gcc/simplify-rtx.cc
  d1aec926a9488869692e8fe2f61ca75f  gcc/sort.cc
  7daa38cb1d09a2f88958f00a965d40a1  gcc/sparseset.cc
  3883b6ff1845dcec7b2822124018ab05  gcc/sparseset.h
--- 8632,8638 ----
  3f3d94e6f52cc07f64e195e1a75dc485  gcc/signop.h
  b4c90fe064bba484ce5c18adb1a9e544  gcc/simple-diagnostic-path.cc
  7affe31db6f7cb9c7fc77937feef0758  gcc/simple-diagnostic-path.h
! c5e9c8b9a25d10dc3d042dd20d5ec3c1  gcc/simplify-rtx.cc
  d1aec926a9488869692e8fe2f61ca75f  gcc/sort.cc
  7daa38cb1d09a2f88958f00a965d40a1  gcc/sparseset.cc
  3883b6ff1845dcec7b2822124018ab05  gcc/sparseset.h
*************** abe561302c75a109ce08cbd323584729  gcc/sr
*** 8642,8648 ****
  230879235935baa33d6a5cfc7df6f697  gcc/stack-ptr-mod.cc
  54d0245c9f12863a12bba5c5dca661de  gcc/statistics.cc
  d0c8ce33234bafe2dbc74e49092117d8  gcc/statistics.h
! e4afca92d1de724cad12aef780c9eca7  gcc/stmt.cc
  bb220250a8f31c99168b5db3e1adb3a7  gcc/stmt.h
  46ca4a8aaee638f2c6d6ba86ff439cb8  gcc/stor-layout.cc
  48b181fd932367bfce9913bb8162cfd6  gcc/stor-layout.h
--- 8650,8656 ----
  230879235935baa33d6a5cfc7df6f697  gcc/stack-ptr-mod.cc
  54d0245c9f12863a12bba5c5dca661de  gcc/statistics.cc
  d0c8ce33234bafe2dbc74e49092117d8  gcc/statistics.h
! bae414ca6b1d11488ac29960c5ec8422  gcc/stmt.cc
  bb220250a8f31c99168b5db3e1adb3a7  gcc/stmt.h
  46ca4a8aaee638f2c6d6ba86ff439cb8  gcc/stor-layout.cc
  48b181fd932367bfce9913bb8162cfd6  gcc/stor-layout.h
*************** b21c32de4ac41afaa112df92995fbc7b  gcc/ta
*** 8678,8684 ****
  8125dc2ec6773b874996579f2c7a5a45  gcc/targhooks.cc
  407bffe68a928437a42d3979f89d8c46  gcc/targhooks.h
  f39fcaa8197187283ccfed40107b426d  gcc/testsuite/.gitattributes
! f9d525858225fc3e16006dd94cea827b  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
! 97473fd14af1c0a540725cf0db2b8cca  gcc/testsuite/ChangeLog
  47e8e29b649ead73b8a1e4797da470ed  gcc/testsuite/ChangeLog-1993-2007
  35198a9e4fd31b935de8789faabf3351  gcc/testsuite/ChangeLog-2008
  0f19934540750356d1b91595cebfd9a8  gcc/testsuite/ChangeLog-2009
*************** f7d448f4e3ebaacd99f950c9cf7f97d5  gcc/te
*** 17526,17532 ****
  c7246874a77abbb3a97cf9097645afd6  gcc/testsuite/algol68/execute/posix-strerror-1.a68
  f586445784f51d44c1177d8b4e0646aa  gcc/testsuite/algol68/execute/posix-stride-1.a68
  87d4bc9531459a7bbd123ce018a50096  gcc/testsuite/algol68/execute/pow-int-1.a68
! 553a8f06543a205e49fc44d50bdaf72d  gcc/testsuite/algol68/execute/pow-real-1.a68
  9af388cb88078b2860ff1899f7d57255  gcc/testsuite/algol68/execute/proc-1.a68
  7310633af0732fcb4a0ceafba216111b  gcc/testsuite/algol68/execute/proc-10.a68
  f946676ba330436b799799f8c749d29f  gcc/testsuite/algol68/execute/proc-12.a68
--- 17534,17540 ----
  c7246874a77abbb3a97cf9097645afd6  gcc/testsuite/algol68/execute/posix-strerror-1.a68
  f586445784f51d44c1177d8b4e0646aa  gcc/testsuite/algol68/execute/posix-stride-1.a68
  87d4bc9531459a7bbd123ce018a50096  gcc/testsuite/algol68/execute/pow-int-1.a68
! 66bebd007439cc8f781a8a72edf48987  gcc/testsuite/algol68/execute/pow-real-1.a68
  9af388cb88078b2860ff1899f7d57255  gcc/testsuite/algol68/execute/proc-1.a68
  7310633af0732fcb4a0ceafba216111b  gcc/testsuite/algol68/execute/proc-10.a68
  f946676ba330436b799799f8c749d29f  gcc/testsuite/algol68/execute/proc-12.a68
*************** e82c7b7752e66456db57ee27e9f0dea7  gcc/te
*** 20189,20194 ****
--- 20197,20203 ----
  9032f3bb916ba5c274bdfec86c5c4ef5  gcc/testsuite/c-c++-common/pr119618.c
  c9f6665aa9cce2133e7c5f9edba34076  gcc/testsuite/c-c++-common/pr121159.c
  f938d650e5405e1ae04ff131a9239d66  gcc/testsuite/c-c++-common/pr122188.c
+ 9644c5632092fc15f618c4092e7e502f  gcc/testsuite/c-c++-common/pr123437.c
  f5dce8e27cfb8a6bfffe57596fecb796  gcc/testsuite/c-c++-common/pr19807-1.c
  8a7d9a8dd4af1ada80ca6a4b3201e073  gcc/testsuite/c-c++-common/pr19807-2.c
  39c0873a2c1c7f951e8b2f90ebc9e12d  gcc/testsuite/c-c++-common/pr19807-3.c
*************** a4281300968e70731988a9ad41094250  gcc/te
*** 21152,21158 ****
  56a12a09adb0c17ac03345d06ae419b3  gcc/testsuite/cobol.dg/group2/CALL_with_OMITTED_parameter.out
  45a23cbfa83a07f3308b7735822f9264  gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_ASCII.cob
  0af968fb266b24c9fd8e9d594d7e28f3  gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_ASCII.out
! 30c8310881b4d6c04883089b48e22813  gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.cob
  0af968fb266b24c9fd8e9d594d7e28f3  gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.out
  f4905b3cede4cad548e4f57e046904d7  gcc/testsuite/cobol.dg/group2/COMP-6_arithmetic.cob
  4c557552ba46fff61c6bba359bbd2426  gcc/testsuite/cobol.dg/group2/COMP-6_arithmetic.out
--- 21161,21167 ----
  56a12a09adb0c17ac03345d06ae419b3  gcc/testsuite/cobol.dg/group2/CALL_with_OMITTED_parameter.out
  45a23cbfa83a07f3308b7735822f9264  gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_ASCII.cob
  0af968fb266b24c9fd8e9d594d7e28f3  gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_ASCII.out
! 1198387259c0c3ba3f28db9eacec53d9  gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.cob
  0af968fb266b24c9fd8e9d594d7e28f3  gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.out
  f4905b3cede4cad548e4f57e046904d7  gcc/testsuite/cobol.dg/group2/COMP-6_arithmetic.cob
  4c557552ba46fff61c6bba359bbd2426  gcc/testsuite/cobol.dg/group2/COMP-6_arithmetic.out
*************** c94667798e53c8974de0912e64b9f68a  gcc/te
*** 21495,21501 ****
  0c0ecf77a8e923475016b253a23bcada  gcc/testsuite/cobol.dg/group2/MULTIPLY_BY_literal_in_INITIAL_program.cob
  87b0bc0c9121907b31f6ee3692914a41  gcc/testsuite/cobol.dg/group2/MULTIPLY_to_FIX4.cob
  cf6cb0baac26cccf2005d78a4a1afb78  gcc/testsuite/cobol.dg/group2/MULTIPLY_to_FIX4.out
! 94f742027b483c887f7c7d9b88ce3763  gcc/testsuite/cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.cob
  92cebaacd47235a03b5cdfc283882a86  gcc/testsuite/cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.out
  b0cd20ec9807fca430e620486c4f9568  gcc/testsuite/cobol.dg/group2/Multiple_INDEXED_BY_variables_with_the_same_name.cob
  3b4538b5070b02cf4ebc653902e53e31  gcc/testsuite/cobol.dg/group2/Multiple_INDEXED_BY_variables_with_the_same_name.out
--- 21504,21510 ----
  0c0ecf77a8e923475016b253a23bcada  gcc/testsuite/cobol.dg/group2/MULTIPLY_BY_literal_in_INITIAL_program.cob
  87b0bc0c9121907b31f6ee3692914a41  gcc/testsuite/cobol.dg/group2/MULTIPLY_to_FIX4.cob
  cf6cb0baac26cccf2005d78a4a1afb78  gcc/testsuite/cobol.dg/group2/MULTIPLY_to_FIX4.out
! 93a76fa238e6b843def50133986feba8  gcc/testsuite/cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.cob
  92cebaacd47235a03b5cdfc283882a86  gcc/testsuite/cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.out
  b0cd20ec9807fca430e620486c4f9568  gcc/testsuite/cobol.dg/group2/Multiple_INDEXED_BY_variables_with_the_same_name.cob
  3b4538b5070b02cf4ebc653902e53e31  gcc/testsuite/cobol.dg/group2/Multiple_INDEXED_BY_variables_with_the_same_name.out
*************** b5963b02036ff978d27f84401ae9576f  gcc/te
*** 21663,21671 ****
  dd53d7fb55d0e27adf37351af8df5cf2  gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_1.cob
  862431a534ef3c4c98f706e77178b302  gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_1.out
  6845ceb0330ecee6abcc0934b17a7fd2  gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.cob
! 9cb056616f86c1cb844545727c347732  gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out
  1c314570f7cbb362dd3e7e739487c960  gcc/testsuite/cobol.dg/group2/floating-point_literals.cob
! 96b2c647c950f5d1637c902171619577  gcc/testsuite/cobol.dg/group2/floating-point_literals.out
  d23088a98a20d2069d7fb0cad5a416f7  gcc/testsuite/cobol.dg/group2/integer_arithmetic_on_floating-point_var.cob
  485a46d485361b3b618c4705dcd36210  gcc/testsuite/cobol.dg/group2/length_of_ODO_Rules_7__8A__and_8B.cob
  5eb817262236b0ba59a5015d171025fb  gcc/testsuite/cobol.dg/group2/length_of_ODO_Rules_7__8A__and_8B.out
--- 21672,21680 ----
  dd53d7fb55d0e27adf37351af8df5cf2  gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_1.cob
  862431a534ef3c4c98f706e77178b302  gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_1.out
  6845ceb0330ecee6abcc0934b17a7fd2  gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.cob
! d88b3fe0bb1d83cea4ea98d680f7ffce  gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out
  1c314570f7cbb362dd3e7e739487c960  gcc/testsuite/cobol.dg/group2/floating-point_literals.cob
! 8159bfeb00042dfb690785c80c76b4c5  gcc/testsuite/cobol.dg/group2/floating-point_literals.out
  d23088a98a20d2069d7fb0cad5a416f7  gcc/testsuite/cobol.dg/group2/integer_arithmetic_on_floating-point_var.cob
  485a46d485361b3b618c4705dcd36210  gcc/testsuite/cobol.dg/group2/length_of_ODO_Rules_7__8A__and_8B.cob
  5eb817262236b0ba59a5015d171025fb  gcc/testsuite/cobol.dg/group2/length_of_ODO_Rules_7__8A__and_8B.out
*************** bd92bb263ce3f4e8ba38942b69777545  gcc/te
*** 21722,21729 ****
  8fb8f015a13dbb924ae0963f603ff37a  gcc/testsuite/g++.dg/DRs/dr2578.C
  69abd62027a5c141b392afc212fa4271  gcc/testsuite/g++.dg/DRs/dr2579.C
  578ff8885e47476743d05b756870ddb1  gcc/testsuite/g++.dg/DRs/dr2580.C
! 5233a6354ddaddf6247a143388684e62  gcc/testsuite/g++.dg/DRs/dr2581-1.C
! 70f8f9b3b1b1380b1cd58f84406195ac  gcc/testsuite/g++.dg/DRs/dr2581-2.C
  b0dfa04b7b53aefdac18e143994883bd  gcc/testsuite/g++.dg/DRs/dr2583.C
  f2f3b031e1cbc5967efb4a8bda8a5660  gcc/testsuite/g++.dg/DRs/dr2604.C
  725e812bcb1bb89bd0a89930ca5524eb  gcc/testsuite/g++.dg/DRs/dr2627.C
--- 21731,21738 ----
  8fb8f015a13dbb924ae0963f603ff37a  gcc/testsuite/g++.dg/DRs/dr2578.C
  69abd62027a5c141b392afc212fa4271  gcc/testsuite/g++.dg/DRs/dr2579.C
  578ff8885e47476743d05b756870ddb1  gcc/testsuite/g++.dg/DRs/dr2580.C
! 4aeb7f22ce169e340d1ea6c0fc562a54  gcc/testsuite/g++.dg/DRs/dr2581-1.C
! 120ebd051af96d507564c6d7f5b23fb3  gcc/testsuite/g++.dg/DRs/dr2581-2.C
  b0dfa04b7b53aefdac18e143994883bd  gcc/testsuite/g++.dg/DRs/dr2583.C
  f2f3b031e1cbc5967efb4a8bda8a5660  gcc/testsuite/g++.dg/DRs/dr2604.C
  725e812bcb1bb89bd0a89930ca5524eb  gcc/testsuite/g++.dg/DRs/dr2627.C
*************** bf4548567b9b369e7f63db818c6a1013  gcc/te
*** 24770,24776 ****
  65eb8edae8e5d98c8436657e2016b854  gcc/testsuite/g++.dg/cpp0x/initlist99.C
  2bd94659e18571416ec707555f61b80d  gcc/testsuite/g++.dg/cpp0x/inline-ns1.C
  09d6c7c943511e4c18583317900e80e5  gcc/testsuite/g++.dg/cpp0x/inline-ns10.C
! 3e2f011d130eb1b8b8c5b45e6f650dfb  gcc/testsuite/g++.dg/cpp0x/inline-ns2.C
  9ac74ab89dc8edcde76b2e7628340a13  gcc/testsuite/g++.dg/cpp0x/inline-ns3.C
  b0c5ed66fb6bc8597e3d516e4ce3f396  gcc/testsuite/g++.dg/cpp0x/inline-ns4.C
  868d9c1bbed4bb85f1cbb3ad116f6eb1  gcc/testsuite/g++.dg/cpp0x/inline-ns5.C
--- 24779,24785 ----
  65eb8edae8e5d98c8436657e2016b854  gcc/testsuite/g++.dg/cpp0x/initlist99.C
  2bd94659e18571416ec707555f61b80d  gcc/testsuite/g++.dg/cpp0x/inline-ns1.C
  09d6c7c943511e4c18583317900e80e5  gcc/testsuite/g++.dg/cpp0x/inline-ns10.C
! 5bddf461168ff54baaf034cdfac47cbb  gcc/testsuite/g++.dg/cpp0x/inline-ns2.C
  9ac74ab89dc8edcde76b2e7628340a13  gcc/testsuite/g++.dg/cpp0x/inline-ns3.C
  b0c5ed66fb6bc8597e3d516e4ce3f396  gcc/testsuite/g++.dg/cpp0x/inline-ns4.C
  868d9c1bbed4bb85f1cbb3ad116f6eb1  gcc/testsuite/g++.dg/cpp0x/inline-ns5.C
*************** e944a760f2bcd206b36820c53e03b241  gcc/te
*** 25191,25196 ****
--- 25200,25206 ----
  01fdf9b25aed01336395f7314f3b5857  gcc/testsuite/g++.dg/cpp0x/noexcept90.C
  a1c17fbec179b1075e3839acd36429dc  gcc/testsuite/g++.dg/cpp0x/noexcept91.C
  0b7482d65d1817e0099f68c74ce2cd47  gcc/testsuite/g++.dg/cpp0x/noexcept91a.C
+ 03041cddc6731221ccbffcbbf4a9a198  gcc/testsuite/g++.dg/cpp0x/noexcept92.C
  3bf83ccb654cedbb57a45851fb14aa9d  gcc/testsuite/g++.dg/cpp0x/nolinkage1.C
  6b7c91b931bbdacbbffbf9b90a79bc6a  gcc/testsuite/g++.dg/cpp0x/nolinkage1.h
  c92e0eda44dd6b3d74960b249fa5204f  gcc/testsuite/g++.dg/cpp0x/nolinkage1a.cc
*************** bbec4ebaa9eb25cb6f5674378a048924  gcc/te
*** 27755,27761 ****
  91a2adb2573597b44ca672b07479e1fd  gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics9.C
  d794673e83c406364ada43bb3424172f  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda1.C
  63a44991fb60332c0389b38376547489  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda10.C
! 0aee297638cbb960b6d7a49303a84770  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda11.C
  0e2a1aa0d0280f985ada8a4c3cbd2e07  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda12.C
  d74bbc201fde13d804d767363c281130  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda13.C
  ad90458ad42ff08d4a1c948d0770dd89  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda14.C
--- 27765,27771 ----
  91a2adb2573597b44ca672b07479e1fd  gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics9.C
  d794673e83c406364ada43bb3424172f  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda1.C
  63a44991fb60332c0389b38376547489  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda10.C
! 809122730285c1f3d656e4d50b24056e  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda11.C
  0e2a1aa0d0280f985ada8a4c3cbd2e07  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda12.C
  d74bbc201fde13d804d767363c281130  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda13.C
  ad90458ad42ff08d4a1c948d0770dd89  gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda14.C
*************** d6cd69df86e5ef21af4548c3401c93ba  gcc/te
*** 29665,29670 ****
--- 29675,29690 ----
  a0199877628a1e748c0f7d11f73710a8  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops-no-highlight-colors.C
  2782c3a1ba0fe921f95b73de11d6bf55  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops.C
  a91bf5789095e7895cce3a68b00c225e  gcc/testsuite/g++.dg/diagnostic/bad-binary-ops2.C
+ 4f29b6db8cfb5880fea97f0b26daf164  gcc/testsuite/g++.dg/diagnostic/bad-fndef-1.C
+ 60a3da468dc223005c2b3338b7b676fb  gcc/testsuite/g++.dg/diagnostic/bad-fndef-2.C
+ 8037245dd64ecbf0a53540c8ceffdd2e  gcc/testsuite/g++.dg/diagnostic/bad-fndef-3.C
+ b272a0eee27afd79f7229c34ce2e3541  gcc/testsuite/g++.dg/diagnostic/bad-fndef-4.C
+ ef7b4739a24c2e4fbbe0f3c78ddbde12  gcc/testsuite/g++.dg/diagnostic/bad-fndef-5.C
+ 36220f9637539d956a08729866796752  gcc/testsuite/g++.dg/diagnostic/bad-fndef-6.C
+ 6478b5f7bafbc52d52e3a5e6eacfcc8b  gcc/testsuite/g++.dg/diagnostic/bad-fndef-7.C
+ 4546391658ef57f6e2ff10ee5ea7f924  gcc/testsuite/g++.dg/diagnostic/bad-fndef-7b.C
+ 536c130a4c45ab2b6ca7379dcf684111  gcc/testsuite/g++.dg/diagnostic/bad-fndef-8.C
+ 5bb307d396add3e8a53638eb6d6c1a0e  gcc/testsuite/g++.dg/diagnostic/bad-fndef-9.C
  748783b112c42a8deeb80f2d23c3aa1f  gcc/testsuite/g++.dg/diagnostic/base-operand-non-pointer-1.C
  33fa854dd774d551baf3637d7d169e63  gcc/testsuite/g++.dg/diagnostic/base.C
  d7dcca6cdb24ff15a17be482e130bf4e  gcc/testsuite/g++.dg/diagnostic/bindings1.C
*************** c3989c492c520c5e5c36e77898e2bd15  gcc/te
*** 29686,29691 ****
--- 29706,29712 ----
  3fd7c0c4c80c4df54c4f6b4749e1ff43  gcc/testsuite/g++.dg/diagnostic/enum2.C
  9d63b247573d69e756be213ea9a4413e  gcc/testsuite/g++.dg/diagnostic/enum3.C
  24cfdb080e913a2c8a75a3cf154f02e5  gcc/testsuite/g++.dg/diagnostic/explicit.C
+ d417e1c133247edfa1ee94b8f7ccf82d  gcc/testsuite/g++.dg/diagnostic/explicit2.C
  3127905a449847bc27a84d6b88588e2a  gcc/testsuite/g++.dg/diagnostic/expr1.C
  4d21f6027d297038928184dbbcd7b6f3  gcc/testsuite/g++.dg/diagnostic/extern-initialized.C
  dd6972e7b92113e6456388c099d1d0fc  gcc/testsuite/g++.dg/diagnostic/friend1.C
*************** b861e559b4d837b0c6576827bfaf08ec  gcc/te
*** 30620,30629 ****
--- 30641,30653 ----
  83baade7989ec401bd49db5363e07e77  gcc/testsuite/g++.dg/ext/gnu-inline-global-redecl.C
  76d50df4b93f3e23ae1ac19f717e8364  gcc/testsuite/g++.dg/ext/gnu-inline-global-reject.C
  3e78535e0258846fa466a40475303131  gcc/testsuite/g++.dg/ext/gnu-inline-global.C
+ 4ec281dd16623035193183cb2cbb2015  gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor1.C
+ 2ea3a9c7ad72ab3ec6e68a985a5742a9  gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor2.C
  b4a8192e545a20f5b7dea0d9fb8a6f63  gcc/testsuite/g++.dg/ext/gnu-inline-namespace.C
  58f8a0136cdff73766d2255387d3090e  gcc/testsuite/g++.dg/ext/gnu-inline-template-class.C
  df8bb001c84f32307c935ddafd4b28e1  gcc/testsuite/g++.dg/ext/gnu-inline-template-func.C
  adccbbb2dfe79ac5c79fd79702b4ebcb  gcc/testsuite/g++.dg/ext/goto1.C
+ 806d7def0c119c3a11f8ddcf2e574d3e  gcc/testsuite/g++.dg/ext/goto2.C
  91b493e659118ac166f0bb0643315332  gcc/testsuite/g++.dg/ext/has-builtin-1.C
  441e5aa8c33ee5eaec15ff3f27c9061f  gcc/testsuite/g++.dg/ext/has-feature.C
  8784bd586e428a839172997bd8adf401  gcc/testsuite/g++.dg/ext/has-feature2.C
*************** d84b4e6ad32eec6b47fea11f39244dd7  gcc/te
*** 30716,30722 ****
  3a805f1dafea1ecf418ab3dbdb6af96b  gcc/testsuite/g++.dg/ext/is_convertible4.C
  986a829ca110a6da40ad4e40333b4eb5  gcc/testsuite/g++.dg/ext/is_convertible5.C
  d74301fd930f4a488c9e941cdd242900  gcc/testsuite/g++.dg/ext/is_convertible6.C
! 81df2803e04b58964bc97c0d499da3e6  gcc/testsuite/g++.dg/ext/is_convertible7.C
  ebb1df191bcea60ed6342dad182b8901  gcc/testsuite/g++.dg/ext/is_deducible1.C
  94a516051a47d1b7e866ec47efa5de01  gcc/testsuite/g++.dg/ext/is_destructible1.C
  aa081a16610eaae6eaa83ad85ce8aa33  gcc/testsuite/g++.dg/ext/is_destructible2.C
--- 30740,30746 ----
  3a805f1dafea1ecf418ab3dbdb6af96b  gcc/testsuite/g++.dg/ext/is_convertible4.C
  986a829ca110a6da40ad4e40333b4eb5  gcc/testsuite/g++.dg/ext/is_convertible5.C
  d74301fd930f4a488c9e941cdd242900  gcc/testsuite/g++.dg/ext/is_convertible6.C
! dcd04efaca98f9985fb7d83ed7a5f959  gcc/testsuite/g++.dg/ext/is_convertible7.C
  ebb1df191bcea60ed6342dad182b8901  gcc/testsuite/g++.dg/ext/is_deducible1.C
  94a516051a47d1b7e866ec47efa5de01  gcc/testsuite/g++.dg/ext/is_destructible1.C
  aa081a16610eaae6eaa83ad85ce8aa33  gcc/testsuite/g++.dg/ext/is_destructible2.C
*************** b37a08c48590ee57a45669e3a61fc899  gcc/te
*** 31732,31738 ****
  dfe63b7d52f6d97e04da25f267ac330c  gcc/testsuite/g++.dg/graphite/pr42930.C
  4cf735ba9e5b65e201dbbd4ec916b359  gcc/testsuite/g++.dg/graphite/pr43026.C
  972ae62627d5778f45f285feb6661317  gcc/testsuite/g++.dg/guality/decomp1.C
! 08dc2a58649d3fc498035d86e6f73fde  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
--- 31756,31762 ----
  dfe63b7d52f6d97e04da25f267ac330c  gcc/testsuite/g++.dg/graphite/pr42930.C
  4cf735ba9e5b65e201dbbd4ec916b359  gcc/testsuite/g++.dg/graphite/pr43026.C
  972ae62627d5778f45f285feb6661317  gcc/testsuite/g++.dg/guality/decomp1.C
! 720617049c7a2f0f6faf0a736b855836  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
*************** b829196dc637277366c74ac9ece4c7c6  gcc/te
*** 32523,32529 ****
  07cf84b805b10187e5cb74fd1976a44c  gcc/testsuite/g++.dg/lookup/crash6.C
  ab5c5a242a635b12bd7f567d048700f4  gcc/testsuite/g++.dg/lookup/crash7.C
  8702e9a4573ea9d19da851427038afe8  gcc/testsuite/g++.dg/lookup/crash8.C
! 66170b2fcd25cd3bc4c54c5fda33f2bc  gcc/testsuite/g++.dg/lookup/decl1.C
  d64551040d13bf36f94a380b6b298ea5  gcc/testsuite/g++.dg/lookup/decl2.C
  d9678387006e999bc9d29de93e894ef7  gcc/testsuite/g++.dg/lookup/delete1.C
  86271224c38de31ea55c228d8c440211  gcc/testsuite/g++.dg/lookup/disamb1.C
--- 32547,32553 ----
  07cf84b805b10187e5cb74fd1976a44c  gcc/testsuite/g++.dg/lookup/crash6.C
  ab5c5a242a635b12bd7f567d048700f4  gcc/testsuite/g++.dg/lookup/crash7.C
  8702e9a4573ea9d19da851427038afe8  gcc/testsuite/g++.dg/lookup/crash8.C
! 2ca6d89eda59c2d0072870e02c8374b8  gcc/testsuite/g++.dg/lookup/decl1.C
  d64551040d13bf36f94a380b6b298ea5  gcc/testsuite/g++.dg/lookup/decl2.C
  d9678387006e999bc9d29de93e894ef7  gcc/testsuite/g++.dg/lookup/delete1.C
  86271224c38de31ea55c228d8c440211  gcc/testsuite/g++.dg/lookup/disamb1.C
*************** b661e2becb05be3da0f4060a56b98297  gcc/te
*** 32769,32775 ****
  566f22665e5dbaacccc9bab0af697314  gcc/testsuite/g++.dg/lookup/using14.C
  dc21e16250c98c89c5aa0d520799c564  gcc/testsuite/g++.dg/lookup/using15.C
  836c6a7c8df87ee0b5d5628bce3fe8a2  gcc/testsuite/g++.dg/lookup/using16.C
! 32cf4fc89f78aea3f873e97983a9112a  gcc/testsuite/g++.dg/lookup/using17.C
  0e7bcfa3b04037051371f537fde080d3  gcc/testsuite/g++.dg/lookup/using18.C
  2f7856e44d88c2a8a051c1b70aff3f85  gcc/testsuite/g++.dg/lookup/using19.C
  875d05eca7e2955ac6c81c54fb2fcf2b  gcc/testsuite/g++.dg/lookup/using2.C
--- 32793,32799 ----
  566f22665e5dbaacccc9bab0af697314  gcc/testsuite/g++.dg/lookup/using14.C
  dc21e16250c98c89c5aa0d520799c564  gcc/testsuite/g++.dg/lookup/using15.C
  836c6a7c8df87ee0b5d5628bce3fe8a2  gcc/testsuite/g++.dg/lookup/using16.C
! d5594e47981033b6490c1f899b223af5  gcc/testsuite/g++.dg/lookup/using17.C
  0e7bcfa3b04037051371f537fde080d3  gcc/testsuite/g++.dg/lookup/using18.C
  2f7856e44d88c2a8a051c1b70aff3f85  gcc/testsuite/g++.dg/lookup/using19.C
  875d05eca7e2955ac6c81c54fb2fcf2b  gcc/testsuite/g++.dg/lookup/using2.C
*************** d04ea5ff4edaac312d2301e012cfc77c  gcc/te
*** 33295,33300 ****
--- 33319,33327 ----
  203934cacd5033145b085ef1a55f02ab  gcc/testsuite/g++.dg/modules/block-decl-3_a.C
  88b54e881629545fb6ed4f4df979f36d  gcc/testsuite/g++.dg/modules/block-decl-3_b.C
  1f9eb2ee99d02aff4c71b5fe07c717f2  gcc/testsuite/g++.dg/modules/block-decl-3_c.C
+ 87fc2f30d102761c8b43f54f10356ee3  gcc/testsuite/g++.dg/modules/block-decl-4_a.C
+ 0277a052b7bce7091bfbc30911065211  gcc/testsuite/g++.dg/modules/block-decl-4_b.C
+ 5ad53765e02751e3d1cdc6e15f6d9e84  gcc/testsuite/g++.dg/modules/block-decl-4_c.C
  9f96f92847a3bf5bed4ca21d22dc7706  gcc/testsuite/g++.dg/modules/bool-1.h
  71cd96ea0f9ca336ec4f50ef4d6949a7  gcc/testsuite/g++.dg/modules/bool-1_a.H
  c93b823398a766831d77299480881f8c  gcc/testsuite/g++.dg/modules/bool-1_b.H
*************** fae22c7cff0bae185284077ff2e72523  gcc/te
*** 33422,33427 ****
--- 33449,33456 ----
  02940f3eec05ab2c1e44ea29d72255b6  gcc/testsuite/g++.dg/modules/convop-1_b.C
  f9fb2c7fc295df949a65ad17e27cbfe7  gcc/testsuite/g++.dg/modules/convop-2_a.H
  f9153a236ec996492630837403e73485  gcc/testsuite/g++.dg/modules/convop-2_b.C
+ 9ae397df67c8580dd9b4d907c754bb56  gcc/testsuite/g++.dg/modules/coro-1_a.C
+ 00a745a5dd6dcad93cf1681fb52cb56b  gcc/testsuite/g++.dg/modules/coro-1_b.C
  a12e7250787d90ecbf8a074e29830748  gcc/testsuite/g++.dg/modules/cpp-1.C
  3bb7a96e17349f006fdc91b7d33ece61  gcc/testsuite/g++.dg/modules/cpp-10.C
  2d36bf18c705bff96fbeefdaf66de03e  gcc/testsuite/g++.dg/modules/cpp-11.C
*************** c087af9321ac0e24731d2a4d1bb3e319  gcc/te
*** 33786,33792 ****
  8c3b4a86df0992edb91ffe5c31e3c519  gcc/testsuite/g++.dg/modules/internal-15_b.C
  88ee381d96387e16394444459f265bfd  gcc/testsuite/g++.dg/modules/internal-16.C
  de8b65b21e105d140eb3a6820d4aff13  gcc/testsuite/g++.dg/modules/internal-17_a.C
! 0a022e56b0fb5b3b73c65cff5e59ad05  gcc/testsuite/g++.dg/modules/internal-17_b.C
  8e050ce1f908224ad301706271ad39c4  gcc/testsuite/g++.dg/modules/internal-18.C
  eaa5a7feb828c2d301939fe4e5b02ace  gcc/testsuite/g++.dg/modules/internal-19_a.C
  0557bb600ba22cb555a81389c8419285  gcc/testsuite/g++.dg/modules/internal-19_b.C
--- 33815,33821 ----
  8c3b4a86df0992edb91ffe5c31e3c519  gcc/testsuite/g++.dg/modules/internal-15_b.C
  88ee381d96387e16394444459f265bfd  gcc/testsuite/g++.dg/modules/internal-16.C
  de8b65b21e105d140eb3a6820d4aff13  gcc/testsuite/g++.dg/modules/internal-17_a.C
! 95e8122b3b1c61455c26580773497b87  gcc/testsuite/g++.dg/modules/internal-17_b.C
  8e050ce1f908224ad301706271ad39c4  gcc/testsuite/g++.dg/modules/internal-18.C
  eaa5a7feb828c2d301939fe4e5b02ace  gcc/testsuite/g++.dg/modules/internal-19_a.C
  0557bb600ba22cb555a81389c8419285  gcc/testsuite/g++.dg/modules/internal-19_b.C
*************** d6c48fcb5fb2cc2eca51bdf02a511666  gcc/te
*** 36048,36053 ****
--- 36077,36083 ----
  9ca7ebe83672a0e3c639a4eff33fa711  gcc/testsuite/g++.dg/parse/attr4.C
  f91706807a58d1674acd4ede0b772db1  gcc/testsuite/g++.dg/parse/auto-struct-param.C
  73272b6d0088d70ce32ad135b8b8bdd1  gcc/testsuite/g++.dg/parse/bitfield1.C
+ 4ee85a4403fc531e7f9e839bd484f65c  gcc/testsuite/g++.dg/parse/bitfield10.C
  44f7fcda1355d2713f1553e89b1837b8  gcc/testsuite/g++.dg/parse/bitfield2.C
  8ba3c4b4e1071c4bc6a0af4986fa5735  gcc/testsuite/g++.dg/parse/bitfield3.C
  b325bb9ea4e508f973b222d3c07380fd  gcc/testsuite/g++.dg/parse/bitfield4.C
*************** eb7d271a7110d4e8fc3f749e65b2288f  gcc/te
*** 36409,36415 ****
  69077da5839ad8d28331fbad77fcd87e  gcc/testsuite/g++.dg/parse/no-typename1.C
  aa5411fd5e6b230e1e272f2eabca94bc  gcc/testsuite/g++.dg/parse/no-value1.C
  d3d5c74c2536d2bbc64765e6108f9905  gcc/testsuite/g++.dg/parse/non-dependent1.C
! 73062b089778c12a0028db31493ae2c0  gcc/testsuite/g++.dg/parse/non-dependent2.C
  4c962ba814ec62b887039d1d3eb9e82b  gcc/testsuite/g++.dg/parse/non-dependent3.C
  301b99fe0e3e5ec394c359f6ae5c6580  gcc/testsuite/g++.dg/parse/non-templ1.C
  975159f65456dba4b16d2ea9f6f10aac  gcc/testsuite/g++.dg/parse/nontype1.C
--- 36439,36445 ----
  69077da5839ad8d28331fbad77fcd87e  gcc/testsuite/g++.dg/parse/no-typename1.C
  aa5411fd5e6b230e1e272f2eabca94bc  gcc/testsuite/g++.dg/parse/no-value1.C
  d3d5c74c2536d2bbc64765e6108f9905  gcc/testsuite/g++.dg/parse/non-dependent1.C
! 47dcde73fe650b0237b53a3dce6b96af  gcc/testsuite/g++.dg/parse/non-dependent2.C
  4c962ba814ec62b887039d1d3eb9e82b  gcc/testsuite/g++.dg/parse/non-dependent3.C
  301b99fe0e3e5ec394c359f6ae5c6580  gcc/testsuite/g++.dg/parse/non-templ1.C
  975159f65456dba4b16d2ea9f6f10aac  gcc/testsuite/g++.dg/parse/nontype1.C
*************** b6e066cc704bbace8cbfa3d84d6416c9  gcc/te
*** 36992,36997 ****
--- 37022,37475 ----
  811592037db74bbc53431e930fefbe1a  gcc/testsuite/g++.dg/pubtypes.C
  c858352ed9c3656275116995879c5a8a  gcc/testsuite/g++.dg/recip_sqrt_mult_1.C
  ba996bbdd4fa7d29eb83826ce56286db  gcc/testsuite/g++.dg/recip_sqrt_mult_2.C
+ 2d11c7f2eb23bbaac0a3b5525304cad9  gcc/testsuite/g++.dg/reflect/access_context1.C
+ 0718aa80b2f3f6003982c05c87f30063  gcc/testsuite/g++.dg/reflect/access_context2.C
+ 5672929e36bfce1255d60bd4305dcc71  gcc/testsuite/g++.dg/reflect/access_context3.C
+ 79b6c11dad254773021e78868fb03cbb  gcc/testsuite/g++.dg/reflect/adl1.C
+ 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
+ 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/testsuite/g++.dg/reflect/annotations5.C
+ 52183ac252419247bd1a55d28d356534  gcc/testsuite/g++.dg/reflect/annotations6.C
+ 7197de7986e56e47fffcc516a0a6e28d  gcc/testsuite/g++.dg/reflect/annotations7.C
+ bae6d6398266dd286951a779994c5fea  gcc/testsuite/g++.dg/reflect/annotations8.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
+ 71a5a17d31dea5a7a7d60fd3b36453dc  gcc/testsuite/g++.dg/reflect/bases_of1.C
+ 50d204becc5a564d003524bbda54d480  gcc/testsuite/g++.dg/reflect/bases_of2.C
+ a3ca02798bae6834626899e3f48626d9  gcc/testsuite/g++.dg/reflect/bases_of3.C
+ 118a467750da473b2ad68973e520b6c9  gcc/testsuite/g++.dg/reflect/bit_size_of1.C
+ cdfee9c92cd1c39030b9538abaa0bbc0  gcc/testsuite/g++.dg/reflect/bitfield1.C
+ 26489e1481d28e38679c10fb0945c3d0  gcc/testsuite/g++.dg/reflect/can_substitute1.C
+ cf1ce97bd56b5845905e4696d6e21793  gcc/testsuite/g++.dg/reflect/class1.C
+ 7e1297bc870fe6904620a1d784bd3929  gcc/testsuite/g++.dg/reflect/class2.C
+ 92d9b5b1bf8f84c19d0b739b4cf4482c  gcc/testsuite/g++.dg/reflect/common_reference1.C
+ 487cfa186771c9640f8860d544bb7f50  gcc/testsuite/g++.dg/reflect/common_type1.C
+ cd206cb5ea84f41a1db6f893297a8a28  gcc/testsuite/g++.dg/reflect/compare1.C
+ eb84036c2fb391317cdd8fb25e15cd20  gcc/testsuite/g++.dg/reflect/compare10.C
+ 77f46ccfa338c4f9a75ef678d7ba5555  gcc/testsuite/g++.dg/reflect/compare2.C
+ 7c0c70816017268061a751c3bdbd538f  gcc/testsuite/g++.dg/reflect/compare3.C
+ 43bc2faf991123b2c587dad97132a94c  gcc/testsuite/g++.dg/reflect/compare4.C
+ 26ff3fb9d84661a03b28e40511fef415  gcc/testsuite/g++.dg/reflect/compare5.C
+ 09e1efe5771d8ca7e58515943f5072d6  gcc/testsuite/g++.dg/reflect/compare6.C
+ 443f23055fa6ef1c04dd052255304335  gcc/testsuite/g++.dg/reflect/compare7.C
+ c904467a71b469ad19ac245ff86a688f  gcc/testsuite/g++.dg/reflect/compare8.C
+ 635fa6f22b16b0493cd6c24ca7a70976  gcc/testsuite/g++.dg/reflect/compare9.C
+ 93f7d56c10957b5c536f0f5607120434  gcc/testsuite/g++.dg/reflect/compat1.C
+ 5099ae69183a971da3cd6780a7dbe8f9  gcc/testsuite/g++.dg/reflect/complete1.C
+ 11137d680afe19be9fda652628f4f9aa  gcc/testsuite/g++.dg/reflect/constant_of1.C
+ 787273832fdeace9aa387d16b45d5acc  gcc/testsuite/g++.dg/reflect/constant_of2.C
+ 6dce9c471620ac11e8a1153d76aa0a38  gcc/testsuite/g++.dg/reflect/constant_of3.C
+ 1c22ff6e7c79248772173a4ea6a2ab41  gcc/testsuite/g++.dg/reflect/constant_of4.C
+ 53293a79e433bd8b974e2ca5d0276809  gcc/testsuite/g++.dg/reflect/constant_of5.C
+ c73e698fa8ee3f17a355c1b70c0b4408  gcc/testsuite/g++.dg/reflect/constant_of6.C
+ edd0d59ec76c7c78594e6927a836e933  gcc/testsuite/g++.dg/reflect/constant_of7.C
+ 5e07eb68edac99f52a53cce16ac70187  gcc/testsuite/g++.dg/reflect/constant_of8.C
+ 7673ffd369326cd2652da80b94a78095  gcc/testsuite/g++.dg/reflect/constant_of9.C
+ 5c824cee5e2baf1b8ac5eb19ca0e3b55  gcc/testsuite/g++.dg/reflect/crash1.C
+ 2945fd341ded545fb0ec7e86bc906bba  gcc/testsuite/g++.dg/reflect/crash10.C
+ e2772898a740250f27b7580dc2785fa8  gcc/testsuite/g++.dg/reflect/crash11.C
+ da1beb4185a29d67525e0c2662e3bf48  gcc/testsuite/g++.dg/reflect/crash12.C
+ e1bc1bead47e5c70581c4fd484464fff  gcc/testsuite/g++.dg/reflect/crash13.C
+ 62281952b5574c91ff9d4b26736166ed  gcc/testsuite/g++.dg/reflect/crash14.C
+ a53dc121d95af0b575afde7329733e7f  gcc/testsuite/g++.dg/reflect/crash15.C
+ 3c9c6caa587b938ca6655f331d023b2e  gcc/testsuite/g++.dg/reflect/crash16.C
+ 9ca9f1b75f738a678aa5371ad5e2f83c  gcc/testsuite/g++.dg/reflect/crash17.C
+ fd4d2ba7da42a991ae7f0513e8331f00  gcc/testsuite/g++.dg/reflect/crash18.C
+ 2e861048a077a8b218262d85ab58096e  gcc/testsuite/g++.dg/reflect/crash2.C
+ 8546621cffce10eaaf19035ce092d690  gcc/testsuite/g++.dg/reflect/crash3.C
+ 08df10fc9089ca9b7056d12d68c3ef8f  gcc/testsuite/g++.dg/reflect/crash4.C
+ dd86fc7e909711154b284147a6956686  gcc/testsuite/g++.dg/reflect/crash5.C
+ d7f568645ceb8b10a63daaa599492f93  gcc/testsuite/g++.dg/reflect/crash6.C
+ edae344ef3c025f6bb140bdcc41cfbac  gcc/testsuite/g++.dg/reflect/crash7.C
+ d7c8a0736148c190a05cdcf0be278b45  gcc/testsuite/g++.dg/reflect/crash8.C
+ f1964d85b7740c85c6c38271bf60d85d  gcc/testsuite/g++.dg/reflect/crash9.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
+ 7d8b3fad71e1451f1bb83533b5f928bd  gcc/testsuite/g++.dg/reflect/data_member_spec4.C
+ a90bbaada7db11433927609f58ce9807  gcc/testsuite/g++.dg/reflect/dealias1.C
+ ba847f7d57294ccd6b282e81baaaf83b  gcc/testsuite/g++.dg/reflect/dealias2.C
+ 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
+ 388f1c5706640dbdf3b8e6017b3e4834  gcc/testsuite/g++.dg/reflect/define_static_array2.C
+ 76b6ad1540a13225c11e60306e2fe45c  gcc/testsuite/g++.dg/reflect/define_static_array3.C
+ 86d501d353abd9444f8b525bd99cf177  gcc/testsuite/g++.dg/reflect/define_static_array4.C
+ 29f60cd4f06a2aeaa33d6d03cd800fb1  gcc/testsuite/g++.dg/reflect/define_static_object1.C
+ 2f43e04330db46fe9e841fa7d43b1c5a  gcc/testsuite/g++.dg/reflect/define_static_object2.C
+ b7ed52abe86f4f7c8db2ebf610edeae3  gcc/testsuite/g++.dg/reflect/define_static_string1.C
+ 74a9da651383d9b624e829c74d8705b9  gcc/testsuite/g++.dg/reflect/dep1.C
+ 2090f130f698bc9d2d5ad0f675b42168  gcc/testsuite/g++.dg/reflect/dep10.C
+ a91076163632559f3333bcb1ef96b8fa  gcc/testsuite/g++.dg/reflect/dep11.C
+ 5ad7826c151890919478e6df81f4d9c8  gcc/testsuite/g++.dg/reflect/dep2.C
+ 0c0dac16104f8e96f71d07858c4a3a86  gcc/testsuite/g++.dg/reflect/dep3.C
+ 88c6774c1f0b10dc1375bd9a535099cb  gcc/testsuite/g++.dg/reflect/dep4.C
+ c152bd0ada713fee54272a0a838df8c0  gcc/testsuite/g++.dg/reflect/dep5.C
+ 27fd41741e15cae97a2741d3df1680b6  gcc/testsuite/g++.dg/reflect/dep6.C
+ caadd2bfc2b0a8223c1bd926f856e2da  gcc/testsuite/g++.dg/reflect/dep7.C
+ a971aae130c7a95be14b62e161cd2ba6  gcc/testsuite/g++.dg/reflect/dep8.C
+ e206f01c179e8a843dc93974bf8abcf8  gcc/testsuite/g++.dg/reflect/dep9.C
+ 3c23671718604961f36aeceda3d710bd  gcc/testsuite/g++.dg/reflect/diag1.C
+ c383f7bdf34cc8248e3fb9c61011574a  gcc/testsuite/g++.dg/reflect/diag2.C
+ 42fe88cac2066717f810a9d18d689e4a  gcc/testsuite/g++.dg/reflect/diag3.C
+ 1533eb5d112721a72e26e68b9d092170  gcc/testsuite/g++.dg/reflect/diag4.C
+ 33dbfbabd9276fa16216f8481beefd2b  gcc/testsuite/g++.dg/reflect/display_string_of1.C
+ 471074284711fdd57cea87c822da502f  gcc/testsuite/g++.dg/reflect/eh1.C
+ 47e795f9117d64bb20ad3346d6279726  gcc/testsuite/g++.dg/reflect/eh2.C
+ 1f1e3e76e5396dd5212128aa8d5efd8a  gcc/testsuite/g++.dg/reflect/eh3.C
+ 3e46ad73df6f3ebee6a89f0408144e7e  gcc/testsuite/g++.dg/reflect/eh4.C
+ 2d8332fa4e636235f83374acfbf34a3e  gcc/testsuite/g++.dg/reflect/eh5.C
+ 38a234dee576194a3715a8e511d1426f  gcc/testsuite/g++.dg/reflect/eh6.C
+ 921aab29773ecf5634effce9886572e5  gcc/testsuite/g++.dg/reflect/eh7.C
+ 1668f4ad5663287d74a9eec42178fefb  gcc/testsuite/g++.dg/reflect/eh8.C
+ 63da1b212dc6641e5f3a67e84ed1a68f  gcc/testsuite/g++.dg/reflect/eh9.C
+ 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
+ 69edf1172a90d65c86d8d9bb69b88b21  gcc/testsuite/g++.dg/reflect/error2.C
+ eb3f835094fc060a3320066f75665133  gcc/testsuite/g++.dg/reflect/error3.C
+ 5caf93c84084cbeab5b7f76875d678ae  gcc/testsuite/g++.dg/reflect/error4.C
+ 6c303a60a26078a7cfbfc0d446302662  gcc/testsuite/g++.dg/reflect/error5.C
+ 6dad71fc45a878bcafd4500cde907505  gcc/testsuite/g++.dg/reflect/error6.C
+ b6e5358e929ecce99496e00535aeba9d  gcc/testsuite/g++.dg/reflect/error8.C
+ 9c8bebf2a51bdac66f56ebcd8d2e79b5  gcc/testsuite/g++.dg/reflect/error9.C
+ 92058e6db958dd512a0f906581bd91a8  gcc/testsuite/g++.dg/reflect/expr1.C
+ a8a15705ab8187b001c195f1cec551cf  gcc/testsuite/g++.dg/reflect/expr10.C
+ b9523a1696257196719fca0c617d3dc0  gcc/testsuite/g++.dg/reflect/expr11.C
+ 964315bf14acc51f2e2f42297e2050c2  gcc/testsuite/g++.dg/reflect/expr12.C
+ d09ceac0ed381b8e6d87478d7da5ecea  gcc/testsuite/g++.dg/reflect/expr13.C
+ cb62b6f411eaa0edabe6a10520d7652c  gcc/testsuite/g++.dg/reflect/expr14.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
+ 2f5078e222bbbc165f5206961c222ffb  gcc/testsuite/g++.dg/reflect/expr5.C
+ 7d020fd4ecbc4b1230e2e19a4dd74baf  gcc/testsuite/g++.dg/reflect/expr6.C
+ 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
+ ae57ae6702f3164f6068801c355ebccb  gcc/testsuite/g++.dg/reflect/extract6.C
+ a8d56dba67d3e38c69cd73989942b6f9  gcc/testsuite/g++.dg/reflect/extract7.C
+ 90a098a09645b4fdee9a2712e997fdbc  gcc/testsuite/g++.dg/reflect/extract8.C
+ dd2227984481efc068df9fad2db70d23  gcc/testsuite/g++.dg/reflect/extract9.C
+ 7dfdda4e711c624c225fbd179ba39cc5  gcc/testsuite/g++.dg/reflect/feat1.C
+ e6669438419d88e4c2b4f1eace854b9c  gcc/testsuite/g++.dg/reflect/feat2.C
+ 161f0254b359ce954f72124bb202c5a7  gcc/testsuite/g++.dg/reflect/has_c_language_linkage1.C
+ 15b93d7620d02c60b28beb4fefd6951b  gcc/testsuite/g++.dg/reflect/has_default_argument1.C
+ 626e46c43bca50953d0c173af0e61317  gcc/testsuite/g++.dg/reflect/has_default_argument2.C
+ 1ba9c0afbd3d3bfee8cdbd06bce926cc  gcc/testsuite/g++.dg/reflect/has_default_member_initializer1.C
+ e7aed054edb8c49f473dedd89e692d96  gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C
+ ad9d237ed8234f3163d2b9a8acbde932  gcc/testsuite/g++.dg/reflect/has_external_linkage1.C
+ 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
+ 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
+ f425cc4c94b98bd21593783d21892327  gcc/testsuite/g++.dg/reflect/has_module_linkage1.C
+ 66f043c96f1021fe0f1a2bdfa3c2f4ca  gcc/testsuite/g++.dg/reflect/has_module_linkage2.C
+ 4ce029dab96644e608063a8020ae2138  gcc/testsuite/g++.dg/reflect/has_parent1.C
+ cb850cd3338c9749c0b33d924ed00a57  gcc/testsuite/g++.dg/reflect/has_template_arguments1.C
+ de0f55ef9b96c27bd58bd2fbbc36e8cb  gcc/testsuite/g++.dg/reflect/has_template_arguments2.C
+ 90b2fb1d5a2ff9be2149247a2409b5da  gcc/testsuite/g++.dg/reflect/has_template_arguments3.C
+ 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
+ 53caf8eb30ca80aa7c7b51f0275d8aae  gcc/testsuite/g++.dg/reflect/init1.C
+ 68f6f989d998918c473f8d79f1db76ef  gcc/testsuite/g++.dg/reflect/init10.C
+ 8dc0d0d0fae9dfaf4da9774c4db397c3  gcc/testsuite/g++.dg/reflect/init11.C
+ 31b74d4045244358f5ddf0340022aa0b  gcc/testsuite/g++.dg/reflect/init12.C
+ 94efec18a5d3953240068549411fd160  gcc/testsuite/g++.dg/reflect/init13.C
+ aa8f04eae840cf292352166e158cfd5c  gcc/testsuite/g++.dg/reflect/init14.C
+ 2f7952cde0bb918e80b859c86f0f6aed  gcc/testsuite/g++.dg/reflect/init15.C
+ 8e50886b33b97c105f268ac4464d550c  gcc/testsuite/g++.dg/reflect/init16.C
+ d90fcc99ddaeb5505678c7c407e0ab75  gcc/testsuite/g++.dg/reflect/init17.C
+ 314f62be0110f9e0a46fdc1b7585aebd  gcc/testsuite/g++.dg/reflect/init2.C
+ 0512b3bdec0b0fd28051477e9423aa67  gcc/testsuite/g++.dg/reflect/init3.C
+ d46e1560ddd6be61c86743909c517b4e  gcc/testsuite/g++.dg/reflect/init4.C
+ 16e06e6f77463e4d204ed502c4b1312b  gcc/testsuite/g++.dg/reflect/init5.C
+ b229ae7cb9793a4868e3dbe1c7d1cb14  gcc/testsuite/g++.dg/reflect/init6.C
+ 940b9893177229b9de2cee1cf1e74f21  gcc/testsuite/g++.dg/reflect/init7.C
+ 8c024b9064bedc0871c9233763f8946f  gcc/testsuite/g++.dg/reflect/init8.C
+ 4194935886cfb2b11d58b4ee27a10524  gcc/testsuite/g++.dg/reflect/init9.C
+ e32daebcb5a2c3af4591a9461a061429  gcc/testsuite/g++.dg/reflect/is_accessible1.C
+ 230691c7d478727c1d03d6ce04564045  gcc/testsuite/g++.dg/reflect/is_accessible2.C
+ ac791bc807fe0c7b53e76d5da44218ff  gcc/testsuite/g++.dg/reflect/is_alias_template1.C
+ 8a8199f0b8ee781f2f20ab30ab7aad23  gcc/testsuite/g++.dg/reflect/is_assignment1.C
+ 6086c12db6ae18199911def135e2ab6a  gcc/testsuite/g++.dg/reflect/is_bit_field1.C
+ 00448bb312c6a82f8b783fb2c261eca2  gcc/testsuite/g++.dg/reflect/is_class_member1.C
+ e787aed23c696a86456b0bb63c55c905  gcc/testsuite/g++.dg/reflect/is_class_template1.C
+ 69d27261600ef7e9bb5da4837bfdf6c8  gcc/testsuite/g++.dg/reflect/is_complete_type1.C
+ 49cc91ffb05d6a9ba6ef6b45d3e540b6  gcc/testsuite/g++.dg/reflect/is_complete_type2.C
+ 907a9b51160c4994e0564b44dda5824d  gcc/testsuite/g++.dg/reflect/is_concept1.C
+ 38a31d7e4824271d0377098550b08aa7  gcc/testsuite/g++.dg/reflect/is_const1.C
+ 38c4d03562b3dd27c1dacecd2f3dc570  gcc/testsuite/g++.dg/reflect/is_consteval_only1.C
+ 64df49905b691d820e4d1acd6536884c  gcc/testsuite/g++.dg/reflect/is_constructible_type1.C
+ edcf11d1d04e007df81b6c1b604ade38  gcc/testsuite/g++.dg/reflect/is_constructible_type2.C
+ bd09d4860633e0abef89800db481ef7b  gcc/testsuite/g++.dg/reflect/is_constructor_template1.C
+ f4a56a950a2bd5cb78ade91ca7986fe8  gcc/testsuite/g++.dg/reflect/is_constuctor1.C
+ e1f633c9f453273819581afe1fb408d1  gcc/testsuite/g++.dg/reflect/is_conversion_function1.C
+ a32b4b1121b495b62b9da9215c71cb93  gcc/testsuite/g++.dg/reflect/is_conversion_function_template1.C
+ fc7d12ed2fbda5d665f037d6d31ecc14  gcc/testsuite/g++.dg/reflect/is_copy_assignment1.C
+ 098c5f6de879f4dd66fe2c00c4b3944a  gcc/testsuite/g++.dg/reflect/is_copy_constructor1.C
+ a12567cab383b4fdd8868ff799d7a158  gcc/testsuite/g++.dg/reflect/is_data_member_spec1.C
+ d22a9ab03353b81e172ea389664d7bf9  gcc/testsuite/g++.dg/reflect/is_default_constructor1.C
+ 4a92c70c0eb651a0622b66edba7da291  gcc/testsuite/g++.dg/reflect/is_defaulted1.C
+ 02d19eba89632140a460396b72fe6939  gcc/testsuite/g++.dg/reflect/is_defaulted2.C
+ 9d914a3626ffbaa15ce334a8e0e4aade  gcc/testsuite/g++.dg/reflect/is_deleted1.C
+ a052e75c54216eda3a7ed548767640a4  gcc/testsuite/g++.dg/reflect/is_deleted2.C
+ 7c870cef82b333b4702c415f72d762a3  gcc/testsuite/g++.dg/reflect/is_destructor1.C
+ e790c039e0e092e68f38b1726e16d237  gcc/testsuite/g++.dg/reflect/is_enumerable_type1.C
+ 9e9917be672f086d123062004e2a548d  gcc/testsuite/g++.dg/reflect/is_enumerator1.C
+ cf4b29f5a184c24c75624cfadbb6701c  gcc/testsuite/g++.dg/reflect/is_explicit1.C
+ df9b3bf5132e39f8a09c99bc27987315  gcc/testsuite/g++.dg/reflect/is_explicit2.C
+ bb48a0d872f20ef6d7a8880e98ad7086  gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter1.C
+ 0e60388c629805e49960eeff70b54b1b  gcc/testsuite/g++.dg/reflect/is_final1.C
+ 022e42914195fa993b27771e411ee773  gcc/testsuite/g++.dg/reflect/is_function1.C
+ 2ec721685f4dab9159ca7c561879cc8d  gcc/testsuite/g++.dg/reflect/is_function2.C
+ 52b79b1608fc475b9f652f7ca0aad11f  gcc/testsuite/g++.dg/reflect/is_function3.C
+ dc2700d74f2ac3d126ee43abd7bd1494  gcc/testsuite/g++.dg/reflect/is_function_parameter1.C
+ 54ff5cd094e84d34cd5ed11eb6f70ae9  gcc/testsuite/g++.dg/reflect/is_function_parameter2.C
+ 89fcf27380bcee287e4235b29d14f531  gcc/testsuite/g++.dg/reflect/is_function_template1.C
+ fe85ee0d81fdd578dd4d16749aa89960  gcc/testsuite/g++.dg/reflect/is_function_template2.C
+ cd8b335479481d42fd594239cc723ab9  gcc/testsuite/g++.dg/reflect/is_function_type1.C
+ 2ed9d6800ea08083368dcdb43e9291b0  gcc/testsuite/g++.dg/reflect/is_literal_operator1.C
+ 2312dfdc3b8372d327a2e3a5d3aee00b  gcc/testsuite/g++.dg/reflect/is_literal_operator_template1.C
+ fc45e1ef9f58bd6a7614052a84b65bba  gcc/testsuite/g++.dg/reflect/is_lrvalue_reference_qualified1.C
+ 43c9413daf18e8ff5cc5f909733189b0  gcc/testsuite/g++.dg/reflect/is_move_assignment1.C
+ 562bd53ef6bf04ba8783413c8d9e77dd  gcc/testsuite/g++.dg/reflect/is_move_constructor1.C
+ 657b4c425375b43a4520a9477578289d  gcc/testsuite/g++.dg/reflect/is_mutable_member1.C
+ 726c080b8acbafed09570c6c58a1ae15  gcc/testsuite/g++.dg/reflect/is_namespace1.C
+ b2f7380f8fb82d61118b86f574efdf5b  gcc/testsuite/g++.dg/reflect/is_namespace_alias1.C
+ 2eeb1dfdffa04726a6facc2444612271  gcc/testsuite/g++.dg/reflect/is_namespace_member1.C
+ 8e979c5b8844a6520767c6efb09db89c  gcc/testsuite/g++.dg/reflect/is_noexcept1.C
+ ef7e9d0ca8688dc92475afb0aa712b4d  gcc/testsuite/g++.dg/reflect/is_noexcept2.C
+ 529256eb00d725cf4e7fe378768231fd  gcc/testsuite/g++.dg/reflect/is_noexcept3.C
+ 251cf6db3cd6d8fe18e0a994d7f2da41  gcc/testsuite/g++.dg/reflect/is_noexcept4.C
+ 2315aabaecef6a5b6556b8d384a700b1  gcc/testsuite/g++.dg/reflect/is_nonstatic_data_member1.C
+ 1e283c86c818492e229ab35822b90502  gcc/testsuite/g++.dg/reflect/is_object1.C
+ 9b9e3859a91aeb1c0e35e658a1cb1d74  gcc/testsuite/g++.dg/reflect/is_object2.C
+ 29590f8c59c0a00a852aa6909b49260b  gcc/testsuite/g++.dg/reflect/is_operator_function1.C
+ d5a1181af8bc4b25a3d2d724c0de83eb  gcc/testsuite/g++.dg/reflect/is_operator_function_template1.C
+ d705a2403f21ad32aef3e6e9ee763a23  gcc/testsuite/g++.dg/reflect/is_override1.C
+ c84e630a475f3025f5312fe34c916da1  gcc/testsuite/g++.dg/reflect/is_pure_virtual1.C
+ 5c516ec29647a5b84282fb28bc6f8fb2  gcc/testsuite/g++.dg/reflect/is_special_member_function1.C
+ cffc8a013897fb3553865b86ba72383a  gcc/testsuite/g++.dg/reflect/is_static_member1.C
+ a149b1bd1090219b0caa06c742c06766  gcc/testsuite/g++.dg/reflect/is_string_literal1.C
+ 6a2dd82163d65ba7fc78cc6dd274b5db  gcc/testsuite/g++.dg/reflect/is_structured_binding1.C
+ 31d287ccca4858cb6b7df144cc6561b4  gcc/testsuite/g++.dg/reflect/is_structured_binding2.C
+ 22fc644c4713c89f3848019502ad5414  gcc/testsuite/g++.dg/reflect/is_template1.C
+ 6b3899b9d8f829c417d46017b448ab60  gcc/testsuite/g++.dg/reflect/is_template2.C
+ 7524642bd3d0cae7277d3d6f359027c3  gcc/testsuite/g++.dg/reflect/is_type1.C
+ 9a7e60d8d9d1f2373102bc3e89c24efb  gcc/testsuite/g++.dg/reflect/is_type_alias1.C
+ 325e8e209b4aed0c45162b3c0c10b22b  gcc/testsuite/g++.dg/reflect/is_type_alias2.C
+ b4f796ba62257af7b6ef0a628e7be5a7  gcc/testsuite/g++.dg/reflect/is_type_alias3.C
+ cf1cf059b14dedec267b9d3eb14af4f6  gcc/testsuite/g++.dg/reflect/is_user_declared1.C
+ 2f2d410caf560ef61b04c889247f4558  gcc/testsuite/g++.dg/reflect/is_user_declared2.C
+ 08aeb095ec65f5b697c384d840034c3e  gcc/testsuite/g++.dg/reflect/is_user_provided1.C
+ cbd23b6c51de10b29357473a9adff8bc  gcc/testsuite/g++.dg/reflect/is_user_provided2.C
+ 3b091e4035f42a5253b3b44f84c04b1f  gcc/testsuite/g++.dg/reflect/is_variable1.C
+ c9981a6f6220d8cb1be4791c68f39805  gcc/testsuite/g++.dg/reflect/is_variable_template1.C
+ bcbfe7a6746a7cf5019e4beb91dfc6e1  gcc/testsuite/g++.dg/reflect/is_virtual1.C
+ 1a53c150bd12e5b766549b40d9f21ca8  gcc/testsuite/g++.dg/reflect/is_volatile1.C
+ 75564b7e49fd2ca4aec72df58d4ce257  gcc/testsuite/g++.dg/reflect/lex1.C
+ 5047184a71ebc4613c16d57f58d02456  gcc/testsuite/g++.dg/reflect/lex2.C
+ c283950e8b15f911e81f4f24718ae4ab  gcc/testsuite/g++.dg/reflect/mangle1.C
+ a3a095f76106493121ca9f08dbb03b9e  gcc/testsuite/g++.dg/reflect/member-visibility1.C
+ ad855dfbd2b8005bd8560472ce0cf5b4  gcc/testsuite/g++.dg/reflect/member-visibility2.C
+ 8f14087fc0d52e8c102a50ea5103a732  gcc/testsuite/g++.dg/reflect/member1.C
+ 798c02332c1f9a2f17309c4a50856e1b  gcc/testsuite/g++.dg/reflect/member10.C
+ 0cba845b2bb01c6139ddd64d9f8b5f57  gcc/testsuite/g++.dg/reflect/member11.C
+ 762fdbd174cf2ac6c75d9d8bd1eb3321  gcc/testsuite/g++.dg/reflect/member12.C
+ 4a7bf7a5063fd95a42f10e1f9db20c3b  gcc/testsuite/g++.dg/reflect/member13.C
+ a511d0918588fcdaf7f7e67daf993ddd  gcc/testsuite/g++.dg/reflect/member14.C
+ 01e8d8deebec5d7349d2120b2cd5afba  gcc/testsuite/g++.dg/reflect/member15.C
+ a1cdb8bf7f9f643fcc25e69a9a742a11  gcc/testsuite/g++.dg/reflect/member16.C
+ e0239469386941b146064cb464bd03c8  gcc/testsuite/g++.dg/reflect/member17.C
+ 67ae698b3600eacd0ebb7033eb1537f3  gcc/testsuite/g++.dg/reflect/member18.C
+ d7bf4b2b4a12e0e7c5f568c235fe50c9  gcc/testsuite/g++.dg/reflect/member19.C
+ 8ebf4e8f059ee7695e3d2f4523f941e8  gcc/testsuite/g++.dg/reflect/member2.C
+ 5a76580cb5157802057a41baaeb6e392  gcc/testsuite/g++.dg/reflect/member20.C
+ 15ab3614f7ae1299d4e7d568ee2727f4  gcc/testsuite/g++.dg/reflect/member3.C
+ 13ad7c1acc0fa411c611ac6fa110ac8a  gcc/testsuite/g++.dg/reflect/member4.C
+ 6fe67e7658a6bcb1550c6e320e9b1cb3  gcc/testsuite/g++.dg/reflect/member5.C
+ 79c751852acda9ad8561484ab2530cea  gcc/testsuite/g++.dg/reflect/member6.C
+ 6d9e2822017983605345c83cd6394e56  gcc/testsuite/g++.dg/reflect/member7.C
+ 6587073d195a9349db99c70b4f9a4f02  gcc/testsuite/g++.dg/reflect/member8.C
+ 33fa6f389e0fccc76ade8dfeb1535b4c  gcc/testsuite/g++.dg/reflect/member9.C
+ d1fd504ae938ad7e3b0edbf6834ec3b4  gcc/testsuite/g++.dg/reflect/members_of1.C
+ 689453102e4425f8d2c4ff89cb939595  gcc/testsuite/g++.dg/reflect/members_of2.C
+ 80a032eb31d0998f2d288e303356773a  gcc/testsuite/g++.dg/reflect/members_of3.C
+ 5ececa99994de569abffae1671b71870  gcc/testsuite/g++.dg/reflect/members_of4.C
+ 00940189c470989fe23b43d312c99062  gcc/testsuite/g++.dg/reflect/members_of5.C
+ 763692ff1741b8de0f544f2807ba4579  gcc/testsuite/g++.dg/reflect/members_of6.C
+ 55c41f09598b3c53288722e46c53c1cf  gcc/testsuite/g++.dg/reflect/members_of7.C
+ 5dfe729351628682329b585f411b52cb  gcc/testsuite/g++.dg/reflect/metafn-ptr1.C
+ 7ea29fd9a046e870ea501c8573ded819  gcc/testsuite/g++.dg/reflect/ns1.C
+ e251ac0684a52cda54a8255e3a49e24a  gcc/testsuite/g++.dg/reflect/ns2.C
+ 5bed6b939e587040c075e70083201181  gcc/testsuite/g++.dg/reflect/ns3.C
+ d651773731e4ea962187b9e5a30570ca  gcc/testsuite/g++.dg/reflect/ns4.C
+ 0b7259d3184e59599aeead7ca291964b  gcc/testsuite/g++.dg/reflect/ns5.C
+ 33a30930e2e875396b90cb726be2f04d  gcc/testsuite/g++.dg/reflect/ns6.C
+ b028075830c73967c5119fee2f30c861  gcc/testsuite/g++.dg/reflect/null1.C
+ c6a71c4b6f87d8009162c82104ba6ea6  gcc/testsuite/g++.dg/reflect/null2.C
+ 9d8f7299a9aea98b5c1b82f0f3a3dc30  gcc/testsuite/g++.dg/reflect/null3.C
+ 43e0baff1477b6b498e5c1d34b4afe5d  gcc/testsuite/g++.dg/reflect/null4.C
+ 0213453633af68fab3da41d83281e0be  gcc/testsuite/g++.dg/reflect/null5.C
+ ff22c9122c2c0fa7a5a06f539fcb9abe  gcc/testsuite/g++.dg/reflect/object_of1.C
+ 87988cb2a7a1da0cf4b8c94fa491b634  gcc/testsuite/g++.dg/reflect/object_of2.C
+ 6f855a2823d74e720da5dd0986bd2163  gcc/testsuite/g++.dg/reflect/odr1.C
+ 09f2262749d7e8a324ecc271ec93e9ef  gcc/testsuite/g++.dg/reflect/offset_of1.C
+ 019759857338107cc6359f1fb1e6f013  gcc/testsuite/g++.dg/reflect/operator_of1.C
+ 2b0f744432e465559b5b58287819bbc2  gcc/testsuite/g++.dg/reflect/override1.C
+ 7dde213d58e8c1daafbfbfd5af17e5d5  gcc/testsuite/g++.dg/reflect/p2996-1.C
+ c634a4b2a4486a5b4a43633d2a0618c7  gcc/testsuite/g++.dg/reflect/p2996-10.C
+ 8ab6c5344e4f14b6050ed7b2bb4a49a4  gcc/testsuite/g++.dg/reflect/p2996-11.C
+ 7ac6691978d0f36cdad31b5985a9e816  gcc/testsuite/g++.dg/reflect/p2996-12.C
+ 95f61b87bf0f7af7877307fa4cb06b06  gcc/testsuite/g++.dg/reflect/p2996-13.C
+ c4f82004380def285e0c839c569ff078  gcc/testsuite/g++.dg/reflect/p2996-14.C
+ 822323c6d3dfaa1f2c37385c1613bd12  gcc/testsuite/g++.dg/reflect/p2996-15.C
+ f63b81a3e6c7f2893e26afa00ccbc394  gcc/testsuite/g++.dg/reflect/p2996-16.C
+ 24605b6093caf5b93ff52758f0687abc  gcc/testsuite/g++.dg/reflect/p2996-17.C
+ b1714ceceb7e0124f79215552325258d  gcc/testsuite/g++.dg/reflect/p2996-18.C
+ 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
+ a50a28893edab692cde4895922fbf011  gcc/testsuite/g++.dg/reflect/p2996-6.C
+ 483ff485a9eeab292d6f65ad722ac089  gcc/testsuite/g++.dg/reflect/p2996-7.C
+ 29508caa5267d69f643d177e8e88e1f0  gcc/testsuite/g++.dg/reflect/p2996-8.C
+ 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
+ 157793e98058b0e2274b5549412cd0a5  gcc/testsuite/g++.dg/reflect/parameters_of2.C
+ 85f420fd03c5ea1a6d9590d66abccd31  gcc/testsuite/g++.dg/reflect/parameters_of3.C
+ 902b2d95e4aadaa6d5e76b7c37573d97  gcc/testsuite/g++.dg/reflect/parameters_of4.C
+ 22cf22648a9e3d3b08f4ff8def822d38  gcc/testsuite/g++.dg/reflect/parameters_of5.C
+ 27f03672191efb3132b9a4258c69a3fc  gcc/testsuite/g++.dg/reflect/parameters_of6.C
+ d6715d284c87d041e08a5fbebff9821e  gcc/testsuite/g++.dg/reflect/parent_of1.C
+ 55769fcd329e50bcfdf1c40931b35db5  gcc/testsuite/g++.dg/reflect/parm1.C
+ ee2a5065f194d0c1d1360c2d2a8f5d8b  gcc/testsuite/g++.dg/reflect/parm2.C
+ 20137ba8760da5d42ba55a0ab0d862fe  gcc/testsuite/g++.dg/reflect/parm3.C
+ 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
+ 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
+ 4a00c41972f2f14fa56db9ca726a463a  gcc/testsuite/g++.dg/reflect/reflect_constant1.C
+ 5d7610e1d1ccaf86552c4b68c0f0dcb1  gcc/testsuite/g++.dg/reflect/reflect_constant2.C
+ 2b1261b43d4d2862c007e4b67ac4dec0  gcc/testsuite/g++.dg/reflect/reflect_constant3.C
+ 56f4fab1f9cc258fffbbed8a454aa738  gcc/testsuite/g++.dg/reflect/reflect_constant4.C
+ 6ee37dab12c8d079c1e93833a4178610  gcc/testsuite/g++.dg/reflect/reflect_constant5.C
+ ea20b4d36f8c09e8db8dc22ebff369b1  gcc/testsuite/g++.dg/reflect/reflect_constant6.C
+ c9a28f1923f13abf7706e0302ed5209c  gcc/testsuite/g++.dg/reflect/reflect_constant7.C
+ f95ce0044b4db49d5f146e5fbe45875c  gcc/testsuite/g++.dg/reflect/reflect_constant8.C
+ 853d9cf6eccdb9acbc7b5f43613db0db  gcc/testsuite/g++.dg/reflect/reflect_constant9.C
+ 61d0a64ce5f607baeb67ce80bb50f4d7  gcc/testsuite/g++.dg/reflect/reflect_constant_array1.C
+ b1917b5ba841920599e01cb07bcd5bbe  gcc/testsuite/g++.dg/reflect/reflect_constant_array2.C
+ 50112030f94d83d432e32d44f823fcb3  gcc/testsuite/g++.dg/reflect/reflect_constant_array3.C
+ b981cebf1d46c91fde1199693b32aca6  gcc/testsuite/g++.dg/reflect/reflect_constant_array4.C
+ 7282880efced8bee225c43aec4c50a71  gcc/testsuite/g++.dg/reflect/reflect_constant_string1.C
+ cc8c2137143cd854b6630dc3dcd4973f  gcc/testsuite/g++.dg/reflect/reflect_constant_string2.C
+ 1e3345a57a06ffa1bd23a544151f8b02  gcc/testsuite/g++.dg/reflect/reflect_function1.C
+ 7da537591cf227c4369675668096edf2  gcc/testsuite/g++.dg/reflect/reflect_function2.C
+ da5ef12464e2e90dfdfbebc6048074af  gcc/testsuite/g++.dg/reflect/reflect_object1.C
+ 219eed74893dc72a1ea85c285ae8bc02  gcc/testsuite/g++.dg/reflect/reflect_object2.C
+ 58189cd2fe7a510e516a09a9e032e291  gcc/testsuite/g++.dg/reflect/reflect_object3.C
+ 6f1b1f516dd8c8457f4d83096b939473  gcc/testsuite/g++.dg/reflect/reflect_object4.C
+ 3467b818a4428e27d79059fb69239f72  gcc/testsuite/g++.dg/reflect/return_type_of1.C
+ 0f44fc97754345cb42d2c2b6567feca7  gcc/testsuite/g++.dg/reflect/return_type_of2.C
+ 384bd4b8aef59f5885e5d97091cfaf54  gcc/testsuite/g++.dg/reflect/serialize1.C
+ 59c250a44a0d375e0062c2596a42096e  gcc/testsuite/g++.dg/reflect/serialize2.C
+ acdd73b149c3c54aa0d80b81c86a5a4c  gcc/testsuite/g++.dg/reflect/size_of1.C
+ b54591a1a4cb544aba9831eba6b8174b  gcc/testsuite/g++.dg/reflect/source_location_of1.C
+ 82420344ec3910dc9c675d2a50b6dd1a  gcc/testsuite/g++.dg/reflect/source_location_of2.C
+ ae74f7e0fcb5cd481ffc4f5cdabaaea7  gcc/testsuite/g++.dg/reflect/splice1.C
+ c80b1bac424d9304fac93754834f224e  gcc/testsuite/g++.dg/reflect/splice2.C
+ e0d01c0d72438804b2438e81debbc181  gcc/testsuite/g++.dg/reflect/splice3.C
+ 16ffa77fee1d5e95704a23459a4b8deb  gcc/testsuite/g++.dg/reflect/splice4.C
+ 4801bd931beed660ccbf513998eaf76d  gcc/testsuite/g++.dg/reflect/splice5.C
+ 0badbfd09ec045739bf918587cc70dcf  gcc/testsuite/g++.dg/reflect/splice6.C
+ 6738eaccb426d5d58c46b54bbd7b4bfb  gcc/testsuite/g++.dg/reflect/splice7.C
+ d83516569f96b60f16ca10d6af0c3fdd  gcc/testsuite/g++.dg/reflect/splicing-base1.C
+ 5b08c4bd5ec55584fe063a1ede09bf93  gcc/testsuite/g++.dg/reflect/splicing-base2.C
+ 161c6b2b6c32e9474a22d401880f7e25  gcc/testsuite/g++.dg/reflect/splicing-base3.C
+ 828b34ddd835b0457a4d3b42b1f39fe4  gcc/testsuite/g++.dg/reflect/splicing-base4.C
+ deb8d7929a75c59a3b5e1acffe8dbc2e  gcc/testsuite/g++.dg/reflect/storage_duration1.C
+ f84dc9ba34cda9fdc1466eac8199bf97  gcc/testsuite/g++.dg/reflect/storage_duration2.C
+ ef83de902dee2f6fe942c29156f8503f  gcc/testsuite/g++.dg/reflect/storage_duration3.C
+ 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
+ 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
+ 8e9280f6ad4e5c65f03dccb8e51aefc7  gcc/testsuite/g++.dg/reflect/template_arguments_of2.C
+ 0b36ea79af1e6323ae15815e8e4759d3  gcc/testsuite/g++.dg/reflect/template_arguments_of3.C
+ 1f1fd5a223dd428cc68eb012d03a95ae  gcc/testsuite/g++.dg/reflect/template_of1.C
+ 78bf7ef59fdf5c4f4b28ea75eaa5f4d4  gcc/testsuite/g++.dg/reflect/template_of2.C
+ 89e96f6ffe32cd4e10add49c5348c9d4  gcc/testsuite/g++.dg/reflect/template_of3.C
+ 64112525decdfd942b3bb45931514e96  gcc/testsuite/g++.dg/reflect/tuple1.C
+ ff49ad2327b77188c9be7008d37b0fa1  gcc/testsuite/g++.dg/reflect/tuple2.C
+ dead90802f91e8ec35a6b26ee1216fb1  gcc/testsuite/g++.dg/reflect/type1.C
+ 7ddd44fc3b31dc7a9800814c464043fa  gcc/testsuite/g++.dg/reflect/type10.C
+ b468479b1feb70e677c72b4fb0612f94  gcc/testsuite/g++.dg/reflect/type2.C
+ d8a3c8c16d619e634a0ac785558d78a3  gcc/testsuite/g++.dg/reflect/type3.C
+ 1ea86d8cc75b073a21cfdfda5218f35e  gcc/testsuite/g++.dg/reflect/type4.C
+ 39553b040f3d67b3d526e7de4b0114cb  gcc/testsuite/g++.dg/reflect/type5.C
+ 24d6f2c3c38ba068c15e41ac86337573  gcc/testsuite/g++.dg/reflect/type6.C
+ 40a69e9361b22f6a58fc25815bc4b804  gcc/testsuite/g++.dg/reflect/type7.C
+ 0d9163acdbee795ad2d759efb9b92ee4  gcc/testsuite/g++.dg/reflect/type8.C
+ b3994c20634b7ad733f312406081a255  gcc/testsuite/g++.dg/reflect/type9.C
+ a97f51af196e9b66ef9d840989598a75  gcc/testsuite/g++.dg/reflect/type_of1.C
+ 151fee0c76d1a7d55ba7f767814c87bd  gcc/testsuite/g++.dg/reflect/type_of2.C
+ 923b99a2592b5b36ddaef3f2fa7327dd  gcc/testsuite/g++.dg/reflect/type_rels1.C
+ 9180e7348d8521febdaba8e0dee848e6  gcc/testsuite/g++.dg/reflect/type_trait1.C
+ a66e1dc9964c7702e9ecdb5be8553fb5  gcc/testsuite/g++.dg/reflect/type_trait10.C
+ 4fb586d7efeeabc9fafb9d8f9f4ec796  gcc/testsuite/g++.dg/reflect/type_trait11.C
+ 9b33e0cb088a6815bc1f1c4cb74a8aa5  gcc/testsuite/g++.dg/reflect/type_trait12.C
+ 15027de4c989f7dd7ffa4d7846a28442  gcc/testsuite/g++.dg/reflect/type_trait13.C
+ 06a1343d9aeb1caa65048fdecda31245  gcc/testsuite/g++.dg/reflect/type_trait2.C
+ c957460ae45089ece9b5352a7de1f5fc  gcc/testsuite/g++.dg/reflect/type_trait3.C
+ 6a48574284311a70358d27e1b45595b3  gcc/testsuite/g++.dg/reflect/type_trait4.C
+ 3ca87a72cd6003b615061c966b9db0a0  gcc/testsuite/g++.dg/reflect/type_trait5.C
+ 7c9280bc78006b6ed6b75ff5c1c9facc  gcc/testsuite/g++.dg/reflect/type_trait6.C
+ 0cb8ffc5aa03364efe260c9bc9c2a638  gcc/testsuite/g++.dg/reflect/type_trait8.C
+ d9fed6fe6bccb0abd2890360744d1a95  gcc/testsuite/g++.dg/reflect/type_trait9.C
+ 27227cc740684a3bed428aad7d9627d9  gcc/testsuite/g++.dg/reflect/u8display_string_of1.C
+ 069b12fc99736e061dda304c7240e4b0  gcc/testsuite/g++.dg/reflect/u8identifier_of1.C
+ 41ca774b408bb80d08217f17926a5cfd  gcc/testsuite/g++.dg/reflect/u8symbol_of1.C
+ 66e9924618e01c3871c0c6349d9353c8  gcc/testsuite/g++.dg/reflect/underlying_type1.C
+ 7411de583d43c552e7b071b948639d1b  gcc/testsuite/g++.dg/reflect/using1.C
+ f84807ff51acb72fe4c1370c2591148e  gcc/testsuite/g++.dg/reflect/value_or_object1.C
+ b6fc6119f5cfb5fe32a5e8b8cb496342  gcc/testsuite/g++.dg/reflect/variable_of1.C
+ 698263b907a62caf5450f66f2c18a05f  gcc/testsuite/g++.dg/reflect/variable_of2.C
+ 84ccc302f81b355370729ab12c7ec54b  gcc/testsuite/g++.dg/reflect/variable_of3.C
+ b20c7245cc70a16f4549d5de46d19bde  gcc/testsuite/g++.dg/reflect/variant1.C
+ 52f1b07fcecf5b7dfd7849245a01cd09  gcc/testsuite/g++.dg/reflect/variant2.C
+ 9eb3efd54c1e30ffca6cb34a1f4136d1  gcc/testsuite/g++.dg/reflect/vector1.C
+ e8e74fceb6e97f784db7d20c12976a38  gcc/testsuite/g++.dg/reflect/visibility1.C
  2bcb8e987d41c50dbd1de216296fd071  gcc/testsuite/g++.dg/rtti/anon-ns1.C
  7345c9463c7d47c7d425463846af6b14  gcc/testsuite/g++.dg/rtti/crash1.C
  34c4c8f1721c4f70c2261dcc1b0a7630  gcc/testsuite/g++.dg/rtti/crash2.C
*************** cba0d4ad4eb20d07d7b8faa8a679415f  gcc/te
*** 39789,39795 ****
  0fb08fd6d187247ae5872931e884061c  gcc/testsuite/g++.dg/tree-ssa/tmmti.C
  d0016ead88409af28f506089528155ae  gcc/testsuite/g++.dg/tree-ssa/value-expr1.C
  ee5f35c1e0d0183f37f4bef5ff673e11  gcc/testsuite/g++.dg/tree-ssa/value-expr2.C
! b46ee98b65a467fe221cf636fe303445  gcc/testsuite/g++.dg/tree-ssa/vector-compare-1.C
  67826d6c8638dba46a4b37835998f34a  gcc/testsuite/g++.dg/tree-ssa/volatile1.C
  927ac273b42ce90eecf5fb0ad135f1c0  gcc/testsuite/g++.dg/tree-ssa/volatile2.C
  2f2cb4fe0eb03e7d7bb6cb25c9e775b0  gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
--- 40267,40273 ----
  0fb08fd6d187247ae5872931e884061c  gcc/testsuite/g++.dg/tree-ssa/tmmti.C
  d0016ead88409af28f506089528155ae  gcc/testsuite/g++.dg/tree-ssa/value-expr1.C
  ee5f35c1e0d0183f37f4bef5ff673e11  gcc/testsuite/g++.dg/tree-ssa/value-expr2.C
! 3305506c315412907d9095dfb88e572b  gcc/testsuite/g++.dg/tree-ssa/vector-compare-1.C
  67826d6c8638dba46a4b37835998f34a  gcc/testsuite/g++.dg/tree-ssa/volatile1.C
  927ac273b42ce90eecf5fb0ad135f1c0  gcc/testsuite/g++.dg/tree-ssa/volatile2.C
  2f2cb4fe0eb03e7d7bb6cb25c9e775b0  gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
*************** db187ae2fd0c35306cac339c19f6fcf6  gcc/te
*** 39981,39986 ****
--- 40459,40465 ----
  a045a81b6625a89ef0797ce8a3b56200  gcc/testsuite/g++.dg/vect/pr121685-1.cc
  9b9c687f1e4fd2f993684bbcadddc323  gcc/testsuite/g++.dg/vect/pr122647.cc
  bba355f1416732af96685d763f01f5d1  gcc/testsuite/g++.dg/vect/pr123315.cc
+ ac94a32beb40b85bf51677a9f718aca3  gcc/testsuite/g++.dg/vect/pr123525-2.cc
  02ab0e7dea4c30ddeaecb971c0b8241e  gcc/testsuite/g++.dg/vect/pr19951.cc
  e7c5a636a280962b70166d1494223f9c  gcc/testsuite/g++.dg/vect/pr21218.cc
  9a0a6f56bdb2cc697abc78c901418a19  gcc/testsuite/g++.dg/vect/pr21734_1.cc
*************** d53003b93dc25906e11f3f1291fb8a1d  gcc/te
*** 40130,40135 ****
--- 40609,40615 ----
  d7cbf62602ce3f0fa143eaedf4981bb9  gcc/testsuite/g++.dg/warn/Warray-bounds-8.C
  6eeb1f365add4be4bdb7ddd36c65ac44  gcc/testsuite/g++.dg/warn/Warray-bounds-9.C
  404736f3786e412f10598b365ba4917e  gcc/testsuite/g++.dg/warn/Warray-bounds-pr104165-1.C
+ c8f48b82a7da2056f0a7f7f6b8c98137  gcc/testsuite/g++.dg/warn/Warray-bounds-pr122824.C
  976766fc4d364b8c40253058ab6b6a10  gcc/testsuite/g++.dg/warn/Warray-bounds-pr92539.C
  2d6a670b4e83bb7433e838e5b33398be  gcc/testsuite/g++.dg/warn/Warray-bounds.C
  060f3f7d5c9e12d3ee82fa6b0a768523  gcc/testsuite/g++.dg/warn/Warray-bounds15.C
*************** a5706ac002500d657b5e8cd77cc6c62e  gcc/te
*** 40321,40326 ****
--- 40801,40807 ----
  1184b1df4ae243b5ab6917e0e3b219b6  gcc/testsuite/g++.dg/warn/Wmismatched-dealloc-2.C
  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
  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
*************** ccfaa381b4b7ddc2ae21136f982f0584  gcc/te
*** 43198,43204 ****
  024add5304c41b827990193948da5b1f  gcc/testsuite/g++.old-deja/g++.other/instan1.C
  7c7aaab427900113172f72ddcd0b0c5e  gcc/testsuite/g++.old-deja/g++.other/lex1.C
  613b5a3314421e3acbbf7e53221024cb  gcc/testsuite/g++.old-deja/g++.other/lineno1.C
! 8c62ee37ef42b6a370fd60335a40f4aa  gcc/testsuite/g++.old-deja/g++.other/lineno2.C
  5e52821ca49563fbc530d8e6757296ea  gcc/testsuite/g++.old-deja/g++.other/lineno3.C
  259b00ebc759f1c2be8bf93afcc1c26c  gcc/testsuite/g++.old-deja/g++.other/lineno4.C
  adce56a08250b8174bedb4599c59675a  gcc/testsuite/g++.old-deja/g++.other/lineno5.C
--- 43679,43685 ----
  024add5304c41b827990193948da5b1f  gcc/testsuite/g++.old-deja/g++.other/instan1.C
  7c7aaab427900113172f72ddcd0b0c5e  gcc/testsuite/g++.old-deja/g++.other/lex1.C
  613b5a3314421e3acbbf7e53221024cb  gcc/testsuite/g++.old-deja/g++.other/lineno1.C
! 900c3269f81de6a200e6181d964ceb9f  gcc/testsuite/g++.old-deja/g++.other/lineno2.C
  5e52821ca49563fbc530d8e6757296ea  gcc/testsuite/g++.old-deja/g++.other/lineno3.C
  259b00ebc759f1c2be8bf93afcc1c26c  gcc/testsuite/g++.old-deja/g++.other/lineno4.C
  adce56a08250b8174bedb4599c59675a  gcc/testsuite/g++.old-deja/g++.other/lineno5.C
*************** be430db3c83c1e77ffcbbbd0b1311df6  gcc/te
*** 44036,44042 ****
  6af909875fa9f90e1e7206db6ad54117  gcc/testsuite/g++.old-deja/g++.pt/t35.C
  1f2805de9d0dd928b7dc9d6396f793df  gcc/testsuite/g++.old-deja/g++.pt/t35a.C
  c84f5cedd02a6127c6506cfa331391da  gcc/testsuite/g++.old-deja/g++.pt/t36.C
! 5bfa822496df4acc8fb3a2b97bead3b0  gcc/testsuite/g++.old-deja/g++.pt/t37.C
  2e421a22074476f104dce2246485a180  gcc/testsuite/g++.old-deja/g++.pt/t37a.C
  75bc3e70f5f3963a4a43e97741cf1de7  gcc/testsuite/g++.old-deja/g++.pt/t38.C
  94fb3f4d92db5a0db2265c73873ffa25  gcc/testsuite/g++.old-deja/g++.pt/t39.C
--- 44517,44523 ----
  6af909875fa9f90e1e7206db6ad54117  gcc/testsuite/g++.old-deja/g++.pt/t35.C
  1f2805de9d0dd928b7dc9d6396f793df  gcc/testsuite/g++.old-deja/g++.pt/t35a.C
  c84f5cedd02a6127c6506cfa331391da  gcc/testsuite/g++.old-deja/g++.pt/t36.C
! b66416f3e9abdf6a8b07155b43c852ce  gcc/testsuite/g++.old-deja/g++.pt/t37.C
  2e421a22074476f104dce2246485a180  gcc/testsuite/g++.old-deja/g++.pt/t37a.C
  75bc3e70f5f3963a4a43e97741cf1de7  gcc/testsuite/g++.old-deja/g++.pt/t38.C
  94fb3f4d92db5a0db2265c73873ffa25  gcc/testsuite/g++.old-deja/g++.pt/t39.C
*************** b55cebf22ef53505e15f00d8c547efc0  gcc/te
*** 44628,44633 ****
--- 45109,45115 ----
  4a44f470ea24c20123902146bd5273ad  gcc/testsuite/g++.target/i386/avx512bw-pr98537-1.C
  3ec2a7fddbb432f8b259b0ada49c99a8  gcc/testsuite/g++.target/i386/avx512f-helper.h
  cbe0c3947d51802a4bf66ce01377fb64  gcc/testsuite/g++.target/i386/avx512f-pr96891-1.C
+ 8763b4590fa0e7aa581be6701962a55f  gcc/testsuite/g++.target/i386/avx512fp16-pr123607.C
  c89ba9cfe468937652adb223c2fe88f9  gcc/testsuite/g++.target/i386/avx512fp16-vcondmn-minmax.C
  d5287c6ed2bebf01314526c64e9b26ba  gcc/testsuite/g++.target/i386/avx512fp16-vcondmn-vec.C
  5df96b365d4dc9fff3b4d57ee1d9f8e5  gcc/testsuite/g++.target/i386/avx512vl-pr100738-1.C
*************** a36b5332929fccce3ba46aacdd6e1984  gcc/te
*** 46251,46256 ****
--- 46733,46739 ----
  ae878ea349c8f9f2a197bf59dcff9d3a  gcc/testsuite/gcc.c-torture/compile/pr118429.c
  6d7416e999725c0f023c4322893b1214  gcc/testsuite/gcc.c-torture/compile/pr118501.c
  4e917b913d6f56bf343a7bff79797c93  gcc/testsuite/gcc.c-torture/compile/pr119226.c
+ ab667119ae39828bcd103bb5c5434cdc  gcc/testsuite/gcc.c-torture/compile/pr120250.c
  ba307c947af4df2e0ff2f70272caf68a  gcc/testsuite/gcc.c-torture/compile/pr120807.c
  b20dd8a4cdcf6dd51489456d26453893  gcc/testsuite/gcc.c-torture/compile/pr122066.c
  46eb20294e18878710a761cb15ba8fd5  gcc/testsuite/gcc.c-torture/compile/pr122588-1.c
*************** f84a62b2c04fd0a9824305fdbf33ca9a  gcc/te
*** 49834,49840 ****
  7d527fafe1db806347cfb826be8f7ac6  gcc/testsuite/gcc.dg/Wstrict-flex-arrays-2.c
  1ab9973f43ef639043dfbd2f42f2c6c7  gcc/testsuite/gcc.dg/Wstrict-flex-arrays-3.c
  b70ddb0fb0f39ff0a77446d94a7b7efb  gcc/testsuite/gcc.dg/Wstrict-flex-arrays.c
- af59ad0b143483efd888a257a65c26fc  gcc/testsuite/gcc.dg/Wstrict-overflow-1.c
  1110716453a4773019d5bb6410117baf  gcc/testsuite/gcc.dg/Wstrict-overflow-10.c
  5949afbfe54027b57c5a7ff340e5c3d8  gcc/testsuite/gcc.dg/Wstrict-overflow-11.c
  a202b608fa712e5194f82040deca3921  gcc/testsuite/gcc.dg/Wstrict-overflow-12.c
--- 50317,50322 ----
*************** cc74ad07bc21697eab1ac4bdbb25f0f5  gcc/te
*** 50596,50606 ****
  1a27715b4b755fb46b13300fd15e4690  gcc/testsuite/gcc.dg/asm-hard-reg-7.c
  518c17261bb078d2460f83de54b6ca4e  gcc/testsuite/gcc.dg/asm-hard-reg-8.c
  ab980f0237f5796fbeebe76bc741601c  gcc/testsuite/gcc.dg/asm-hard-reg-9.c
! d91cbead950670110f9f5469da62fe7e  gcc/testsuite/gcc.dg/asm-hard-reg-error-1.c
  9db82ff602331dd327582c106428d7c7  gcc/testsuite/gcc.dg/asm-hard-reg-error-2.c
  b7d7ad2352b64cd5b5f59527de4a95d9  gcc/testsuite/gcc.dg/asm-hard-reg-error-3.c
  524d418a9c4592d83ab9f5d9048f817c  gcc/testsuite/gcc.dg/asm-hard-reg-error-4.c
  a4862e2e0b5c04818a6438ae16091cec  gcc/testsuite/gcc.dg/asm-hard-reg-error-5.c
  6c3cba24c3d3fbf660605697935b9be5  gcc/testsuite/gcc.dg/asm-names.c
  9c3b7de14ce6ac49627b91e2808376e5  gcc/testsuite/gcc.dg/asm-pr24146.c
  bb1414d3448a4d73560e8bf9f884913a  gcc/testsuite/gcc.dg/asm-qual-1.c
--- 51078,51089 ----
  1a27715b4b755fb46b13300fd15e4690  gcc/testsuite/gcc.dg/asm-hard-reg-7.c
  518c17261bb078d2460f83de54b6ca4e  gcc/testsuite/gcc.dg/asm-hard-reg-8.c
  ab980f0237f5796fbeebe76bc741601c  gcc/testsuite/gcc.dg/asm-hard-reg-9.c
! b8c52e60689e1b1842e4e05f9f0a21fb  gcc/testsuite/gcc.dg/asm-hard-reg-error-1.c
  9db82ff602331dd327582c106428d7c7  gcc/testsuite/gcc.dg/asm-hard-reg-error-2.c
  b7d7ad2352b64cd5b5f59527de4a95d9  gcc/testsuite/gcc.dg/asm-hard-reg-error-3.c
  524d418a9c4592d83ab9f5d9048f817c  gcc/testsuite/gcc.dg/asm-hard-reg-error-4.c
  a4862e2e0b5c04818a6438ae16091cec  gcc/testsuite/gcc.dg/asm-hard-reg-error-5.c
+ 1ec5c1bd0d09a10946894557c718d3e9  gcc/testsuite/gcc.dg/asm-hard-reg-error-6.c
  6c3cba24c3d3fbf660605697935b9be5  gcc/testsuite/gcc.dg/asm-names.c
  9c3b7de14ce6ac49627b91e2808376e5  gcc/testsuite/gcc.dg/asm-pr24146.c
  bb1414d3448a4d73560e8bf9f884913a  gcc/testsuite/gcc.dg/asm-qual-1.c
*************** e781844c1655d36c9b6e04d59aad8996  gcc/te
*** 52391,52396 ****
--- 52874,52886 ----
  79de76f1d9fe6810bc65fa1f39adc1dc  gcc/testsuite/gcc.dg/conv-1.c
  3a476a2d0c391587638c234c7b082c5a  gcc/testsuite/gcc.dg/conv-2.c
  89b18c0becd2933f025acc401a0aeaf8  gcc/testsuite/gcc.dg/conv-3.c
+ 272bd8e9bc2a4630f64de65202c56a4f  gcc/testsuite/gcc.dg/counted-by-anonymous-2-char.c
+ ca7e5de7ae44ae6b5bb729e4d9eadc6f  gcc/testsuite/gcc.dg/counted-by-anonymous-2-float.c
+ 5974c46e70b053892338147c6afd43d1  gcc/testsuite/gcc.dg/counted-by-anonymous-2-struct.c
+ 1e0d8659de1de8612c7cf5d3f8f49b0f  gcc/testsuite/gcc.dg/counted-by-anonymous-2-union.c
+ f90b8d83aba1cc7359d672c46fd07a9a  gcc/testsuite/gcc.dg/counted-by-anonymous-2.c
+ 2e612baabc05d361cda086f6a663da17  gcc/testsuite/gcc.dg/counted-by-anonymous-3.c
+ 5b22fc4910c9bfeecd988a4d23f85456  gcc/testsuite/gcc.dg/counted-by-anonymous.c
  c797c0159985b6cfaaf4ab160451c3a4  gcc/testsuite/gcc.dg/countof-compat.c
  cfd1e5fcba6e1e17d853d6d14a40057b  gcc/testsuite/gcc.dg/countof-compile.c
  608b1948fb6a190311fada69744220cd  gcc/testsuite/gcc.dg/countof-no-compat.c
*************** b9aafcde73d659e8a8f12aec94a7cb09  gcc/te
*** 55197,55203 ****
  46fe10dc7c2a1b21f0d7af66c601ad44  gcc/testsuite/gcc.dg/guality/drap.c
  35524176317603e370c0e34f6d8bd9ae  gcc/testsuite/gcc.dg/guality/example.c
  163a14c7ee9331fc07d3026f1cde9d39  gcc/testsuite/gcc.dg/guality/guality.c
! 8fe1139f4413428a77fb51f401a931e8  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
--- 55687,55693 ----
  46fe10dc7c2a1b21f0d7af66c601ad44  gcc/testsuite/gcc.dg/guality/drap.c
  35524176317603e370c0e34f6d8bd9ae  gcc/testsuite/gcc.dg/guality/example.c
  163a14c7ee9331fc07d3026f1cde9d39  gcc/testsuite/gcc.dg/guality/guality.c
! 021da817e5cbb8af34ec67bc8d3152cb  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
*************** d4d46f0bcf41225e72b23884cc6722bb  gcc/te
*** 55302,55307 ****
--- 55792,55800 ----
  4145640799f181a64b6a3215e095230c  gcc/testsuite/gcc.dg/heap-trampoline-1.c
  47a19efbf7957f2fc0bb31a641354fe3  gcc/testsuite/gcc.dg/hex-round-1.c
  beabf14243b2b65800f0733144ef725e  gcc/testsuite/gcc.dg/hex-round-2.c
+ 4dc14ce0946a92deff8afc4ab000b909  gcc/testsuite/gcc.dg/hierarchical-discriminator-loop-version.c
+ ce9b234435235e80666923ef14247d73  gcc/testsuite/gcc.dg/hierarchical-discriminator-unroll.c
+ 0af7cd8dbb4fab75a640c7e4e4200fc7  gcc/testsuite/gcc.dg/hierarchical-discriminator-vect-version.c
  dc12526b2575b25bbb0263164484aeb3  gcc/testsuite/gcc.dg/hoist-register-pressure-1.c
  0df11bb9dd20d8cf406324e2baa18d83  gcc/testsuite/gcc.dg/hoist-register-pressure-2.c
  dd0c3d86be7753351dad89d50055a01e  gcc/testsuite/gcc.dg/hoist-register-pressure-3.c
*************** e39432b4ae7797e55b13f6d2fd29a4a6  gcc/te
*** 55646,55652 ****
  fc7c9c751d59b444d0ab30c4d9029491  gcc/testsuite/gcc.dg/ipa/pr120044-1.c
  538e5a7542c72b7ea4e4375cbebde001  gcc/testsuite/gcc.dg/ipa/pr120044-2.c
  565d3e382e01fcd9c41e557858bca548  gcc/testsuite/gcc.dg/ipa/pr120295.c
! e8b4bc1989b7f3096953c4625f277eac  gcc/testsuite/gcc.dg/ipa/pr122458.c
  c8295ff7fd7e271d17e7609620f5dfcb  gcc/testsuite/gcc.dg/ipa/pr42706.c
  e4887053c792f4f78b03804c148839ce  gcc/testsuite/gcc.dg/ipa/pr45644.c
  6e1b4f2c5d0c0d768778da8e3b7df828  gcc/testsuite/gcc.dg/ipa/pr48195.c
--- 56139,56147 ----
  fc7c9c751d59b444d0ab30c4d9029491  gcc/testsuite/gcc.dg/ipa/pr120044-1.c
  538e5a7542c72b7ea4e4375cbebde001  gcc/testsuite/gcc.dg/ipa/pr120044-2.c
  565d3e382e01fcd9c41e557858bca548  gcc/testsuite/gcc.dg/ipa/pr120295.c
! 907c897d4b8e5d023fcf02993ee3135e  gcc/testsuite/gcc.dg/ipa/pr122458.c
! 888d33a20f8dcb2d65f085d84f66723e  gcc/testsuite/gcc.dg/ipa/pr123542.c
! 187b807400791bf18a7a1f9f9ce8a4a7  gcc/testsuite/gcc.dg/ipa/pr123543.c
  c8295ff7fd7e271d17e7609620f5dfcb  gcc/testsuite/gcc.dg/ipa/pr42706.c
  e4887053c792f4f78b03804c148839ce  gcc/testsuite/gcc.dg/ipa/pr45644.c
  6e1b4f2c5d0c0d768778da8e3b7df828  gcc/testsuite/gcc.dg/ipa/pr48195.c
*************** afbbdc9160c7bbb463b8a9a0ccecc1ec  gcc/te
*** 57551,57567 ****
--- 58046,58065 ----
  acdecc3711a0a56635d3de4e2064206c  gcc/testsuite/gcc.dg/pr122947.c
  9f4094b7196b5eab8c79608995a96efc  gcc/testsuite/gcc.dg/pr122991.c
  9fcb8913b9a18055b2a811284d59780e  gcc/testsuite/gcc.dg/pr123018.c
+ c1faded54c3f4dcf6ef6214623eb5e7a  gcc/testsuite/gcc.dg/pr123109.c
  4bb95b7b27d5cf33c1f6f21056e27c11  gcc/testsuite/gcc.dg/pr123110-1.c
  5e8f304c4d6cec9c5b0a6f0ed430bd96  gcc/testsuite/gcc.dg/pr123114.c
  a7854fc3636527bc932319df4a19bc42  gcc/testsuite/gcc.dg/pr123205.c
  9458a512908504ff59f92077cde8c882  gcc/testsuite/gcc.dg/pr123295-1.c
  5fbcf85870a8e9883872a384e3cf5e12  gcc/testsuite/gcc.dg/pr123300.c
+ 785eb6e7b2c08f02c9e8a5f33f827f1a  gcc/testsuite/gcc.dg/pr123309.c
  afeafc726f9068066b4e782197455056  gcc/testsuite/gcc.dg/pr123319.c
  3e218010f127737b8ec6efbf8cb00273  gcc/testsuite/gcc.dg/pr123431.c
  4288ef3d117ee2b6aabf0d6303eeb663  gcc/testsuite/gcc.dg/pr123435-1.c
  4e3fe4e93ab76bd43ab7833b477c70e9  gcc/testsuite/gcc.dg/pr123435-2.c
  0da2c71eea90fdad386d74777acfa661  gcc/testsuite/gcc.dg/pr123463.c
  e43dcd43531182c1839bc3842972ef9a  gcc/testsuite/gcc.dg/pr123475.c
+ 40c720d493fdf466beac8d906dcdb821  gcc/testsuite/gcc.dg/pr123544.c
  bc5ddfbbc46f4e0cce1629d1b58d3090  gcc/testsuite/gcc.dg/pr12603.c
  72a2fca76cb69617ae36bab93c7ec0d7  gcc/testsuite/gcc.dg/pr12625-1.c
  6f0ef61e5a12db5f11da839b2988c5e1  gcc/testsuite/gcc.dg/pr13519-1.c
*************** a9069345cbc40d488766c1fbf34c5555  gcc/te
*** 59757,59763 ****
  15525cb0069579146b25b83c9e5e7bcb  gcc/testsuite/gcc.dg/rtl/i386/vector_eq-3.c
  0fad692089013e1244e2ad3e5560e613  gcc/testsuite/gcc.dg/rtl/powerpc/move_compare_peephole_32.c
  67d911dae09d634dcf74fac029f1d2e6  gcc/testsuite/gcc.dg/rtl/powerpc/move_compare_peephole_64.c
! 663a7efc837a7d07fae71898812629fa  gcc/testsuite/gcc.dg/rtl/powerpc/test-frame-related.c
  63412a6bd4b847e5c4b62a88063ce6c0  gcc/testsuite/gcc.dg/rtl/rtl.exp
  75dd0c3d9daa8abdd58a0d0eaf55bd9e  gcc/testsuite/gcc.dg/rtl/test.c
  555898d2432906a81b3aa66cb112a450  gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c
--- 60255,60261 ----
  15525cb0069579146b25b83c9e5e7bcb  gcc/testsuite/gcc.dg/rtl/i386/vector_eq-3.c
  0fad692089013e1244e2ad3e5560e613  gcc/testsuite/gcc.dg/rtl/powerpc/move_compare_peephole_32.c
  67d911dae09d634dcf74fac029f1d2e6  gcc/testsuite/gcc.dg/rtl/powerpc/move_compare_peephole_64.c
! 7c5684bd93ee5f194df629270a23a3fb  gcc/testsuite/gcc.dg/rtl/powerpc/test-frame-related.c
  63412a6bd4b847e5c4b62a88063ce6c0  gcc/testsuite/gcc.dg/rtl/rtl.exp
  75dd0c3d9daa8abdd58a0d0eaf55bd9e  gcc/testsuite/gcc.dg/rtl/test.c
  555898d2432906a81b3aa66cb112a450  gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c
*************** bb26c0da7df248d044cf5f83428206bf  gcc/te
*** 60103,60110 ****
  6dfbd7669b05fa32377f1d387f6b10fd  gcc/testsuite/gcc.dg/store_merging_15.c
  a9371402086b38138c9017bde847bf83  gcc/testsuite/gcc.dg/store_merging_16.c
  26403e8ae1d70e44af1f5f33343f4a2a  gcc/testsuite/gcc.dg/store_merging_17.c
! 7a99330458cafca53d5652eb17cf7a70  gcc/testsuite/gcc.dg/store_merging_18.c
! 13cc1dd3f3c86243edc35d95deff2795  gcc/testsuite/gcc.dg/store_merging_19.c
  516117f10841e46c17e880197dde01b3  gcc/testsuite/gcc.dg/store_merging_2.c
  974e9bde77a5300698b30ff61c50d1e9  gcc/testsuite/gcc.dg/store_merging_20.c
  ff5638c9cb6bd567e0a1a1acee287fe2  gcc/testsuite/gcc.dg/store_merging_21.c
--- 60601,60608 ----
  6dfbd7669b05fa32377f1d387f6b10fd  gcc/testsuite/gcc.dg/store_merging_15.c
  a9371402086b38138c9017bde847bf83  gcc/testsuite/gcc.dg/store_merging_16.c
  26403e8ae1d70e44af1f5f33343f4a2a  gcc/testsuite/gcc.dg/store_merging_17.c
! 4b15c0eecc4e37fd27332be74ce5bc79  gcc/testsuite/gcc.dg/store_merging_18.c
! 46049504ac4c633e849f89e09628e3eb  gcc/testsuite/gcc.dg/store_merging_19.c
  516117f10841e46c17e880197dde01b3  gcc/testsuite/gcc.dg/store_merging_2.c
  974e9bde77a5300698b30ff61c50d1e9  gcc/testsuite/gcc.dg/store_merging_20.c
  ff5638c9cb6bd567e0a1a1acee287fe2  gcc/testsuite/gcc.dg/store_merging_21.c
*************** c2a46e867e783aa09ce428803ff2eb1f  gcc/te
*** 60606,60612 ****
  fb1ac4ca7d21a0ebd69de3b13f313e3c  gcc/testsuite/gcc.dg/torture/bitint-61.c
  ec46adffd1b71b37080f2c2fdfd30dbb  gcc/testsuite/gcc.dg/torture/bitint-62.c
  12041a6757f63a687858dedea1213648  gcc/testsuite/gcc.dg/torture/bitint-63.c
! 46e3e76051e6a69f02c46d10e1cacefa  gcc/testsuite/gcc.dg/torture/bitint-64.c
  d3fc0f9dcd751a3330cf8dad7a58f270  gcc/testsuite/gcc.dg/torture/bitint-65.c
  32852fe0c4231daaf28127cda08a71f6  gcc/testsuite/gcc.dg/torture/bitint-66.c
  308ffdbb2d530e7bb0d9566dcc845610  gcc/testsuite/gcc.dg/torture/bitint-67.c
--- 61104,61110 ----
  fb1ac4ca7d21a0ebd69de3b13f313e3c  gcc/testsuite/gcc.dg/torture/bitint-61.c
  ec46adffd1b71b37080f2c2fdfd30dbb  gcc/testsuite/gcc.dg/torture/bitint-62.c
  12041a6757f63a687858dedea1213648  gcc/testsuite/gcc.dg/torture/bitint-63.c
! 83257a510a72e691a61174dc5bc35c20  gcc/testsuite/gcc.dg/torture/bitint-64.c
  d3fc0f9dcd751a3330cf8dad7a58f270  gcc/testsuite/gcc.dg/torture/bitint-65.c
  32852fe0c4231daaf28127cda08a71f6  gcc/testsuite/gcc.dg/torture/bitint-66.c
  308ffdbb2d530e7bb0d9566dcc845610  gcc/testsuite/gcc.dg/torture/bitint-67.c
*************** e5e2d1086821d7f61f870b51487c30ef  gcc/te
*** 60626,60634 ****
  cf2a2337cf009457d836bd48e49c0af3  gcc/testsuite/gcc.dg/torture/bitint-8.c
  fa228ee9fbe53472bf0fbc0d82dbf06c  gcc/testsuite/gcc.dg/torture/bitint-80.c
  8ccddc7d4c25a0d622af001f456097fb  gcc/testsuite/gcc.dg/torture/bitint-81.c
! c04a5c86281fcb981a8f28043fe2b87d  gcc/testsuite/gcc.dg/torture/bitint-82.c
  25ae478f26e4b1f0fbc9427fc6d848a3  gcc/testsuite/gcc.dg/torture/bitint-83.c
! 823a8546c0d347f9693e09831afe36d3  gcc/testsuite/gcc.dg/torture/bitint-84.c
  368a2f51dfadfa4e9fbd0017065b6a83  gcc/testsuite/gcc.dg/torture/bitint-85.c
  4d03bd57dac0507a44cc15b9afacd8a3  gcc/testsuite/gcc.dg/torture/bitint-9.c
  cf9904d4026e69bddaf745011bbaaab3  gcc/testsuite/gcc.dg/torture/builtin-attr-1.c
--- 61124,61132 ----
  cf2a2337cf009457d836bd48e49c0af3  gcc/testsuite/gcc.dg/torture/bitint-8.c
  fa228ee9fbe53472bf0fbc0d82dbf06c  gcc/testsuite/gcc.dg/torture/bitint-80.c
  8ccddc7d4c25a0d622af001f456097fb  gcc/testsuite/gcc.dg/torture/bitint-81.c
! 6ce8637cd350c339b1f3d14f609b9f31  gcc/testsuite/gcc.dg/torture/bitint-82.c
  25ae478f26e4b1f0fbc9427fc6d848a3  gcc/testsuite/gcc.dg/torture/bitint-83.c
! d855a0135427383c84dcb22a8f97fca3  gcc/testsuite/gcc.dg/torture/bitint-84.c
  368a2f51dfadfa4e9fbd0017065b6a83  gcc/testsuite/gcc.dg/torture/bitint-85.c
  4d03bd57dac0507a44cc15b9afacd8a3  gcc/testsuite/gcc.dg/torture/bitint-9.c
  cf9904d4026e69bddaf745011bbaaab3  gcc/testsuite/gcc.dg/torture/builtin-attr-1.c
*************** e1b9ad351c56aebfaff790ff4002bf6e  gcc/te
*** 61318,61323 ****
--- 61816,61822 ----
  0c3297c6ebf6e4adcaeec164dfe8e9ac  gcc/testsuite/gcc.dg/torture/pr120211-1.c
  68b7b9a81ceb31b6b33b9a797a7f6c30  gcc/testsuite/gcc.dg/torture/pr120242.c
  a0d2174875961d5bb3004aad3d93d7d7  gcc/testsuite/gcc.dg/torture/pr120276.c
+ 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
*************** a9aaac3c1ee96431c6d95bd2eb3c3f27  gcc/te
*** 61369,61379 ****
--- 61868,61883 ----
  599ac258574b276ce3335b78a5a77da0  gcc/testsuite/gcc.dg/torture/pr122873.c
  a72ae7e01256a00a4331a97695f441c8  gcc/testsuite/gcc.dg/torture/pr123027.c
  10b3b873efcbbc683b1b7bc118deaf44  gcc/testsuite/gcc.dg/torture/pr123107.c
+ 555e199e2c16f6c135742459dd2921b3  gcc/testsuite/gcc.dg/torture/pr123175-1.c
+ a57694d59f86b331962949b865331a14  gcc/testsuite/gcc.dg/torture/pr123175-2.c
  53e66b5cadafe7e2c98dde34bf157702  gcc/testsuite/gcc.dg/torture/pr123267-1.c
  e03287adad00d313766ecc2e039fb9b5  gcc/testsuite/gcc.dg/torture/pr123298.c
  11091949fe6774584df4fe838c80617e  gcc/testsuite/gcc.dg/torture/pr123310.c
  696ea16080bb129f974e534dd41b1ac9  gcc/testsuite/gcc.dg/torture/pr123382-1.c
  46a4a57171daf43cca2c2be68546f06a  gcc/testsuite/gcc.dg/torture/pr123382-2.c
+ 31008858fedcd65ab763c86127409b2f  gcc/testsuite/gcc.dg/torture/pr123530.c
+ ea90221ab80b5c3561ffc7665d2a343a  gcc/testsuite/gcc.dg/torture/pr123645-1.c
+ c6c07c813f67e0f94f1352f2810dfcff  gcc/testsuite/gcc.dg/torture/pr123645-2.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
*************** b99a791d3dbef7a8c3f50eb93840c713  gcc/te
*** 62830,62835 ****
--- 63334,63343 ----
  7ad8d748f571e7a17cc0495c3da36812  gcc/testsuite/gcc.dg/tree-ssa/bitops-1.c
  16d974eee68f3b79ff8c91eec7df7f8d  gcc/testsuite/gcc.dg/tree-ssa/bitops-10.c
  c8f2154e257bc0cdeff432c63c4a887f  gcc/testsuite/gcc.dg/tree-ssa/bitops-11.c
+ 97fb8d20280a75e3d3f66b55eaf50ad0  gcc/testsuite/gcc.dg/tree-ssa/bitops-12.c
+ a8868bafeb00368f220d5fa2d1e3815d  gcc/testsuite/gcc.dg/tree-ssa/bitops-13.c
+ 9624855862f3f81a5ae029baebe216a6  gcc/testsuite/gcc.dg/tree-ssa/bitops-14.c
+ 5b205b8dadb24b4360bd42ba31bee229  gcc/testsuite/gcc.dg/tree-ssa/bitops-15.c
  2bb75de536bbde529169d19b1c3100a4  gcc/testsuite/gcc.dg/tree-ssa/bitops-2.c
  2023414b5a08c97c5d350acaab9d9158  gcc/testsuite/gcc.dg/tree-ssa/bitops-3.c
  0b073c6f533f1ad0778489cddb884b85  gcc/testsuite/gcc.dg/tree-ssa/bitops-4.c
*************** c696d7723e6935b64e8868efdada71d9  gcc/te
*** 64708,64713 ****
--- 65216,65222 ----
  5561c38451474a42839647e4e156c010  gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-11.c
  78f5b94faf6fa73b44dd51964967e5c2  gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-110.c
  e17e18c4987b53f256b8271310af6347  gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-111.c
+ 1c4e46dde7b0fe083a98ab1723ffd455  gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-112.c
  5561c38451474a42839647e4e156c010  gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-12.c
  b95088c9ed88a484349d681f36871312  gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-13.c
  87ba541be7f38ef117b8b5cc09ff4932  gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-14.c
*************** c65bb38d621cd1fe2b1533770dfec13c  gcc/te
*** 65171,65177 ****
  09c180f580447bfea8ff91ad81781be3  gcc/testsuite/gcc.dg/tree-ssa/vrp97.c
  a2633c9b66a328f6153f6fe74603b46f  gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c
  f7edf6151c35b222fd66fe727f22a15a  gcc/testsuite/gcc.dg/tree-ssa/vrp98.c
! 9bebb10790801ab5fff1fc3c72bfbc17  gcc/testsuite/gcc.dg/tree-ssa/vrp99.c
  6a9b24ebec6820a8ec39fb106a33a0db  gcc/testsuite/gcc.dg/tree-ssa/wholeprogram-1.c
  1674280740676ac853a0c40326c7a3bd  gcc/testsuite/gcc.dg/tree-ssa/wholeprogram-2.c
  1de3cdbef0251dc14d21f1fc5e419d05  gcc/testsuite/gcc.dg/tree-ssa/wnull-dereference.c
--- 65680,65686 ----
  09c180f580447bfea8ff91ad81781be3  gcc/testsuite/gcc.dg/tree-ssa/vrp97.c
  a2633c9b66a328f6153f6fe74603b46f  gcc/testsuite/gcc.dg/tree-ssa/vrp98-1.c
  f7edf6151c35b222fd66fe727f22a15a  gcc/testsuite/gcc.dg/tree-ssa/vrp98.c
! 42cb8e7345d49b18b264b19715d8ea83  gcc/testsuite/gcc.dg/tree-ssa/vrp99.c
  6a9b24ebec6820a8ec39fb106a33a0db  gcc/testsuite/gcc.dg/tree-ssa/wholeprogram-1.c
  1674280740676ac853a0c40326c7a3bd  gcc/testsuite/gcc.dg/tree-ssa/wholeprogram-2.c
  1de3cdbef0251dc14d21f1fc5e419d05  gcc/testsuite/gcc.dg/tree-ssa/wnull-dereference.c
*************** e2c0ae3b7ed6cf4f7eed5c4ed76ee410  gcc/te
*** 65239,65244 ****
--- 65748,65756 ----
  acf0af3723cb1d2f1a5fe0dbbb7d9fa9  gcc/testsuite/gcc.dg/ubsan/c99-wrapv-shift-1.c
  24e57c18350248c3a31ee78f8f40e95b  gcc/testsuite/gcc.dg/ubsan/c99-wrapv-shift-2.c
  e4441e7485c1c8e740509a37f0c0bb14  gcc/testsuite/gcc.dg/ubsan/commutative-1.c
+ 6975f30222afb309a1d34fbcf2c11e38  gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-1.c
+ e879e7f722c6198cac405eb30a81f528  gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-2.c
+ 93bd48937a1990338e7ee1a9df544652  gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds.c
  0e78258070f4a00ed32a6b6143fddfaa  gcc/testsuite/gcc.dg/ubsan/flex-array-counted-by-bounds-2.c
  1f2963dd8e70eaac130aaf90bf69ce82  gcc/testsuite/gcc.dg/ubsan/flex-array-counted-by-bounds-3.c
  16cc959fa5049b30aef10c2caf823747  gcc/testsuite/gcc.dg/ubsan/flex-array-counted-by-bounds-4.c
*************** e4b537e85147239a3fc4b998be3eac4c  gcc/te
*** 65488,65493 ****
--- 66000,66006 ----
  9fa2cff5bcff4df8b1fc7bf0d88b061b  gcc/testsuite/gcc.dg/union-cast-2.c
  b909732314b5b1dd0dbae5d059adef6f  gcc/testsuite/gcc.dg/union-cast-3.c
  dc36e1fc63bcc8c697aee2fadba2036d  gcc/testsuite/gcc.dg/union-cast-4.c
+ b2cccb9e569370f7b92ab35d360f96d2  gcc/testsuite/gcc.dg/union-composite-type.c
  ae4d67d87a0b04934eeaae8a208e5575  gcc/testsuite/gcc.dg/union-duplicate-field.c
  a7ac2b6782378edf99026215c26ce37f  gcc/testsuite/gcc.dg/unordered-1.c
  fced4847e686e50fcf2f9178fed8ec41  gcc/testsuite/gcc.dg/unordered-2.c
*************** fa9e975179c7549630562771c7beb477  gcc/te
*** 65771,65777 ****
  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
! df536d0552f1bc9d3f904b98132b3f3d  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
--- 66284,66290 ----
  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
*************** aca7d2373617a1be34881ac1c7f666c3  gcc/te
*** 65924,65929 ****
--- 66437,66444 ----
  45453c03b2d83b8c253a510f6a157bdd  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr104582-3.c
  220ca37927f70593ad75a493a099ae58  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr104582-4.c
  af1a8b32e71c4979a967ab326a54bace  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr122573.c
+ 9186fecdc3fdbd1e29c457ed6c3ec015  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-1.c
+ 4b5a237cf055ed5b96ca7403d59bb3f7  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-2.c
  adf307e0a12bcc8d31b97d83adb3e848  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr30843.c
  ec5c6a4d5052e20e84aa5eb95742d36f  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr64909.c
  e094ee1a12f158fa8be372b1974af637  gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr69297.c
*************** a2a31f73b067f86314a45763557dbbb3  gcc/te
*** 65945,65951 ****
  3a36b81283db5676a0d0c5cc250ca233  gcc/testsuite/gcc.dg/vect/fast-math-pr44152.c
  3f801cbf0c5841e89f4f7c8c2b258a1d  gcc/testsuite/gcc.dg/vect/fast-math-pr55281.c
  e2001ca822dddb3c869bf1c66cb0b3b6  gcc/testsuite/gcc.dg/vect/fast-math-slp-27.c
! 5eee4f108a83b5ad00c5778d9bede531  gcc/testsuite/gcc.dg/vect/fast-math-slp-38.c
  296c87760558888bcb3aefd7ce84d08a  gcc/testsuite/gcc.dg/vect/fast-math-vect-call-1.c
  73e2ae1e2a2d73e42dcb7686ffc774de  gcc/testsuite/gcc.dg/vect/fast-math-vect-call-2.c
  38ee3e7351524bacfe4e3e370a048a55  gcc/testsuite/gcc.dg/vect/fast-math-vect-complex-3.c
--- 66460,66466 ----
  3a36b81283db5676a0d0c5cc250ca233  gcc/testsuite/gcc.dg/vect/fast-math-pr44152.c
  3f801cbf0c5841e89f4f7c8c2b258a1d  gcc/testsuite/gcc.dg/vect/fast-math-pr55281.c
  e2001ca822dddb3c869bf1c66cb0b3b6  gcc/testsuite/gcc.dg/vect/fast-math-slp-27.c
! 1b9f860b9fc08700480114e90cf75ea0  gcc/testsuite/gcc.dg/vect/fast-math-slp-38.c
  296c87760558888bcb3aefd7ce84d08a  gcc/testsuite/gcc.dg/vect/fast-math-vect-call-1.c
  73e2ae1e2a2d73e42dcb7686ffc774de  gcc/testsuite/gcc.dg/vect/fast-math-vect-call-2.c
  38ee3e7351524bacfe4e3e370a048a55  gcc/testsuite/gcc.dg/vect/fast-math-vect-complex-3.c
*************** ae7dd7b535828dd877ea453ce08b1b4b  gcc/te
*** 66258,66263 ****
--- 66773,66779 ----
  1e57bd875cece14e0d06e2d617c8ef1c  gcc/testsuite/gcc.dg/vect/pr123032.c
  1a89666cdf0f2352dc6a3b60a35d5526  gcc/testsuite/gcc.dg/vect/pr123038.c
  2838d9516eba265f0e0975f689ddd518  gcc/testsuite/gcc.dg/vect/pr123043.c
+ 17c5c38b2c03547dce34b548af8a2143  gcc/testsuite/gcc.dg/vect/pr123525.c
  42d48d2ecd5682545b12ac42f879a831  gcc/testsuite/gcc.dg/vect/pr16105.c
  231c99dba9475fe09525bbf6f4374124  gcc/testsuite/gcc.dg/vect/pr18308.c
  915cf38408eaa7fee5013d90ec1c3251  gcc/testsuite/gcc.dg/vect/pr18400.c
*************** d63a3ba805f750904ac56d5a3099e28f  gcc/te
*** 66677,66683 ****
  7366b1c35af385466b2fb3e0ac751199  gcc/testsuite/gcc.dg/vect/slp-24.c
  e3153e4fa0cd57f31cd27ff2a5e3e509  gcc/testsuite/gcc.dg/vect/slp-25.c
  12b26338d07e33733f60949b9879a355  gcc/testsuite/gcc.dg/vect/slp-26.c
! 72867fd93d334910b817557f3c9596f9  gcc/testsuite/gcc.dg/vect/slp-28.c
  4e1ffccecc23382df688437a5f471a8e  gcc/testsuite/gcc.dg/vect/slp-3-big-array.c
  8e4d813bb5abc2214d5c49998ce56f69  gcc/testsuite/gcc.dg/vect/slp-3.c
  790fc2743ec1a739262fae4d397bacfa  gcc/testsuite/gcc.dg/vect/slp-33.c
--- 67193,67199 ----
  7366b1c35af385466b2fb3e0ac751199  gcc/testsuite/gcc.dg/vect/slp-24.c
  e3153e4fa0cd57f31cd27ff2a5e3e509  gcc/testsuite/gcc.dg/vect/slp-25.c
  12b26338d07e33733f60949b9879a355  gcc/testsuite/gcc.dg/vect/slp-26.c
! 8ea043f00d5a9e69d3e0c505e6e9b7c8  gcc/testsuite/gcc.dg/vect/slp-28.c
  4e1ffccecc23382df688437a5f471a8e  gcc/testsuite/gcc.dg/vect/slp-3-big-array.c
  8e4d813bb5abc2214d5c49998ce56f69  gcc/testsuite/gcc.dg/vect/slp-3.c
  790fc2743ec1a739262fae4d397bacfa  gcc/testsuite/gcc.dg/vect/slp-33.c
*************** a27087df4989bb70386182ff7f74facf  gcc/te
*** 67600,67605 ****
--- 68116,68122 ----
  5346702060f2a1fdcbef60b8759f436c  gcc/testsuite/gcc.dg/vect/vect-pr123002.c
  efc5db1b97ea06d470c57048d8966ea1  gcc/testsuite/gcc.dg/vect/vect-pr123221.c
  745e1ec106fc11cf54190bfa02bb194e  gcc/testsuite/gcc.dg/vect/vect-pr123316.c
+ 8392d6836424887c8615331c1ad6592d  gcc/testsuite/gcc.dg/vect/vect-pr12358.c
  464c872c62ad2fc5d241ed918e0cf5de  gcc/testsuite/gcc.dg/vect/vect-pr61247.c
  4d57df9e3b3522c9f1a6707c05f1da45  gcc/testsuite/gcc.dg/vect/vect-pr69848.c
  3a3a316ff2f2496494ecb0bd77d61aad  gcc/testsuite/gcc.dg/vect/vect-pre-interact.c
*************** f8584ef5813441112b0bfb8283a130fd  gcc/te
*** 69492,69498 ****
  c6f22c75d128166e2734ec28d48d349b  gcc/testsuite/gcc.target/aarch64/cssc_5.c
  f15d1ff83066971ce9a42593ae9e147c  gcc/testsuite/gcc.target/aarch64/ctz.c
  66e80d99734f8cef1f2093c52336c4c2  gcc/testsuite/gcc.target/aarch64/cvtf_1.c
! 219904a019d4bb11b9f01c14bdd7a407  gcc/testsuite/gcc.target/aarch64/dbl_mov_immediate_1.c
  a95c8779f3b9cc5c91774eab2c3b9b8d  gcc/testsuite/gcc.target/aarch64/declare-simd-1.c
  e57188457d19c572c1c7ca575a6aa71b  gcc/testsuite/gcc.target/aarch64/declare-simd-2.c
  063fb3cb3ef8c03670a39beb490eee85  gcc/testsuite/gcc.target/aarch64/diag_aka_1.c
--- 70009,70015 ----
  c6f22c75d128166e2734ec28d48d349b  gcc/testsuite/gcc.target/aarch64/cssc_5.c
  f15d1ff83066971ce9a42593ae9e147c  gcc/testsuite/gcc.target/aarch64/ctz.c
  66e80d99734f8cef1f2093c52336c4c2  gcc/testsuite/gcc.target/aarch64/cvtf_1.c
! 8501198f53731bd7e02e01dcd420970d  gcc/testsuite/gcc.target/aarch64/dbl_mov_immediate_1.c
  a95c8779f3b9cc5c91774eab2c3b9b8d  gcc/testsuite/gcc.target/aarch64/declare-simd-1.c
  e57188457d19c572c1c7ca575a6aa71b  gcc/testsuite/gcc.target/aarch64/declare-simd-2.c
  063fb3cb3ef8c03670a39beb490eee85  gcc/testsuite/gcc.target/aarch64/diag_aka_1.c
*************** e721f980e1e7a9648d77300c2f6ea0e5  gcc/te
*** 69998,70003 ****
--- 70515,70545 ----
  d28ce23985b773a211ff26743e9e661d  gcc/testsuite/gcc.target/aarch64/options_set_8.c
  55ae452185bb0bb101f614fc4fa21cd9  gcc/testsuite/gcc.target/aarch64/options_set_9.c
  2ba9e0951fadcf5ce5f2eab080c09a68  gcc/testsuite/gcc.target/aarch64/orr_imm_1.c
+ 588d2e2dfdd80b688f338634b7d1dd0e  gcc/testsuite/gcc.target/aarch64/pch/aarch64-pch.exp
+ a6744e260d36942daafb6b2fcf3e4e19  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.c
+ 7b90a6e9d561b2c19e6c612960e8ef70  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.hs
+ 5a5b4234700c182421280262006aff02  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.c
+ 7b90a6e9d561b2c19e6c612960e8ef70  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.hs
+ 4478fcdd1aefee96e33faf1c4b60215d  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.c
+ 97e98018fd0a42839432bb5716c601bb  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.hs
+ 4775f635f85fab86b3e43edddb4d3731  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.c
+ 97e98018fd0a42839432bb5716c601bb  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.hs
+ c1cc84ca237825286acc5b291c488ad3  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.c
+ eea843b45fced370cf40e4fd8434b286  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.hs
+ 66efb2495a5e78783e0592acaf913f90  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.c
+ eea843b45fced370cf40e4fd8434b286  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.hs
+ 0b52c4a1f6b3f91ec85ce6e2ce5d7f99  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.c
+ c0b11c30b275c5fd2113fe2a4ecac4af  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.hs
+ 48d3f71076eb2c9a167ad14ae32a23de  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.c
+ c0b11c30b275c5fd2113fe2a4ecac4af  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.hs
+ b2bd58eb682ff2375e24885036453e0e  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.c
+ 408bbbd938ffecc7c0bf0e2b87b2864b  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.hs
+ 6b00da17b87978f4062502ae983d70b2  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.c
+ 408bbbd938ffecc7c0bf0e2b87b2864b  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.hs
+ 957c9a141aeddbfd748594553077d14e  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.c
+ 58d8436df4c6af25396ff8f2e09b91c2  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.hs
+ 8e6da171896c5c3446074fa59d4c2cd4  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.c
+ 58d8436df4c6af25396ff8f2e09b91c2  gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.hs
  2affd5586d9d9534731788d83a2a3904  gcc/testsuite/gcc.target/aarch64/pcs_attribute-2.c
  b0a892934f70ddbece003356d1462148  gcc/testsuite/gcc.target/aarch64/pcs_attribute-3.c
  9fe8a7ffd0c54ed06b5690a31efb7b70  gcc/testsuite/gcc.target/aarch64/pcs_attribute.c
*************** a3303d7dc6b509471d4e18418c9de113  gcc/te
*** 70106,70111 ****
--- 70648,70654 ----
  5e8481e02f3cfad1b565c1fcf18a51b0  gcc/testsuite/gcc.target/aarch64/pr113613.c
  c3b3090c8cc6b28f90027aceb08f6ad7  gcc/testsuite/gcc.target/aarch64/pr113618.c
  65b79dfa682a9ae7b9e39d7180ffd699  gcc/testsuite/gcc.target/aarch64/pr114196.c
+ 36053cf59cb8f7ed3c6851b00c7a8da0  gcc/testsuite/gcc.target/aarch64/pr114528.c
  88db9b527d6d24f272fa2ecc6aa6a21c  gcc/testsuite/gcc.target/aarch64/pr114674.c
  e95d7302a79bebe0c38e93d641a753d8  gcc/testsuite/gcc.target/aarch64/pr114741.c
  63ef009af426deb86b0efef97e0dc7e7  gcc/testsuite/gcc.target/aarch64/pr114991.c
*************** d8cfefc063686118062e9fc3b774907b  gcc/te
*** 70159,70165 ****
  617b125a3275c9ce440e1e542a8bbc79  gcc/testsuite/gcc.target/aarch64/pr62178.c
  da1fc7d53b5f8b6e99f57a2a7b7ac849  gcc/testsuite/gcc.target/aarch64/pr62262.c
  5b090e5d951a21826fd629be991b5411  gcc/testsuite/gcc.target/aarch64/pr62308.c
! b39607ed8246d1c1e4730c6984888a15  gcc/testsuite/gcc.target/aarch64/pr63304_1.c
  5195785cc7216a9662357829a66aa2c7  gcc/testsuite/gcc.target/aarch64/pr63424.c
  baf71778326c44f90d27479f00af7a63  gcc/testsuite/gcc.target/aarch64/pr63874.c
  193743022291a9918f493ad3090965ec  gcc/testsuite/gcc.target/aarch64/pr64263_1.c
--- 70702,70708 ----
  617b125a3275c9ce440e1e542a8bbc79  gcc/testsuite/gcc.target/aarch64/pr62178.c
  da1fc7d53b5f8b6e99f57a2a7b7ac849  gcc/testsuite/gcc.target/aarch64/pr62262.c
  5b090e5d951a21826fd629be991b5411  gcc/testsuite/gcc.target/aarch64/pr62308.c
! 32cd403212b0827f42a447c050158e6a  gcc/testsuite/gcc.target/aarch64/pr63304_1.c
  5195785cc7216a9662357829a66aa2c7  gcc/testsuite/gcc.target/aarch64/pr63424.c
  baf71778326c44f90d27479f00af7a63  gcc/testsuite/gcc.target/aarch64/pr63874.c
  193743022291a9918f493ad3090965ec  gcc/testsuite/gcc.target/aarch64/pr64263_1.c
*************** df616b441a15b0fdbf888d04c5fe95fb  gcc/te
*** 70340,70346 ****
  9e585f963d3e92c62da9f74870533f70  gcc/testsuite/gcc.target/aarch64/shrn-combine-9.c
  61520e36e20fbdca6fded10ce66f096c  gcc/testsuite/gcc.target/aarch64/signbit-1.c
  d6d84820bf58577dda59d8f5e7e556f1  gcc/testsuite/gcc.target/aarch64/signbit-2.c
! 7378ad57a7e281bf3f87ce9a0d494e69  gcc/testsuite/gcc.target/aarch64/signbitv2sf.c
  d2757938fad3b14f583150a49e03367e  gcc/testsuite/gcc.target/aarch64/signbitv4sf.c
  b3b3cf4271262efc97f836f3073eda48  gcc/testsuite/gcc.target/aarch64/simd/addlv_1.c
  ec1e7259ab590008de3be293d2d948c0  gcc/testsuite/gcc.target/aarch64/simd/addlv_zext.c
--- 70883,70889 ----
  9e585f963d3e92c62da9f74870533f70  gcc/testsuite/gcc.target/aarch64/shrn-combine-9.c
  61520e36e20fbdca6fded10ce66f096c  gcc/testsuite/gcc.target/aarch64/signbit-1.c
  d6d84820bf58577dda59d8f5e7e556f1  gcc/testsuite/gcc.target/aarch64/signbit-2.c
! 7b3d0bb71a1cc12f48302e6738f9c6f0  gcc/testsuite/gcc.target/aarch64/signbitv2sf.c
  d2757938fad3b14f583150a49e03367e  gcc/testsuite/gcc.target/aarch64/signbitv4sf.c
  b3b3cf4271262efc97f836f3073eda48  gcc/testsuite/gcc.target/aarch64/simd/addlv_1.c
  ec1e7259ab590008de3be293d2d948c0  gcc/testsuite/gcc.target/aarch64/simd/addlv_zext.c
*************** ba056a05a11764def1104c2563563d51  gcc/te
*** 71159,71167 ****
  bd74662fa87765674d154ca63c69e837  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_f32_s32_x4.c
  0c4515c5440fafeba33404df47d694f9  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_f32_u32_x2.c
  84da17a32976df75d7f7fa54f68383d7  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_f32_u32_x4.c
! e18a6e42f8ee2b513fc74aea6b5ad7c3  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_bf16_x2.c
! 2d9d797a2a783ed298b8f9b509387209  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f16_x2.c
! b8cd6313fd187d43b9e3865395a2e123  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f32_x4.c
  204478c3aea054e20bc973139f7426db  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_x2.c
  cd04bfeb885395f8141a5eb5e79d513b  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_s32_f32_x2.c
  5da06bb8e1f77e628372e25b0a9a48e8  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_s32_f32_x4.c
--- 71702,71710 ----
  bd74662fa87765674d154ca63c69e837  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_f32_s32_x4.c
  0c4515c5440fafeba33404df47d694f9  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_f32_u32_x2.c
  84da17a32976df75d7f7fa54f68383d7  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_f32_u32_x4.c
! 7f1e19ba0807e583ef485b980c468b46  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_bf16_x2.c
! 3ab577ce7c7552174f605a735650ed3e  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f16_x2.c
! d8474c5f45e12eed9c464867f2cc7612  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f32_x4.c
  204478c3aea054e20bc973139f7426db  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_x2.c
  cd04bfeb885395f8141a5eb5e79d513b  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_s32_f32_x2.c
  5da06bb8e1f77e628372e25b0a9a48e8  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_s32_f32_x4.c
*************** bfad1ade50c6407affa0bb57d100e232  gcc/te
*** 71171,71177 ****
  90742e69be923e36837dbd965e837a62  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtl_mf8_x2.c
  c7e70850df6204b80a6eb2a595dde2c5  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_bf16_f32_x2.c
  8fb32ef3a80092caff5869318f4a26ea  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_f16_f32_x2.c
! 92ab53bf56868e08189ad9b4066a701f  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_mf8_f32_x4.c
  6d2e06bbf42e9a73d30281a2ef54d819  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/dot_f32.c
  2254e8fce53e727c3c39066718e987a5  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/dot_lane_f32.c
  9f7f258d6d152e8e4e9e0d166efba1b4  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/dot_lane_s32.c
--- 71714,71720 ----
  90742e69be923e36837dbd965e837a62  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtl_mf8_x2.c
  c7e70850df6204b80a6eb2a595dde2c5  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_bf16_f32_x2.c
  8fb32ef3a80092caff5869318f4a26ea  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_f16_f32_x2.c
! 64d67aad8d75b51ca4e234428bf37b8e  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_mf8_f32_x4.c
  6d2e06bbf42e9a73d30281a2ef54d819  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/dot_f32.c
  2254e8fce53e727c3c39066718e987a5  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/dot_lane_f32.c
  9f7f258d6d152e8e4e9e0d166efba1b4  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/dot_lane_s32.c
*************** d22a3bd90868146ac9eae1229a4aba9c  gcc/te
*** 71683,71694 ****
  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
! a7984614aea4eef25554975f1575af45  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c
! 8fa54be5bd501ebb94c9f5734d7ce06a  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c
! 0160928e0156a90f41d41bd47f25737e  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c
! 1d0fcababf610a750d8a3e0e725c0c1f  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c
! 978e2ccb2cf8ccdc38f1b0893271ae09  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c
! aaf14ef39df5e90d6ea342e0cc8130d5  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c
  f2d9a2b1123be589ca2a71591a6388bd  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/sel_bf16_x2.c
  9f0b4021df6d37447f6daef5b6ab57c8  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/sel_bf16_x4.c
  94e0b3b236eb1f558e70a7b0a2327094  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/sel_f16_x2.c
--- 72226,72237 ----
  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
! 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
! d7132bd971ab4ffded2226315176f496  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c
! 134ca48a8ccf500c8672ddab80599615  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c
! ee93fd654af8a65ea269fa1cfe75a816  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c
  f2d9a2b1123be589ca2a71591a6388bd  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/sel_bf16_x2.c
  9f0b4021df6d37447f6daef5b6ab57c8  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/sel_bf16_x4.c
  94e0b3b236eb1f558e70a7b0a2327094  gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/sel_f16_x2.c
*************** b47de1519a1ea6d899c2a6cd56b65cba  gcc/te
*** 74191,74196 ****
--- 74734,74740 ----
  a37d20c2585b9553233fb42e281e9b03  gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr115464_2.c
  89320642fc28eb425a70fa1fc222f0b2  gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr120718.c
  c1f0d92266055a62f8c3a0b32cffca32  gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr121118_1.c
+ 4b3b421e52a2297ee3fdf3f39e2b6294  gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr123392.c
  cd84e485b3fa7a0d50f2ee5113eca33d  gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr94683.c
  111a35b5bdbe877086a99d29b13dc65b  gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr94700.c
  dd9873ff910539b000561a51ccc3a52f  gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr96146.c
*************** b5fef8fb540e17f32442a50d6ee40f1e  gcc/te
*** 89062,89071 ****
  609faa828d84f786709fd1c4f7c03431  gcc/testsuite/gcc.target/i386/pr122598.c
  405fadb5a4007fdee8be974babcb3550  gcc/testsuite/gcc.target/i386/pr122675-1.c
  68c5cb935b4b7d76ed31899761e6b756  gcc/testsuite/gcc.target/i386/pr123027.c
! dc0ac30205a49a37f80c833e996ed4d2  gcc/testsuite/gcc.target/i386/pr123121.c
  f99f88a6e994ad6e55e065e41bc58f8f  gcc/testsuite/gcc.target/i386/pr12329.c
  8be8732e201b30755cf471a1f8ac1cf6  gcc/testsuite/gcc.target/i386/pr123319.c
  5263cb01b17b6df3496a998c2a8e70d8  gcc/testsuite/gcc.target/i386/pr123489.c
  8951a1fa31f2d45ef9eacfff6a733f77  gcc/testsuite/gcc.target/i386/pr13366.c
  9a752a4b3b77930d91d3c8b0c8897b90  gcc/testsuite/gcc.target/i386/pr13685.c
  31ead0ee84b382ba03e3561931bc6e40  gcc/testsuite/gcc.target/i386/pr14289-1.c
--- 89606,89617 ----
  609faa828d84f786709fd1c4f7c03431  gcc/testsuite/gcc.target/i386/pr122598.c
  405fadb5a4007fdee8be974babcb3550  gcc/testsuite/gcc.target/i386/pr122675-1.c
  68c5cb935b4b7d76ed31899761e6b756  gcc/testsuite/gcc.target/i386/pr123027.c
! 6631a523638aaa28883a1480bb393315  gcc/testsuite/gcc.target/i386/pr123121.c
  f99f88a6e994ad6e55e065e41bc58f8f  gcc/testsuite/gcc.target/i386/pr12329.c
  8be8732e201b30755cf471a1f8ac1cf6  gcc/testsuite/gcc.target/i386/pr123319.c
+ fd0c95fcad577a49c3553f21604c3b61  gcc/testsuite/gcc.target/i386/pr123484.c
  5263cb01b17b6df3496a998c2a8e70d8  gcc/testsuite/gcc.target/i386/pr123489.c
+ 0c572aee98b871b5098fcc5a78b5d069  gcc/testsuite/gcc.target/i386/pr123523.c
  8951a1fa31f2d45ef9eacfff6a733f77  gcc/testsuite/gcc.target/i386/pr13366.c
  9a752a4b3b77930d91d3c8b0c8897b90  gcc/testsuite/gcc.target/i386/pr13685.c
  31ead0ee84b382ba03e3561931bc6e40  gcc/testsuite/gcc.target/i386/pr14289-1.c
*************** c16fea0d740f8946249d8d3ff6230152  gcc/te
*** 92352,92357 ****
--- 92898,92904 ----
  a7210513dd89b8e683a00184ee4478a4  gcc/testsuite/gcc.target/loongarch/la64/attr-model-3.c
  9d4f972a3175f736a746ae031fb25e7a  gcc/testsuite/gcc.target/loongarch/la64/attr-model-4.c
  02f1973aec4f57a84c09f2b6bc6eaf79  gcc/testsuite/gcc.target/loongarch/la64/attr-model-5.c
+ eaedeb33f4a944f6ddcb113a7cd3ed14  gcc/testsuite/gcc.target/loongarch/la64/attr-model-6.c
  f9bd26f98b04e99789925370214a2a06  gcc/testsuite/gcc.target/loongarch/la64/attr-model-diag.c
  b0da33fc443024e77c7b605056bff4ae  gcc/testsuite/gcc.target/loongarch/la64/attr-model-test.c
  cd00ceeea45683383cf6ab2205253ad0  gcc/testsuite/gcc.target/loongarch/la64/bitint-alignments.c
*************** eb7720d1ee0f7dde86471e1b8ad3b82f  gcc/te
*** 92785,92790 ****
--- 93332,93338 ----
  de83bbcbb03e37b7d3c3619033b6882e  gcc/testsuite/gcc.target/loongarch/vector/lasx/pr112476-2.c
  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
  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
*************** ed343c63973b66c0e986170ee496a1bd  gcc/te
*** 94288,94293 ****
--- 94836,94842 ----
  523510347699205aba59cb836c38573b  gcc/testsuite/gcc.target/powerpc/amo2.c
  f92704c5f7f462e7f0b0f7a56209b9c1  gcc/testsuite/gcc.target/powerpc/asm-es-1.c
  ab233b59d18c7aa71a26292124ceae27  gcc/testsuite/gcc.target/powerpc/asm-es-2.c
+ 6ab0c2c5c17e69db0ab917861a4fc5cc  gcc/testsuite/gcc.target/powerpc/asm-hard-reg-1.c
  378c09d3dfb95c75b49eec1d5713dd6b  gcc/testsuite/gcc.target/powerpc/asm-redzone-1.c
  f1f6a9ec080c7f1554b538d5701c21e2  gcc/testsuite/gcc.target/powerpc/asm-y.c
  684c6b7214e8eb80af0a5566f5c6625e  gcc/testsuite/gcc.target/powerpc/atomic-p7.c
*************** c6a17fe16a8de24e823815f272f8e895  gcc/te
*** 97251,97256 ****
--- 97800,97809 ----
  ea3dbec756f9d6d8cc34b5e0555acc12  gcc/testsuite/gcc.target/riscv/bf16_float_libcall_convert.c
  b7abe95f9b02106e7160a5bdf3bd9683  gcc/testsuite/gcc.target/riscv/bf16_integer_libcall_convert.c
  ce996344e43595d076a35c5854116e9d  gcc/testsuite/gcc.target/riscv/binv-for-simode-1.c
+ a900b4ae158def8ab326c6875424b82e  gcc/testsuite/gcc.target/riscv/bitint-32-on-rv64.c
+ 514d8a30ef5907af23194f37b0aceb6b  gcc/testsuite/gcc.target/riscv/bitint-alignments.c
+ 1468f9f7b39bfaa0cc408217ce4b6bc3  gcc/testsuite/gcc.target/riscv/bitint-args.c
+ 3fdc6864e2eaf2cad1a528ed5efae324  gcc/testsuite/gcc.target/riscv/bitint-sizes.c
  244404494e46bf644ff8a21bfd0fe745  gcc/testsuite/gcc.target/riscv/branch-1.c
  5ff9fc5e4ee023e4133be50b0e41bac7  gcc/testsuite/gcc.target/riscv/bset-for-simode-1.c
  4b54c8f5ed08f52993b3ed6d5d8fd7a1  gcc/testsuite/gcc.target/riscv/can_inline_p_test-01.c
*************** cddeabddc47c1e2e434be321884dbb80  gcc/te
*** 98057,98062 ****
--- 98610,98616 ----
  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
+ fff9d84e7d142a27609a7e87d10bfded  gcc/testsuite/gcc.target/riscv/pr123092.c
  61858fbf3627a6a698ef76b904f1ab7b  gcc/testsuite/gcc.target/riscv/pr123274.c
  ba319008fc3d471c58bb29fc9d29ccbc  gcc/testsuite/gcc.target/riscv/pr123278.c
  6eca389fe57f7e888581742c60e40dd4  gcc/testsuite/gcc.target/riscv/pr123318.c
*************** e69ac673a560685af831869d72b01154  gcc/te
*** 98929,98935 ****
  311a627408ac72490b3120be31a63ff3  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121985.c
  505e3d028e24b575ded98597fbccdbfd  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122124.c
  e990c042b373d09f16b69f4b30f0ac20  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122321.c
! a46c21828339f41cac3054a662eefb70  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c
  9e392034c9515123dd44a7ee88bd8905  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122627.c
  f282bbefbf97b6d53a628679bbaa73c0  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122635-1.c
  b2dd0767e7d7daf54047f6721f5c4fc5  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122635-2.c
--- 99483,99489 ----
  311a627408ac72490b3120be31a63ff3  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr121985.c
  505e3d028e24b575ded98597fbccdbfd  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122124.c
  e990c042b373d09f16b69f4b30f0ac20  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122321.c
! f0e27c8a70ef385c8afee48411a152f0  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c
  9e392034c9515123dd44a7ee88bd8905  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122627.c
  f282bbefbf97b6d53a628679bbaa73c0  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122635-1.c
  b2dd0767e7d7daf54047f6721f5c4fc5  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122635-2.c
*************** cf72fc61666d019de029c8143c4c42a2  gcc/te
*** 98939,98944 ****
--- 99493,99499 ----
  159ba529f2ab9b94d86dd9c7121d5aec  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123022.c
  c447bf3b1ca59703351696005c25a811  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123097-run.c
  f7f343c3de4454209ad958bd70574bf9  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123097.c
+ 9c1bbd3ecbed8403a5df89411fa20a31  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c
  2f0b7e899c4345c6d370e174e7d4b2dd  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123317-run-1.c
  d6f32022613367c165768e009d673ee3  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123317-run-2.c
  2ca459b948998f212e7c63db48a126a9  gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123317-run-3.c
*************** c45fc8b957d3795551007dc8778f0905  gcc/te
*** 98973,98978 ****
--- 99528,99534 ----
  806b456b7c04a495d9c07f1c78339fd5  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last_run-7.c
  dcd95e6b0ffbcd67134508285cf0dd7e  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last_run-8.c
  079315192f9f57442a4c0d1132f7ec72  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/extract_last_run-9.c
+ 92189b0ad615f2d3623f1b871af4cb09  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/pr123501.c
  32208ad008f41245be33936306a955c8  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc-1.c
  e1f86fc6350b92e9f73b5a34874e1310  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc-10.c
  2166358447adcc350e54279c2a70a7b2  gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/reduc-2.c
*************** daa1172ed1d5a6072057b20aaca3b1ec  gcc/te
*** 114611,114617 ****
  702b0cdf61e5478dccaf83e842bc3466  gcc/testsuite/gfortran.dg/graphite/vect-pr40979.f90
  7f4798472e54ab24309f0edab16c91d1  gcc/testsuite/gfortran.dg/graphite/vect-pr94043.f90
  6d96f31789e9318047e153d50e613791  gcc/testsuite/gfortran.dg/guality/arg1.f90
! 0b8fd6ccf67a7f794af2e9d3338903c4  gcc/testsuite/gfortran.dg/guality/guality.exp
  d4160e104059a3b57d5b80ddb9140570  gcc/testsuite/gfortran.dg/guality/pr119190.f90
  f6dc189e3efd8e05cb4f9668eaf8fdbe  gcc/testsuite/gfortran.dg/guality/pr120193.f90
  9e2790792b04c03a1a0860c862a27b4b  gcc/testsuite/gfortran.dg/guality/pr41558.f90
--- 115167,115173 ----
  702b0cdf61e5478dccaf83e842bc3466  gcc/testsuite/gfortran.dg/graphite/vect-pr40979.f90
  7f4798472e54ab24309f0edab16c91d1  gcc/testsuite/gfortran.dg/graphite/vect-pr94043.f90
  6d96f31789e9318047e153d50e613791  gcc/testsuite/gfortran.dg/guality/arg1.f90
! 730335b06412cc42ddaafe247e9959c4  gcc/testsuite/gfortran.dg/guality/guality.exp
  d4160e104059a3b57d5b80ddb9140570  gcc/testsuite/gfortran.dg/guality/pr119190.f90
  f6dc189e3efd8e05cb4f9668eaf8fdbe  gcc/testsuite/gfortran.dg/guality/pr120193.f90
  9e2790792b04c03a1a0860c862a27b4b  gcc/testsuite/gfortran.dg/guality/pr41558.f90
*************** cda99c4f9b1e1ca808103eba31168058  gcc/te
*** 115664,115669 ****
--- 116220,116226 ----
  ab43a12e9d7dd4f0eed4d087fc19a84f  gcc/testsuite/gfortran.dg/named_interface.f90
  7841bdfa2894b1c8f28e061e0d78ca99  gcc/testsuite/gfortran.dg/namelist_1.f90
  33eb50db1247aefc95a8f0bcc1c23951  gcc/testsuite/gfortran.dg/namelist_100.f90
+ 6d976ec444b00238a9bfc57f681c6c05  gcc/testsuite/gfortran.dg/namelist_101.f90
  02a533763d199c5afa28bec631ca6b9e  gcc/testsuite/gfortran.dg/namelist_11.f
  fadabd8643639e650a8499262b9a767e  gcc/testsuite/gfortran.dg/namelist_12.f
  637100e10c22e1d286db1ce10741e289  gcc/testsuite/gfortran.dg/namelist_13.f90
*************** e7b56697ac64f36257ec59b471922aaa  gcc/te
*** 116069,116074 ****
--- 116626,116632 ----
  4a0359f8a25f066b79811b00f5556602  gcc/testsuite/gfortran.dg/pdt_79.f03
  e21f38a2db39f95405441b61c12cf1e6  gcc/testsuite/gfortran.dg/pdt_8.f03
  50b90d7df8b77f8225042795ce534280  gcc/testsuite/gfortran.dg/pdt_80.f03
+ 08059a1fb646b56d0e4c4e079cca8ad9  gcc/testsuite/gfortran.dg/pdt_81.f03
  c621629f10feffbfa9fef1441a610e53  gcc/testsuite/gfortran.dg/pdt_9.f03
  ce217e87870d47796b72f99a0b0f46b7  gcc/testsuite/gfortran.dg/pdt_generic_1.f90
  4555f630cb01a40d0eaf421fd7ad9e77  gcc/testsuite/gfortran.dg/pointer_1.f90
*************** b4c38adb4e9d005c1c883b2efff25b07  gcc/te
*** 116317,116322 ****
--- 116875,116881 ----
  b7b6edb61862ad55069c70c4744ad157  gcc/testsuite/gfortran.dg/pr109265.f90
  78ada5d286128144e86af4a4c1aac9cc  gcc/testsuite/gfortran.dg/pr109345.f90
  05aad7d3d7d82955070028e39fdf28af  gcc/testsuite/gfortran.dg/pr109358.f90
+ 177c71b2af7ff0342ee4829742717d26  gcc/testsuite/gfortran.dg/pr109512.f90
  f309d722fd5c0108897e848739b09dbb  gcc/testsuite/gfortran.dg/pr109662-a.f90
  87aa7841fecf66956c29baf129e68fb9  gcc/testsuite/gfortran.dg/pr109662.f90
  f2965c649a5f8dcb271f4f49f656cfff  gcc/testsuite/gfortran.dg/pr109948.f90
*************** fe55b4afdea6006daace9aa79199e551  gcc/te
*** 116738,116744 ****
  f98605838f661ab05c8e58bbe0ec37a4  gcc/testsuite/gfortran.dg/pr69739.f90
  ad1c20f5706de185c8d1a0e845e5710d  gcc/testsuite/gfortran.dg/pr69867.f90
  5d287811020bdabb61dcc6757135eb94  gcc/testsuite/gfortran.dg/pr69955.f90
! 29610fdfa7dcc34c2dbc61b21af1103e  gcc/testsuite/gfortran.dg/pr69962.f90
  c718be52c08cbfe5941dc1bb7a50bcb5  gcc/testsuite/gfortran.dg/pr69987.f90
  e3df725d919fbea72dd53c26d3c3fc1b  gcc/testsuite/gfortran.dg/pr70006.f90
  7f656e5a6d13d6ab788f5c3e8fb90572  gcc/testsuite/gfortran.dg/pr70040.f90
--- 117297,117303 ----
  f98605838f661ab05c8e58bbe0ec37a4  gcc/testsuite/gfortran.dg/pr69739.f90
  ad1c20f5706de185c8d1a0e845e5710d  gcc/testsuite/gfortran.dg/pr69867.f90
  5d287811020bdabb61dcc6757135eb94  gcc/testsuite/gfortran.dg/pr69955.f90
! 32eae45af02bad04ece42a07c4bcea17  gcc/testsuite/gfortran.dg/pr69962.f90
  c718be52c08cbfe5941dc1bb7a50bcb5  gcc/testsuite/gfortran.dg/pr69987.f90
  e3df725d919fbea72dd53c26d3c3fc1b  gcc/testsuite/gfortran.dg/pr70006.f90
  7f656e5a6d13d6ab788f5c3e8fb90572  gcc/testsuite/gfortran.dg/pr70040.f90
*************** d676dbff55fa3a1bfc2c5c723ab4b0e6  gcc/te
*** 116783,116788 ****
--- 117342,117349 ----
  c80f60155bcb84d08e36147df56ee2a7  gcc/testsuite/gfortran.dg/pr77391.f90
  98fa011f3b9cb0fda809c579d18e2aff  gcc/testsuite/gfortran.dg/pr77406.f90
  fecc61bbfc16293b15103804392e0bd2  gcc/testsuite/gfortran.dg/pr77414.f90
+ 78965c868f16f11cbff9aec9504ba604  gcc/testsuite/gfortran.dg/pr77415_1.f90
+ b093c5bb912dc337cd65afad2e986ddf  gcc/testsuite/gfortran.dg/pr77415_2.f90
  273708f3f44a1085948126b236c9f875  gcc/testsuite/gfortran.dg/pr77420_1.f90
  85915b4b10039334da3368e57192ff34  gcc/testsuite/gfortran.dg/pr77420_2.f90
  2549339a920645cd51edb2c436ea56ab  gcc/testsuite/gfortran.dg/pr77420_3.f90
*************** a50919bcdb1d810ce2f68bd6b22ee53b  gcc/te
*** 117018,117023 ****
--- 117579,117586 ----
  80c38334d4c2234ca4df7f0176fd911f  gcc/testsuite/gfortran.dg/pr91943.f90
  f47280c21d6106d254997e6f8dfc8428  gcc/testsuite/gfortran.dg/pr91945.f90
  3f0d651103a337f28b2bc24f57d468a5  gcc/testsuite/gfortran.dg/pr91959.f90
+ 9ace4410c7d6051b4bc3dfb4b478cd75  gcc/testsuite/gfortran.dg/pr91960_1.f90
+ 1ce699a04d21670ef1f80fb9b9dd1de0  gcc/testsuite/gfortran.dg/pr91960_2.f90
  08fda0592c5d30dce05f0478585e75bd  gcc/testsuite/gfortran.dg/pr92018.f90
  272b67d76fa6d4258e045be0ee78f536  gcc/testsuite/gfortran.dg/pr92019.f90
  cd47c5f771e296971301643af5583dfa  gcc/testsuite/gfortran.dg/pr92050.f90
*************** f9cd7fe0c8cb7be5b0846aa6c3eb0b93  gcc/te
*** 117077,117082 ****
--- 117640,117646 ----
  b0f8acfae3746c459e5af7bcca222814  gcc/testsuite/gfortran.dg/pr94030_2.f90
  3fbf8e84b18aab42f89f48c0c8a9a41a  gcc/testsuite/gfortran.dg/pr94285.f90
  f17ab40b1ca95ac01da77049baa72103  gcc/testsuite/gfortran.dg/pr94329.f90
+ 606c0d796566955abff716dca0065850  gcc/testsuite/gfortran.dg/pr94377.f90
  bf6d4fa9d116ccede014485a892d0d71  gcc/testsuite/gfortran.dg/pr94380.f90
  b9faba8aac0e0dd38443caeb527db93d  gcc/testsuite/gfortran.dg/pr94397.F90
  16d161f7900dd36eabcbaea6cd9c1b6e  gcc/testsuite/gfortran.dg/pr94708.f90
*************** ac267a2812409b3404f6c1aeba441861  gcc/te
*** 121682,121687 ****
--- 122246,122252 ----
  eabd848befe131fde7677a9da2ddf20b  gcc/testsuite/gnat.dg/complex1_pkg.ads
  0b8796322445f41bce527a08ee2783de  gcc/testsuite/gnat.dg/component_size.adb
  13eb5d243ed2779f56be7f0f26132a53  gcc/testsuite/gnat.dg/component_value1.adb
+ 7ad5ed9511b0c4ff7e5173963b1e276c  gcc/testsuite/gnat.dg/component_value2.adb
  65f042f7c7f3ba5cd72d9c078386a46e  gcc/testsuite/gnat.dg/compose.adb
  ac069379af0132c56a9f326aa688d9f0  gcc/testsuite/gnat.dg/concat1.adb
  d0d9950b243700f01e3cfad18d2b6139  gcc/testsuite/gnat.dg/concat1_pkg.adb
*************** a0ed36c59884ca42f622cc1d30faff4d  gcc/te
*** 126191,126199 ****
  999cfa769885f2a876551163115fe602  gcc/testsuite/lib/g++-dg.exp
  8f61c91e9ce681c3472f2a307c7d7f00  gcc/testsuite/lib/g++.exp
  2ebe67e0e1de7772a7339a397dba5dc4  gcc/testsuite/lib/gcc-defs.exp
! d6a546082a5df6c5f9e5b58f02bf732a  gcc/testsuite/lib/gcc-dg.exp
! c595c87c22b8effa5019ccd62b77d676  gcc/testsuite/lib/gcc-gdb-test.exp
! 0a82259708a995bebf94f43fd905acea  gcc/testsuite/lib/gcc-simulate-thread.exp
  f137fa2e280bd8fee6a57544dbe520a8  gcc/testsuite/lib/gcc.exp
  89ac16c64ea0883a89a11a2e6fdb78f6  gcc/testsuite/lib/gcov.exp
  1ab113b2aab75f691397f0a23c85a675  gcc/testsuite/lib/gdc-dg.exp
--- 126756,126764 ----
  999cfa769885f2a876551163115fe602  gcc/testsuite/lib/g++-dg.exp
  8f61c91e9ce681c3472f2a307c7d7f00  gcc/testsuite/lib/g++.exp
  2ebe67e0e1de7772a7339a397dba5dc4  gcc/testsuite/lib/gcc-defs.exp
! 4509e498c1b9c26e0114d658e21335ff  gcc/testsuite/lib/gcc-dg.exp
! 5a6de494accc5d43d4daa0ed3d05846b  gcc/testsuite/lib/gcc-gdb-test.exp
! 5d43c86c0be2338b09999f28a2d4ae79  gcc/testsuite/lib/gcc-simulate-thread.exp
  f137fa2e280bd8fee6a57544dbe520a8  gcc/testsuite/lib/gcc.exp
  89ac16c64ea0883a89a11a2e6fdb78f6  gcc/testsuite/lib/gcov.exp
  1ab113b2aab75f691397f0a23c85a675  gcc/testsuite/lib/gdc-dg.exp
*************** d84a04f02b348b9b24a659413d60a25b  gcc/te
*** 126234,126240 ****
  cdfac88acd33dec95625eb0cca4bc571  gcc/testsuite/lib/sarif-schema-2.1.0.json
  808895f3fef94ae1653cf826a4c6c9de  gcc/testsuite/lib/sarif-schema-2.2-prerelease-2024-08-08.json
  5a6cedce32c4c01005adb940226eae62  gcc/testsuite/lib/sarif.py
! fd53b026ced829d5564457ca55224996  gcc/testsuite/lib/scanasm.exp
  81addbeaa55d8c8d361049d045d21b6e  gcc/testsuite/lib/scandump.exp
  daccee9e5e177dcd385268830f15bd84  gcc/testsuite/lib/scanhtml.exp
  a33ed92a9095d29763dd3ba2493b26d7  gcc/testsuite/lib/scanipa.exp
--- 126799,126805 ----
  cdfac88acd33dec95625eb0cca4bc571  gcc/testsuite/lib/sarif-schema-2.1.0.json
  808895f3fef94ae1653cf826a4c6c9de  gcc/testsuite/lib/sarif-schema-2.2-prerelease-2024-08-08.json
  5a6cedce32c4c01005adb940226eae62  gcc/testsuite/lib/sarif.py
! 989dd2c5456ebd517277c7c4e1c50380  gcc/testsuite/lib/scanasm.exp
  81addbeaa55d8c8d361049d045d21b6e  gcc/testsuite/lib/scandump.exp
  daccee9e5e177dcd385268830f15bd84  gcc/testsuite/lib/scanhtml.exp
  a33ed92a9095d29763dd3ba2493b26d7  gcc/testsuite/lib/scanipa.exp
*************** de9eeadec9703aff96169206e31a3a22  gcc/te
*** 126250,126256 ****
  275f7eb9618e6b097a58c1fba25cdb9c  gcc/testsuite/lib/scanwpaipa.exp
  9bc4cbcf0cb4f1aa30a8cf3142d157eb  gcc/testsuite/lib/target-libpath.exp
  ba9ca262f3c7ac3b9717ac474fa255b8  gcc/testsuite/lib/target-supports-dg.exp
! bb1023dae0e3a862cca4ad470073e2b8  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
--- 126815,126821 ----
  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
*************** d7a0aa61ac6ea480aa470031428550d2  gcc/te
*** 127808,127817 ****
  19216f5c45ffc18281d7a6eeb7c5534f  gcc/testsuite/rust/compile/issue-3711.rs
  b6cc4ab95094c5e9f54084f73495560d  gcc/testsuite/rust/compile/issue-3726.rs
  a80ba949f3fc3f50011b81cb80b1ecd4  gcc/testsuite/rust/compile/issue-3836.rs
! f70238abf05e340d48ee9e6ab5020409  gcc/testsuite/rust/compile/issue-3874.rs
  94a2cfe870fb37b0f022125bd7ab65bf  gcc/testsuite/rust/compile/issue-3876.rs
  34b52236ae1c3de76ae9436257bdb690  gcc/testsuite/rust/compile/issue-3885.rs
  964ce25dc11787d37e2f58cc99b08d10  gcc/testsuite/rust/compile/issue-3898.rs
  a5921241e2fb69f5be5f4dbc5ca08f50  gcc/testsuite/rust/compile/issue-3915.rs
  4ec8ba647273f5c266a6486e759da392  gcc/testsuite/rust/compile/issue-3916.rs
  5ef50466b281b79b756d304bb2847797  gcc/testsuite/rust/compile/issue-3922.rs
--- 128373,128383 ----
  19216f5c45ffc18281d7a6eeb7c5534f  gcc/testsuite/rust/compile/issue-3711.rs
  b6cc4ab95094c5e9f54084f73495560d  gcc/testsuite/rust/compile/issue-3726.rs
  a80ba949f3fc3f50011b81cb80b1ecd4  gcc/testsuite/rust/compile/issue-3836.rs
! 2d523fd5e16f9ed97bc5f996bb9018c6  gcc/testsuite/rust/compile/issue-3874.rs
  94a2cfe870fb37b0f022125bd7ab65bf  gcc/testsuite/rust/compile/issue-3876.rs
  34b52236ae1c3de76ae9436257bdb690  gcc/testsuite/rust/compile/issue-3885.rs
  964ce25dc11787d37e2f58cc99b08d10  gcc/testsuite/rust/compile/issue-3898.rs
+ 17f551fa3060019cd27c5bb64f782dd1  gcc/testsuite/rust/compile/issue-3904.rs
  a5921241e2fb69f5be5f4dbc5ca08f50  gcc/testsuite/rust/compile/issue-3915.rs
  4ec8ba647273f5c266a6486e759da392  gcc/testsuite/rust/compile/issue-3916.rs
  5ef50466b281b79b756d304bb2847797  gcc/testsuite/rust/compile/issue-3922.rs
*************** f903646ce6fe965ceb5a5d390d6cfcc4  gcc/te
*** 127845,127854 ****
--- 128411,128423 ----
  32f8f6000d7c69556ed000f78b96f2df  gcc/testsuite/rust/compile/issue-4148.rs
  9a90a5823b2fac9dbc891be63a808346  gcc/testsuite/rust/compile/issue-4155.rs
  7131557f59176cb191bf859cdabf540b  gcc/testsuite/rust/compile/issue-4162.rs
+ 33a091dca1efbbdaed96da4370c6ac69  gcc/testsuite/rust/compile/issue-4163-2.rs
+ 7349b232d8d0cf550f805087e21cee71  gcc/testsuite/rust/compile/issue-4163.rs
  f84fe23c1ba8b2db0d2401b4fddc498f  gcc/testsuite/rust/compile/issue-4165.rs
  295eeee71b2b9b6c1be4c0ad05c1e862  gcc/testsuite/rust/compile/issue-4168.rs
  be42b59aa26fcea2b3e4b82ba7cd7e5d  gcc/testsuite/rust/compile/issue-4188.rs
  ec1071b4fb0c33637bd7da589cb438c5  gcc/testsuite/rust/compile/issue-4212.rs
+ e9da926c0057832b1be2caa174dada48  gcc/testsuite/rust/compile/issue-4213.rs
  1529aa2d41a892e93b3b439dcb3985ab  gcc/testsuite/rust/compile/issue-4219.rs
  9f16c34e424c842b4df6cbdbc023e1c8  gcc/testsuite/rust/compile/issue-4222.rs
  b889a37174c1fb578620fbb747c66988  gcc/testsuite/rust/compile/issue-4226.rs
*************** cdf95b02e58f3a2eaae2e38ae65f43e9  gcc/te
*** 127873,127878 ****
--- 128442,128448 ----
  ac3ff850b71bccb465eebb16d5df5f02  gcc/testsuite/rust/compile/lang_feature_gate.rs
  1d1da8d13d0b65abc363fa272c1bbd7d  gcc/testsuite/rust/compile/let_alt.rs
  83a6908517e92139d7d9cbd6244e4b51  gcc/testsuite/rust/compile/lifetime_name_validation.rs
+ f4004d8269dfab49f3b81cf700c9b6f8  gcc/testsuite/rust/compile/link_name-malformed.rs
  9afdcde455c4f144c4385b9d67323cb3  gcc/testsuite/rust/compile/lookup_err1.rs
  e1f539e4bedf717d10b3950694757e15  gcc/testsuite/rust/compile/loop_constant_context.rs
  b8ca829745dd2a35cb6e5ad418cfda91  gcc/testsuite/rust/compile/macros/builtin/builtin_macro.exp
*************** fda9dc3567123e4f04a16ea5f5b364bf  gcc/te
*** 128085,128090 ****
--- 128655,128661 ----
  da671ca390cc71e31d1a13e83175ed07  gcc/testsuite/rust/compile/nested_macro_use2.rs
  3b2626cfdc7db1273eb3ace63fc4ebf3  gcc/testsuite/rust/compile/nested_macro_use3.rs
  0e29d0825fda239bc7af83c9fccfaf89  gcc/testsuite/rust/compile/never_type1.rs
+ 1b451825adc15745ad07329bcb713dac  gcc/testsuite/rust/compile/no_mangle-malformed.rs
  19dbaffedde4ba3825d87ab394b19d20  gcc/testsuite/rust/compile/non_foreign_variadic_function.rs
  3639ca46ce436f80bb407f584c24a65e  gcc/testsuite/rust/compile/non_member_const.rs
  501057f9a3f80553b968ea2275e57662  gcc/testsuite/rust/compile/nonexistent-field.rs
*************** e089bb98184ba9adc0034ee6a63f5608  gcc/te
*** 128145,128150 ****
--- 128716,128722 ----
  049ed63026624cc99753cd92390ab6bd  gcc/testsuite/rust/compile/redef_error4.rs
  d5691828b526a3c26648a9f4a2ca65cc  gcc/testsuite/rust/compile/redef_error5.rs
  a2b256701e3bbefd0fd9e84cd5f19288  gcc/testsuite/rust/compile/redef_error6.rs
+ 6b168462f2fad2ee304e3d851ec29174  gcc/testsuite/rust/compile/redundant-semicolons_0.rs
  e777fc9630d68ddc2900c3d74fc2318f  gcc/testsuite/rust/compile/ref_pattern_fn_param1.rs
  c864259519a663ecdb9ce794228363de  gcc/testsuite/rust/compile/ref_pattern_fn_param2.rs
  0853bd33e41a069ac779f1031cabcab3  gcc/testsuite/rust/compile/reference1.rs
*************** b8008bbbb6a2e41bf794f9f5d16971a2  gcc/te
*** 128183,128188 ****
--- 128755,128761 ----
  c2a21c19762e48d9fe8a2144950b1b4f  gcc/testsuite/rust/compile/struct_pack2.rs
  b43cef7a71615c9da4ee1b0bf1b98d56  gcc/testsuite/rust/compile/structural-eq-peq.rs
  b367b9437770c67d8d9059972bc1a3e8  gcc/testsuite/rust/compile/syntax-only.rs
+ 2cb23cc6c5bf4ce86c0d8b975a9d7b57  gcc/testsuite/rust/compile/target_feature-malformed-4233.rs
  9717a1267510229e7d9933018e324aec  gcc/testsuite/rust/compile/template_function_0.rs
  156d3a4eb60d669211c1c31f6828f576  gcc/testsuite/rust/compile/torture/all_doc_comment_line_blocks.rs
  fdf890b2027e28e726e5201eddef6b4f  gcc/testsuite/rust/compile/torture/all_doc_comment_line_blocks_crlf.rs
*************** f840f4287f5740ac4854b2f4195dbfbe  gcc/te
*** 128528,128533 ****
--- 129101,129107 ----
  1eda1b7673de43c07e2c48bd01367d7c  gcc/testsuite/rust/compile/unsafe_module.rs
  82c88b596e5dd7e19c5c2febfa49a9e8  gcc/testsuite/rust/compile/unstable-fn.rs
  7c830dd0a2ec3525c6da4bc67b44f331  gcc/testsuite/rust/compile/unterminated_c_comment.rs
+ 677e89ef192a8eefa1a4e7e864dfb65f  gcc/testsuite/rust/compile/unused-label_0.rs
  15677d62dbb38a134b8dcdd984897b15  gcc/testsuite/rust/compile/unused-mut-identifier_0.rs
  dcf8467b7c073251e28e3b9285555700  gcc/testsuite/rust/compile/unused-mut-struct-field_0.rs
  4be9ad073e00747e5ffe46175988b56e  gcc/testsuite/rust/compile/use_1.rs
*************** cbe90a107fcd179a95684d58982b5779  gcc/te
*** 128908,128914 ****
  16df2eee5df7c3c54070ef71bde6afcb  gcc/text-art/widget.h
  4020706e89a3193babbae430014c2735  gcc/text-range-label.h
  092eef5e89ca84562a58ff0e91eaee48  gcc/timevar.cc
! ca3ae2bce204f93c852f5e6bfd69e16e  gcc/timevar.def
  160bb6626a9562507750456253c82eb4  gcc/timevar.h
  4815aa7e0102f83eef9e638939f57d05  gcc/topics/pass-events.h
  2a561ff3c13599ceb8bd8423cb38a1fa  gcc/toplev.cc
--- 129482,129488 ----
  16df2eee5df7c3c54070ef71bde6afcb  gcc/text-art/widget.h
  4020706e89a3193babbae430014c2735  gcc/text-range-label.h
  092eef5e89ca84562a58ff0e91eaee48  gcc/timevar.cc
! ee4165de3d74b0fde5ca55a403c7f37b  gcc/timevar.def
  160bb6626a9562507750456253c82eb4  gcc/timevar.h
  4815aa7e0102f83eef9e638939f57d05  gcc/topics/pass-events.h
  2a561ff3c13599ceb8bd8423cb38a1fa  gcc/toplev.cc
*************** a0c02d542dbd50cb44704b2ffce2739c  gcc/tr
*** 128928,128934 ****
  447f46e51936add5de4aaa77a96039ba  gcc/tree-chrec.cc
  1cf760e3e7aab6f94a5e56897486623d  gcc/tree-chrec.h
  2ef5259e28d138d053c8a5df2217ec69  gcc/tree-complex.cc
! 0f48cc289e7aeb3e3f81f6c56f2313f4  gcc/tree-core.h
  4a0e32c3f4db8d2b600df44d6f3bfb90  gcc/tree-data-ref.cc
  885e741c83d91ee864f9af2a1a079312  gcc/tree-data-ref.h
  89ef786b9c4639015bae3652c90fa60f  gcc/tree-dfa.cc
--- 129502,129508 ----
  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
*************** d7c0da59494a51ae966d29f4618b2f9a  gcc/tr
*** 128945,128951 ****
  0cb6286531ef1298c60bd670fe8a1f62  gcc/tree-emutls.cc
  278ef0d1cc8f017ae51affd9a1e110a5  gcc/tree-hash-traits.h
  f8be97e59befb22cc3869e742a095cca  gcc/tree-hasher.h
! f90d889e8893c34a40691aacff2957b0  gcc/tree-if-conv.cc
  87f110e202a07bb1d7e6402808531851  gcc/tree-if-conv.h
  4b26ef89948606c3d64ab76630552cdd  gcc/tree-inline.cc
  6bebd695468e1b608400eecde4c37451  gcc/tree-inline.h
--- 129519,129525 ----
  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
*************** fe7cb8d01db48420c7b2914863f3580c  gcc/tr
*** 128970,128977 ****
  2c7c1113ffe65976e40c16348adcd4c7  gcc/tree-phinodes.h
  a24cff30baef257a999b4fac3ca47d5a  gcc/tree-predcom.cc
  47856333edaecc32813dad93ecb96fbe  gcc/tree-pretty-print-markup.h
! 0699d64c56d114199f21d2f93b73c71a  gcc/tree-pretty-print.cc
! 01115d4e990f4a771d183aa1388474f4  gcc/tree-pretty-print.h
  088c11dc59d7ddfafad885e8514fd394  gcc/tree-profile.cc
  a39e1901dac55b45c25e4542501e20ff  gcc/tree-scalar-evolution.cc
  0ac41331ad8cbe754ee005d5ef9aff94  gcc/tree-scalar-evolution.h
--- 129544,129551 ----
  2c7c1113ffe65976e40c16348adcd4c7  gcc/tree-phinodes.h
  a24cff30baef257a999b4fac3ca47d5a  gcc/tree-predcom.cc
  47856333edaecc32813dad93ecb96fbe  gcc/tree-pretty-print-markup.h
! a915783d6a3d6ec96408624f8773e9b7  gcc/tree-pretty-print.cc
! c021bc7a8aa59f2b8184de8bff6b1d14  gcc/tree-pretty-print.h
  088c11dc59d7ddfafad885e8514fd394  gcc/tree-profile.cc
  a39e1901dac55b45c25e4542501e20ff  gcc/tree-scalar-evolution.cc
  0ac41331ad8cbe754ee005d5ef9aff94  gcc/tree-scalar-evolution.h
*************** c1c4fe85c3abe80948e72eb9950ff189  gcc/tr
*** 128993,129005 ****
  ec31925fe8431d27258939fc79f1f02e  gcc/tree-ssa-dom.h
  2def3c3d20d186b56fd7b598ee0124be  gcc/tree-ssa-dse.cc
  1df01d660e0f98ade0ae7a3152aa33ed  gcc/tree-ssa-dse.h
! 13b20baac9d27ca40617d6339a01d2e0  gcc/tree-ssa-forwprop.cc
  44658616283db8f7d8bb40eb2c38e605  gcc/tree-ssa-ifcombine.cc
  96b11e029c398aaecd1c642c41c88884  gcc/tree-ssa-live.cc
  7c36b95c9d109be3302936ceed49fb4f  gcc/tree-ssa-live.h
  dcaeaaad1469ccb53d09d0c3975284d7  gcc/tree-ssa-loop-ch.cc
  492cb224057825be76972299a81f9ddc  gcc/tree-ssa-loop-im.cc
! ca9af94119d469f2996b0db6b83c2695  gcc/tree-ssa-loop-ivcanon.cc
  0352f316ce735254fc0a8394edd81dc6  gcc/tree-ssa-loop-ivopts.cc
  73db7c26eb3c2afa63524b388a9849fd  gcc/tree-ssa-loop-ivopts.h
  3b019867aefd4f962c260256d5bed88e  gcc/tree-ssa-loop-manip.cc
--- 129567,129579 ----
  ec31925fe8431d27258939fc79f1f02e  gcc/tree-ssa-dom.h
  2def3c3d20d186b56fd7b598ee0124be  gcc/tree-ssa-dse.cc
  1df01d660e0f98ade0ae7a3152aa33ed  gcc/tree-ssa-dse.h
! db94ce817c590cac6e4a1e4f7d3b1dc2  gcc/tree-ssa-forwprop.cc
  44658616283db8f7d8bb40eb2c38e605  gcc/tree-ssa-ifcombine.cc
  96b11e029c398aaecd1c642c41c88884  gcc/tree-ssa-live.cc
  7c36b95c9d109be3302936ceed49fb4f  gcc/tree-ssa-live.h
  dcaeaaad1469ccb53d09d0c3975284d7  gcc/tree-ssa-loop-ch.cc
  492cb224057825be76972299a81f9ddc  gcc/tree-ssa-loop-im.cc
! f8b96abb98adf78d9bf9645ec4529541  gcc/tree-ssa-loop-ivcanon.cc
  0352f316ce735254fc0a8394edd81dc6  gcc/tree-ssa-loop-ivopts.cc
  73db7c26eb3c2afa63524b388a9849fd  gcc/tree-ssa-loop-ivopts.h
  3b019867aefd4f962c260256d5bed88e  gcc/tree-ssa-loop-manip.cc
*************** d746bb26f2340ebcb931e43dc812a2d8  gcc/tr
*** 129015,129028 ****
  fa83f982a805985b3a3da2ca5e10e43a  gcc/tree-ssa-math-opts.h
  9b5221bc2087b040736afeb799949b04  gcc/tree-ssa-operands.cc
  f83d0b12185538e6f679296bebfe3d2f  gcc/tree-ssa-operands.h
! 175166d3ffd5f71462eb4dc12d3fb31e  gcc/tree-ssa-phiopt.cc
  449b769bbd461c05c5cd26af91829d37  gcc/tree-ssa-phiprop.cc
  47053be5dfc570966a87d1ef62a039ff  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
! d5d54675cbc7ce5e1ce7180a5232989f  gcc/tree-ssa-sccvn.cc
  9b0da40767981c9bb917d64c14b2a7c1  gcc/tree-ssa-sccvn.h
  43b66558734f8fe9fec03260c6814f6b  gcc/tree-ssa-scopedtables.cc
  f9f30b312deca96b11a781af60153767  gcc/tree-ssa-scopedtables.h
--- 129589,129602 ----
  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
  47053be5dfc570966a87d1ef62a039ff  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
  43b66558734f8fe9fec03260c6814f6b  gcc/tree-ssa-scopedtables.cc
  f9f30b312deca96b11a781af60153767  gcc/tree-ssa-scopedtables.h
*************** d05b6cdafcded128262d93d015eb5396  gcc/tr
*** 129055,129076 ****
  e316eddfbf9a02433a4ee93e648f3aa4  gcc/tree-switch-conversion.h
  6a0f6268d598b3c59871ad41e01f33c1  gcc/tree-tailcall.cc
  8b778220f046450b620cf0b570927dd3  gcc/tree-vect-data-refs.cc
! 0c7f20ef37f81aef965738814c3b37c2  gcc/tree-vect-generic.cc
! 2ec1bedb46783a1f37bfc8c21cb5e534  gcc/tree-vect-loop-manip.cc
! 29d1e53a6f4fa1c3936c324a58223247  gcc/tree-vect-loop.cc
! 93feb6daf538051d5d37092050c5d459  gcc/tree-vect-patterns.cc
  ef0b51a362b8764cf6b0628ed16b2dde  gcc/tree-vect-slp-patterns.cc
  1c5c289a3b0b8bbc09c2836b9217e035  gcc/tree-vect-slp.cc
! d40aaff1636033c777d70d462e746ba4  gcc/tree-vect-stmts.cc
  42032e04f389a2e0f43fbb46ac091dac  gcc/tree-vector-builder.cc
  4a1b4947e64a076fdca46d14aab2181f  gcc/tree-vector-builder.h
  29624134a45fa2e54db69b6ee376164d  gcc/tree-vectorizer.cc
! 45c74e36f9dfa0bf74f3df0609fcb70f  gcc/tree-vectorizer.h
  4c3ac67391ddc3b07a2816d1bd537f5e  gcc/tree-vrp.cc
  d7273e63988959e17e61bc75f7f0cf29  gcc/tree-vrp.h
! eb962872ca53d46482f2e286fae6c4fb  gcc/tree.cc
  f88475a43ca5e7c59112c941875a762c  gcc/tree.def
! 64c031d2568084cbd1b45cd2f619a906  gcc/tree.h
  56652e612288132aa8395fdf720b0146  gcc/treestruct.def
  6c6350469a3dbb37f658f247d16ed872  gcc/tristate.cc
  704359710c2d40a58b6646b2da626443  gcc/tristate.h
--- 129629,129650 ----
  e316eddfbf9a02433a4ee93e648f3aa4  gcc/tree-switch-conversion.h
  6a0f6268d598b3c59871ad41e01f33c1  gcc/tree-tailcall.cc
  8b778220f046450b620cf0b570927dd3  gcc/tree-vect-data-refs.cc
! 952f93181ad4691b6a87ae3d877a0b6e  gcc/tree-vect-generic.cc
! c1cdefadc1abb9281e2f4868a0bc14ff  gcc/tree-vect-loop-manip.cc
! 1938f848ac6d901afee701c65c3884da  gcc/tree-vect-loop.cc
! 550c845a7dca165130319d9b3d1f4b0f  gcc/tree-vect-patterns.cc
  ef0b51a362b8764cf6b0628ed16b2dde  gcc/tree-vect-slp-patterns.cc
  1c5c289a3b0b8bbc09c2836b9217e035  gcc/tree-vect-slp.cc
! bfdc9870ad5872634030f2fa692f0d60  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
  4c3ac67391ddc3b07a2816d1bd537f5e  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
*************** f26e462c6f89f856041d649e1dfa527e  includ
*** 129200,129209 ****
  46d6319e8ffc7eabf27cbecd6141a912  libada/configure
  ab9e00e84d092822a6cc241ba44f609b  libada/configure.ac
  46d3fe6da7a771cc2d5420c4137a6861  libatomic/.gitignore
! 48db5f5257d7c3d2526b312e4fe5c854  libatomic/ChangeLog
! 06a07674dec175f539f19297385f7c6f  libatomic/Makefile.am
! 9e9fda61274991dc83714f45f6aa740a  libatomic/Makefile.in
! 3ffebc64ea145f822a3e70192f58b44f  libatomic/acinclude.m4
  24697a8f49205fd232a3f6f3870a5d40  libatomic/aclocal.m4
  b741b38c451feebdcd9aedce6e37b702  libatomic/auto-config.h.in
  85778ae74823824ea052d5783265c513  libatomic/cas_n.c
--- 129774,129783 ----
  46d6319e8ffc7eabf27cbecd6141a912  libada/configure
  ab9e00e84d092822a6cc241ba44f609b  libada/configure.ac
  46d3fe6da7a771cc2d5420c4137a6861  libatomic/.gitignore
! 34eb3a1522b263e1cfa7ee5c6a9de128  libatomic/ChangeLog
! 208c462ec1d8ae3f09cbb92c26654e5a  libatomic/Makefile.am
! 43f4169557cdd56f6a478b34d9ee2d58  libatomic/Makefile.in
! 357dab2e679ef947dacf67e851f4e4ba  libatomic/acinclude.m4
  24697a8f49205fd232a3f6f3870a5d40  libatomic/aclocal.m4
  b741b38c451feebdcd9aedce6e37b702  libatomic/auto-config.h.in
  85778ae74823824ea052d5783265c513  libatomic/cas_n.c
*************** ed3d69739cb2f35407547229f0393f92  libato
*** 129238,129244 ****
  18e12ed35584156293b3386bbaa4c810  libatomic/config/x86/fenv.c
  ff7145d48440dfce80b40e64432d54b2  libatomic/config/x86/host-config.h
  9dba85cfea4771af56b0d0f71f9dd213  libatomic/config/x86/init.c
! f172f9631303b00fdb4b337af4dfc1ca  libatomic/configure
  cfbdf0beba5ceb685a2a71fe953728d2  libatomic/configure.ac
  0de16a62b4d69145d18c1019044e5415  libatomic/configure.tgt
  17dfc1d9215cf4dc01bf9f1341c7fadf  libatomic/exch_n.c
--- 129812,129818 ----
  18e12ed35584156293b3386bbaa4c810  libatomic/config/x86/fenv.c
  ff7145d48440dfce80b40e64432d54b2  libatomic/config/x86/host-config.h
  9dba85cfea4771af56b0d0f71f9dd213  libatomic/config/x86/init.c
! a50d0ae6478b7ef8c414f1cc486ccbf0  libatomic/configure
  cfbdf0beba5ceb685a2a71fe953728d2  libatomic/configure.ac
  0de16a62b4d69145d18c1019044e5415  libatomic/configure.tgt
  17dfc1d9215cf4dc01bf9f1341c7fadf  libatomic/exch_n.c
*************** ccfc3fd656c22a300f42e57f02683c9a  libato
*** 129260,129265 ****
--- 129834,129841 ----
  c93b85d7b95ed603e6bde591f826d6c5  libatomic/host-config.h
  0e7ef9ed2b60ec1c9afc38701d815f6c  libatomic/init.c
  2fe463a1aa0855eab0961f927f300752  libatomic/libatomic.map
+ 342fb60591d316cde0b860cb9bd6cb3f  libatomic/libatomic_asneeded.a
+ 68f1fe6adbc4a3afa4481ca88736b31a  libatomic/libatomic_asneeded.so
  8e58d225b6fad8afd12425ed65404cf1  libatomic/libatomic_i.h
  1708f3694a349f00c13d500f4bd5088c  libatomic/load_n.c
  25ed5bbc5d4edc9b495cdaad40b37de2  libatomic/store_n.c
*************** c2c965e4a7a144af3e430d4191b2a091  libbac
*** 129347,129353 ****
  04137bad794f9bfb1236039f63227eef  libbacktrace/xztest.c
  47e1b04b06d9e6924421aef4c4247940  libbacktrace/zstdtest.c
  ace1e49933e01dd308790e101ff593e2  libbacktrace/ztest.c
! 3f362023b2a50c3c022443164bba3bbd  libcc1/ChangeLog
  8449193c9f9b6527fb64e695789dd4bf  libcc1/Makefile.am
  270e13d9f539c9eacc16d848641ecb9d  libcc1/Makefile.in
  e6c98f41e0035dd3e80d4c55a6301318  libcc1/aclocal.m4
--- 129923,129929 ----
  04137bad794f9bfb1236039f63227eef  libbacktrace/xztest.c
  47e1b04b06d9e6924421aef4c4247940  libbacktrace/zstdtest.c
  ace1e49933e01dd308790e101ff593e2  libbacktrace/ztest.c
! 2bba393e96eff722fc2a34903416cd55  libcc1/ChangeLog
  8449193c9f9b6527fb64e695789dd4bf  libcc1/Makefile.am
  270e13d9f539c9eacc16d848641ecb9d  libcc1/Makefile.in
  e6c98f41e0035dd3e80d4c55a6301318  libcc1/aclocal.m4
*************** c7c355053af23dc00e98d44d86eb47f2  libcc1
*** 129372,129378 ****
  763ec519d0c487f9aa36545436ca3166  libcc1/libcc1plugin.cc
  75503db6a0981a95d9c29d9607b29380  libcc1/libcc1plugin.sym
  ea1b4786e1c05805205e8285603b195e  libcc1/libcp1.cc
! 901b3caa40bb3cf040f0f5a1978de5d3  libcc1/libcp1plugin.cc
  75503db6a0981a95d9c29d9607b29380  libcc1/libcp1plugin.sym
  eb1c55f4816e93ada80eae709c628a8a  libcc1/marshall-cp.hh
  87287fd5e305703c5a029a4220bcf0a8  libcc1/marshall.cc
--- 129948,129954 ----
  763ec519d0c487f9aa36545436ca3166  libcc1/libcc1plugin.cc
  75503db6a0981a95d9c29d9607b29380  libcc1/libcc1plugin.sym
  ea1b4786e1c05805205e8285603b195e  libcc1/libcp1.cc
! b72d68dce9c92efab2338e3a4752085b  libcc1/libcp1plugin.cc
  75503db6a0981a95d9c29d9607b29380  libcc1/libcp1plugin.sym
  eb1c55f4816e93ada80eae709c628a8a  libcc1/marshall-cp.hh
  87287fd5e305703c5a029a4220bcf0a8  libcc1/marshall.cc
*************** cffdeae41b78da05839b193e90188f55  libcod
*** 129403,129413 ****
  6419dfc879387358e95288142e569914  libcody/packet.cc
  688ece05c8b9d378b3df186808162e76  libcody/resolver.cc
  c94add0032978604acf65591bb86d2d6  libcody/server.cc
! feb90d1e3e589ac5faa670dffb3e078e  libcpp/ChangeLog
  2bd831b17997584e38305782cebe6948  libcpp/ChangeLog.jit
  4f1e80b433907c013fc6e4eaf2b0e8aa  libcpp/Makefile.in
  b07c7863f0e7ad4e6a0915d66fc9e582  libcpp/aclocal.m4
! 9f947fb51faaafbb7e395f18e07ec132  libcpp/charset.cc
  5b2f9d37e91d01eed5bf420a47dc8046  libcpp/combining-chars.inc
  4c25fc38f2b9d20ca1fbefba9ad34b45  libcpp/config.in
  ce84d633b2df3cc02e63c283e8c7cbd8  libcpp/configure
--- 129979,129989 ----
  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
! 82343ab8932de7bfddda411fc3c3405c  libcpp/charset.cc
  5b2f9d37e91d01eed5bf420a47dc8046  libcpp/combining-chars.inc
  4c25fc38f2b9d20ca1fbefba9ad34b45  libcpp/config.in
  ce84d633b2df3cc02e63c283e8c7cbd8  libcpp/configure
*************** e6648c5f8f4e111883be81dc9e8dd630  libcpp
*** 129418,129432 ****
  c64b19de1df44b381b33e2a6a6bc9bb3  libcpp/files.cc
  d7530c9a36bef9a00a690083401e3c83  libcpp/generated_cpp_wcwidth.h
  bf0c57c21ee2aeaa654ee6781e41cad5  libcpp/identifiers.cc
! 73de941a710835de35cd8a3783bbd865  libcpp/include/cpplib.h
  a5730f5ab9435bb5d8446830fe8f3706  libcpp/include/label-text.h
  8cb860e4fa9bf4c99ce3c92bfa2ca0c8  libcpp/include/line-map.h
  6c27e4af6058e741469234cdf0f74c01  libcpp/include/mkdeps.h
  0c5086e2180aacc727c73843682f1fe9  libcpp/include/rich-location.h
  1e65760d4159f777cf02dedef8a52357  libcpp/include/symtab.h
  5a44adf11235c72de2f0c0e89db76903  libcpp/init.cc
! ad4c6db1b815df1bc904bfda44027630  libcpp/internal.h
! 2e0c9a17022a66b46da53f2cc2f1cc2c  libcpp/lex.cc
  83122fc92aa10f8e0e147c53f782a3d0  libcpp/line-map.cc
  46a07100f95f5e354c7e25cd19d26884  libcpp/location-example.txt
  8fdce4dfce3a69798f4bcfddbc367465  libcpp/macro.cc
--- 129994,130008 ----
  c64b19de1df44b381b33e2a6a6bc9bb3  libcpp/files.cc
  d7530c9a36bef9a00a690083401e3c83  libcpp/generated_cpp_wcwidth.h
  bf0c57c21ee2aeaa654ee6781e41cad5  libcpp/identifiers.cc
! a72f35908cfbf53a2b400c41cc011477  libcpp/include/cpplib.h
  a5730f5ab9435bb5d8446830fe8f3706  libcpp/include/label-text.h
  8cb860e4fa9bf4c99ce3c92bfa2ca0c8  libcpp/include/line-map.h
  6c27e4af6058e741469234cdf0f74c01  libcpp/include/mkdeps.h
  0c5086e2180aacc727c73843682f1fe9  libcpp/include/rich-location.h
  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
*************** a3eb5dee2788fe0a6c42502ba658eddd  libffi
*** 129927,129942 ****
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! b95dccdd4199c9bae47adfda3e42d65b  libga68/ChangeLog
  fad297e84229ab9c5c178ad0fc368da2  libga68/Makefile.am
  6005e14bc427347f6465e1567a1e1455  libga68/Makefile.in
  e582170826a5049ebe5f76ccb66fe5f2  libga68/README
  b448cc4384a1f4e710c59734055b7e8a  libga68/acinclude.m4
  32da020621b62d1b431988a5525d7995  libga68/aclocal.m4
  cf6be962dfa097e1e50ffbb773452c38  libga68/config.h.in
! 39c3c4b0219399f897cb3d93feece926  libga68/configure
! 864513fa54bc9e36559d066a77160a8e  libga68/configure.ac
! e19c640ed91fb88d59a444ae09fddf70  libga68/ga68-alloc.c
  ab4bfff29b367495b338f951fb77ffd9  libga68/ga68-error.c
  d1fcb12f6315dd37431de90213b6072f  libga68/ga68-posix.c
  12f59efc2c02c8e22bec45f9a718e690  libga68/ga68-standenv.c
--- 130503,130518 ----
  0f3c94e520870e194cf525de7ec404dc  libffi/testsuite/libffi.go/ffitest.h
  6cfb66c1c00023abb2c2276d85f16e77  libffi/testsuite/libffi.go/go.exp
  189dc193fd0e627a2d55b2e84871edc5  libffi/testsuite/libffi.go/static-chain.h
! e7c88dc8684152aab42cb8bb80b95d30  libga68/ChangeLog
  fad297e84229ab9c5c178ad0fc368da2  libga68/Makefile.am
  6005e14bc427347f6465e1567a1e1455  libga68/Makefile.in
  e582170826a5049ebe5f76ccb66fe5f2  libga68/README
  b448cc4384a1f4e710c59734055b7e8a  libga68/acinclude.m4
  32da020621b62d1b431988a5525d7995  libga68/aclocal.m4
  cf6be962dfa097e1e50ffbb773452c38  libga68/config.h.in
! 17067e44b9eeb74933bca7dfec50f0fa  libga68/configure
! bebb5164879c36309fb118c1cd13bf95  libga68/configure.ac
! 7e8fa409baf1ded0502dc80128925cb6  libga68/ga68-alloc.c
  ab4bfff29b367495b338f951fb77ffd9  libga68/ga68-error.c
  d1fcb12f6315dd37431de90213b6072f  libga68/ga68-posix.c
  12f59efc2c02c8e22bec45f9a718e690  libga68/ga68-standenv.c
*************** d1fcb12f6315dd37431de90213b6072f  libga6
*** 129949,129955 ****
  fc49680d0c6e77e437523ea496a6b8c4  libga68/m4/autoconf.m4
  b0d017b83148520411f1c1ebdbf28b58  libga68/sppp.awk
  de04458df73a22c6f12b67294ae6d428  libga68/transput.a68.in
! e6bcb50582141e0f7157a977c1687a41  libgcc/ChangeLog
  9ce0b8c50fec68eb0555ae800e4e457e  libgcc/Makefile.in
  0dafba01dbe15f4c680f6fe25dd268f1  libgcc/config.host
  46412830a2ee8a02503ccc921912c3cf  libgcc/config.in
--- 130525,130531 ----
  fc49680d0c6e77e437523ea496a6b8c4  libga68/m4/autoconf.m4
  b0d017b83148520411f1c1ebdbf28b58  libga68/sppp.awk
  de04458df73a22c6f12b67294ae6d428  libga68/transput.a68.in
! ffdad7e6f506041442064fea3137d98b  libgcc/ChangeLog
  9ce0b8c50fec68eb0555ae800e4e457e  libgcc/Makefile.in
  0dafba01dbe15f4c680f6fe25dd268f1  libgcc/config.host
  46412830a2ee8a02503ccc921912c3cf  libgcc/config.in
*************** b542071feaa6f1914ec810a91b9f0e4c  libgcc
*** 131003,131008 ****
--- 131579,131585 ----
  196894f3e59520659e3b0ba14bb0a903  libgcc/config/riscv/crtn.S
  3e8b5b53e342b916e5c14f9af338c109  libgcc/config/riscv/div.S
  67914451f9c65710da65b5591b7258f9  libgcc/config/riscv/feature_bits.c
+ 570db79df21c684f38dd05efb7ea6b97  libgcc/config/riscv/libgcc-riscv.ver
  ee6e30cc4a2ad7734a1c0eacad56a515  libgcc/config/riscv/linux-unwind.h
  fc4c3defc96f140cf5aa4a7b4a7dfc66  libgcc/config/riscv/muldi3.S
  6a68829fa4d831c59952a264493ef982  libgcc/config/riscv/multi3.c
*************** fc4c3defc96f140cf5aa4a7b4a7dfc66  libgcc
*** 131011,131020 ****
  60944ffcad92e815a9715ccbea473084  libgcc/config/riscv/sfp-machine.h
  5e6a952ca0fa2349ad7d76b565673e70  libgcc/config/riscv/shadow-stack-unwind.h
  6a8be20744258bc3c31a34df112164ce  libgcc/config/riscv/t-crtstuff
! 36bce65087be6239f054fc6c97ca056c  libgcc/config/riscv/t-elf
  02fdd22ff5d39903f17ad235a8fe0f65  libgcc/config/riscv/t-elf32
  02fdd22ff5d39903f17ad235a8fe0f65  libgcc/config/riscv/t-elf64
! 385fba009156405608e80e71b8a6a1a0  libgcc/config/riscv/t-softfp32
  d687514a08d797924d3d6e5d3fb2fd84  libgcc/config/riscv/t-softfp64
  85f94042fd6a8e289b99aa9bfff8f164  libgcc/config/riscv/value-unwind.h
  cbcc02cecd8e74d406d6a657271883bf  libgcc/config/rl78/adddi3.S
--- 131588,131597 ----
  60944ffcad92e815a9715ccbea473084  libgcc/config/riscv/sfp-machine.h
  5e6a952ca0fa2349ad7d76b565673e70  libgcc/config/riscv/shadow-stack-unwind.h
  6a8be20744258bc3c31a34df112164ce  libgcc/config/riscv/t-crtstuff
! 4f61b4ac6ab5e5d0335936ea1738fc53  libgcc/config/riscv/t-elf
  02fdd22ff5d39903f17ad235a8fe0f65  libgcc/config/riscv/t-elf32
  02fdd22ff5d39903f17ad235a8fe0f65  libgcc/config/riscv/t-elf64
! ab808d72bbcb655af7c3892635a1ccad  libgcc/config/riscv/t-softfp32
  d687514a08d797924d3d6e5d3fb2fd84  libgcc/config/riscv/t-softfp64
  85f94042fd6a8e289b99aa9bfff8f164  libgcc/config/riscv/value-unwind.h
  cbcc02cecd8e74d406d6a657271883bf  libgcc/config/rl78/adddi3.S
*************** b44f00c02e7cc40f858e8ca1f092bb4d  libgcc
*** 131237,131243 ****
  397d06701a9c354f5606477c578c9efb  libgcc/config/t-linux
  eb3161bf886026cdcf8a78cea885fdd2  libgcc/config/t-openbsd-thread
  474d97884b393e08b0ce416dd09493bc  libgcc/config/t-rtems
! 8efa62887e2b399334416f06c8b7210b  libgcc/config/t-slibgcc
  8f731e727bedf843e1a93e29493db712  libgcc/config/t-slibgcc-darwin
  57f27c60e5d8c572d2645821ec5935e0  libgcc/config/t-slibgcc-elf-ver
  265b8de37b0831ef8d3774d34fe4d928  libgcc/config/t-slibgcc-fuchsia
--- 131814,131820 ----
  397d06701a9c354f5606477c578c9efb  libgcc/config/t-linux
  eb3161bf886026cdcf8a78cea885fdd2  libgcc/config/t-openbsd-thread
  474d97884b393e08b0ce416dd09493bc  libgcc/config/t-rtems
! 885c0180bda1f152eb4f0e9beceaaf32  libgcc/config/t-slibgcc
  8f731e727bedf843e1a93e29493db712  libgcc/config/t-slibgcc-darwin
  57f27c60e5d8c572d2645821ec5935e0  libgcc/config/t-slibgcc-elf-ver
  265b8de37b0831ef8d3774d34fe4d928  libgcc/config/t-slibgcc-fuchsia
*************** b7bdc64c03d62f87f61d3d8a61a75d2d  libgcc
*** 131525,131540 ****
  227525d7193394128a83ce15e7642842  libgcc/vtv_start.c
  23ad2a8d256ba5dca28382d64a20e8f2  libgcc/vtv_start_preinit.c
  e50c29294062dfe571c9c053a8ec217b  libgcobol/.gitignore
! a7624c874c7b9b98ef311b1728800870  libgcobol/ChangeLog
  b227feb8ac8df349788743a8ade3e840  libgcobol/LICENSE
  04057a81e83131ef0e6ab68dbfab7511  libgcobol/Makefile.am
  32b0df03b8a0a32ad6a44a8623dc0ab2  libgcobol/Makefile.in
  ff016a65ce3c24bdd22207044f2a126e  libgcobol/README
  8c9140838556aedbca129aeaedf0855b  libgcobol/acinclude.m4
  edff1d46cc8f5e3fa2007d8fede32717  libgcobol/aclocal.m4
! ea69c0048b747c5afbcca0e5cb85a756  libgcobol/charmaps.cc
! 9c61b752c257ce87adcf298dcfc73435  libgcobol/charmaps.h
! e44c6fe97350bdd7eff39bd00d594918  libgcobol/common-defs.h
  6f92fa32eabcfff6e25b59104fbd9a6a  libgcobol/compat/README.md
  9724ffdf971bebe59c8b2e8708a371b3  libgcobol/compat/gnu/lib/CBL_ALLOC_MEM.cbl
  848d2a16eb4e04f66947f0a4f3388039  libgcobol/compat/gnu/lib/CBL_CHECK_FILE_EXIST.cbl
--- 132102,132117 ----
  227525d7193394128a83ce15e7642842  libgcc/vtv_start.c
  23ad2a8d256ba5dca28382d64a20e8f2  libgcc/vtv_start_preinit.c
  e50c29294062dfe571c9c053a8ec217b  libgcobol/.gitignore
! 1a3c7e08e218722d2ccac95daf86d70b  libgcobol/ChangeLog
  b227feb8ac8df349788743a8ade3e840  libgcobol/LICENSE
  04057a81e83131ef0e6ab68dbfab7511  libgcobol/Makefile.am
  32b0df03b8a0a32ad6a44a8623dc0ab2  libgcobol/Makefile.in
  ff016a65ce3c24bdd22207044f2a126e  libgcobol/README
  8c9140838556aedbca129aeaedf0855b  libgcobol/acinclude.m4
  edff1d46cc8f5e3fa2007d8fede32717  libgcobol/aclocal.m4
! a41650878785053bfb9d4ea1dd5a6cdf  libgcobol/charmaps.cc
! 3effc0747d3a010f5ca41c69628b6d3d  libgcobol/charmaps.h
! a94ce6ebf5799c1d82c4fd0e0897f800  libgcobol/common-defs.h
  6f92fa32eabcfff6e25b59104fbd9a6a  libgcobol/compat/README.md
  9724ffdf971bebe59c8b2e8708a371b3  libgcobol/compat/gnu/lib/CBL_ALLOC_MEM.cbl
  848d2a16eb4e04f66947f0a4f3388039  libgcobol/compat/gnu/lib/CBL_CHECK_FILE_EXIST.cbl
*************** a7de3a965aa8c95cf89fee18c19b9139  libgco
*** 131549,131580 ****
  5aec96a7dfdb0d6e7b10cc13d65c53a3  libgcobol/configure.tgt
  b7eded6395ef32819ecac70ac1aac697  libgcobol/constants.cc
  641fcbe1c4aa0a6cde86f5b185638e11  libgcobol/ec.h
! c79d6b48483d8a0371cd7ce7f5a55900  libgcobol/encodings.h
  fbd99afdab52fcee0543b901042350ef  libgcobol/exceptl.h
! d2631951ed961d10e78f060dde00da42  libgcobol/gcobolio.h
! e48958dd84f9ab9611279e150e9957cf  libgcobol/gfileio.cc
! 4c5dc966be490381f53924b2441c9300  libgcobol/gfileio.h
! 42a0be811da2d9bccec1fc42d43424cb  libgcobol/gmath.cc
  9b52995346d1f02cab9c3e2b816722d6  libgcobol/gmath.h
! 5146ab85cb2a80f156a1e9f152b0d173  libgcobol/intrinsic.cc
  0cf9ce2863c11a8fd875185c371fe6e6  libgcobol/io.cc
  b054056cc4fe4de7a78d34e43f2f3bab  libgcobol/io.h
  6fa2e26d11c71898dae520939b992484  libgcobol/libgcobol-fp.h
! 96078ffaa1ee8a031e846c430c98c072  libgcobol/libgcobol.cc
! 78c88c93e6cd7caad5e1f94a728d4097  libgcobol/libgcobol.h
  469e0f6e21e357ff8b53b9d17373a6c8  libgcobol/libgcobol.spec.in
  96b721e88c5f79776cedad463373ad78  libgcobol/posix/README.md
! 964317051f2410eac09f25ae28d205a1  libgcobol/posix/bin/Makefile
  de91f2c442f5429dd57a380d4e77abd4  libgcobol/posix/bin/headers
! 8c07631eb91478eb62d8197115e63536  libgcobol/posix/bin/scrape.awk
  807e38148d3d302d10877fa78d259600  libgcobol/posix/bin/sizeofs.c
! 5731ef322f2cc56fd96cd89d0e5ecc9c  libgcobol/posix/bin/udf-gen
  d33a3081c7c2f2ff39cf646a35ec62a8  libgcobol/posix/cpy/posix-errno.cbl
  df954afb031169710b0fcef1d2c63141  libgcobol/posix/cpy/psx-open.cpy
  89c4c2d899376a5caefdc9ee44531f91  libgcobol/posix/cpy/statbuf.cpy
  3d39925c2d07caf265c66370d2845166  libgcobol/posix/cpy/tm.cpy
  c057a9c0bf247b066e7de6f079edb2f6  libgcobol/posix/shim/errno.cc
  a7b68930ae7325253870cb373c7849f6  libgcobol/posix/shim/localtime.cc
  84d32331f0b5857d790711a9353e6ace  libgcobol/posix/shim/open.cc
  308a02a974673252b622e5bbca74784d  libgcobol/posix/shim/stat.cc
  0627b6b8874b55669b3c13b6a52ef590  libgcobol/posix/shim/stat.h
--- 132126,132159 ----
  5aec96a7dfdb0d6e7b10cc13d65c53a3  libgcobol/configure.tgt
  b7eded6395ef32819ecac70ac1aac697  libgcobol/constants.cc
  641fcbe1c4aa0a6cde86f5b185638e11  libgcobol/ec.h
! 4d631962d9cffec6762734da92f10e9a  libgcobol/encodings.h
  fbd99afdab52fcee0543b901042350ef  libgcobol/exceptl.h
! f1ab1b4e2b05d9a13774db42ef391916  libgcobol/gcobolio.h
! a440589f964741a7b0b073b9ab76e154  libgcobol/gfileio.cc
! 948488d543e0bdadd9d5f4283005a874  libgcobol/gfileio.h
! 9bc9dfe1f51cd0d1dec4a74a7db9326e  libgcobol/gmath.cc
  9b52995346d1f02cab9c3e2b816722d6  libgcobol/gmath.h
! 47a14e62349a55715e10fd4c4a29bdc5  libgcobol/intrinsic.cc
  0cf9ce2863c11a8fd875185c371fe6e6  libgcobol/io.cc
  b054056cc4fe4de7a78d34e43f2f3bab  libgcobol/io.h
  6fa2e26d11c71898dae520939b992484  libgcobol/libgcobol-fp.h
! 1c8fa0d10597fa6e6e8f8173062064fd  libgcobol/libgcobol.cc
! 74fd209d4dd961323d957619171cb186  libgcobol/libgcobol.h
  469e0f6e21e357ff8b53b9d17373a6c8  libgcobol/libgcobol.spec.in
  96b721e88c5f79776cedad463373ad78  libgcobol/posix/README.md
! 6c13b507d443d1aa5c60a6b8939dd068  libgcobol/posix/bin/Makefile
  de91f2c442f5429dd57a380d4e77abd4  libgcobol/posix/bin/headers
! 684a25ba570455c35402148c3b528c13  libgcobol/posix/bin/scrape.awk
  807e38148d3d302d10877fa78d259600  libgcobol/posix/bin/sizeofs.c
! df27d0831414ed4ff9aa6640fe95d3f7  libgcobol/posix/bin/udf-gen
  d33a3081c7c2f2ff39cf646a35ec62a8  libgcobol/posix/cpy/posix-errno.cbl
+ c89d8daf75b2fb1290c281d696f1bf34  libgcobol/posix/cpy/psx-lseek.cpy
  df954afb031169710b0fcef1d2c63141  libgcobol/posix/cpy/psx-open.cpy
  89c4c2d899376a5caefdc9ee44531f91  libgcobol/posix/cpy/statbuf.cpy
  3d39925c2d07caf265c66370d2845166  libgcobol/posix/cpy/tm.cpy
  c057a9c0bf247b066e7de6f079edb2f6  libgcobol/posix/shim/errno.cc
  a7b68930ae7325253870cb373c7849f6  libgcobol/posix/shim/localtime.cc
+ 08a9641ad44d6c67ea4195530b685068  libgcobol/posix/shim/lseek.cc
  84d32331f0b5857d790711a9353e6ace  libgcobol/posix/shim/open.cc
  308a02a974673252b622e5bbca74784d  libgcobol/posix/shim/stat.cc
  0627b6b8874b55669b3c13b6a52ef590  libgcobol/posix/shim/stat.h
*************** c185f49b81cdf8493183fa80bac2a3a7  libgco
*** 131586,131604 ****
  30c9799508c129fb6190e083a7a7837a  libgcobol/posix/t/stat.cbl
  7eb31de3bb34e7725a6cc8285ec9c00e  libgcobol/posix/udf/posix-exit.cbl
  63471924bc915602fcc79a08d2844cd0  libgcobol/posix/udf/posix-localtime.cbl
! d0b960468c537843000703d744a80306  libgcobol/posix/udf/posix-lseek.cbl
  9905637f1731df63655b7c69bee2138d  libgcobol/posix/udf/posix-mkdir.cbl
  aaed34e8da501e8f7406f40adfee9b24  libgcobol/posix/udf/posix-open.cbl
  7e68e298d44e171c82ef36bae597b286  libgcobol/posix/udf/posix-read.cbl
  b596ffc38045755f7ef0c54f1d5555a1  libgcobol/posix/udf/posix-stat.cbl
! 3df03151f09cf8f654bae1aa69897f61  libgcobol/posix/udf/posix-unlink.cbl
  0cbcc2fa8aaaeccc8cd28ddd6e3acb0b  libgcobol/posix/udf/posix-write.cbl
! 569f88db0d90fcf77b2a1a314beb8bcb  libgcobol/stringbin.cc
! 179156ad95afd403a9316969a95142f7  libgcobol/stringbin.h
! 2b31946dfaa7df328dd0749c37f1ae36  libgcobol/valconv.cc
  bf52fdaed06effba57a10e8157bc6930  libgcobol/valconv.h
  c87d0834249e4949627ac190796295e9  libgcobol/xmlparse.cc
! e307b4f72f04ba57762439aa217c5053  libgfortran/ChangeLog
  d99469a76bfe825683f8d94fe07b508c  libgfortran/ChangeLog-2002
  522fdb2df6cefe6bcaed3c7c7311eae1  libgfortran/ChangeLog-2003
  5a3a93e76d878d063aba66079340cfe0  libgfortran/ChangeLog-2004
--- 132165,132183 ----
  30c9799508c129fb6190e083a7a7837a  libgcobol/posix/t/stat.cbl
  7eb31de3bb34e7725a6cc8285ec9c00e  libgcobol/posix/udf/posix-exit.cbl
  63471924bc915602fcc79a08d2844cd0  libgcobol/posix/udf/posix-localtime.cbl
! b19197a360b91a408994e0794c230d8c  libgcobol/posix/udf/posix-lseek.cbl
  9905637f1731df63655b7c69bee2138d  libgcobol/posix/udf/posix-mkdir.cbl
  aaed34e8da501e8f7406f40adfee9b24  libgcobol/posix/udf/posix-open.cbl
  7e68e298d44e171c82ef36bae597b286  libgcobol/posix/udf/posix-read.cbl
  b596ffc38045755f7ef0c54f1d5555a1  libgcobol/posix/udf/posix-stat.cbl
! d5f038474fd5faad3f79701cbb81bf30  libgcobol/posix/udf/posix-unlink.cbl
  0cbcc2fa8aaaeccc8cd28ddd6e3acb0b  libgcobol/posix/udf/posix-write.cbl
! db96b460f17e3ec206617c052da2d651  libgcobol/stringbin.cc
! c9e5ab16fc25ce977c378934b670079e  libgcobol/stringbin.h
! 646189d06f85a933fb4886c34f1d93c8  libgcobol/valconv.cc
  bf52fdaed06effba57a10e8157bc6930  libgcobol/valconv.h
  c87d0834249e4949627ac190796295e9  libgcobol/xmlparse.cc
! 17a8b03e153b55840b195304488382aa  libgfortran/ChangeLog
  d99469a76bfe825683f8d94fe07b508c  libgfortran/ChangeLog-2002
  522fdb2df6cefe6bcaed3c7c7311eae1  libgfortran/ChangeLog-2003
  5a3a93e76d878d063aba66079340cfe0  libgfortran/ChangeLog-2004
*************** f9101923347929f02ecedab542ddf291  libgfo
*** 132517,132523 ****
  1e1625a66efd32187feb746a26427f89  libgfortran/io/inquire.c
  86f78d0a8d7fd3418de9e9f9a1cb384f  libgfortran/io/intrinsics.c
  fe24afda0444aab88f5a40caf1738169  libgfortran/io/io.h
! acece1cf786346e53cfcf74926973d1b  libgfortran/io/list_read.c
  908721400434528de210b0cbef37f603  libgfortran/io/lock.c
  a5048d41737161954ead03f98865a018  libgfortran/io/open.c
  15fa25bbc2ea09df80ad7037e0c28b75  libgfortran/io/read.c
--- 133096,133102 ----
  1e1625a66efd32187feb746a26427f89  libgfortran/io/inquire.c
  86f78d0a8d7fd3418de9e9f9a1cb384f  libgfortran/io/intrinsics.c
  fe24afda0444aab88f5a40caf1738169  libgfortran/io/io.h
! 724724904a02d3a4a9d6f7203b3949ae  libgfortran/io/list_read.c
  908721400434528de210b0cbef37f603  libgfortran/io/lock.c
  a5048d41737161954ead03f98865a018  libgfortran/io/open.c
  15fa25bbc2ea09df80ad7037e0c28b75  libgfortran/io/read.c
*************** a3a7e9ca6057da9ca42e03e41e1c73f7  libgo/
*** 138163,138169 ****
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! b2341c4341b8d9f9b53b17aa2f9b1917  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  714e3b9c0810a61df01246c2a97e825a  libgomp/Makefile.am
  ebb578201b0bfde5d8221fca34ee44c4  libgomp/Makefile.in
--- 138742,138748 ----
  dcdf1b680b15b372bdb64cc5107d51b6  libgo/testsuite/libgo-test-support.exp.in
  bf162aa572f7b96b25dbd2b027845d32  libgo/testsuite/libgo.testmain/testmain.exp
  cc9d2a0e34e31ba866a8caf9f46f48f3  libgomp/.gitattributes
! 4472900f13f063c213963c4d459f135f  libgomp/ChangeLog
  0d55aa862aee66efdc5f8d62c94ff8fb  libgomp/ChangeLog.graphite
  714e3b9c0810a61df01246c2a97e825a  libgomp/Makefile.am
  ebb578201b0bfde5d8221fca34ee44c4  libgomp/Makefile.in
*************** cb237e684fa48f0d3d0a04a711c5a6b0  libgom
*** 138450,138456 ****
  8945def7ee59696379ce0bb88a8f3f77  libgomp/testsuite/libgomp.c++/depend-iterator-1.C
  c9740fad4aed0ad56520ed80ef3e0c8d  libgomp/testsuite/libgomp.c++/depobj-1.C
  ce9c39e35005e3bdc03574b9f7ee41c9  libgomp/testsuite/libgomp.c++/doacross-1.C
! 8f3fa1739a32f62d1e950e3ffdf69ab6  libgomp/testsuite/libgomp.c++/examples-4/declare_target-2.C
  98f2608bd37e360bc09de297923e88b7  libgomp/testsuite/libgomp.c++/examples-4/target_data-5.C
  ccd9ee1d01506847d3ea1b041c796d78  libgomp/testsuite/libgomp.c++/firstprivate-1.C
  2e6cbe250ac9d5c71de572a824df56a0  libgomp/testsuite/libgomp.c++/firstprivate-2.C
--- 139029,139035 ----
  8945def7ee59696379ce0bb88a8f3f77  libgomp/testsuite/libgomp.c++/depend-iterator-1.C
  c9740fad4aed0ad56520ed80ef3e0c8d  libgomp/testsuite/libgomp.c++/depobj-1.C
  ce9c39e35005e3bdc03574b9f7ee41c9  libgomp/testsuite/libgomp.c++/doacross-1.C
! 180763c1f861a2798392fca31f505ef3  libgomp/testsuite/libgomp.c++/examples-4/declare_target-2.C
  98f2608bd37e360bc09de297923e88b7  libgomp/testsuite/libgomp.c++/examples-4/target_data-5.C
  ccd9ee1d01506847d3ea1b041c796d78  libgomp/testsuite/libgomp.c++/firstprivate-1.C
  2e6cbe250ac9d5c71de572a824df56a0  libgomp/testsuite/libgomp.c++/firstprivate-2.C
*************** f66604a729c1a693416c247cef5805b1  libgom
*** 138641,138647 ****
  1a7862ad9a2af6943f9928a670bcaf16  libgomp/testsuite/libgomp.c++/target-8.C
  9ae4b452504278d0f3af44f0a9a2aa71  libgomp/testsuite/libgomp.c++/target-9.C
  fa716b461da8e5de360fdcf69a488b17  libgomp/testsuite/libgomp.c++/target-cdtor-1.C
! ca5bc44232dc9d552ae8a1e6353dd7d4  libgomp/testsuite/libgomp.c++/target-cdtor-2.C
  3d15e0d44019185d8004a4d4b87851de  libgomp/testsuite/libgomp.c++/target-exceptions-bad_cast-1.C
  64bd4e898ee85afe93f6f182b3a479fc  libgomp/testsuite/libgomp.c++/target-exceptions-bad_cast-2-offload-sorry-GCN.C
  2ab3f03a68f64f25cb39af3017726c7c  libgomp/testsuite/libgomp.c++/target-exceptions-bad_cast-2-offload-sorry-nvptx.C
--- 139220,139226 ----
  1a7862ad9a2af6943f9928a670bcaf16  libgomp/testsuite/libgomp.c++/target-8.C
  9ae4b452504278d0f3af44f0a9a2aa71  libgomp/testsuite/libgomp.c++/target-9.C
  fa716b461da8e5de360fdcf69a488b17  libgomp/testsuite/libgomp.c++/target-cdtor-1.C
! 7d8c3a8920086d8f7b78c2a84e52fdf5  libgomp/testsuite/libgomp.c++/target-cdtor-2.C
  3d15e0d44019185d8004a4d4b87851de  libgomp/testsuite/libgomp.c++/target-exceptions-bad_cast-1.C
  64bd4e898ee85afe93f6f182b3a479fc  libgomp/testsuite/libgomp.c++/target-exceptions-bad_cast-2-offload-sorry-GCN.C
  2ab3f03a68f64f25cb39af3017726c7c  libgomp/testsuite/libgomp.c++/target-exceptions-bad_cast-2-offload-sorry-nvptx.C
*************** cfa4149542c401b73310497159a6cb92  libgom
*** 138699,138741 ****
  d01f6cd5771f7784c8ce461cf8b60255  libgomp/testsuite/libgomp.c++/target-same-name-2-a.C
  b0372bd118a07b6674371887148186be  libgomp/testsuite/libgomp.c++/target-same-name-2-b.C
  e20a8ae264dd60aac921ec743e8b6ef6  libgomp/testsuite/libgomp.c++/target-same-name-2.C
! c9d5676fea876c578c496003955fd30f  libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C
! 8b98f91100d66ac34727cfa5d5717c68  libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C
! 203cd3bbd56fcbfbb37ecdfe1acbecde  libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C
! 06d825a0695b3b2c778183f2a0f15340  libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C
  9ca8fd31f9d1a81ee2848076e938d038  libgomp/testsuite/libgomp.c++/target-std__cmath.C
  3e851d51211a5b45aef590ec200d5aeb  libgomp/testsuite/libgomp.c++/target-std__complex.C
! 74dc860faf574c58178a0cdd8785bead  libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C
! b758290af585897f36616822156ea1a9  libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C
! 7b8564af7efb36534e06bf9256491d47  libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C
! 50abf3a4f9429a3f337acccadf011f08  libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C
! 462312b79cfd6847f34cdd45245bc748  libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C
! 9f7bf1a7585f20e59cb41e8099f7caf1  libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C
! 7369f06d6c6e12c4efe8eb11b828b88c  libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C
! 6f8b7653695f5852a537ab81635a40d2  libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C
! b0f9096b7bf3c9d0ce4dd3a00ee55759  libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C
! 2f3331139fe17c39b23a3edc290e40a0  libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C
! 35f314c32d461e5b9b300e452a0e98a1  libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C
! 0850a8e25f775a93e3548200ac6c5e9b  libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C
! d77d8756bf317a714ee17dc55981161d  libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C
! ebc970badffeaa66f031d7077302889d  libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C
! 2a4a1e185293d0c63298569d1c7d7719  libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C
! 3c9a591a77ac428729c14e9aebfdc428  libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C
  155c26d39bae87ec622ca18a97497525  libgomp/testsuite/libgomp.c++/target-std__numbers.C
! 0cc775768f980490ca709164e16fce0e  libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C
! 5c50c046a303089716d97390d263ae5d  libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C
! b0960e5e9f351f0ed8ff8529cc3194e1  libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C
! b41edef63ed773783fe739048b52b76b  libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C
! 1fb1f482d2cc7a45a533ed58a3ad667b  libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C
! bbb993c5215396373d2a2a480d2ef71a  libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C
! 4eb7070d3fbd54355b325be0a2134275  libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C
! 8987e8e0d15420f50e0c3dd2ba9a92fc  libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C
  1ca15bd8238a647321aeb7d4e5868782  libgomp/testsuite/libgomp.c++/target-std__valarray-1.C
  94b5f7b92b7c4edffc6cfe54dfd4fdee  libgomp/testsuite/libgomp.c++/target-std__valarray-1.output
! 3c291529e3fb93e1412a045262b4b281  libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C
! d131730aa8400dfc468fc20016b2384e  libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C
! 99f3f3b3487d9caab256ded57f8d2a90  libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C
! 0a26596ca5e68223783093ca0fc7964f  libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C
  dd3ce96eb6e1a02d995c05804baf3219  libgomp/testsuite/libgomp.c++/target-this-1.C
  7ecd542ef8fc4d3c7a2e77af16f33ddc  libgomp/testsuite/libgomp.c++/target-this-2.C
  ca6e1cf374cf317aca4336ffd0f23b46  libgomp/testsuite/libgomp.c++/target-this-3.C
--- 139278,139328 ----
  d01f6cd5771f7784c8ce461cf8b60255  libgomp/testsuite/libgomp.c++/target-same-name-2-a.C
  b0372bd118a07b6674371887148186be  libgomp/testsuite/libgomp.c++/target-same-name-2-b.C
  e20a8ae264dd60aac921ec743e8b6ef6  libgomp/testsuite/libgomp.c++/target-same-name-2.C
! 238a94597dd5ed51e805225404cfe6c8  libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C
! b0e82ee7e64a8a22c0972d684065bb11  libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C
! a1d500be55e92a7a03c1be6c8fa486f2  libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C
! 41f65e99a080a22d27f0b2d33e50d808  libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C
  9ca8fd31f9d1a81ee2848076e938d038  libgomp/testsuite/libgomp.c++/target-std__cmath.C
  3e851d51211a5b45aef590ec200d5aeb  libgomp/testsuite/libgomp.c++/target-std__complex.C
! b18b1cb0133b28594597029cf7db44ff  libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C
! bb0bf0ab197120edc9916797415179ab  libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C
! e3b11ebd56ba21889ca9f3d074e3ed7e  libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C
! 8ad75417ee9f0d313299b609471519e6  libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C
! 36cb4df9290f5e7001c45c05a18e1f88  libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C
! 7d50d408a2ee8c4a1d633ea3e75ce654  libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C
! 62623bce7f6da50e8d2b1d61061030af  libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C
! a61747c41ceef9d0337d2871c1f72c38  libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C
! e4029a4eb93893adc0147f3101fb766d  libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C
! 8100f5a33e0d9796f30f8a4b4f150a32  libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C
! f6a834895f8afbbc3574ca207cdeb54b  libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C
! 3680c923da9a297ea8b02a8dfb722910  libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C
! 51231b4722b861f08f713ac96b3caa5b  libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C
! 9cc02c65e4a7cd2697f4ea4e71d58de2  libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C
! 0edcbeefe52f6ebb790bbf074181c7df  libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C
! df50cd725c25e9f5a5c5f9940a9c5bac  libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C
! e85696bee267273e6ae13c36259d6026  libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C
! f5d1972187ae37a4576e963ed17c85b9  libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C
! f9fe809d96ea4277c96e170a72b9f2f2  libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C
! 218e418909a8b4b5e30171c5edf34d59  libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C
  155c26d39bae87ec622ca18a97497525  libgomp/testsuite/libgomp.c++/target-std__numbers.C
! 96317e775e0266606fb86a3f7f0d0892  libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C
! 29aa35a592caca04cf45c63a3ac9b500  libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C
! 6ade5dbb99910aa747e177b02ab59b4e  libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C
! 3ab36c10aa51dfe5d83f8307175e81e3  libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C
! f51737d43afa146bf6c6278952b405cd  libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent-usm.C
! 785cf7c8ad2533d1bdd9c8ec3b707d52  libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C
! d349257963773d9aacbba6388238573a  libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent-usm.C
! e834f7f94d139d2a593b5420ac2f5a77  libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C
! 6552a9c0e4ee2cfeee5d9b4cfdfb6235  libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent-usm.C
! 41ad845cd806088b1c154d88a85dcc1f  libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C
! 7ccdfafe5ba9339fecb86bc2ae4873bf  libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent-usm.C
! 50c5f8dc8594629cdec02be8c657d582  libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C
  1ca15bd8238a647321aeb7d4e5868782  libgomp/testsuite/libgomp.c++/target-std__valarray-1.C
  94b5f7b92b7c4edffc6cfe54dfd4fdee  libgomp/testsuite/libgomp.c++/target-std__valarray-1.output
! ab3b8c71c7f55c524395323abccc18a3  libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C
! d6683fc66b1ea2b4b3cee554c552cb24  libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C
! e6ab7ad1a761d072399647231b862e4e  libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C
! c3afb93c7427399290dc355f84c46cbc  libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C
  dd3ce96eb6e1a02d995c05804baf3219  libgomp/testsuite/libgomp.c++/target-this-1.C
  7ecd542ef8fc4d3c7a2e77af16f33ddc  libgomp/testsuite/libgomp.c++/target-this-2.C
  ca6e1cf374cf317aca4336ffd0f23b46  libgomp/testsuite/libgomp.c++/target-this-3.C
*************** b27380cd395a2928996b8531b3eb62ad  libgom
*** 138922,138928 ****
--- 139509,139517 ----
  81cd8a77c25ea49d08f07250f984f35d  libgomp/testsuite/libgomp.c-c++-common/loop-14.c
  dffc3aabaa5b2461aa560fc66c80c0fe  libgomp/testsuite/libgomp.c-c++-common/loop-15.c
  432ac98498f545fab31969b079c5848a  libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-1.c
+ 86225adf9607d64421b4b2d8b0fcaccf  libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-2-usm.c
  afc52bb7680e92ac0996527dce7bd30f  libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-2.c
+ 516b1e6f33fcb02aab7737f80139fac7  libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-3-usm.c
  b7c55d9a7dcc3e046b1f2c02fc0d61e2  libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-3.c
  5cdaccb404c42c94d2b0ed71fa9b4450  libgomp/testsuite/libgomp.c-c++-common/masked-1.c
  776bf7cbf25f215ab09a3df3faed350d  libgomp/testsuite/libgomp.c-c++-common/master-combined-1.c
*************** cbc1c46aca10b5056dd653273e1b22d3  libgom
*** 139045,139050 ****
--- 139634,139640 ----
  80deab7b7285fa934f6f5e449fc455bb  libgomp/testsuite/libgomp.c-c++-common/struct-elem-2.c
  31d15621334ecdff113afb86d86a61e0  libgomp/testsuite/libgomp.c-c++-common/struct-elem-3.c
  0e9f2991ddeb503b1a576d6dfefe7b15  libgomp/testsuite/libgomp.c-c++-common/struct-elem-4.c
+ 2a76fba3664a30934cf9a02627637f18  libgomp/testsuite/libgomp.c-c++-common/struct-elem-5-usm.c
  2f381b5b2c1edcb3aff57cd8162f2765  libgomp/testsuite/libgomp.c-c++-common/struct-elem-5.c
  8f27ce990f1126b470fb31270c5d5393  libgomp/testsuite/libgomp.c-c++-common/target-1.c
  6f5e2a9456fa80159727bad1e98aec97  libgomp/testsuite/libgomp.c-c++-common/target-10.c
*************** d989443106e2a262436792d18fb2f23b  libgom
*** 139085,139092 ****
--- 139675,139685 ----
  3737e3b4823c33573762510eb88c0f0f  libgomp/testsuite/libgomp.c-c++-common/target-memcpy-async-2.c
  b13870c9ccee080373d9f85e69613aa6  libgomp/testsuite/libgomp.c-c++-common/target-memcpy-rect-async-1.c
  acca011e007b14dd1357bebb2ff85642  libgomp/testsuite/libgomp.c-c++-common/target-memcpy-rect-async-2.c
+ aab4d26bd6f75e5ca59cdea2e79110ea  libgomp/testsuite/libgomp.c-c++-common/target-present-1-usm.c
  5e383c34b37ea1cb5c06fff98b1f457d  libgomp/testsuite/libgomp.c-c++-common/target-present-1.c
+ 0a49014c931d667dada251c672fbf516  libgomp/testsuite/libgomp.c-c++-common/target-present-2-usm.c
  ffe15652e4f5929658a368d8b7aabdd0  libgomp/testsuite/libgomp.c-c++-common/target-present-2.c
+ e708cd109a462fac89d30a6c65910437  libgomp/testsuite/libgomp.c-c++-common/target-present-3-usm.c
  d4069bee4bb64a7b1bc7c9545219e88c  libgomp/testsuite/libgomp.c-c++-common/target-present-3.c
  400c5830e8dd2f17214d8d23477755de  libgomp/testsuite/libgomp.c-c++-common/target-same-name-1-a.c
  469b004815365e46140bcd8b826170ce  libgomp/testsuite/libgomp.c-c++-common/target-same-name-1-b.c
*************** d9fd6ed98015269ce9eddab24d3efeba  libgom
*** 139245,139291 ****
  47117801af35c93e0553f4fd2ee62156  libgomp/testsuite/libgomp.c/debug-1.c
  afbc465058b9ba3f4c999bbdd4f3d1ae  libgomp/testsuite/libgomp.c/declare-variant-1.c
  6d6b0531c9f74483e6111b636da2edf2  libgomp/testsuite/libgomp.c/declare-variant-2.c
! d9c383822eb3728cd6eba3775b3e04bc  libgomp/testsuite/libgomp.c/declare-variant-3-sm30.c
! 1f68040131b346f50f3b863a32ef8916  libgomp/testsuite/libgomp.c/declare-variant-3-sm35.c
! 30b6bbbc024fc68fa9e69677007dbae3  libgomp/testsuite/libgomp.c/declare-variant-3-sm37.c
! 4ea99858cb964012c477b246b7693494  libgomp/testsuite/libgomp.c/declare-variant-3-sm52.c
! 24ce05bd1621e2283a45e5631d7fd074  libgomp/testsuite/libgomp.c/declare-variant-3-sm53.c
! 4d500a885d06d0e35ed7237c9155fcdc  libgomp/testsuite/libgomp.c/declare-variant-3-sm61.c
! a30c653b4c75613a04461c9dd4693f7c  libgomp/testsuite/libgomp.c/declare-variant-3-sm70.c
! c7e4450d857de7de3db653040f28ea54  libgomp/testsuite/libgomp.c/declare-variant-3-sm75.c
! f2efa95bfb9ba9e454c38688371551c9  libgomp/testsuite/libgomp.c/declare-variant-3-sm80.c
! 0315cdf9221c890fcd6f827cf70b030e  libgomp/testsuite/libgomp.c/declare-variant-3-sm89.c
  7da3ac85e4c6bcbc1ce1d6d1c6575395  libgomp/testsuite/libgomp.c/declare-variant-3.c
  990725ec4ad0102414e463c434143f4f  libgomp/testsuite/libgomp.c/declare-variant-3.h
! 6514cd5e3a0a420fe0305c6e4e7e139d  libgomp/testsuite/libgomp.c/declare-variant-4-gfx10-3-generic.c
! 3e7f10285df48e5145c86b3105312288  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1030.c
! 1fcf3bea3ca865db29685b78ae86d140  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1031.c
! ea25d22c94361de2f7c6663eded64859  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1032.c
! 6486978fa2dfa87e2298a28eb32c7236  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1033.c
! 289220bf4c53786c09b18d94a74411b7  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1034.c
! d29621d36df13c3c907a695988bbcdee  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1035.c
! a89c49367a93b858da713435ff74d9ba  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1036.c
! d25b59c844a267a61c29213a3ff86b5a  libgomp/testsuite/libgomp.c/declare-variant-4-gfx11-generic.c
! 0d0783a71120c0dd795287264783bbaf  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1100.c
! fe94298d711566c57de9a631fe061114  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1101.c
! 1821245bf6ae4f9ab6f63e9de23e8110  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1102.c
! 7012e8272491ab09130a073b5aaa5f93  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1103.c
! fe4a42adbe608dcfea411355f1b2a739  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1150.c
! da341ae0d846bfc532dd4e1196367f7a  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1151.c
! 75833185b8fdfdafed8e19d27b2892a0  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1152.c
! 2a3554431e1ac877f58b9ca03da3b49e  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1153.c
! 5e672eb910dde2db2c758bd3b0ebd8e8  libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-4-generic.c
! f80392e878b00ccf5324633c4b38c1cb  libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-generic.c
! d5f9c7b8f93dd5569ce16352b403bb0d  libgomp/testsuite/libgomp.c/declare-variant-4-gfx900.c
! eb222dc0465e0afe8a598769c2fbfc7c  libgomp/testsuite/libgomp.c/declare-variant-4-gfx902.c
! 98d105279772a2e99041112459e2e597  libgomp/testsuite/libgomp.c/declare-variant-4-gfx904.c
! 6cd0f2dfd2fb7d7365f2624d073a80dc  libgomp/testsuite/libgomp.c/declare-variant-4-gfx906.c
! ff9e30635e6b17c5a81f0980300ae689  libgomp/testsuite/libgomp.c/declare-variant-4-gfx908.c
! c6140af0b4134fc2cd0af2cd67b6e93f  libgomp/testsuite/libgomp.c/declare-variant-4-gfx909.c
! 1ef481085c5219f5ed298fdf707f229b  libgomp/testsuite/libgomp.c/declare-variant-4-gfx90a.c
! a3798387afacc8f3b56b1c2357980b40  libgomp/testsuite/libgomp.c/declare-variant-4-gfx90c.c
! 03788ed6fd46368d573f8054aaa4cc74  libgomp/testsuite/libgomp.c/declare-variant-4-gfx942.c
! bb78bd1426b9a9dbb6d042011bc83fc5  libgomp/testsuite/libgomp.c/declare-variant-4-gfx950.c
  1f5eb948c82d13c08cf06ad916ec9f8a  libgomp/testsuite/libgomp.c/declare-variant-4.c
  e47e9fb21f42db5558fd30458968e456  libgomp/testsuite/libgomp.c/declare-variant-4.h
  de26bcca8c4e027a5ce130d6ff6fc370  libgomp/testsuite/libgomp.c/depend-1.c
--- 139838,139884 ----
  47117801af35c93e0553f4fd2ee62156  libgomp/testsuite/libgomp.c/debug-1.c
  afbc465058b9ba3f4c999bbdd4f3d1ae  libgomp/testsuite/libgomp.c/declare-variant-1.c
  6d6b0531c9f74483e6111b636da2edf2  libgomp/testsuite/libgomp.c/declare-variant-2.c
! 647e42c6f8847e9b2954a85db8b55452  libgomp/testsuite/libgomp.c/declare-variant-3-sm30.c
! 446d3ecc5800c697d4bcd620373cb1af  libgomp/testsuite/libgomp.c/declare-variant-3-sm35.c
! 6a2e3a3f922844ade1a50eb395e0f707  libgomp/testsuite/libgomp.c/declare-variant-3-sm37.c
! 4132f95b3a08365758ab8d3f63208b11  libgomp/testsuite/libgomp.c/declare-variant-3-sm52.c
! 1869bfd2c2d4f9054d24c0a53a4788f4  libgomp/testsuite/libgomp.c/declare-variant-3-sm53.c
! f5213ec135b06c4fb357312be37288e0  libgomp/testsuite/libgomp.c/declare-variant-3-sm61.c
! 27c76785eb4889e8c8e8ab4f547ad5d3  libgomp/testsuite/libgomp.c/declare-variant-3-sm70.c
! e3d8ca5fb313ae31460660d3c39fb913  libgomp/testsuite/libgomp.c/declare-variant-3-sm75.c
! 6a06e807c91724ad57fad63397edfc07  libgomp/testsuite/libgomp.c/declare-variant-3-sm80.c
! 67ae20a302c0ab13c08ae6c4e6ae29d5  libgomp/testsuite/libgomp.c/declare-variant-3-sm89.c
  7da3ac85e4c6bcbc1ce1d6d1c6575395  libgomp/testsuite/libgomp.c/declare-variant-3.c
  990725ec4ad0102414e463c434143f4f  libgomp/testsuite/libgomp.c/declare-variant-3.h
! cc4ead5a0ad636ec62f0631bacc8ca4b  libgomp/testsuite/libgomp.c/declare-variant-4-gfx10-3-generic.c
! be70e184111446ef18f6ea1974005b74  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1030.c
! d73b5456e037cae4f16adc3fbf606295  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1031.c
! 1e0c8e7dd1a5017ec43325c08fe1ae05  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1032.c
! 03b6da6fe8521a4b696a05e4a5a8fe46  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1033.c
! 7da17afcd4e38611f94f4e288f3275c9  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1034.c
! b597ab22cbca53813346074ccd1ced0c  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1035.c
! dffc4c70a7ebe90a92f61d1751dce187  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1036.c
! a9cf95c399c5c53992a037e4b7446a94  libgomp/testsuite/libgomp.c/declare-variant-4-gfx11-generic.c
! 2dc14ada5135adcf7f4acd53d521a3cf  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1100.c
! 6c345086e20ba7b4010d7f01680ee968  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1101.c
! a5202d7ece2343c917ff674ec3d17d43  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1102.c
! 7fe7b326d127cfaf697e082961b8530a  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1103.c
! f4d7f805584a2e28eb287f5598c5a90b  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1150.c
! 31e0d3c99477f6f331b1b4e2551121cb  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1151.c
! 2057861161508622eaba346f17937772  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1152.c
! d45d7ac641120dccd5ccc98054641ada  libgomp/testsuite/libgomp.c/declare-variant-4-gfx1153.c
! 657861ab5bb98b193b50edd7624cc4c0  libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-4-generic.c
! 30af8875d0d9f227785bee76e55c94b3  libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-generic.c
! f305069bd11b00f18b14cac51fe4ea4b  libgomp/testsuite/libgomp.c/declare-variant-4-gfx900.c
! d614f1f9c812e2e28e1f45bc4b65e86f  libgomp/testsuite/libgomp.c/declare-variant-4-gfx902.c
! 87bc6ed12bc5502a9a11c65793190c36  libgomp/testsuite/libgomp.c/declare-variant-4-gfx904.c
! 50e4e7f3c4cede5f8a9f013a07fc801a  libgomp/testsuite/libgomp.c/declare-variant-4-gfx906.c
! dfff6132222b56ea3a97a78f87fd6d52  libgomp/testsuite/libgomp.c/declare-variant-4-gfx908.c
! 12ac2278ea44037e15f98fbe425e1eca  libgomp/testsuite/libgomp.c/declare-variant-4-gfx909.c
! 37d5647834f73af2efb4d599f456cdd1  libgomp/testsuite/libgomp.c/declare-variant-4-gfx90a.c
! 159920f6c8468210cdbb7deff9631f88  libgomp/testsuite/libgomp.c/declare-variant-4-gfx90c.c
! 1a9f04d463ae351e41f4aaf3d992848a  libgomp/testsuite/libgomp.c/declare-variant-4-gfx942.c
! ebbc10a12446476dbb1ade87812f29f9  libgomp/testsuite/libgomp.c/declare-variant-4-gfx950.c
  1f5eb948c82d13c08cf06ad916ec9f8a  libgomp/testsuite/libgomp.c/declare-variant-4.c
  e47e9fb21f42db5558fd30458968e456  libgomp/testsuite/libgomp.c/declare-variant-4.h
  de26bcca8c4e027a5ce130d6ff6fc370  libgomp/testsuite/libgomp.c/depend-1.c
*************** da453be173ad92979620c14fc3d651f4  libgom
*** 139309,139315 ****
  39fea640f2c9adb1a5a7efe5f6d370b8  libgomp/testsuite/libgomp.c/examples-4/array_sections-3.c
  9d4709594c05148c0ee2d3ba822d433d  libgomp/testsuite/libgomp.c/examples-4/array_sections-4.c
  f95f9a06d610c417756639a9e31b39de  libgomp/testsuite/libgomp.c/examples-4/async_target-1.c
! 54cf2a17f0a08dba2be7b953a4867917  libgomp/testsuite/libgomp.c/examples-4/async_target-2.c
  5dae1e63b6e289379131dc0b49823a76  libgomp/testsuite/libgomp.c/examples-4/declare_target-1.c
  09801ffa5ff17b2b3a0382319df3b8e6  libgomp/testsuite/libgomp.c/examples-4/declare_target-3.c
  10e8145c82c46c37bfdcb8f1004a9792  libgomp/testsuite/libgomp.c/examples-4/declare_target-4.c
--- 139902,139908 ----
  39fea640f2c9adb1a5a7efe5f6d370b8  libgomp/testsuite/libgomp.c/examples-4/array_sections-3.c
  9d4709594c05148c0ee2d3ba822d433d  libgomp/testsuite/libgomp.c/examples-4/array_sections-4.c
  f95f9a06d610c417756639a9e31b39de  libgomp/testsuite/libgomp.c/examples-4/async_target-1.c
! 57c136441520da6eae7dce437ffdb570  libgomp/testsuite/libgomp.c/examples-4/async_target-2.c
  5dae1e63b6e289379131dc0b49823a76  libgomp/testsuite/libgomp.c/examples-4/declare_target-1.c
  09801ffa5ff17b2b3a0382319df3b8e6  libgomp/testsuite/libgomp.c/examples-4/declare_target-3.c
  10e8145c82c46c37bfdcb8f1004a9792  libgomp/testsuite/libgomp.c/examples-4/declare_target-4.c
*************** ee1bca91c6e853556cd65170329412cb  libgom
*** 139367,139373 ****
  0f1e2ad9f4304e2b19abf50063219cdd  libgomp/testsuite/libgomp.c/interop-hipblas-nvidia-no-headers.c
  ee6acb3089ae16656715ede5acd4a769  libgomp/testsuite/libgomp.c/interop-hipblas-nvidia-no-hip-header.c
  73994b391db11a9fa8269d17021fc731  libgomp/testsuite/libgomp.c/interop-hipblas.h
! b892336be3124a54b2f99643e2295959  libgomp/testsuite/libgomp.c/interop-hsa.c
  a6c33c02bb48400578351a95922a2f1c  libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c
  01e92bf2afe709ab5d5aabf0410fa484  libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c
  95f6c8613aa251d5def12c5b8ac78a94  libgomp/testsuite/libgomp.c/ipcp-cb1.c
--- 139960,139966 ----
  0f1e2ad9f4304e2b19abf50063219cdd  libgomp/testsuite/libgomp.c/interop-hipblas-nvidia-no-headers.c
  ee6acb3089ae16656715ede5acd4a769  libgomp/testsuite/libgomp.c/interop-hipblas-nvidia-no-hip-header.c
  73994b391db11a9fa8269d17021fc731  libgomp/testsuite/libgomp.c/interop-hipblas.h
! a312f0c1d775afad3261daee64966b25  libgomp/testsuite/libgomp.c/interop-hsa.c
  a6c33c02bb48400578351a95922a2f1c  libgomp/testsuite/libgomp.c/ipcp-cb-spec1.c
  01e92bf2afe709ab5d5aabf0410fa484  libgomp/testsuite/libgomp.c/ipcp-cb-spec2.c
  95f6c8613aa251d5def12c5b8ac78a94  libgomp/testsuite/libgomp.c/ipcp-cb1.c
*************** b39893ba213997fb0f30060685879d54  libgom
*** 139470,139475 ****
--- 140063,140069 ----
  aa4bf5c713a6787268e4b1415f31402c  libgomp/testsuite/libgomp.c/pr104952-2.c
  37f576b8026bd1367998c4594550703d  libgomp/testsuite/libgomp.c/pr108459.c
  502f086f1c0aa4e9757c3ad58c79e9da  libgomp/testsuite/libgomp.c/pr122281.c
+ fcc4da1244b552bb375f6a3e5c1f5356  libgomp/testsuite/libgomp.c/pr122852.c
  c522146f1617da47efbc34dedb563f61  libgomp/testsuite/libgomp.c/pr24455-1.c
  fc16ef4cc2849f9673cfa72118b38b03  libgomp/testsuite/libgomp.c/pr24455.c
  5f9c41745fbf27e0d2ca8e182c9ff34f  libgomp/testsuite/libgomp.c/pr26171.c
*************** aa5f3d6857ebbdacbc317114429b603a  libgom
*** 139614,139620 ****
  5c41719f58a5064411f8409559fe90a4  libgomp/testsuite/libgomp.c/target-17.c
  8f2af019fdef670d3a01cf4c9c2db643  libgomp/testsuite/libgomp.c/target-18.c
  99aa65fd4472b89cba7adbcc473a8787  libgomp/testsuite/libgomp.c/target-19.c
! 5db64b8d1a5b9e2c35fc058aaf002a15  libgomp/testsuite/libgomp.c/target-20.c
  96268d9b7cf5e004e7d8b46ee3b1fd4c  libgomp/testsuite/libgomp.c/target-21.c
  f2e54a8764788eb33e978b5d31ff89b6  libgomp/testsuite/libgomp.c/target-22.c
  4ce1597f944d0dab5e5edb26f06eb285  libgomp/testsuite/libgomp.c/target-23.c
--- 140208,140214 ----
  5c41719f58a5064411f8409559fe90a4  libgomp/testsuite/libgomp.c/target-17.c
  8f2af019fdef670d3a01cf4c9c2db643  libgomp/testsuite/libgomp.c/target-18.c
  99aa65fd4472b89cba7adbcc473a8787  libgomp/testsuite/libgomp.c/target-19.c
! da7c783b6d1259ce3e7cf23d0e6a963a  libgomp/testsuite/libgomp.c/target-20.c
  96268d9b7cf5e004e7d8b46ee3b1fd4c  libgomp/testsuite/libgomp.c/target-21.c
  f2e54a8764788eb33e978b5d31ff89b6  libgomp/testsuite/libgomp.c/target-22.c
  4ce1597f944d0dab5e5edb26f06eb285  libgomp/testsuite/libgomp.c/target-23.c
*************** ae08608d1d34ffa14592283860b92d45  libgom
*** 139666,139674 ****
  68edfd581475a06b17e8a98d85c86022  libgomp/testsuite/libgomp.c/target-map-zero-sized-3.c
  24c08630e1dc6f184073f42ff7c1bb73  libgomp/testsuite/libgomp.c/target-map-zero-sized.c
  7d9530ec8677e1a90e6b3d38859fc1b2  libgomp/testsuite/libgomp.c/target-print-1.c
! ec5b58aca4cfce9a6dafce47f592cdc3  libgomp/testsuite/libgomp.c/target-simd-clone-1.c
! 602b6f2d636477283d0ff3d6fc3402fc  libgomp/testsuite/libgomp.c/target-simd-clone-2.c
! 3945b32fbe56de1978fd25a17fabaacf  libgomp/testsuite/libgomp.c/target-simd-clone-3.c
  b252b319bbe3ddfce7d52820069e82fe  libgomp/testsuite/libgomp.c/target-teams-1.c
  c37e15563e68af3a9459b8879bf6d99b  libgomp/testsuite/libgomp.c/task-1.c
  b07f3ce8ad8f8edece7624d18f5d154d  libgomp/testsuite/libgomp.c/task-2.c
--- 140260,140268 ----
  68edfd581475a06b17e8a98d85c86022  libgomp/testsuite/libgomp.c/target-map-zero-sized-3.c
  24c08630e1dc6f184073f42ff7c1bb73  libgomp/testsuite/libgomp.c/target-map-zero-sized.c
  7d9530ec8677e1a90e6b3d38859fc1b2  libgomp/testsuite/libgomp.c/target-print-1.c
! 09dca57afc9c61b2c641c70949ad2b8a  libgomp/testsuite/libgomp.c/target-simd-clone-1.c
! d910b3007727e693125b118a82389aa1  libgomp/testsuite/libgomp.c/target-simd-clone-2.c
! c462b175293ed1e3501ec2d51f59cd12  libgomp/testsuite/libgomp.c/target-simd-clone-3.c
  b252b319bbe3ddfce7d52820069e82fe  libgomp/testsuite/libgomp.c/target-teams-1.c
  c37e15563e68af3a9459b8879bf6d99b  libgomp/testsuite/libgomp.c/task-1.c
  b07f3ce8ad8f8edece7624d18f5d154d  libgomp/testsuite/libgomp.c/task-2.c
*************** cbc8d1928586e24499210f2cd9438551  libgom
*** 139717,139723 ****
  21463b128d951cea6b4ea41176379b5c  libgomp/testsuite/libgomp.fortran/alloc-comp-2.f90
  c9531d367dce1d94d1c60a4798d79661  libgomp/testsuite/libgomp.fortran/alloc-comp-3.f90
  fa45380ee93a1192a6e6ef3538c265be  libgomp/testsuite/libgomp.fortran/alloc-comp-4.f90
! d3800d655351c2378745c38ed5a99de4  libgomp/testsuite/libgomp.fortran/alloc-managed-1.f90
  1067959d41c1d727cb8b2b0fb01911a7  libgomp/testsuite/libgomp.fortran/alloc-pinned-1.f90
  9ddc595eb654a0b9f09bb8a163862bd3  libgomp/testsuite/libgomp.fortran/allocatable-comp.f90
  a52dbb26d615e1710d36c7f03cfed8b2  libgomp/testsuite/libgomp.fortran/allocatable1.f90
--- 140311,140317 ----
  21463b128d951cea6b4ea41176379b5c  libgomp/testsuite/libgomp.fortran/alloc-comp-2.f90
  c9531d367dce1d94d1c60a4798d79661  libgomp/testsuite/libgomp.fortran/alloc-comp-3.f90
  fa45380ee93a1192a6e6ef3538c265be  libgomp/testsuite/libgomp.fortran/alloc-comp-4.f90
! 5b681d1577f541c13f167870475d9d03  libgomp/testsuite/libgomp.fortran/alloc-managed-1.f90
  1067959d41c1d727cb8b2b0fb01911a7  libgomp/testsuite/libgomp.fortran/alloc-pinned-1.f90
  9ddc595eb654a0b9f09bb8a163862bd3  libgomp/testsuite/libgomp.fortran/allocatable-comp.f90
  a52dbb26d615e1710d36c7f03cfed8b2  libgomp/testsuite/libgomp.fortran/allocatable1.f90
*************** fb198f79d07000ba2794e9cc222e90f8  libgom
*** 139951,139957 ****
  e0c7a627e2c061377a19883807aabfe2  libgomp/testsuite/libgomp.fortran/map-alloc-comp-6.f90
  6b6de91ce089e96b58d531319cf398d4  libgomp/testsuite/libgomp.fortran/map-alloc-comp-7.f90
  0240fb14a61ab47fba407a3a8493bfc6  libgomp/testsuite/libgomp.fortran/map-alloc-comp-8.f90
! 10190778b4af6170854bedfa75244a91  libgomp/testsuite/libgomp.fortran/map-alloc-comp-9-usm.f90
  11a2994612dda1ea5d074b912ea7e4aa  libgomp/testsuite/libgomp.fortran/map-alloc-comp-9.f90
  f4ad2acbc3bf213777f658e4581eb805  libgomp/testsuite/libgomp.fortran/map-alloc-ptr-1.f90
  18f729a1444b06169904daaa41adb0f4  libgomp/testsuite/libgomp.fortran/map-alloc-ptr-2.f90
--- 140545,140551 ----
  e0c7a627e2c061377a19883807aabfe2  libgomp/testsuite/libgomp.fortran/map-alloc-comp-6.f90
  6b6de91ce089e96b58d531319cf398d4  libgomp/testsuite/libgomp.fortran/map-alloc-comp-7.f90
  0240fb14a61ab47fba407a3a8493bfc6  libgomp/testsuite/libgomp.fortran/map-alloc-comp-8.f90
! ff694c77648180b4ecf0d218e61ad029  libgomp/testsuite/libgomp.fortran/map-alloc-comp-9-usm.f90
  11a2994612dda1ea5d074b912ea7e4aa  libgomp/testsuite/libgomp.fortran/map-alloc-comp-9.f90
  f4ad2acbc3bf213777f658e4581eb805  libgomp/testsuite/libgomp.fortran/map-alloc-ptr-1.f90
  18f729a1444b06169904daaa41adb0f4  libgomp/testsuite/libgomp.fortran/map-alloc-ptr-2.f90
*************** f4ad2acbc3bf213777f658e4581eb805  libgom
*** 139959,139966 ****
--- 140553,140563 ----
  fe829ea13169aa018e2a5ad40e7581b9  libgomp/testsuite/libgomp.fortran/map-subarray-2.f90
  c1190bc5bceb25197c6d0d9b5ba5a2ae  libgomp/testsuite/libgomp.fortran/map-subarray-3.f90
  b2c263036c49be63977c634860a8cf72  libgomp/testsuite/libgomp.fortran/map-subarray-4.f90
+ 50bc585ef798638185f318bffcc439c4  libgomp/testsuite/libgomp.fortran/map-subarray-5-usm.f90
  919c574beca36bdd957b212826948051  libgomp/testsuite/libgomp.fortran/map-subarray-5.f90
+ 69d650b92cb175c8535d6293c55ee9cf  libgomp/testsuite/libgomp.fortran/map-subarray-6-usm.f90
  3016a644377b86aff8cd64f0767eac38  libgomp/testsuite/libgomp.fortran/map-subarray-6.f90
+ 7c0c20265d095118da385dfa15064e4c  libgomp/testsuite/libgomp.fortran/map-subarray-7-usm.f90
  b916bf010c1060aa6d0c7f50cf781f71  libgomp/testsuite/libgomp.fortran/map-subarray-7.f90
  74aa87d51967ef1e4d58a270e8558b81  libgomp/testsuite/libgomp.fortran/map-subarray-8.f90
  33dd6008eda776497e2463d274281b62  libgomp/testsuite/libgomp.fortran/map-subarray-9.f90
*************** ceccd78cff1834f03868559872713a66  libgom
*** 140121,140129 ****
  d83d2615373561e22bd33085adbc3c8e  libgomp/testsuite/libgomp.fortran/target-11.f90
  d9f909ebb4169aa0d6b851dc1ccdec4b  libgomp/testsuite/libgomp.fortran/target-12.f90
  6088668eebebdee2e363a3d9c13c815f  libgomp/testsuite/libgomp.fortran/target-13.f90
! 063a24dc5c19b2adb2c5fcb0b05a58a4  libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90
! 89c53be6c76a8902941180b26848ae9b  libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90
  f3e9642d4302feea21de2d2b9f5ca654  libgomp/testsuite/libgomp.fortran/target-enter-data-1.f90
  10cc37e35fda6c7ed2cff8cf2f9f8371  libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90
  4cff677f5db94e4dec7723c368aef31e  libgomp/testsuite/libgomp.fortran/target-enter-data-3.f90
  cad258d1ebb0ddd9dafd8a3cc0fc7c0c  libgomp/testsuite/libgomp.fortran/target-enter-data-4.f90
--- 140718,140729 ----
  d83d2615373561e22bd33085adbc3c8e  libgomp/testsuite/libgomp.fortran/target-11.f90
  d9f909ebb4169aa0d6b851dc1ccdec4b  libgomp/testsuite/libgomp.fortran/target-12.f90
  6088668eebebdee2e363a3d9c13c815f  libgomp/testsuite/libgomp.fortran/target-13.f90
! 7a32d3e70774cae4da3f980bfd8b6374  libgomp/testsuite/libgomp.fortran/target-allocatable-1-1-usm.f90
! 25598a8e991bcadec2d273a9ff0663bd  libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90
! d24e84b95b77da1764aaecb7956d1645  libgomp/testsuite/libgomp.fortran/target-allocatable-1-2-usm.f90
! eb0616ef115da195c0cf4ec0be1c818e  libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90
  f3e9642d4302feea21de2d2b9f5ca654  libgomp/testsuite/libgomp.fortran/target-enter-data-1.f90
+ 09d9e4b284358385295a01601902d439  libgomp/testsuite/libgomp.fortran/target-enter-data-2-usm.F90
  10cc37e35fda6c7ed2cff8cf2f9f8371  libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90
  4cff677f5db94e4dec7723c368aef31e  libgomp/testsuite/libgomp.fortran/target-enter-data-3.f90
  cad258d1ebb0ddd9dafd8a3cc0fc7c0c  libgomp/testsuite/libgomp.fortran/target-enter-data-4.f90
*************** fa67086ca331f5c3937170a587173c10  libgom
*** 140158,140166 ****
  2091f2ab8064a010253fb962f417a898  libgomp/testsuite/libgomp.fortran/target-memcpy-rect-async-1.f90
  548ed09f85e9ea7b135e720c2e102444  libgomp/testsuite/libgomp.fortran/target-memcpy-rect-async-2.f90
  fa86dfefc4898bd33879aef257ad3fc1  libgomp/testsuite/libgomp.fortran/target-nowait-array-section.f90
! 453ae3ce43888cc2b5758900879a735c  libgomp/testsuite/libgomp.fortran/target-present-1.f90
! beb86fd00c7159b7c9e64baab658450f  libgomp/testsuite/libgomp.fortran/target-present-2.f90
! 7d30e6e2b116e1b138176f9d553356ec  libgomp/testsuite/libgomp.fortran/target-present-3.f90
  ffc4f536027a66699af0956fc5b0d785  libgomp/testsuite/libgomp.fortran/target-print-1.f90
  b7c20b004458fd9909db3090ddfcd1d8  libgomp/testsuite/libgomp.fortran/target-simd.f90
  06e3ddc01cecc71c2af49a64f38f6a88  libgomp/testsuite/libgomp.fortran/target-var.f90
--- 140758,140769 ----
  2091f2ab8064a010253fb962f417a898  libgomp/testsuite/libgomp.fortran/target-memcpy-rect-async-1.f90
  548ed09f85e9ea7b135e720c2e102444  libgomp/testsuite/libgomp.fortran/target-memcpy-rect-async-2.f90
  fa86dfefc4898bd33879aef257ad3fc1  libgomp/testsuite/libgomp.fortran/target-nowait-array-section.f90
! 90ef283e08cb6285cab3cdd40f8c1d8c  libgomp/testsuite/libgomp.fortran/target-present-1-usm.f90
! 6410f9b245c50048dccccc6080da246b  libgomp/testsuite/libgomp.fortran/target-present-1.f90
! 34c7b7bdcd75ae46cf40de9552b2f2be  libgomp/testsuite/libgomp.fortran/target-present-2-usm.f90
! 674fe5134bad0badcd044d35def4c4cb  libgomp/testsuite/libgomp.fortran/target-present-2.f90
! b07707201a161cc672bc60acd1aec156  libgomp/testsuite/libgomp.fortran/target-present-3-usm.f90
! 25f675dca304722a9f04f20b15c3e46b  libgomp/testsuite/libgomp.fortran/target-present-3.f90
  ffc4f536027a66699af0956fc5b0d785  libgomp/testsuite/libgomp.fortran/target-print-1.f90
  b7c20b004458fd9909db3090ddfcd1d8  libgomp/testsuite/libgomp.fortran/target-simd.f90
  06e3ddc01cecc71c2af49a64f38f6a88  libgomp/testsuite/libgomp.fortran/target-var.f90
*************** efb13688b8f5b12df4f386ca40cc687d  libgom
*** 140173,140179 ****
  c7cbb1fd57ef2663e3293bb979181399  libgomp/testsuite/libgomp.fortran/target6.f90
  b1889638e28c31a67ab996e01c764b45  libgomp/testsuite/libgomp.fortran/target7.f90
  675782568bedb5bd5daef132e71aac8c  libgomp/testsuite/libgomp.fortran/target8.f90
! dcfe27eb9dec5095293470aaba48e94a  libgomp/testsuite/libgomp.fortran/target9.f90
  6ba906766b927837b669526edc80e1df  libgomp/testsuite/libgomp.fortran/task-7.f90
  9c0790499c6c651f2b06950352cd7d10  libgomp/testsuite/libgomp.fortran/task-8.f90
  93803cea6999dc2ffa26c3d175258645  libgomp/testsuite/libgomp.fortran/task-detach-1.f90
--- 140776,140782 ----
  c7cbb1fd57ef2663e3293bb979181399  libgomp/testsuite/libgomp.fortran/target6.f90
  b1889638e28c31a67ab996e01c764b45  libgomp/testsuite/libgomp.fortran/target7.f90
  675782568bedb5bd5daef132e71aac8c  libgomp/testsuite/libgomp.fortran/target8.f90
! 08de2e5292d902762d6bce9fff056cc4  libgomp/testsuite/libgomp.fortran/target9.f90
  6ba906766b927837b669526edc80e1df  libgomp/testsuite/libgomp.fortran/task-7.f90
  9c0790499c6c651f2b06950352cd7d10  libgomp/testsuite/libgomp.fortran/task-8.f90
  93803cea6999dc2ffa26c3d175258645  libgomp/testsuite/libgomp.fortran/task-detach-1.f90
*************** a9f926de80d09b0da7520672b009c751  libgom
*** 140741,140747 ****
  e65c44041c15898765a99f6782a191d2  libgomp/testsuite/libgomp.oacc-c-c++-common/vector-type-1.c
  1adf3017b5fe6def74e1026289ff82b8  libgomp/testsuite/libgomp.oacc-c-c++-common/vprop-2.c
  3df312778896ed29ec60eefae35ce701  libgomp/testsuite/libgomp.oacc-c-c++-common/vprop.c
! 43188fab53292c75aaf3b00d92ff1d50  libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c
  4210ba709794292b7c55787ddbfa572a  libgomp/testsuite/libgomp.oacc-c-c++-common/zero_length_subarrays.c
  2a6a62d82b16b3bd4b1ab343e02eaed3  libgomp/testsuite/libgomp.oacc-c/c.exp
  cbdcc7dbb1bbfcb008b972db87d6a771  libgomp/testsuite/libgomp.oacc-c/nested-function-1.c
--- 141344,141350 ----
  e65c44041c15898765a99f6782a191d2  libgomp/testsuite/libgomp.oacc-c-c++-common/vector-type-1.c
  1adf3017b5fe6def74e1026289ff82b8  libgomp/testsuite/libgomp.oacc-c-c++-common/vprop-2.c
  3df312778896ed29ec60eefae35ce701  libgomp/testsuite/libgomp.oacc-c-c++-common/vprop.c
! 740bb3c7370aed8a10c47e96dc522237  libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c
  4210ba709794292b7c55787ddbfa572a  libgomp/testsuite/libgomp.oacc-c-c++-common/zero_length_subarrays.c
  2a6a62d82b16b3bd4b1ab343e02eaed3  libgomp/testsuite/libgomp.oacc-c/c.exp
  cbdcc7dbb1bbfcb008b972db87d6a771  libgomp/testsuite/libgomp.oacc-c/nested-function-1.c
*************** d1c33a8b5e0f3d9a19ffe583f8e72f56  libgru
*** 141738,141744 ****
  c21183b1df7f7afb240d765035277db1  libgrust/rustc-lib/version-info
  99c2e5e712b990ee07be10f53e41f3fb  libiberty/.gitignore
  a916467b91076e631dd8edb7424769c7  libiberty/COPYING.LIB
! f9dfedf550afff7cdfc721f507121c3e  libiberty/ChangeLog
  347c31392973de6a4872d540c1718dc1  libiberty/ChangeLog.jit
  de0b0731d5d06e748df71e896c6078a5  libiberty/Makefile.in
  8b93d0e0369daed24e2260ccfd102eb3  libiberty/README
--- 142341,142347 ----
  c21183b1df7f7afb240d765035277db1  libgrust/rustc-lib/version-info
  99c2e5e712b990ee07be10f53e41f3fb  libiberty/.gitignore
  a916467b91076e631dd8edb7424769c7  libiberty/COPYING.LIB
! 1654efba5db9e1362973aedf94565705  libiberty/ChangeLog
  347c31392973de6a4872d540c1718dc1  libiberty/ChangeLog.jit
  de0b0731d5d06e748df71e896c6078a5  libiberty/Makefile.in
  8b93d0e0369daed24e2260ccfd102eb3  libiberty/README
*************** d2f8420243d7223cc896b7a6308fd19a  libibe
*** 141821,141827 ****
  5f0eb20e9ed4d7e6c2eb9d1baf4d9dc9  libiberty/memset.c
  042bf04268346eaad968d92c3d0433b2  libiberty/mkstemps.c
  7897e43bedd2def4beb6eb73003efa68  libiberty/msdos.c
! 0ad5a6fba7d490084642fd17c8e78db1  libiberty/objalloc.c
  e34765e40f64a3f6763e5f33501d0622  libiberty/obstack.c
  60e853e97e156d94dfb6374f701b99ab  libiberty/obstacks.texi
  77492cc9bc9b6bb783538e0ef02450ad  libiberty/partition.c
--- 142424,142430 ----
  5f0eb20e9ed4d7e6c2eb9d1baf4d9dc9  libiberty/memset.c
  042bf04268346eaad968d92c3d0433b2  libiberty/mkstemps.c
  7897e43bedd2def4beb6eb73003efa68  libiberty/msdos.c
! c2f3de4d053cc63c57e672c972866db7  libiberty/objalloc.c
  e34765e40f64a3f6763e5f33501d0622  libiberty/obstack.c
  60e853e97e156d94dfb6374f701b99ab  libiberty/obstacks.texi
  77492cc9bc9b6bb783538e0ef02450ad  libiberty/partition.c
*************** a73d560a3ba317c5ad0a7919d87b4b6d  libssp
*** 143734,143740 ****
  7d75fa0d30318408fe4cd91d9cbe3ac7  libssp/vsnprintf-chk.c
  e9ff0f4bdd1be75a507480ed1267459d  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! a677232462246b1f7a8f11a3ed82ed81  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
--- 144337,144343 ----
  7d75fa0d30318408fe4cd91d9cbe3ac7  libssp/vsnprintf-chk.c
  e9ff0f4bdd1be75a507480ed1267459d  libssp/vsprintf-chk.c
  9e2de2e1f20ab0ffa2201164de02824f  libstdc++-v3/.editorconfig
! 87b5a5bdb4b8801b8700212ff8d283d7  libstdc++-v3/ChangeLog
  7aa6c40440a44fcf5ec94c066160c2f8  libstdc++-v3/ChangeLog-1998
  7aff86600b6a1ed3fa87305075a92db0  libstdc++-v3/ChangeLog-1999
  a6f28e8fc9bb07696a9e068b439a3a87  libstdc++-v3/ChangeLog-2000
*************** f774a16511cbcae3a91bcc69a897bbbc  libstd
*** 143790,143796 ****
  3ed9ad145022e2626ac8fa1f90db2d12  libstdc++-v3/config/abi/post/riscv64-linux-gnu/baseline_symbols.txt
  3ec228e0d9301df0938cba4a7fb94374  libstdc++-v3/config/abi/post/s390-linux-gnu/baseline_symbols.txt
  3ec228e0d9301df0938cba4a7fb94374  libstdc++-v3/config/abi/post/s390x-linux-gnu/32/baseline_symbols.txt
! 70993c5bcc5c0d004dd1b8020e63cf28  libstdc++-v3/config/abi/post/s390x-linux-gnu/baseline_symbols.txt
  cc65678819ec7ff06eaeed8b1a5455eb  libstdc++-v3/config/abi/post/sparc-linux-gnu/baseline_symbols.txt
  b956a0c1d4368f5175f30b8da133a56e  libstdc++-v3/config/abi/post/sparc-solaris/baseline_symbols.txt
  abc6f4755fae8c6e8f45ce5fee798654  libstdc++-v3/config/abi/post/sparc-solaris/sparcv9/baseline_symbols.txt
--- 144393,144399 ----
  3ed9ad145022e2626ac8fa1f90db2d12  libstdc++-v3/config/abi/post/riscv64-linux-gnu/baseline_symbols.txt
  3ec228e0d9301df0938cba4a7fb94374  libstdc++-v3/config/abi/post/s390-linux-gnu/baseline_symbols.txt
  3ec228e0d9301df0938cba4a7fb94374  libstdc++-v3/config/abi/post/s390x-linux-gnu/32/baseline_symbols.txt
! c2f539d78b1b45f6e47b9f9aa356a5ef  libstdc++-v3/config/abi/post/s390x-linux-gnu/baseline_symbols.txt
  cc65678819ec7ff06eaeed8b1a5455eb  libstdc++-v3/config/abi/post/sparc-linux-gnu/baseline_symbols.txt
  b956a0c1d4368f5175f30b8da133a56e  libstdc++-v3/config/abi/post/sparc-solaris/baseline_symbols.txt
  abc6f4755fae8c6e8f45ce5fee798654  libstdc++-v3/config/abi/post/sparc-solaris/sparcv9/baseline_symbols.txt
*************** abc6f4755fae8c6e8f45ce5fee798654  libstd
*** 143801,143807 ****
  6c165e7a2d80e986556ae6dc2bad3857  libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt
  5c4c38aeca254313c616b84337c937c3  libstdc++-v3/config/abi/pre/float128.ver
  d8fba4e72b3bac4b2fa939d9ec589c51  libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
! 891188db8cca73a1c7655dc692421190  libstdc++-v3/config/abi/pre/gnu.ver
  b01f8da8f4373070847fe317fe8a546e  libstdc++-v3/config/abi/pre/none.ver
  a2a19bba90a6663d180d5d9f7b28b623  libstdc++-v3/config/allocator/malloc_allocator_base.h
  92afc718fea5d5748cbf18f969414917  libstdc++-v3/config/allocator/new_allocator_base.h
--- 144404,144410 ----
  6c165e7a2d80e986556ae6dc2bad3857  libstdc++-v3/config/abi/post/x86_64-linux-gnu/x32/baseline_symbols.txt
  5c4c38aeca254313c616b84337c937c3  libstdc++-v3/config/abi/pre/float128.ver
  d8fba4e72b3bac4b2fa939d9ec589c51  libstdc++-v3/config/abi/pre/gnu-versioned-namespace.ver
! 33137a53f652d24cd432293a2fa8bc2f  libstdc++-v3/config/abi/pre/gnu.ver
  b01f8da8f4373070847fe317fe8a546e  libstdc++-v3/config/abi/pre/none.ver
  a2a19bba90a6663d180d5d9f7b28b623  libstdc++-v3/config/allocator/malloc_allocator_base.h
  92afc718fea5d5748cbf18f969414917  libstdc++-v3/config/allocator/new_allocator_base.h
*************** bc0412a9556e7ed39afe5103b73f1f26  libstd
*** 144398,144405 ****
  7b70f0f77a50b976605aef6dbeb1e282  libstdc++-v3/doc/xml/spine.xml
  bd966b4a0df6f2a84f9770525581d45c  libstdc++-v3/doc/xsl/customization.xsl.in
  42d14268f2b16c54a6bc2f71538a838c  libstdc++-v3/fragment.am
! 871612d3fa3d089fe0e956e33aac40d7  libstdc++-v3/include/Makefile.am
! a04390416b071401200d585473d823f2  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
--- 145001,145008 ----
  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
*************** dec832c4e096f15d10aafd4c825cc195  libstd
*** 144416,144422 ****
  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
! 44b907843b209009f25c0ba9e6d5e640  libstdc++-v3/include/bits/atomic_wait.h
  65e262c95ca2a5021497a947a07b5d48  libstdc++-v3/include/bits/basic_ios.h
  e0d25c8ddeac5ee95a7b60861849f304  libstdc++-v3/include/bits/basic_ios.tcc
  c747603193d260bfba0d73229384fc23  libstdc++-v3/include/bits/basic_string.h
--- 145019,145025 ----
  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
  65e262c95ca2a5021497a947a07b5d48  libstdc++-v3/include/bits/basic_ios.h
  e0d25c8ddeac5ee95a7b60861849f304  libstdc++-v3/include/bits/basic_ios.tcc
  c747603193d260bfba0d73229384fc23  libstdc++-v3/include/bits/basic_string.h
*************** d209b8063483aa0b8623963ca5d039a2  libstd
*** 144460,144466 ****
  06b4263267a102d1ab00cc2f9647964c  libstdc++-v3/include/bits/invoke.h
  4150f8a8b9f1d62d09bec752e3f3476a  libstdc++-v3/include/bits/ios_base.h
  1fc82914e7574979e75201ce425f67ef  libstdc++-v3/include/bits/istream.tcc
! b7b87f3f761e06c49460bfb5cf95082f  libstdc++-v3/include/bits/iterator_concepts.h
  dbb38e51004a447016e1e173b48b4e27  libstdc++-v3/include/bits/list.tcc
  4c22a893ca8a2b9ff88b689b6d5bb1ca  libstdc++-v3/include/bits/locale_classes.h
  a24ec2cbb7ec61510b16ffcdecba54dd  libstdc++-v3/include/bits/locale_classes.tcc
--- 145063,145069 ----
  06b4263267a102d1ab00cc2f9647964c  libstdc++-v3/include/bits/invoke.h
  4150f8a8b9f1d62d09bec752e3f3476a  libstdc++-v3/include/bits/ios_base.h
  1fc82914e7574979e75201ce425f67ef  libstdc++-v3/include/bits/istream.tcc
! 675990bcb7251fa8ae5aa34ac346d80c  libstdc++-v3/include/bits/iterator_concepts.h
  dbb38e51004a447016e1e173b48b4e27  libstdc++-v3/include/bits/list.tcc
  4c22a893ca8a2b9ff88b689b6d5bb1ca  libstdc++-v3/include/bits/locale_classes.h
  a24ec2cbb7ec61510b16ffcdecba54dd  libstdc++-v3/include/bits/locale_classes.tcc
*************** f5291a41594cbc2cfdc8240cb611d8b1  libstd
*** 144535,144541 ****
  c53878727e94c56c0b362d17dfe0fca2  libstdc++-v3/include/bits/stl_construct.h
  c56a5e22a7aa2899e57a689ddfa64b43  libstdc++-v3/include/bits/stl_deque.h
  04e6a1526f87da35dce0a6f865622fad  libstdc++-v3/include/bits/stl_function.h
! 4e53d691b16c47fa9137ea0be3be23c7  libstdc++-v3/include/bits/stl_heap.h
  bd2e27c602ee02023df28ac89c0ad816  libstdc++-v3/include/bits/stl_iterator.h
  08f3002267b4b29c0a28c75c6da5cf82  libstdc++-v3/include/bits/stl_iterator_base_funcs.h
  e8556ffa25de8ce12d02235826b7f595  libstdc++-v3/include/bits/stl_iterator_base_types.h
--- 145138,145144 ----
  c53878727e94c56c0b362d17dfe0fca2  libstdc++-v3/include/bits/stl_construct.h
  c56a5e22a7aa2899e57a689ddfa64b43  libstdc++-v3/include/bits/stl_deque.h
  04e6a1526f87da35dce0a6f865622fad  libstdc++-v3/include/bits/stl_function.h
! 4af65d6cfcd3e9943b1da341c9fa26ad  libstdc++-v3/include/bits/stl_heap.h
  bd2e27c602ee02023df28ac89c0ad816  libstdc++-v3/include/bits/stl_iterator.h
  08f3002267b4b29c0a28c75c6da5cf82  libstdc++-v3/include/bits/stl_iterator_base_funcs.h
  e8556ffa25de8ce12d02235826b7f595  libstdc++-v3/include/bits/stl_iterator_base_types.h
*************** d1cf5a35c4ad3820cb023d8f84762cc7  libstd
*** 144576,144583 ****
  ddd4bdc2fa29f8f2aa3386cead9ebcb2  libstdc++-v3/include/bits/valarray_array.tcc
  16c6db3f5b1e7b3e37c3febbf4dc4e8c  libstdc++-v3/include/bits/valarray_before.h
  5a7dd3eca21d4650e654ea51da466c59  libstdc++-v3/include/bits/vector.tcc
! 89e60e8632294d3913c8f2dd9cd06e90  libstdc++-v3/include/bits/version.def
! 6ed54a99ef25b98b93625a058985190a  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
--- 145179,145186 ----
  ddd4bdc2fa29f8f2aa3386cead9ebcb2  libstdc++-v3/include/bits/valarray_array.tcc
  16c6db3f5b1e7b3e37c3febbf4dc4e8c  libstdc++-v3/include/bits/valarray_before.h
  5a7dd3eca21d4650e654ea51da466c59  libstdc++-v3/include/bits/vector.tcc
! 31c6f0e0ed70ad876efb6089704d30ef  libstdc++-v3/include/bits/version.def
! 3a364f21bb7aa48953d976c132cb172d  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
*************** c698c1ffe0a8bca7840bf982885e5592  libstd
*** 145098,145104 ****
  b598ca744dd57c47a8db41c9c83fa8c4  libstdc++-v3/include/parallel/unique_copy.h
  d8d948c3273e96ae05bc4e2157b7ed8f  libstdc++-v3/include/parallel/workstealing.h
  efd116d146d6a6c8e05e44e670969ea4  libstdc++-v3/include/precompiled/extc++.h
! 584d24da01ea78e8bcbc9159dc6f6fa5  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
--- 145701,145707 ----
  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
*************** e13aa398b297358df449791a35753c9b  libstd
*** 145166,145171 ****
--- 145769,145775 ----
  0ad5b6c8098cd5eba2a4160a431f554d  libstdc++-v3/include/std/mdspan
  78c1d1dab9dcd12a4cb99d5911d27568  libstdc++-v3/include/std/memory
  ea0d67f29f1a73f1ccdade0115646a1c  libstdc++-v3/include/std/memory_resource
+ 6e451bc77cd2f67e1f0ab00b66f4f43f  libstdc++-v3/include/std/meta
  6042ceb95043702de02a8354f2507317  libstdc++-v3/include/std/mutex
  98a3e25011c5fb2383b3824b1c349d43  libstdc++-v3/include/std/numbers
  6a44514a47e24df75405dc1d397afc69  libstdc++-v3/include/std/numeric
*************** f5a5ebc7b6133572f8f361cde93ec52f  libstd
*** 145198,145204 ****
  608edef7344e2e25c7b00170df6fa9e6  libstdc++-v3/include/std/text_encoding
  0e55da688cfae6ed254c1328fad9c8ad  libstdc++-v3/include/std/thread
  18066f87725dc5e14297a90730d89f30  libstdc++-v3/include/std/tuple
! 3bfa993cb464387249e8b2cf75248287  libstdc++-v3/include/std/type_traits
  66a7939bfcb3a6f5966552f3fb49a384  libstdc++-v3/include/std/typeindex
  8689664c4fb3fe9445086a22c3f4a18b  libstdc++-v3/include/std/unordered_map
  7a4ca06500f14aacb6b6609c40f4eb86  libstdc++-v3/include/std/unordered_set
--- 145802,145808 ----
  608edef7344e2e25c7b00170df6fa9e6  libstdc++-v3/include/std/text_encoding
  0e55da688cfae6ed254c1328fad9c8ad  libstdc++-v3/include/std/thread
  18066f87725dc5e14297a90730d89f30  libstdc++-v3/include/std/tuple
! e465f9065fdc0cd37abb571a528cdc3d  libstdc++-v3/include/std/type_traits
  66a7939bfcb3a6f5966552f3fb49a384  libstdc++-v3/include/std/typeindex
  8689664c4fb3fe9445086a22c3f4a18b  libstdc++-v3/include/std/unordered_map
  7a4ca06500f14aacb6b6609c40f4eb86  libstdc++-v3/include/std/unordered_set
*************** fbb127f006c65ae37d591c627cc6235c  libstd
*** 145497,145503 ****
  04669634e7d7f19fae4baadedc6d0908  libstdc++-v3/src/c++17/uint128_t.h
  2667b57b71cdb4809c2d08103ab7a239  libstdc++-v3/src/c++20/Makefile.am
  8992329b44e206ac3d5b63e10bf82246  libstdc++-v3/src/c++20/Makefile.in
! 6c9a4a556a43184494473d3ab8a556fb  libstdc++-v3/src/c++20/atomic.cc
  e017d47cedd4e843177ec9ff2c936541  libstdc++-v3/src/c++20/clock.cc
  94b3ab191e8fe566a951ac2b4f081c40  libstdc++-v3/src/c++20/format.cc
  c2bd27af25e57adce5807e0f01a2d0dc  libstdc++-v3/src/c++20/sstream-inst.cc
--- 146101,146107 ----
  04669634e7d7f19fae4baadedc6d0908  libstdc++-v3/src/c++17/uint128_t.h
  2667b57b71cdb4809c2d08103ab7a239  libstdc++-v3/src/c++20/Makefile.am
  8992329b44e206ac3d5b63e10bf82246  libstdc++-v3/src/c++20/Makefile.in
! ccf4239a6340788ca2b18d64e365b37c  libstdc++-v3/src/c++20/atomic.cc
  e017d47cedd4e843177ec9ff2c936541  libstdc++-v3/src/c++20/clock.cc
  94b3ab191e8fe566a951ac2b4f081c40  libstdc++-v3/src/c++20/format.cc
  c2bd27af25e57adce5807e0f01a2d0dc  libstdc++-v3/src/c++20/sstream-inst.cc
*************** ba1de75ac9c1bb7d2506c503fe17708a  libstd
*** 145511,145517 ****
  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
! 749d5f03c1747271ded2795da84c9a8e  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
--- 146115,146121 ----
  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
*************** eff3aec53990c6bfc2d6467b7f80b49d  libstd
*** 146411,146416 ****
--- 147015,147023 ----
  c830f82bd430ccc48fd8879bb6aab494  libstdc++-v3/testsuite/20_util/is_const/value.cc
  8512866144ef7d6e0bdc360363b2e91b  libstdc++-v3/testsuite/20_util/is_constant_evaluated/1.cc
  07d5c1fbd55889a7b9d326cb29621fc3  libstdc++-v3/testsuite/20_util/is_constant_evaluated/noexcept.cc
+ ad21f35ae233efced0fe17ca9c84f07a  libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/explicit_instantiation.cc
+ 1eaa4a3ff8dd3a0dead835b5f67f37c4  libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/typedefs.cc
+ 47fce5ae3f08e42eaaabe495207bf6da  libstdc++-v3/testsuite/20_util/is_consteval_only/value.cc
  bd2945e4de0798dbc26bff03145c982f  libstdc++-v3/testsuite/20_util/is_constructible/51185.cc
  a5e184714ddd867798fa94c2ebe2c9fe  libstdc++-v3/testsuite/20_util/is_constructible/68430.cc
  d2fd4eae55a898a976457f234a05c32b  libstdc++-v3/testsuite/20_util/is_constructible/77395.cc
*************** bcc5dd4d3ad8efc617c688a8514b20a9  libstd
*** 146582,146587 ****
--- 147189,147197 ----
  9dce84a8af58156dc86b7aac27b3e567  libstdc++-v3/testsuite/20_util/is_reference/requirements/explicit_instantiation.cc
  76806791ec2fcac40a8ac8c78cb0f40f  libstdc++-v3/testsuite/20_util/is_reference/requirements/typedefs.cc
  fe496498c2089342f6b554a3a1327840  libstdc++-v3/testsuite/20_util/is_reference/value.cc
+ ae5f1246833937e60afd0110ad00bf39  libstdc++-v3/testsuite/20_util/is_reflection/requirements/explicit_instantiation.cc
+ 1727c6519417e3e040827cd8a14b95ee  libstdc++-v3/testsuite/20_util/is_reflection/requirements/typedefs.cc
+ 883083a63fd637f64f79b4dd3e63d004  libstdc++-v3/testsuite/20_util/is_reflection/value.cc
  323da33a7f515df7b35219b544f6bcbe  libstdc++-v3/testsuite/20_util/is_rvalue_reference/requirements/explicit_instantiation.cc
  d111b68444cde568124d67b51b586979  libstdc++-v3/testsuite/20_util/is_rvalue_reference/requirements/typedefs.cc
  058ff687e1105c56bdfa2cd6c5ba6c57  libstdc++-v3/testsuite/20_util/is_rvalue_reference/value.cc
*************** e0d44cbad1eb705070d90f8be658add1  libstd
*** 147402,147408 ****
  9a49272a09aaad1f39daf2c5791b5420  libstdc++-v3/testsuite/20_util/uses_allocator/requirements/uses_allocator_v.cc
  696874efad5e42cc8d20940428caca19  libstdc++-v3/testsuite/20_util/uses_allocator/uninitialized_construct.cc
  6b0af96b25bbf619c8b4fc01b1d8cf30  libstdc++-v3/testsuite/20_util/uses_allocator/value.cc
! a48367a10ddd43e90007245b06f8115e  libstdc++-v3/testsuite/20_util/variable_templates_for_traits.cc
  b9698b5e78dcefad507d6737875a6a1d  libstdc++-v3/testsuite/20_util/variant/100384.cc
  5ef3d7df10dd90d995e4c63bc62c39de  libstdc++-v3/testsuite/20_util/variant/102912.cc
  8a98faef69d02af6ad48bf92f83aa16d  libstdc++-v3/testsuite/20_util/variant/112591.cc
--- 148012,148018 ----
  9a49272a09aaad1f39daf2c5791b5420  libstdc++-v3/testsuite/20_util/uses_allocator/requirements/uses_allocator_v.cc
  696874efad5e42cc8d20940428caca19  libstdc++-v3/testsuite/20_util/uses_allocator/uninitialized_construct.cc
  6b0af96b25bbf619c8b4fc01b1d8cf30  libstdc++-v3/testsuite/20_util/uses_allocator/value.cc
! eeea30fc09efcbee0b605004af8cd30d  libstdc++-v3/testsuite/20_util/variable_templates_for_traits.cc
  b9698b5e78dcefad507d6737875a6a1d  libstdc++-v3/testsuite/20_util/variant/100384.cc
  5ef3d7df10dd90d995e4c63bc62c39de  libstdc++-v3/testsuite/20_util/variant/102912.cc
  8a98faef69d02af6ad48bf92f83aa16d  libstdc++-v3/testsuite/20_util/variant/112591.cc
*************** a5eb83d8a3f95f2c59a9dfc9c479e10f  libstd
*** 151203,151208 ****
--- 151813,151819 ----
  a07745bc3daad10d22bb51a685e38ccf  libstdc++-v3/testsuite/25_algorithms/sort/requirements/explicit_instantiation/pod.cc
  4c2a224d0d0799a0ccb5e357b8ab1bfb  libstdc++-v3/testsuite/25_algorithms/sort/vectorbool.cc
  4fc06400852be08d251e6fdbe01bfc7a  libstdc++-v3/testsuite/25_algorithms/sort_heap/check_compare_by_value.cc
+ f60389be6df402fcd03e8c914dd36763  libstdc++-v3/testsuite/25_algorithms/sort_heap/check_proxy_brackets.cc
  b21c211f10d0ea580e46c7ad49849a39  libstdc++-v3/testsuite/25_algorithms/sort_heap/complexity.cc
  a981dd3f4793ad460e58d24511d956d8  libstdc++-v3/testsuite/25_algorithms/sort_heap/constexpr.cc
  83c1b359ec1a642347f1b79af3397f9a  libstdc++-v3/testsuite/25_algorithms/sort_heap/requirements/explicit_instantiation/2.cc
*************** bf3b0b114ea3efdbd4365c99cdd7742b  libstd
*** 151755,151761 ****
  16e9828686b07c695b1fcdf17b2fa2e0  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/cons/parms.cc
  efcb84be5a12aa91b3606ed0a050de2f  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/64351.cc
  ba065f15aed902b5215a94e08fdd6eaa  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/equal.cc
! 5ba91e2cb224c5b66e31b924c722fd79  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon.cc
  316869129064e3da75b4d3639c05a9ff  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon_eng.cc
  5a4f033756610029c09db4bcce859646  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/inequal.cc
  47a1c582eeebb3f94b058bb87f680102  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/serialize.cc
--- 152366,152372 ----
  16e9828686b07c695b1fcdf17b2fa2e0  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/cons/parms.cc
  efcb84be5a12aa91b3606ed0a050de2f  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/64351.cc
  ba065f15aed902b5215a94e08fdd6eaa  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/equal.cc
! 54b97ad7ccfa51187caaa1eaefa6191c  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon.cc
  316869129064e3da75b4d3639c05a9ff  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon_eng.cc
  5a4f033756610029c09db4bcce859646  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/inequal.cc
  47a1c582eeebb3f94b058bb87f680102  libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/serialize.cc
*************** e0f7d13a790b40f07a58ba70a8d2e554  libstd
*** 155868,155874 ****
  a61da9cbd87ad94712cf12bae7e1c98f  libstdc++-v3/testsuite/util/testsuite_hooks.cc
  37dbdb4efaa4756802e9d59a40b5f911  libstdc++-v3/testsuite/util/testsuite_hooks.h
  e63fd0c6465f79a8ba5e9ca578ce9b07  libstdc++-v3/testsuite/util/testsuite_io.h
! 4a4fa35e20ea28ae9f81d607f012b5f3  libstdc++-v3/testsuite/util/testsuite_iterators.h
  661c313306e35430e26daff84954a8fb  libstdc++-v3/testsuite/util/testsuite_new_operators.h
  5d84fdc1643c22bc0cf8019170a06aab  libstdc++-v3/testsuite/util/testsuite_performance.h
  8ddb64c826c6cf6105b2d30ef241ec43  libstdc++-v3/testsuite/util/testsuite_random.h
--- 156479,156485 ----
  a61da9cbd87ad94712cf12bae7e1c98f  libstdc++-v3/testsuite/util/testsuite_hooks.cc
  37dbdb4efaa4756802e9d59a40b5f911  libstdc++-v3/testsuite/util/testsuite_hooks.h
  e63fd0c6465f79a8ba5e9ca578ce9b07  libstdc++-v3/testsuite/util/testsuite_io.h
! 4e37bb0b2da2cce7a6c71fb5b712d7f7  libstdc++-v3/testsuite/util/testsuite_iterators.h
  661c313306e35430e26daff84954a8fb  libstdc++-v3/testsuite/util/testsuite_new_operators.h
  5d84fdc1643c22bc0cf8019170a06aab  libstdc++-v3/testsuite/util/testsuite_performance.h
  8ddb64c826c6cf6105b2d30ef241ec43  libstdc++-v3/testsuite/util/testsuite_random.h
diff -Nrcpad gcc-16-20260111/gcc/BASE-VER gcc-16-20260118/gcc/BASE-VER
*** gcc-16-20260111/gcc/BASE-VER	Sun Jan 11 22:32:05 2026
--- gcc-16-20260118/gcc/BASE-VER	Sun Jan 18 22:32:06 2026
***************
*** 1 ****
! 16.0.0
--- 1 ----
! 16.0.1
diff -Nrcpad gcc-16-20260111/gcc/ChangeLog gcc-16-20260118/gcc/ChangeLog
*** gcc-16-20260111/gcc/ChangeLog	Sun Jan 11 22:32:05 2026
--- gcc-16-20260118/gcc/ChangeLog	Sun Jan 18 22:32:06 2026
***************
*** 1,3 ****
--- 1,838 ----
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	* config/darwin.opt.urls: Regenerated.
+ 	* config/dragonfly.opt.urls: Regenerated.
+ 	* config/freebsd.opt.urls: Regenerated.
+ 	* config/gnu-user.opt.urls: Regenerated.
+ 	* config/hpux11.opt.urls: Regenerated.
+ 	* config/i386/cygwin.opt.urls: Regenerated.
+ 	* config/i386/i386.opt.urls: Regenerated.
+ 	* config/mingw/mingw.opt.urls: Regenerated.
+ 	* config/nds32/nds32.opt.urls: Regenerated.
+ 	* config/netbsd.opt.urls: Regenerated.
+ 	* config/nvptx/nvptx.opt.urls: Regenerated.
+ 	* config/openbsd.opt.urls: Regenerated.
+ 	* config/pru/pru.opt.urls: Regenerated.
+ 	* config/riscv/riscv.opt.urls: Regenerated.
+ 	* config/rl78/rl78.opt.urls: Regenerated.
+ 	* config/rs6000/aix64.opt.urls: Regenerated.
+ 	* config/rs6000/rs6000.opt.urls: Regenerated.
+ 	* config/rs6000/sysv4.opt.urls: Regenerated.
+ 	* config/rtems.opt.urls: Regenerated.
+ 	* config/rx/rx.opt.urls: Regenerated.
+ 	* config/s390/s390.opt.urls: Regenerated.
+ 	* config/s390/tpf.opt.urls: Regenerated.
+ 	* config/sh/sh.opt.urls: Regenerated.
+ 	* config/sol2.opt.urls: Regenerated.
+ 	* config/sparc/sparc.opt.urls: Regenerated.
+ 	* config/v850/v850.opt.urls: Regenerated.
+ 	* config/vax/vax.opt.urls: Regenerated.
+ 	* config/vxworks.opt.urls: Regenerated.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/nds32/nds32.opt: Tidy documentation strings.
+ 	(mbig-endian, mlittle-endian): Remove "Undocumented" flag since
+ 	these are, in fact, documented.
+ 	* doc/invoke.texi (Option Summary) <NDS32 Options>: Document
+ 	-EB, -EL, -mabi, -mfloat-abi, -malways-align, -malign-functions,
+ 	-mfp-as-gp, -mext-dsp, -mext-fpu-fma, -mext-fpu-sp, -mext-fpu-dp,
+ 	-misr-vector-size, -misr-secure, -mcpu, -mconfig-fpu,
+ 	-mconfig-mul, -mconfig-register-ports, -mrelax-hint,
+ 	-msched-prolog-epilog, -mno-ret-in-naked-func, -malways-save-lp,
+ 	-munaligned-access, and -minline-asm-r15.
+ 	(NDS32 Options): Likewise.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/xtensa/uclinux.opt (elf2flt, elf2flt=): Mark as Undocumented.
+ 	* config/xtensa/xtensa.opt (mlra): Likewise.
+ 	* doc/invoke.texi (Option Summary) <Xtensa Options>: Remove
+ 	redundant negative forms plus obsolete -mfused-madd option.
+ 	(Xtensa Options): Likewise undocument -mfused-madd.  List
+ 	negative form of -mforce-no-pic.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/i386/i386.opt (malign-functions): Mark undocumented/unused
+ 	option as Undocumented.
+ 	(malign-jumps): Likewise.
+ 	(malign-loops): Likewise.
+ 	(mbranch-cost, mforce-drap): Mark undocumented options likely
+ 	intended for developer use only as Undocumented.
+ 	(mstv): Correct sense of option in doc string.
+ 	(mavx512cd): Remove extra "and" from doc string.
+ 	(mavx512dq): Likewise.
+ 	(mavx512bw): Likewise.
+ 	(mavx512vl): Likewise.
+ 	(mavx512ifma): Likewise.
+ 	(mavx512bvmi): Likewise.
+ 	* doc/invoke.texi (Options Summary) <x86 Options>: Add
+ 	missing options.  Correct whitespace and re-wrap long lines.
+ 	Remove -mthreads which is now classed as a MinGW option.
+ 	(Cygwin and MinGW Options): Replace existing documentation of
+ 	-mthreads with the more detailed text moved from x86 Options.
+ 	(x86 Options): Move introductory text about ISA extensions before
+ 	the individual options instead of after.  Document them all
+ 	individually instead of as a group, and move immediately after
+ 	-march/-mtune documentation.  Rewrap long lines.  Document
+ 	interaction between SSE and AVX with -mfpmath=sse.  Move -masm
+ 	documentation farther down instead of grouped with options
+ 	affecting floating-point behavior.  Add missing @opindex
+ 	entries.  Rewrite the -mdaz-ftz documentation.  Document
+ 	-mstack-arg-probe.  Copy-editing.  Document -mstv.  Remove
+ 	obsolete warning about -mskip-rax-setup in very old GCC versions.
+ 	Rewrite the -mapx-inline-asm-use-gpr32 documentation.
+ 	Document -mgather and -mscatter.  Split -miamcu documentation
+ 	from -m32/-m64/etc.  Rewrite -munroll-only-small-loops documentation.
+ 	Document -mdispatch-scheduler.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* doc/invoke.texi (Option Summary) <VxWorks Options>: Add -mvthreads.
+ 	(VxWorks Options): Likewise.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/vms/vms.opt (map): Mark as Undocumented.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/visium/visium.opt (menable-trampolines): Mark Undocumented.
+ 	* doc/invoke.texi (Options Summary) <Visium Options>: Remove
+ 	redundant -mno- option.
+ 	(Visium Options): Copy-editing to put in active voice and add markup.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/vax/elf.opt (mno-asm-pic): Mark as Undocumented.
+ 	* doc/invoke.texi (Option Summary) <VAX Options>: Add
+ 	-mvaxc-alignment and -mqmath.
+ 	(VAX Options): Likewise.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/v850/v850.opt: Copy-edit documentation strings.
+ 	(mdebug): Make Undocumented.
+ 	(mno-strict-align): Add RejectNegative.
+ 	(mUS-bit-set): Make Undocumented.
+ 	* doc/invoke.texi (Option Summary) <V850 Options>: Remove
+ 	redundant -mno- forms from list.  Add missing entries.
+ 	(V850 Options): Add @opindex for negative forms.  Combine
+ 	entries for -mapp-regs and -mno-app-regs.  Document -msmall-sld,
+ 	-mno-strict-align, and -mjump-tables-in-data-section.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* doc/invoke.texi (Option Summary) <SPARC Options>: Remove
+ 	redundant -mno- forms from the list.  Add -mptr32 and -mptr64.
+ 	(SPARC Options): Document -mptr32 and -mptr64.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* doc/invoke.texi (Option Summary) <Solaris 2 Options>:
+ 	Remove redundant negative option forms from list.  List both
+ 	-pthread and -pthreads.
+ 	(Solaris 2 Options): Index and list the negative forms here.
+ 	Combine the two @table environments.  Document both -pthread
+ 	and -pthreads.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/sh/sh.opt (mhitachi, mpadstruct): Mark obsolete options
+ 	as Undocumented.
+ 	* doc/invoke.texi (Option Summary) <SH Options>: Add missing
+ 	entries for -m4-* and other options.  Remove redundant -mno- entries
+ 	and obsolete options.  Add missing options -mfdpic, -mlra.
+ 	(SH Options): Combine entries for -mrenesas and -mno-renesas.
+ 	Index and list -mno- forms for other options that have them.
+ 	Remove documentation for obsolete options -mpadstruct and
+ 	-mfused-madd.  Add documentation for -mlra.  Copy-edit and wrap long
+ 	lines throughout the section.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/s390/s390.opt (mbranch-cost): Mark as Undocumented.
+ 	* config/s390/tpf.opt (mtpf-trace-hook-prologue-check=): Likewise.
+ 	(mtpf-trace-hook-prologue-target=): Likewise.
+ 	(mtpf-trace-hook-epilogue-check=): Likewise.
+ 	(mtpf-trace-hook-epilogue-target=): Likewise.
+ 	* doc/invoke.texi (Option Summary) <S/390 and zSeries Options>:
+ 	Remove redundant -mno- entries and add missing options.  Make
+ 	entries with arguments match the syntax in the main documentation.
+ 	(S/390 and zSeries Options): Light copy-editing.  Wrap overly-long
+ 	lines.  Add missing @opindex entries.  Add documention for
+ 	-mmain, -mno-pic-data-is-text-relative, -mindirect-branch,
+ 	-mindirect-branch-jump, -mindirect-branch-call,
+ 	-mfunction-return, -mfunction-return-mem, -mfunction-return-reg,
+ 	-mindirect-branch-table, -mfentry, -mrecord-mcount, -mnop-mcount,
+ 	-mpreserve-args, and -munaligned-symbols.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/rx/rx.opt (mgcc-abi, mrx-abi): Mark as Undocumented.
+ 	* doc/invoke.texi (Option Summary) <RX Options>: Remove redundant
+ 	entries for -mno-forms, correct name of -msmall-data-limit option,
+ 	add -mlra, clean up formatting.
+ 	(RX Options): Minor copy-editing, add -mlra.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	* config/rs6000/darwin.opt (Waltivec-long-deprecated): Mark as
+ 	Undocumented.
+ 	(faltivec, ffix-and-continue, findirect-data): Likewise.
+ 	* config/rs6000/rs6000.opt (mvrsave): Likewise.
+ 	* config/rs6000/sysv4.opt (mno-toc, mtoc, mno-traceback): Likewise.
+ 	(mshlib, mnewlib): Likewise.
+ 	* doc/invoke.texi (Option Summary) <RS/6000 and PowerPC Options>:
+ 	Document only one form of each option.  Add missing options.
+ 	Correct whitespace.
+ 	(RS/6000 and PowerPC Options): Separately document -mpowerpc-gpopt,
+ 	-mpowerpc-gfxopt, -mpowerpc64, -mmfcrf, -mpopcntb, -mpopcntd,
+ 	-mfprnd, -mcmpb, and -mhard-dfp and move their documentation after
+ 	-mcpu=.  Remove documentation for -mtoc which is unimplemented.
+ 	Add missing @opindex entries.  Minor copy-editing and whitespace
+ 	fixes.
+ 
+ 2026-01-17  Sandra Loosemore  <sloosemore@baylibre.com>
+ 
+ 	PR other/122243
+ 	PR target/71340
+ 	* doc/invoke.texi (Option Summary) <RL78 Options>: Remove
+ 	never-implemented -m64bit-doubles and -m32bit-doubles options.
+ 	Add missing entries for -mrelax, -mes0, -mmul=rl78, -mcpu=rl78,
+ 	and -mrl78.
+ 	(RL78 Options): Likewise.  Add missing @opindex entries.
+ 	Light copy-editing.
+ 
+ 2026-01-17  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR tree-optimization/123513
+ 	* tree.cc (valid_new_delete_pair_p): If new_name[3] or delete_name[3]
+ 	is 'I', return false with *pcertain set to false rather than true.
+ 
+ 2026-01-16  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* hierarchical_discriminator.cc (init_copyid_allocator): Walks the function
+ 	body to find existing max copyids per location.
+ 	(record_existing_copyid): New.
+ 
+ 2026-01-16  Alice Carlotti  <alice.carlotti@arm.com>
+ 
+ 	PR target/123460
+ 	* config.gcc: Accept hyphens in aarch64 --with-arch extensions.
+ 
+ 2026-01-16  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/123145
+ 	* timevar.def (TV_ANALYZER_SUPERGRAPH): Rename to...
+ 	(TV_ANALYZER_SUPERGRAPH_CREATION): ...this.
+ 	(TV_ANALYZER_SUPERGRAPH_FIXUP_LOCATIONS): New.
+ 	(TV_ANALYZER_SUPERGRAPH_SIMPLIFY): New.
+ 	(TV_ANALYZER_SUPERGRAPH_SORTING): New.
+ 
+ 2026-01-16  Vladimir N. Makarov  <vmakarov@redhat.com>
+ 
+ 	PR target/123092
+ 	* lra-constraints.cc (lra_constraints): Push insn on processing
+ 	stack after equivalence substitution.
+ 
+ 2026-01-16  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	PR pch/110746
+ 	* config/host-freebsd.cc: New file.
+ 	* config.host <*-*-freebsd*>: Use it.
+ 	* config/x-freebsd: New file.
+ 
+ 2026-01-16  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/123412
+ 	* ipa-cp.cc (devirtualization_time_bonus): Do add the indirect
+ 	edge frequency at least once even for targets which cannot be
+ 	inlined.
+ 
+ 2026-01-16  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/123607
+ 	* config/i386/i386.md (movhf_mask): Change constraint on
+ 	match_operand 2's second alternative from 0C to 0.
+ 
+ 2026-01-16  Lulu Cheng  <chenglulu@loongson.cn>
+ 
+ 	PR target/123521
+ 	* config/loongarch/loongarch.cc
+ 	(loongarch_expand_vector_init_same): Fixed a bug in the
+ 	vector initialization section..
+ 
+ 2026-01-16  David Guillen Fandos  <david@davidgf.net>
+ 
+ 	* config/mips/mips.h (ISA_HAS_FMIN_FMAX): Add R5900;
+ 	note that, R5900 is not IEEE754 fully compatiable.
+ 
+ 2026-01-15  Marek Polacek  <polacek@redhat.com>
+ 	    Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120775
+ 	PR c++/123081
+ 	PR c++/122634
+ 	* attribs.cc (attribute_value_equal): Return false if either attribute
+ 	is ATTR_UNIQUE_VALUE_P.
+ 	(merge_attributes): Handle lists with ATTR_UNIQUE_VALUE_P values.
+ 	* doc/invoke.texi: Document -freflection.
+ 	* dwarf2out.cc (is_base_type) <case default>: Check
+ 	TREE_CODE >= LAST_AND_UNUSED_TREE_CODE instead of is_cxx_auto.
+ 	(gen_type_die_with_usage): For TREE_CODE >= LAST_AND_UNUSED_TREE_CODE
+ 	trees use use DW_TAG_unspecified_type.
+ 	* tree-core.h (struct tree_base): Update a comment.
+ 	* tree.h (ATTR_UNIQUE_VALUE_P): Define.
+ 	(BINFO_BASE_ACCESSES): Update the comment.
+ 
+ 2026-01-15  Peter Damianov  <peter0x44@disroot.org>
+ 
+ 	PR driver/123504
+ 	* config/i386/cygming.h (EXTRA_DEFAULT_COMPILERS): Comment out
+ 	.res spec to allow COFF files with .res extension to pass
+ 	through to the linker.
+ 	* config/aarch64/cygming.h (EXTRA_DEFAULT_COMPILERS): Likewise.
+ 
+ 2026-01-15  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
+ 
+ 	* ira-lives.cc (ira_implicitly_set_insn_hard_regs): Honor hard
+ 	register constraints.
+ 	* ira.cc (ira_setup_alts): Ditto.
+ 
+ 2026-01-15  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
+ 
+ 	* doc/extend.texi: Document current limitations of hard register
+ 	constraints.
+ 	* stmt.cc (parse_output_constraint): Reject multiple hard
+ 	register constraints or a combination of hard register
+ 	constraints and regular register constraints in one alternative.
+ 	(parse_input_constraint): Ditto.
+ 
+ 2026-01-15  Alfie Richards  <alfie.richards@arm.com>
+ 
+ 	* config/aarch64/aarch64-simd.md: Add comment.
+ 	* config/aarch64/aarch64-sme.md: Likewise.
+ 	* config/aarch64/aarch64-sve-builtins-base.def: Likewise.
+ 	* config/aarch64/aarch64-sve-builtins-sme.def: Likewise.
+ 	* config/aarch64/aarch64-sve-builtins-sve2.def: Likewise.
+ 	* config/aarch64/aarch64-sve-builtins.def: Likewise.
+ 	* config/aarch64/aarch64-sve.md: Likewise.
+ 	* config/aarch64/aarch64-sve2.md: Likewise.
+ 	* config/aarch64/aarch64.md: Likewise.
+ 
+ 2026-01-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	* config/sparc/sparc.h (TARGET_SUN_TLS): Remove.
+ 	* config/sparc/sol2.h (TARGET_SUN_TLS): Likewise.
+ 	* config/sparc/sparc.cc (TARGET_ASM_OUTPUT_DWARF_DTPREL): Guard
+ 	with HAVE_GNU_AS.
+ 	(sparc_tls_got): Guard with !HAVE_GNU_AS.
+ 	(sparc_legitimize_tls_address): Likewise.
+ 	* config/sparc/sparc.md ("tls_delay_slot"): Likewise.
+ 	("@tie_add<P:mode>"): Likewise.
+ 
+ 2026-01-15  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR debug/121045
+ 	* tree-pretty-print.h (dump_location): Add new dump_flags_t
+ 	argument defaulted to TDF_NONE.
+ 	* tree-pretty-print.cc (dump_location): Add flags argument.  Don't
+ 	print discriminator if TDF_COMPARE_DEBUG bit is set in flags.
+ 	(dump_block_node, dump_generic_node): Pass through flags to
+ 	dump_location.
+ 	* gimple-pretty-print.cc (dump_gimple_phi, pp_gimple_stmt_1,
+ 	dump_implicit_edges): Likewise.
+ 	(gimple_dump_bb_as_sarif_properties): Pass dump_flags to
+ 	dump_location.
+ 	* print-rtl.cc (rtx_writer::print_rtx_operand_code_L): If dump_flags
+ 	has TDF_COMPARE_DEBUG bit set, don't print discriminators.
+ 
+ 2026-01-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	* config/i386/sol2.h [!HAVE_GNU_AS] (ASM_CPU32_DEFAULT_SPEC): Use -m32.
+ 	(ASM_CPU64_DEFAULT_SPEC): Use -m64.
+ 
+ 2026-01-15  Josef Melcr  <josef.melcr@suse.com>
+ 
+ 	PR ipa/122852
+ 	* cgraph.cc (cgraph_node::verify_node): Verify that callback
+ 	edges are unreachable when the carrying edge is unreachable.
+ 	* ipa-fnsummary.cc (redirect_to_unreachable): Redirect callback
+ 	edges to unreachable when redirecting the carrying edge.
+ 
+ 2026-01-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	* configure.ac (gcc_cv_as_sparc_ua_pcrel): Remove.
+ 	(gcc_cv_as_sparc_ua_pcrel_hidden): Likewise.
+ 	* configure: Regenerate.
+ 	* config.in: Regenerate.
+ 	* config/sparc/sparc.h (ASM_PREFERRED_EH_DATA_FORMAT): Remove
+ 	!HAVE_AS_SPARC_UA_PCREL, !HAVE_AS_SPARC_UA_PCREL_HIDDEN support.
+ 	* config/sparc/sol2.h (ASM_PREFERRED_EH_DATA_FORMAT): Remove.
+ 	* config/sparc/sparc.cc (TARGET_ASM_OUTPUT_DWARF_DTPREL): Remove
+ 	HAVE_AS_SPARC_UA_PCREL guard.
+ 
+ 2026-01-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	* config/sparc/sparc.h (TARGET_TLS): Define as HAVE_AS_TLS.
+ 	Update comment.
+ 	(TARGET_SUN_TLS): Define as 0.
+ 	(TARGET_GNU_TLS): Remove.
+ 	* config/sparc/freebsd.h (TARGET_SUN_TLS): Remove.
+ 	(TARGET_GNU_TLS): Remove.
+ 	* config/sparc/linux.h: Likewise.
+ 	* config/sparc/linux64.h: Likewise.
+ 	* config/sparc/sol2.h (TARGET_SUN_TLS): Redefine as 1.
+ 	Guard with HAVE_AS_TLS && !HAVE_GNU_AS.
+ 	(TARGET_GNU_TLS): Remove.
+ 	* config/sparc/sparc.cc (TARGET_ASM_OUTPUT_DWARF_DTPREL): Use
+ 	!TARGET_SUN_TLS in guard.
+ 	with !TARGET_SUN_TLS only.
+ 	* config/sparc/sparc.md ("tls_delay_slot"): Guard with
+ 	!TARGET_SUN_TLS.
+ 
+ 2026-01-15  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	PR target/38118
+ 	* config/sparc/sol2.h (ASM_OUTPUT_ALIGNED_COMMON): Remove.
+ 
+ 2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* cfgloopmanip.cc (duplicate_loop_body_to_header_edge): Assign
+ 	hierarchical discriminators for loop unrolling.
+ 	* cfgloopmanip.h (DLTHE_RECORD_HIERARCHICAL_DISCRIMINATOR): New flag.
+ 	* tree-ssa-loop-ivcanon.cc (try_unroll_loop_completely): Pass flag
+ 	to enable hierarchical discriminator assignment.
+ 	(try_peel_loop): Likewise.
+ 
+ 2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* gimple-loop-versioning.cc (loop_versioning::version_loop): Assign
+ 	copyid discriminators to distinguish different loop versions.
+ 
+ 2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* tree-vect-loop-manip.cc (vect_loop_versioning): Assign copyid
+ 	discriminators for vectorized and scalar loop versions.
+ 	* tree-vect-loop.cc (vect_transform_loop): Assign copyid
+ 	discriminators for vectorized and scalar loop versions.
+ 
+ 2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* Makefile.in: Add hierarchical_discriminator.o to OBJS.
+ 	* hierarchical_discriminator.cc: New file.
+ 	* hierarchical_discriminator.h: New file.
+ 	* function.h (copyid_alloc): New.
+ 	* input.cc (location_with_discriminator_components): New function.
+ 	(get_discriminator_components_from_loc): Likewise.
+ 	* input.h (DISCR_BASE_BITS): New constant.
+ 	(DISCR_MULTIPLICITY_BITS): Likewise.
+ 	(DISCR_COPYID_BITS): Likewise.
+ 	(DISCR_UNUSED_BITS): Likewise.
+ 	(DISCR_BASE_MASK): Likewise.
+ 	(DISCR_MULTIPLICITY_MASK): Likewise.
+ 	(DISCR_COPYID_MASK): Likewise.
+ 	(DISCR_BASE_SHIFT): Likewise.
+ 	(DISCR_MULTIPLICITY_SHIFT): Likewise.
+ 	(DISCR_COPYID_SHIFT): Likewise.
+ 	(DISCR_BASE_MAX): Likewise.
+ 	(DISCR_MULTIPLICITY_MAX): Likewise.
+ 	(DISCR_COPYID_MAX): Likewise.
+ 	(location_with_discriminator_components): New function declaration.
+ 	(get_discriminator_components_from_loc): Likewise.
+ 
+ 2026-01-15  DengJianbo  <dengjianbo@loongson.cn>
+ 
+ 	* config/loongarch/loongarch.md: Remove condition in template
+ 	movdi_symbolic_off64.
+ 
+ 2026-01-14  Peter Bergner  <bergner@tenstorrent.com>
+ 
+ 	PR target/123092
+ 	* config/riscv/constraints.md (ZD): Disable when xmipscbop is disabled.
+ 
+ 2026-01-14  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/123542
+ 	* ipa-cp.cc (ipa_value_from_jfunc): Always use
+ 	ipacp_value_safe_for_type.  Bail out if parm_type is NULL.
+ 
+ 2026-01-14  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/121240
+ 	* config/aarch64/aarch64.md (mov<mode>): Expand FP immediates early.
+ 	* config/aarch64/aarch64.cc (aarch64_select_rtx_section): Force
+ 	immediates <= 8 bytes to constdata.
+ 	(aarch64_rtx_costs): Increase cost of CONST_DOUBLE loaded from memory.
+ 
+ 2026-01-14  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/114528
+ 	* config/aarch64/aarch64.cc (aarch64_check_mov_add_imm12):
+ 	New function to check and emit MOV+ADD/SUB immediates.
+ 	(aarch64_internal_mov_immediate): Add support for MOV+ADD/SUB
+ 	immediates.
+ 
+ 2026-01-14  Tejas Belagod  <tejas.belagod@arm.com>
+ 
+ 	PR middle-end/123392
+ 	* cfgexpand.cc (expand_debug_expr): Handle variable-length initializer
+ 	for CONSTRUCTOR.
+ 
+ 2026-01-14  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR middle-end/123115
+ 	* defaults.h (EH_RETURN_DATA_REGNO): Add void (N) to the macro
+ 	definition inside of a comma expression before INVALID_REGNUM.
+ 
+ 2026-01-14  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/120250
+ 	* combine.cc (recog_for_combine): Don't try to put SET_SRC
+ 	into a constant pool if SET_DEST is pc_rtx.
+ 
+ 2026-01-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123190
+ 	* tree-vectorizer.h (vect_load_store_data): Add n_loads member.
+ 	* tree-vect-stmts.cc (get_load_store_type): Record the
+ 	number of required loads for permuted loads.
+ 	(vectorizable_load): Make use of this when costing loads
+ 	for VMAT_CONTIGUOUS[_REVERSE].
+ 
+ 2026-01-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123190
+ 	* tree-vect-loop.cc (vect_analyze_loop_costing): Allow
+ 	vectorizing loops with a single scalar iteration iff the
+ 	vectorization factor is 1.
+ 
+ 2026-01-14  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR rtl-optimization/123544
+ 	* simplify-rtx.cc (simplify_context::simplify_binary_operation_1)
+ 	<case AND>: Don't canonicalize (subreg (lshiftrt (x cnt)) low) into
+ 	(lshiftrt (subreg x low) cnt) if the SUBREG is paradoxical.
+ 
+ 2026-01-14  Prathamesh Kulkarni  <prathameshk@nvidia.com>
+ 
+ 	* auto-profile.cc: (string_table::filenames): New method.
+ 	(function_instance::timestamp_): New member.
+ 	(function_instance::timestamp): New accessor for timestamp_ member.
+ 	(function_instance::set_timestamp): New function.
+ 	(function_instance::prop_timestamp): Likewise.
+ 	(function_instance::prop_timestamp_1): Likewise.
+ 	(function_instance::function_instance): Initialize timestamp_ to 0.
+ 	(function_instance::read_function_instance): Adjust prototype by
+ 	replacing head_count with toplevel param with default value true, and
+ 	stream in head_count and timestamp values from gcov file.
+ 	(autofdo::timestamp_info_map): New std::map.
+ 	(autofdo_source_profile::get_function_instance_by_decl): New argument
+ 	filename with default value NULL.
+ 	(autofdo_source_profile::read): Populate timestamp_info_map and
+ 	propagate timestamp to inlined instances from toplevel function.
+ 	(afdo_annotate_cfg): Assign node->tp_first_run based on
+ 	timestamp_info_map and bail out of annotation if
+ 	param_auto_profile_reorder_only is enabled.
+ 	* params.opt: New param auto-profile-reorder-only.
+ 
+ 2026-01-14  Lili Cui  <lili.cui@intel.com>
+ 
+ 	* config/i386/x86-tune.def (X86_TUNE_ALIGN_TIGHT_LOOPS):
+ 	disable tight loop alignment for m_CORE_ATOM.
+ 
+ 2026-01-14  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* match.pd: remove 'fold_overflow_warning' references.
+ 	* tree.h (TYPE_OVERFLOW_UNDEFINED): remove note telling
+ 	that we must use warn_strict_overflow for every optimization
+ 	based on TYPE_OVERFLOW_UNDEFINED.
+ 
+ 2026-01-13  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* match.pd (`(T1)(a bit_op (T2)b)`): Remove redundant
+ 	type checks.
+ 
+ 2026-01-13  Pengxuan Zheng  <pengxuan.zheng@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123109
+ 	* fold-const.cc (fold_binary_loc): Remove (X >> C) NE/EQ 0 -> X LT/GE 0
+ 	folding.
+ 	* match.pd (`(X >> C) NE/EQ 0 -> X LT/GE 0`): New pattern.
+ 
+ 2026-01-13  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/119402
+ 	* match.pd (`(a*zero_one_valued_p) & b`): New pattern.
+ 
+ 2026-01-13  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR rtl-optimization/123312
+ 	* ifcvt.cc (noce_try_cond_zero_arith): Rename to ...
+ 	(noce_try_cond_arith): This. For AND try `cmp ? a : -1`
+ 	also to see which one cost less.
+ 	(noce_process_if_block): Handle the rename.
+ 
+ 2026-01-13  Jonathan Yong  <10walls@gmail.com>
+ 
+ 	* config/i386/winnt-utf8.manifest: enable longPathAware.
+ 
+ 2026-01-13  Jonathan Yong  <10walls@gmail.com>
+ 
+ 	PR driver/108865
+ 	* config/i386/winnt-utf8.manifest: correct XML tags
+ 
+ 2026-01-13  Jeff Law  <jeffrey.law@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123530
+ 	* match.pd (reassociating xor to enable rotations): Verify constants
+ 	fit into a uhwi before trying to extract them as a uhwi.
+ 
+ 2026-01-13  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123573
+ 	* fold-const.cc (fold_vec_perm): Actually check, not assert,
+ 	that input and output vector element numbers agree.
+ 	* match.pd (vec_perm @0 @1 @2): Make sure element numbers
+ 	are the same when folding to an input vector and wrap that
+ 	inside a VIEW_CONVERT_EXPR.
+ 
+ 2026-01-13  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123525
+ 	* tree-ssa-forwprop.cc (simplify_vector_constructor): Use
+ 	converted source type for conversion bit field ref.
+ 
+ 2026-01-13  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123301
+ 	* tree-if-conv.cc (convert_scalar_cond_reduction):
+ 	Disallow vector types.
+ 
+ 2026-01-13  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR rtl-optimization/123501
+ 	PR rtl-optimization/123444
+ 	* rtlanal.cc (nonzero_bits1): Use operand mode instead of
+ 	operation mode.
+ 
+ 2026-01-13  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR libstdc++/123396
+ 	* configure.ac (gcc_cv_ld_use_as_needed_ldscript): New test.
+ 	(USE_LD_AS_NEEDED_LDSCRIPT): New AC_DEFINE.
+ 	* gcc.cc (LINK_LIBATOMIC_SPEC): Use "-latomic_asneeded" instead
+ 	of LD_AS_NEEDED_OPTION " -latomic " LD_NO_AS_NEEDED_OPTION
+ 	if USE_LD_AS_NEEDED_LDSCRIPT is defined.
+ 	(init_gcc_specs): Use "-lgcc_s_asneeded" instead of
+ 	LD_AS_NEEDED_OPTION " -lgcc_s " LD_NO_AS_NEEDED_OPTION
+ 	if USE_LD_AS_NEEDED_LDSCRIPT is defined.
+ 	* config.in: Regenerate.
+ 	* configure: Regenerate.
+ 
+ 2026-01-13  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123539
+ 	* tree-vect-loop.cc (vect_create_epilog_for_reduction):
+ 	Use the compute vectype to pun down to smaller or element
+ 	size for by-element reductions.
+ 
+ 2026-01-13  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	* tree-ssa-sccvn.cc (vn_walk_cb_data::push_partial_def): Use
+ 	build_bitint_type for BITINT_TYPE when maxsizei exceeds
+ 	MAX_FIXED_MODE_SIZE.
+ 
+ 2026-01-13  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	PR target/117581
+ 	* config/riscv/riscv.cc (riscv_bitint_type_info): New function.
+ 	(TARGET_C_BITINT_TYPE_INFO): Define.
+ 
+ 2026-01-13  liuhongt  <hongtao.liu@intel.com>
+ 
+ 	PR target/123484
+ 	* config/i386/mmx.md (divv4hf3): Add TARGET_MMX_WITH_SSE to
+ 	the condition.
+ 	(cmlav4hf4): Ditto.
+ 	(cmla_conjv4hf4): Ditto.
+ 	(cmulv4hf3): Ditto.
+ 	(cmul_conjv4hf3): Ditto.
+ 
+ 2026-01-12  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/122845
+ 	PR tree-optimization/122843
+ 	* match.pd (`(T1)(a bit_op (T2)b)`): Also
+ 	simplify if T1 is the same type as b and T2 is wider
+ 	type than T1.
+ 
+ 2026-01-12  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123528
+ 	* tree-vect-patterns.cc (vect_recog_bool_pattern): Restore
+ 	INTEGRAL_TYPE_P check but also allow SCALAR_FLOAT_TYPE_P.
+ 
+ 2026-01-12  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/123543
+ 	* ipa-cp.cc (propagate_bits_across_jump_function): Fix test for
+ 	recipient_only_p.
+ 
+ 2026-01-12  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/122830
+ 	PR tree-optimization/122824
+ 	* tree-ssa-sccvn.cc (vn_reference_lookup_3): Generalize
+ 	aggregate copy handling when no variable offsets are
+ 	involved.
+ 
+ 2026-01-12  Richard Biener  <rguenther@suse.de>
+ 
+ 	* tree-ssa-sccvn.cc (vn_reference_lookup_3): Only tentatively
+ 	accumulate extra_off when tentatively consuming components
+ 	during aggregate copy handling.
+ 
+ 2026-01-12  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123175
+ 	* match.pd (vec_perm @0 @1 @2): Fixup for inputs having a
+ 	different number of elements than the result.
+ 	* tree-vect-generic.cc (lower_vec_perm): Likewise.
+ 
+ 2026-01-12  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR rtl-optimization/123523
+ 	* simplify-rtx.cc (simplify_const_binary_operation): Use
+ 	DImode for VOIDmode shift and truncation counts if int_mode
+ 	is narrower than HOST_BITS_PER_WIDE_INT rather than
+ 	word_mode if int_mode it is narrower than BITS_PER_WORD.
+ 
+ 2026-01-12  Dhruv Chawla  <dhruvc@nvidia.com>
+ 
+ 	* auto-profile.cc (autofdo_source_profile::offline_unrealized_inlines):
+ 	Add missing check for in_map.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* asm-toplevel.cc (mark_fragile_ref_by_asm):
+ 	Add marked_local to handle symbol as local.
+ 	(ipa_asm_heuristics): New.
+ 	(class pass_ipa_asm): New.
+ 	(make_pass_ipa_asm_lgen): New.
+ 	(make_pass_ipa_asm_wpa): New.
+ 	* common.opt: New flto-toplevel-asm-heuristics.
+ 	* passes.def: New asm passes.
+ 	* timevar.def (TV_IPA_LTO_ASM): New.
+ 	* tree-pass.h (make_pass_ipa_asm_lgen): New.
+ 	(make_pass_ipa_asm_wpa): New.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* asm-toplevel.cc (mark_fragile_ref_by_asm): New.
+ 	(struct constraint_data): New.
+ 	(walk_through_constraints): Handle .local definitions.
+ 	(analyze_toplevel_extended_asm): Propagate constraint_data.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* cgraph.h: Add must_remain_in_tu_*.
+ 	* cgraphclones.cc (cgraph_node::create_clone): Propagate
+ 	must_remain_in_tu_body.
+ 	* cif-code.def (MUST_REMAIN_IN_TU): New.
+ 	* ipa-icf.cc (sem_function::equals_wpa): Check
+ 	must_remain_in_tu_*
+ 	(sem_variable::equals_wpa): Likewise.
+ 	* ipa-inline-transform.cc (inline_call): Propagate
+ 	must_remain_in_tu_body.
+ 	* ipa-inline.cc (can_inline_edge_p): Check
+ 	must_remain_in_tu_body.
+ 	* lto-cgraph.cc (lto_output_node): Output must_remain_in_tu_*
+ 	(lto_output_varpool_node): Likewise.
+ 	(input_overwrite_node): Input must_remain_in_tu_*.
+ 	(input_varpool_node): Likewise.
+ 	* tree.cc (decl_address_ip_invariant_p): Check
+ 	must_remain_in_tu_name.
+ 	* varpool.cc (varpool_node::ctor_useable_for_folding_p): Check
+ 	must_remain_in_tu_body.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* lto-cgraph.cc (compute_ltrans_boundary): Add symbols
+ 	referenced from asm_nodes.
+ 	* lto-streamer-out.cc (lto_output): Move adding asm_nodes
+ 	to...
+ 	* passes.cc (ipa_write_summaries): ...here.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* ipa-free-lang-data.cc (find_decls_types_in_asm): New.
+ 	(free_lang_data_in_cgraph): Use find_decls_types_in_asm.
+ 	* lto-cgraph.cc (input_cgraph_1): Move asm to..
+ 	(input_toplevel_asms): ..here.
+ 	* lto-streamer-in.cc (lto_input_toplevel_asms):
+ 	Allow extended asm.
+ 	* lto-streamer-out.cc (lto_output_toplevel_asms):
+ 	Allow extended asm.
+ 	(lto_output_toplevel_asms): Allow ASM_EXPR.
+ 	* lto-streamer.h (input_toplevel_asms): New.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	PR ipa/122458
+ 	* Makefile.in: Add new file.
+ 	* cgraph.h (analyze_toplevel_extended_asm): New.
+ 	* cgraphunit.cc (symbol_table::finalize_compilation_unit):
+ 	Call analyze_toplevel_extended_asm.
+ 	* asm-toplevel.cc: New file.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* cgraph.cc (cgraph_node_cannot_be_local_p_1): Check ref_by_asm.
+ 	(cgraph_node::verify_node): Likewise.
+ 	* cgraph.h (cgraph_node::only_called_directly_or_aliased_p):
+ 	Likewise.
+ 	(cgraph_node::can_remove_if_no_direct_calls_and_refs_p):
+ 	Likewise.
+ 	(varpool_node::can_remove_if_no_refs_p): Likewise.
+ 	(varpool_node::all_refs_explicit_p): Likewise.
+ 	* cgraphunit.cc (symtab_node::needed_p): Likewise.
+ 	(analyze_functions): Likewise.
+ 	* gimple-ssa-pta-constraints.cc (refered_from_nonlocal_fn):
+ 	Likewise.
+ 	(refered_from_nonlocal_var): Likewise.
+ 	(ipa_create_global_variable_infos): Likewise.
+ 	* ipa-comdats.cc (ipa_comdats): Likewise.
+ 	* ipa-visibility.cc (cgraph_externally_visible_p): Likewise.
+ 	(varpool_node::externally_visible_p): Likewise.
+ 	* ipa.cc (symbol_table::remove_unreachable_nodes): Likewise.
+ 	* lto-cgraph.cc (lto_output_node): Output ref_by_asm.
+ 	(lto_output_varpool_node): Likewise.
+ 	(input_overwrite_node): Input ref_by_asm.
+ 	(input_varpool_node): Likewise.
+ 	* symtab.cc (address_matters_1): Check ref_by_asm.
+ 
+ 2026-01-11  Hans-Peter Nilsson  <hp@axis.com>
+ 
+ 	* config/cris/cris.cc (cris_rtx_costs) <POST_INC>: Handle POST_INC
+ 	as ZERO_EXTEND and SIGN_EXTEND, i.e. as an operator without cost.
+ 
  2026-01-10  Jeff Law  <jeffrey.law@oss.qualcomm.com>
  
  	* config/mcore/mcore.h (ASM_OUT_ADDR_DIFF_ELT): Remove.
diff -Nrcpad gcc-16-20260111/gcc/DATESTAMP gcc-16-20260118/gcc/DATESTAMP
*** gcc-16-20260111/gcc/DATESTAMP	Sun Jan 11 22:32:05 2026
--- gcc-16-20260118/gcc/DATESTAMP	Sun Jan 18 22:32:06 2026
***************
*** 1 ****
! 20260111
--- 1 ----
! 20260118
diff -Nrcpad gcc-16-20260111/gcc/Makefile.in gcc-16-20260118/gcc/Makefile.in
*** gcc-16-20260111/gcc/Makefile.in	Sun Jan 11 22:32:05 2026
--- gcc-16-20260118/gcc/Makefile.in	Sun Jan 18 22:32:06 2026
*************** OBJS = \
*** 1464,1469 ****
--- 1464,1470 ----
  	dce.o \
  	ddg.o \
  	debug.o \
+ 	hierarchical_discriminator.o \
  	dep-fusion.o \
  	df-core.o \
  	df-problems.o \
diff -Nrcpad gcc-16-20260111/gcc/ada/ChangeLog gcc-16-20260118/gcc/ada/ChangeLog
*** gcc-16-20260111/gcc/ada/ChangeLog	Sun Jan 11 22:32:05 2026
--- gcc-16-20260118/gcc/ada/ChangeLog	Sun Jan 18 22:32:06 2026
***************
*** 1,3 ****
--- 1,13 ----
+ 2026-01-17  Eric Botcazou  <ebotcazou@adacore.com>
+ 	    Lisa Felidae  <lisa@felidae.bam.moe>
+ 
+ 	PR ada/68179
+ 	PR ada/123589
+ 	* exp_ch3.adb (Expand_Freeze_Array_Type): Build an initialization
+ 	procedure for a bit-packed array type if Has_Default_Aspect is set
+ 	on the base type, but make sure not to build it twice.  Also test
+ 	Has_Default_Aspect for a type derived from String.
+ 
  2026-01-10  Iain Sandoe  <iain@sandoe.co.uk>
  
  	* libgnarl/s-osinte__darwin.adb: Delete unneeded use clause.
diff -Nrcpad gcc-16-20260111/gcc/ada/exp_ch3.adb gcc-16-20260118/gcc/ada/exp_ch3.adb
*** gcc-16-20260111/gcc/ada/exp_ch3.adb	Sun Jan 11 22:32:05 2026
--- gcc-16-20260118/gcc/ada/exp_ch3.adb	Sun Jan 18 22:32:06 2026
*************** package body Exp_Ch3 is
*** 5711,5716 ****
--- 5711,5718 ----
            (Component_Type (Typ));
  
     begin
+       --  First, the nonpacked case
+ 
        if not Is_Bit_Packed_Array (Typ) then
           if No (Init_Proc (Base)) then
  
*************** package body Exp_Ch3 is
*** 5734,5740 ****
              --  and do not need initialization procedures.
  
              elsif Is_Standard_String_Type (Base)
!               and then No (Default_Aspect_Component_Value (Base))
              then
                 null;
  
--- 5736,5742 ----
              --  and do not need initialization procedures.
  
              elsif Is_Standard_String_Type (Base)
!               and then not Has_Default_Aspect (Base)
              then
                 null;
  
*************** package body Exp_Ch3 is
*** 5755,5772 ****
              end if;
           end if;
  
!       --  For packed case, default initialization, except if the component type
!       --  is itself a packed structure with an initialization procedure, or
!       --  initialize/normalize scalars active, and we have a base type, or the
!       --  type is public, because in that case a client might specify
!       --  Normalize_Scalars and there better be a public Init_Proc for it.
  
!       elsif (Present (Init_Proc (Component_Type (Base)))
!               and then No (Base_Init_Proc (Base)))
!         or else (Init_Or_Norm_Scalars and then Base = Typ)
          or else Is_Public (Typ)
        then
!          Build_Array_Init_Proc (Base, N);
        end if;
     end Expand_Freeze_Array_Type;
  
--- 5757,5776 ----
              end if;
           end if;
  
!       --  For the packed case, no initialization, except if the component type
!       --  has an initialization procedure, or Initialize/Normalize_Scalars is
!       --  active, or there is a Default_Component_Value aspect, or the type is
!       --  public, because a client might specify Initialize_Scalars and there
!       --  better be a public Init_Proc for it.
  
!       elsif Present (Init_Proc (Component_Type (Base)))
!         or else Init_Or_Norm_Scalars
!         or else Has_Default_Aspect (Base)
          or else Is_Public (Typ)
        then
!          if No (Init_Proc (Base)) then
!             Build_Array_Init_Proc (Base, N);
!          end if;
        end if;
     end Expand_Freeze_Array_Type;
  
diff -Nrcpad gcc-16-20260111/gcc/algol68/ChangeLog gcc-16-20260118/gcc/algol68/ChangeLog
*** gcc-16-20260111/gcc/algol68/ChangeLog	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/algol68/ChangeLog	Sun Jan 18 22:32:06 2026
***************
*** 1,3 ****
--- 1,57 ----
+ 2026-01-17  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* a68-parser-prelude.cc (stand_prelude): Remove definitions for ^
+ 	operator.
+ 	* ga68.texi (Real operators): Remove entries for ^.
+ 	(Integral operators): Likewise.
+ 
+ 2026-01-17  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* ga68-coding-guidelines.texi: New file.
+ 	* Make-lang.in (A68_CODING_GUIDE_MANUAL_FILES): Define.
+ 	(A68_TEXI_FILES): Add A68_CODING_GUIDE_MANUAL_FILES.
+ 	(doc/ga68-coding-guidelines.info): New rule.
+ 	(doc/ga68-coding-guidelines.dvi): Likewise.
+ 	(doc/ga68-coding-guidelines.pdf): Likewise.
+ 	($(build_htmldir)/ga68-coding-guidelines/index.html): Likewise.
+ 	(algol68.info): Add ga68-coding-guidelines.info.
+ 	(algol68.srcinfo): Likewise.
+ 	(algol68.install-info): Likewise.
+ 	(algol68.install-html): Likewise.
+ 	(algol68.dvi): Add ga68-coding-guielines.dvi.
+ 	(algol68.pdf): Add ga68-coding-guidelines.pdf.
+ 
+ 2026-01-17  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* a68-parser-moids-equivalence.cc (are_packs_equivalent): Add
+ 	explicative comment.
+ 
+ 2026-01-17  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	PR algol68/123653
+ 	* a68-parser-moids-equivalence.cc (are_packs_equivalent): Fix
+ 	logic in name comparison.
+ 
+ 2026-01-17  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* a68-parser-prelude.cc (stand_transput): Do not define
+ 	`Number' and `whole' as built-ins.
+ 
+ 2026-01-17  Mohammad-Reza Nabipoor  <mnabipoor@gnu.org>
+ 
+ 	PR algol68/123007
+ 	* a68-lang.cc (a68_type_for_mode): Handle TImode.
+ 	(a68_type_for_size): Handle unsigned_intTI_type_node.
+ 
+ 2026-01-15  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* ga68.texi (POSIX files): Fix documentation of lseek.
+ 
+ 2026-01-15  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* ga68.texi (Dialect options): {..} is not a valid variant of
+ 	(...).
+ 
  2026-01-10  Pietro Monteiro  <pietro@sociotechnical.xyz>
  
  	* a68-low-posix.cc (a68_posix_setexitstatus): Delete function.
diff -Nrcpad gcc-16-20260111/gcc/algol68/Make-lang.in gcc-16-20260118/gcc/algol68/Make-lang.in
*** gcc-16-20260111/gcc/algol68/Make-lang.in	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/algol68/Make-lang.in	Sun Jan 18 22:32:06 2026
*************** A68_INT_MANUAL_FILES = \
*** 141,147 ****
  		$(gcc_docdir)/include/gcc-common.texi \
  		gcc-vers.texi
  
! A68_TEXI_FILES = $(A68_MANUAL_FILES) $(A68_INT_MANUAL_FILES)
  
  doc/ga68.info: $(A68_MANUAL_FILES)
  	if test "x$(BUILD_INFO)" = xinfo; then \
--- 141,154 ----
  		$(gcc_docdir)/include/gcc-common.texi \
  		gcc-vers.texi
  
! A68_CODING_GUIDE_MANUAL_FILES = \
! 		algol68/ga68-coding-guidelines.texi \
! 		$(gcc_docdir)/include/fdl.texi \
! 		$(gcc_docdir)/include/gcc-common.texi \
! 		gcc-vers.texi
! 
! A68_TEXI_FILES = $(A68_MANUAL_FILES) $(A68_INT_MANUAL_FILES) \
!                  $(A68_CODING_GUIDE_MANUAL_FILES)
  
  doc/ga68.info: $(A68_MANUAL_FILES)
  	if test "x$(BUILD_INFO)" = xinfo; then \
*************** doc/ga68-internals.info: $(A68_INT_MANUA
*** 157,174 ****
--- 164,194 ----
  		-I $(gcc_docdir)/include -o $@ $<; \
  	else true; fi
  
+ doc/ga68-coding-guidelines.info: $(A68_CODING_GUIDE_MANUAL_FILES)
+ 	if test "x$(BUILD_INFO)" = xinfo; then \
+ 	  rm -f doc/ga68-coding-guidelines.info*; \
+ 	  $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \
+ 		-I $(gcc_docdir)/include -o $@ $<; \
+ 	else true; fi
+ 
  doc/ga68.dvi: $(A68_MANUAL_FILES)
  	$(TEXI2DVI) -I $(abs_docdir)/include -o $@ $<
  
  doc/ga68-internals.dvi: $(A68_INT_MANUAL_FILES)
  	$(TEXI2DVI) -I $(abs_docdir)/include -o $@ $<
  
+ doc/ga68-coding-guidelines.dvi: $(A68_CODING_GUIDE_MANUAL_FILES)
+ 	$(TEXI2DVI) -I $(abs_docdir)/include -o $@ $<
+ 
  doc/ga68.pdf: $(A68_MANUAL_FILES)
  	$(TEXI2PDF) -I $(abs_docdir)/include -o $@ $<
  
  doc/ga68-internals.pdf: $(A68_INT_MANUAL_FILES)
  	$(TEXI2PDF) -I $(abs_docdir)/include -o $@ $<
  
+ doc/ga68-coding-guidelines.pdf: $(A68_CODING_GUIDE_MANUAL_FILES)
+ 	$(TEXI2PDF) -I $(abs_docdir)/include -o $@ $<
+ 
  $(build_htmldir)/ga68/index.html: $(A68_MANUAL_FILES)
  	$(mkinstalldirs) $(@D)
  	rm -f $(@D)/*
*************** $(build_htmldir)/ga68-internals/index.ht
*** 181,186 ****
--- 201,212 ----
  	$(TEXI2HTML) $(MAKEINFO_TOC_INLINE_FLAG) \
  		-I $(gcc_docdir)/include -I $(srcdir)/d -o $(@D) $<
  
+ $(build_htmldir)/ga68-coding-guidelines/index.html: $(A68_CODING_GUIDE_MANUAL_FILES)
+ 	$(mkinstalldirs) $(@D)
+ 	rm -f $(@D)/*
+ 	$(TEXI2HTML) $(MAKEINFO_TOC_INLINE_FLAG) \
+ 		-I $(gcc_docdir)/include -I $(srcdir)/d -o $(@D) $<
+ 
  .INTERMEDIATE: ga68.pod
  
  ga68.pod: algol68/ga68.texi
*************** algol68.srcextra:
*** 193,205 ****
  algol68.all.cross: ga68$(exeext)
  algol68.start.encap: ga68$(exeect)
  algol68.rest.encap:
! algol68.info: doc/ga68.info doc/ga68-internals.info
! algol68.dvi: doc/ga68.dvi doc/ga68-internals.dvi
! algol68.pdf: doc/ga68.pdf doc/ga68-internals.pdf
  algol68.install-pdf:
! algol68.html: $(build_htmldir)/ga68/index.html $(build_htmldir)/ga68-internals/index.html
  algol68.man: doc/ga68.1
! algol68.srcinfo: doc/ga68.info doc/ga68-internals.info
  	-cp -p $^ $(srcdir)/doc
  algol68.srcinfo:
  algol68.srcman:
--- 219,232 ----
  algol68.all.cross: ga68$(exeext)
  algol68.start.encap: ga68$(exeect)
  algol68.rest.encap:
! algol68.info: doc/ga68.info doc/ga68-internals.info doc/ga68-coding-guidelines.info
! algol68.dvi: doc/ga68.dvi doc/ga68-internals.dvi doc/ga68-coding-guidelines.dvi
! algol68.pdf: doc/ga68.pdf doc/ga68-internals.pdf doc/ga68-coding-guidelines.pdf
  algol68.install-pdf:
! algol68.html: $(build_htmldir)/ga68/index.html $(build_htmldir)/ga68-internals/index.html \
!               $(build_htmldir)/ga68-coding-guidelines/index.html
  algol68.man: doc/ga68.1
! algol68.srcinfo: doc/ga68.info doc/ga68-internals.info doc/ga68-coding-guidelines.info
  	-cp -p $^ $(srcdir)/doc
  algol68.srcinfo:
  algol68.srcman:
*************** $(DESTDIR)$(man7dir)/%.7algol: doc/%.7al
*** 245,253 ****
  	-$(INSTALL_DATA) $< $@
  	-chmod a-x $@
  
! algol68.install-info: $(DESTDIR)$(infodir)/ga68.info $(DESTDIR)$(infodir)/ga68-internals.info
  
! algol68.install-html: $(build_htmldir)/ga68 $(build_htmldir)/ga68-internals
  	@$(NORMAL_INSTALL)
  	test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)"
  	@for p in $(build_htmldir)/ga68; do \
--- 272,283 ----
  	-$(INSTALL_DATA) $< $@
  	-chmod a-x $@
  
! algol68.install-info: $(DESTDIR)$(infodir)/ga68.info \
!                       $(DESTDIR)$(infodir)/ga68-internals.info \
!                       $(DESTDIR)$(infodir)/ga68-coding-guidelines.info
  
! algol68.install-html: $(build_htmldir)/ga68 $(build_htmldir)/ga68-internals \
!                       $(build_htmldir)/ga68-coding-guidelines.info
  	@$(NORMAL_INSTALL)
  	test -z "$(htmldir)" || $(mkinstalldirs) "$(DESTDIR)$(htmldir)"
  	@for p in $(build_htmldir)/ga68; do \
diff -Nrcpad gcc-16-20260111/gcc/algol68/a68-lang.cc gcc-16-20260118/gcc/algol68/a68-lang.cc
*** gcc-16-20260111/gcc/algol68/a68-lang.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/algol68/a68-lang.cc	Sun Jan 18 22:32:06 2026
*************** a68_option_lang_mask (void)
*** 263,268 ****
--- 263,271 ----
  static tree
  a68_type_for_mode (enum machine_mode mode, int unsignedp)
  {
+   if (mode == TImode)
+     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
+ 
    if (mode == QImode)
      return unsignedp ? a68_short_short_bits_type :a68_short_short_int_type;
  
*************** a68_type_for_size (unsigned int bits, in
*** 319,324 ****
--- 322,332 ----
  {
    if (unsignedp)
      {
+       /* Handle TImode as a special case because it is used by some backends
+ 	 (e.g. ARM) even though it is not available for normal use.  */
+       if (bits == TYPE_PRECISION (unsigned_intTI_type_node))
+ 	return unsigned_intTI_type_node;
+ 
        if (bits <= TYPE_PRECISION (a68_short_short_bits_type))
  	return a68_short_short_bits_type;
        if (bits <= TYPE_PRECISION (a68_short_bits_type))
diff -Nrcpad gcc-16-20260111/gcc/algol68/a68-parser-moids-equivalence.cc gcc-16-20260118/gcc/algol68/a68-parser-moids-equivalence.cc
*** gcc-16-20260111/gcc/algol68/a68-parser-moids-equivalence.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/algol68/a68-parser-moids-equivalence.cc	Sun Jan 18 22:32:06 2026
*************** are_packs_equivalent (PACK_T *s, PACK_T
*** 49,58 ****
  	return false;
        if (compare_names)
  	{
  	  if (TEXT (s) != TEXT (t)
! 	      && TEXT (s) != NO_TEXT
! 	      && TEXT (t) != NO_TEXT
! 	      && strcmp (TEXT (s), TEXT (t)) != 0)
  	    return false;
  	}
      }
--- 49,62 ----
  	return false;
        if (compare_names)
  	{
+ 	  /* Note that a name in a pack of a struct may be NULL if the
+ 	     corresponding field is supposed to not be accessible by the user.
+ 	     There is at present one instance of this: the standard prelude
+ 	   */
  	  if (TEXT (s) != TEXT (t)
! 	      && !(TEXT (s) != NO_TEXT
! 		   && TEXT (t) != NO_TEXT
! 		   && strcmp (TEXT (s), TEXT (t)) == 0))
  	    return false;
  	}
      }
diff -Nrcpad gcc-16-20260111/gcc/algol68/a68-parser-prelude.cc gcc-16-20260118/gcc/algol68/a68-parser-prelude.cc
*** gcc-16-20260111/gcc/algol68/a68-parser-prelude.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/algol68/a68-parser-prelude.cc	Sun Jan 18 22:32:06 2026
*************** stand_prelude (void)
*** 518,524 ****
    a68_prio ("SHR", 8);
    a68_prio ("UP", 8);
    a68_prio ("DOWN", 8);
-   a68_prio ("^", 8);
    a68_prio ("LWB", 8);
    a68_prio ("UPB", 8);
    a68_prio ("I", 9);
--- 518,523 ----
*************** stand_prelude (void)
*** 634,640 ****
    a68_op (A68_STD, "/=", m, a68_lower_int_ne3);
    m = a68_proc (M_SHORT_SHORT_INT, M_SHORT_SHORT_INT, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m, a68_lower_pow_int);
-   a68_op (A68_STD, "^", m, a68_lower_pow_int);
    /* SHORT INT operators.  */
    m = a68_proc (M_SHORT_INT, M_SHORT_INT, NO_MOID);
    a68_op (A68_STD, "+", m, a68_lower_confirm2);
--- 633,638 ----
*************** stand_prelude (void)
*** 681,687 ****
    a68_op (A68_STD, "GE", m, a68_lower_int_ge3);
    m = a68_proc (M_SHORT_INT, M_SHORT_INT, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m, a68_lower_pow_int);
-   a68_op (A68_STD, "^", m, a68_lower_pow_int);
    /* INT operators. */
    m = a68_proc (M_INT, M_INT, NO_MOID);
    a68_op (A68_STD, "+", m, a68_lower_confirm2);
--- 679,684 ----
*************** stand_prelude (void)
*** 716,722 ****
    a68_op (A68_STD, "MOD", m, a68_lower_mod3);
    a68_op (A68_STD, "%*", m, a68_lower_mod3);
    a68_op (A68_STD, "**", m, a68_lower_pow_int);
-   a68_op (A68_STD, "^", m, a68_lower_pow_int);
    m = a68_proc (M_REAL, M_INT, M_INT, NO_MOID);
    a68_op (A68_STD, "/", m, a68_lower_rdiv3);
    m = a68_proc (M_REF_INT, M_REF_INT, M_INT, NO_MOID);
--- 713,718 ----
*************** stand_prelude (void)
*** 778,784 ****
    a68_op (A68_STD, "/", m, a68_lower_rdiv3);
    m = a68_proc (M_LONG_INT, M_LONG_INT, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m, a68_lower_pow_int);
-   a68_op (A68_STD, "^", m, a68_lower_pow_int);
    /* LONG LONG INT operators. */
    m = a68_proc (M_LONG_LONG_INT, M_LONG_LONG_INT, NO_MOID);
    a68_op (A68_STD, "+", m, a68_lower_confirm2);
--- 774,779 ----
*************** stand_prelude (void)
*** 826,832 ****
    a68_op (A68_STD, "/=", m, a68_lower_int_ne3);
    m = a68_proc (M_LONG_LONG_INT, M_LONG_LONG_INT, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m, a68_lower_pow_int);
-   a68_op (A68_STD, "^", m, a68_lower_pow_int);
    /* SHORT SHORT BITS operators  */
    m = a68_proc (M_BOOL, M_SHORT_SHORT_BITS, M_SHORT_SHORT_BITS, NO_MOID);
    a68_op (A68_STD, "=", m, a68_lower_bit_eq3);
--- 821,826 ----
*************** stand_prelude (void)
*** 1006,1015 ****
    a68_op (A68_STD, "*", m, a68_lower_mult_real);
    a68_op (A68_STD, "/", m, a68_lower_div3);
    a68_op (A68_STD, "**", m, a68_lower_pow_real);
-   a68_op (A68_STD, "^", m, a68_lower_pow_real);
    m = a68_proc (M_REAL, M_REAL, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m, a68_lower_pow_real);
-   a68_op (A68_STD, "^", m, a68_lower_pow_real);
    m = a68_proc (M_REF_REAL, M_REF_REAL, M_REAL, NO_MOID);
    a68_op (A68_STD, "+:=", m, a68_lower_plusab3);
    a68_op (A68_STD, "-:=", m, a68_lower_minusab3);
--- 1000,1007 ----
*************** stand_prelude (void)
*** 1041,1047 ****
    a68_op (A68_STD, "*", m, a68_lower_mult_real);
    a68_op (A68_STD, "/", m, a68_lower_div3);
    a68_op (A68_STD, "**", m, a68_lower_pow_real);
-   a68_op (A68_STD, "^", m, a68_lower_pow_real);
    m = a68_proc (M_REF_LONG_REAL, M_REF_LONG_REAL, M_LONG_REAL, NO_MOID);
    a68_op (A68_STD, "+:=", m, a68_lower_plusab3);
    a68_op (A68_STD, "-:=", m, a68_lower_minusab3);
--- 1033,1038 ----
*************** stand_prelude (void)
*** 1066,1072 ****
    a68_op (A68_STD, "GE", m, a68_lower_real_ge3);
    m = a68_proc (M_LONG_REAL, M_LONG_REAL, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m, a68_lower_pow_real);
-   a68_op (A68_STD, "^", m, a68_lower_pow_real);
    /* LONG LONG REAL operators. */
    m = a68_proc (M_LONG_REAL, M_LONG_LONG_REAL, NO_MOID);
    a68_op (A68_STD, "SHORTEN", m, a68_lower_shortenreal2);
--- 1057,1062 ----
*************** stand_prelude (void)
*** 1085,1091 ****
    a68_op (A68_STD, "*", m, a68_lower_mult_real);
    a68_op (A68_STD, "/", m, a68_lower_div3);
    a68_op (A68_STD, "**", m, a68_lower_pow_real);
-   a68_op (A68_STD, "^", m, a68_lower_pow_real);
    m = a68_proc (M_REF_LONG_LONG_REAL, M_REF_LONG_LONG_REAL, M_LONG_LONG_REAL, NO_MOID);
    a68_op (A68_STD, "+:=", m, a68_lower_plusab3);
    a68_op (A68_STD, "-:=", m, a68_lower_minusab3);
--- 1075,1080 ----
*************** stand_prelude (void)
*** 1110,1116 ****
    a68_op (A68_STD, "GE", m, a68_lower_real_ge3);
    m = a68_proc (M_LONG_LONG_REAL, M_LONG_LONG_REAL, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m, a68_lower_pow_real);
-   a68_op (A68_STD, "^", m, a68_lower_pow_real);
    /* ROWS operators.  */
    m = a68_proc (M_INT, M_ROWS, NO_MOID);
    a68_op (A68_STD, "LWB", m, a68_lower_lwb2);
--- 1099,1104 ----
*************** stand_prelude (void)
*** 1196,1203 ****
    a68_op (A68_STD, "/", m);
    m = a68_proc (M_COMPLEX, M_COMPLEX, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m);
-   a68_op (A68_STD, "UP", m);
-   a68_op (A68_STD, "^", m);
    m = a68_proc (M_REF_COMPLEX, M_REF_COMPLEX, M_COMPLEX, NO_MOID);
    a68_op (A68_STD, "+:=", m);
    a68_op (A68_STD, "-:=", m);
--- 1184,1189 ----
*************** stand_prelude (void)
*** 1240,1247 ****
    a68_op (A68_STD, "/", m);
    m = a68_proc (M_LONG_COMPLEX, M_LONG_COMPLEX, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m);
-   a68_op (A68_STD, "UP", m);
-   a68_op (A68_STD, "^", m);
    m = a68_proc (M_BOOL, M_LONG_COMPLEX, M_LONG_COMPLEX, NO_MOID);
    a68_op (A68_STD, "=", m);
    a68_op (A68_STD, "EQ", m);
--- 1226,1231 ----
*************** stand_prelude (void)
*** 1279,1286 ****
    a68_op (A68_STD, "/", m);
    m = a68_proc (M_LONG_LONG_COMPLEX, M_LONG_LONG_COMPLEX, M_INT, NO_MOID);
    a68_op (A68_STD, "**", m);
-   a68_op (A68_STD, "UP", m);
-   a68_op (A68_STD, "^", m);
    m = a68_proc (M_BOOL, M_LONG_LONG_COMPLEX, M_LONG_LONG_COMPLEX, NO_MOID);
    a68_op (A68_STD, "=", m);
    a68_op (A68_STD, "EQ", m);
--- 1263,1268 ----
*************** posix_prelude (void)
*** 1442,1469 ****
  static void
  stand_transput (void)
  {
!   PACK_T *z = NO_PACK;
!   MOID_T *m = NO_MOID;
! 
!   /* Modes.  */
! 
!   /* NUMBER  */
!   z = NO_PACK;
!   (void) a68_add_mode_to_pack (&z, M_INT, NO_TEXT, NO_NODE);
!   (void) a68_add_mode_to_pack (&z, M_LONG_INT, NO_TEXT, NO_NODE);
!   (void) a68_add_mode_to_pack (&z, M_LONG_LONG_INT, NO_TEXT, NO_NODE);
!   (void) a68_add_mode_to_pack (&z, M_SHORT_INT, NO_TEXT, NO_NODE);
!   (void) a68_add_mode_to_pack (&z, M_SHORT_SHORT_INT, NO_TEXT, NO_NODE);
!   (void) a68_add_mode_to_pack (&z, M_REAL, NO_TEXT, NO_NODE);
!   (void) a68_add_mode_to_pack (&z, M_LONG_REAL, NO_TEXT, NO_NODE);
!   (void) a68_add_mode_to_pack (&z, M_LONG_LONG_REAL, NO_TEXT, NO_NODE);
!   M_NUMBER = a68_add_mode (&TOP_MOID (&A68_JOB), UNION_SYMBOL, a68_count_pack_members (z), NO_NODE, NO_MOID, z);
! 
!   /* Layout procedures.  */
! 
!   /* Conversion procedures.  */
!   m = a68_proc (M_STRING, M_NUMBER, M_INT, NO_MOID);
!   a68_idf (A68_STD, "whole", m);
  }
  
  /* Build the standard environ symbol table.  */
--- 1424,1431 ----
  static void
  stand_transput (void)
  {
!   /* Most of the standard transput is implemented in Algol 68 and doesn't
!      require compiler support.  See libga68/transput.a68.in */
  }
  
  /* Build the standard environ symbol table.  */
diff -Nrcpad gcc-16-20260111/gcc/algol68/ga68-coding-guidelines.texi gcc-16-20260118/gcc/algol68/ga68-coding-guidelines.texi
*** gcc-16-20260111/gcc/algol68/ga68-coding-guidelines.texi	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/algol68/ga68-coding-guidelines.texi	Sun Jan 18 22:32:06 2026
***************
*** 0 ****
--- 1,847 ----
+ \input texinfo  @c -*-texinfo-*-
+ @c %**start of header
+ @setfilename ga68-coding-guidelines.info
+ 
+ @include gcc-common.texi
+ 
+ @synindex tp cp
+ 
+ @settitle GNU Algol 68 Coding Guidelines
+ 
+ @c %**end of header
+ 
+ @c %** start of document
+ 
+ @copying
+ Copyright @copyright{} 2026 Jose E. Marchesi.
+ 
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3 or
+ any later version published by the Free Software Foundation; with no
+ Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A
+ copy of the license is included in the section entitled ``GNU Free
+ Documentation License''.
+ @end copying
+ 
+ @ifinfo
+ @dircategory Software development
+ @direntry
+ * ga68-coding-guidelines: (ga68-coding-guidelines).           GNU Algol 68 Coding Guidelines.
+ @end direntry
+ This document contains a set of conventions and recommendations for
+ writing Algol 68 code which is part of ga68, the GNU Algol 68
+ compiler. As with any coding conventions, the goal is to achieve a
+ coherent style among the code base.
+ 
+ @insertcopying
+ @end ifinfo
+ 
+ @c Macro for bold-tags.  In TeX and HTML they expand to proper bold words,
+ @c in other formats it resorts to upper stropping.
+ @iftex
+ @macro B{tag}
+ @strong{\tag\}
+ @end macro
+ @end iftex
+ 
+ @ifhtml
+ @macro B{tag}
+ @strong{\tag\}
+ @end macro
+ @end ifhtml
+ 
+ @ifnottex
+ @ifnothtml
+ @macro B{tag}
+ @sc{\tag\}
+ @end macro
+ @end ifnothtml
+ @end ifnottex
+ 
+ @setchapternewpage odd
+ @titlepage
+ @title GNU Algol 68 Coding Guidelines
+ @versionsubtitle
+ @author Jose E. Marchesi
+ @page
+ @vskip 0pt plus 1filll
+ @sp 1
+ @insertcopying
+ @end titlepage
+ 
+ @summarycontents
+ @contents
+ 
+ @page
+ 
+ @ifnottex
+ @node Top
+ @top Introduction
+ @cindex Introduction
+ 
+ This document contains a set of conventions and recommendations for
+ writing Algol 68 code which is part of @command{ga68}, the GNU Algol
+ 68 compiler. As with any coding conventions, the goal is to achieve a
+ coherent style among the code base.
+ 
+ Algol 68 is probably the programming language with the most carefully
+ and lovingly designed syntax ever made.  It can be verbose when it is
+ convenient for the programmer, and also extremely compact while
+ keeping an astounding high level of readability.  These conventions
+ aim to make a good use of that.
+ 
+ Feel free to adopt our guidelines for your own Algol 68 project,
+ partially or entirely.
+ 
+ In what follows we make extensive use of Algol 68 terminology, which
+ may be confusing at first for the uninitiated reader.  The Algol 68
+ Jargon File provides definitions for many of the terms used in the
+ context of the Algol 68 programming language and associated
+ technologies.  If you find yourself wondering about "frobyts" or
+ "enclosed clauses", please look them up in the jargon
+ file@footnote{@url{https://jemarch.net/a68-jargon}}.  The file is
+ available online in the www and, in Gentoo, as manpages once you
+ install the app-doc/a68-jargon package. Just type @command{man 7algol
+ frobyt} in the terminal, for example.
+ 
+ Additionally, in this document we use the term "space" and "spaces" to
+ refer to "typographical display features", i.e. spaces, tabs and
+ newlines.  These characters are of no significance and do not alter
+ the meaning of the program when they appear between symbols, outside
+ of string and character denotations, but they have a great impact on
+ the readability of the code and are the main tool for formatting.
+ 
+ @menu
+ * Stropping::              What stropping regime to use.
+ * Formatting::             Using spaces wisely.
+ * Comments::               No idem.
+ * Syntactic Conventions::  How to best write certain constructs.
+ * Naming::                 Choosing good tags and bold words.
+ * Programming Style::      Recommendations on style.
+ 
+ * GNU Free Documentation License::
+                            How you can copy and share this manual.
+ * Index::                  Index of this documentation.
+ @end menu
+ @end ifnottex
+ 
+ @c ---------------------------------------------------------------------
+ @c Stropping
+ @c ---------------------------------------------------------------------
+ 
+ @node Stropping
+ @chapter Stropping
+ 
+ The GNU Algol 68 compiler supports two stropping regimes:
+ 
+ @itemize @minus
+ @item
+ The classic @dfn{UPPER stropping}, which is one of the standard
+ stropping regimes defined in the Standard Hardware Representation for
+ Algol 68.  This regime uses upper-case letters to encode bold letters
+ and lower-case letters to encode non-bold letters.
+ @item
+ The modern @dfn{SUPPER stropping}, which is a GNU extension.  This is
+ the standard stropping regime in GCC, and its rules are similar to the
+ naming conventions widely used in many modern programming languages.
+ The resulting programs have a very modern feeling.
+ @end itemize
+ 
+ In GCC we use SUPPER stropping only.  The only instance of UPPER
+ stropping are in test cases.  Some of the guidelines and
+ considerations in this document may also be useful in programs using
+ UPPER stropping.
+ 
+ @node Formatting
+ @chapter Formatting
+ 
+ The placement of spaces and empty lines in the program text plays an
+ important role when it comes to readability.
+ 
+ @menu
+ * Empty lines::
+ * Spaces before parentheses::
+ * Spaces after parentheses::
+ * Spaces within packs::
+ * Spaces in row displays::
+ * Spaces in formulas::
+ * Spaces in declarers::
+ * Spaces in indexers and trimmers::
+ * Spaces in brief clause forms::
+ @end menu
+ 
+ @node Empty lines
+ @section Empty lines
+ 
+ Empty lines are often used in programs to separate logical parts in a
+ sequence of statements or expressions.  This avoids the code to look
+ like walls of text, which are somewhat difficult to read.  This of
+ course also applies to Algol 68, but to a much lesser degree due to
+ the exceptionally clean syntax of the language.  Therefore we favor a
+ compact formatting to a reasonable extent.
+ 
+ Please be frugal with empty lines, especially within enclosed clauses.
+ 
+ It is not necessary nor advisable to have separated "declaration
+ parts" in serial clauses, because declarations can appear anywhere.
+ However empty lines may still be useful to group related declarations
+ together.
+ 
+ It is often better to use an explanatory comment rather than an empty
+ line, again especially within enclosed clauses.
+ 
+ @node Spaces before parentheses
+ @section Spaces before parentheses
+ 
+ Do not put spaces before open-parentheses in routine calls.
+ 
+ But make sure to always put a space between @code{union} or
+ @code{struct} and the open parenthesis that follows in declarers.
+ 
+ Likewise, please put a space before the open parenthesis when the
+ enclosed clause in a cast is a closed clause.
+ 
+ Examples:
+ 
+ @example
+ @{ No space before open-parentheses in calls @}
+ puts(fixed(count,0) + "'n");
+ 
+ @{ Space between `union' or `struct' and `(' @}
+ mode Number = union (int,long int,real,long real)
+ 
+ @{ Space before '(' in casts @}
+ ref JSON_Fld (fields) := field;
+ @end example
+ 
+ @node Spaces after parentheses
+ @section Spaces after parentheses
+ 
+ When writing routine texts always place a space between the formal
+ parameters pack and the mode of the value yielded by the routine.
+ 
+ When writing operator and procedure declarators do not put a space
+ between the parameter modes pack and the mode of the yielded value.
+ 
+ Also in declarers, do not put a space after @code{op} or @code{proc}
+ and the parameter modes pack.
+ 
+ @example
+ @{ Space after formal parameters pack in routine text @}
+ json_foreach_elem(a, (ref JSON_Val v) void: len +:= 1)
+ 
+ @{ No space after parameters pack in procedure and operator
+   declarators @}
+ proc(string)void error;
+ @end example
+ 
+ @node Spaces within packs
+ @section Spaces within packs
+ 
+ With "pack" we refer to the following source constructs which are
+ collections of other constructs enclosed between @code{(} and @code{)}
+ symbols:
+ 
+ @itemize @minus
+ @item The actual parameters in a call.
+ @item The formal parameters in a routine text.
+ @item The fields in a struct mode declarator.
+ @item The modes of the united modes in an union mode declarator.
+ @item The modes of the parameters in an operator or procedure declarator.
+ @end itemize
+ 
+ Spaces are optional after commas in packs when both the preceding and
+ following symbols are tags.
+ 
+ Put a space after commas in packs when the next construct is not a
+ tag, but only if the preceding construct is a tag.
+ 
+ Do not put spaces before commas in packs.
+ 
+ Examples:
+ 
+ @example
+ @{ Spaces are optional around commas surrounded by tags @}
+ process(socket, resp, fragmented);
+ process(socket,resp,fragmented);
+ op E = (Symbol a,b) bool: a = b;
+ op E = (Symbol a, b) bool: a = b;
+ 
+ @{ Space after commas separating a non tag and a tag @}
+ op E = (Symbol s, Word w) bool: s E w;
+ mode M = struct (int i, real r);
+ 
+ @{ No spaces in commas separating non tags @}
+ proc(int,string,[]real)int callback;
+ op(int,int)int handler;
+ mode Data = union (void,bool,int)
+ @end example
+ 
+ @node Spaces in row displays
+ @section Spaces in row displays
+ 
+ Within row displays spaces are optional after commas, but please never
+ put spaces before commas.
+ 
+ @example
+ @{ Spaces are ok after commas in row-displays @}
+ []int a = (1,2,3);
+ []int b = (1, 2, 3);
+ []string names = ("jemarch",
+                   "mnabipoor",
+                   "pietr0");
+ @end example
+ 
+ @node Spaces in formulas
+ @section Spaces in formulas
+ 
+ Do not put spaces after monadic operators whose representation is not
+ a bold word.
+ 
+ However, if the monadic operator is represented by a bold word, always
+ put a space between the operator and the operand, even when the
+ operand starts with a parenthesis.
+ 
+ Always put spaces before and after dyadic operators if the formula is
+ not parenthesized.  Spaces are optional if the formula is
+ parenthesized, provided the operator is not represented by a bold
+ word.  Note however that if long tags are involved extra spaces may be
+ advisable even for parenthesized formulas.
+ 
+ Examples:
+ 
+ @example
+ @{ No space after non-bold monadic operators @}
+ int i = -10;
+ 
+ @{ Always a space after bold monadic operator @}
+ int i = ABS (base + offset)
+ 
+ @{ Spaces in dyadic opeator @}
+ total := a + b;
+ index := cnt +:= 1;
+ total := (a + b);
+ index := (cnt +:= 1);
+ total := (a+b);
+ index := (cnt+:=1)
+ @end example
+ 
+ @node Spaces in declarers
+ @section Spaces in declarers
+ 
+ 
+ Do not put spaces after ']' in row mode declarers.
+ 
+ Do not put spaces after the bounds of a declarer.
+ 
+ Also, do not put spaces directly within the bounds of a declarer,
+ unless for indentation purposes.  Since bounds can contain any unit,
+ the general rules apply within these.
+ 
+ Examples:
+ 
+ @example
+ @{ No space after `]' in declarers @}
+ []int a = (1,2,3);
+ 
+ @{ No spaces after bounds in declarers @}
+ mode List = [10]int,
+      MatrixList = [10][3,3]int,
+      Numbers = []union (int,real);
+ 
+ @{ No spaces directly within bounds in declarers @}
+ mode MyString = [1:10@@]MyChar,
+      DynamicTable = [read_int(10, 20),
+                      read_int(10, 20)]char;
+ @end example
+ 
+ @node Spaces in indexers and trimmers
+ @section Spaces in indexers and trimmers
+ 
+ 
+ While indexing and trimming a multiple, never put a space between the
+ indexed tertiary and the SUB symbol.
+ 
+ Do not put spaces direcly within indexers and trimmers, unless for
+ indentation purposes.  As an exception to this rule, you can put a
+ single space before the "at" operator @code{@@} if desired.
+ 
+ Examples:
+ 
+ @example
+ @{ No space between tertiary and '[' @}
+ int i = a[i];
+ int i = a[10:20]
+ 
+ @{ No direct spaces within trimmers and indexers, but before @ @}
+ []int a = b[2:5@@10];
+ []int c = d[10:20 @@1];
+ @end example
+ 
+ @node Spaces in brief clause forms
+ @section Spaces in brief clause forms
+ 
+ It is generally a good idea to have spaces around @code{|} and
+ @code{|:} within the brief forms of conditional clauses, case clauses
+ and conformity clauses.
+ 
+ When the brief forms are very short and the units are number
+ denotations, it may be more clear to not use spaces, especially when
+ the form is an operand in a formula.
+ 
+ Examples:
+ 
+ @example
+ @{ Space around | and |: in brief forms @}
+ (v | (void): "empty", (bool b): (b | "true" | "false"))
+ 
+ @{ No spaces may be more readable sometimes @}
+ int n = 2 + (c>3|10|20);
+ @end example
+ 
+ @node Comments
+ @chapter Comments
+ 
+ Use @code{"foo"} to refer to formal parameters when documenting
+ procedures or operators.
+ 
+ Use @code{`whatever'} to refer to any other source construct that is
+ not a formal parameter.
+ 
+ Use @code{@{@{} and @code{@}@}} delimiters for commenting out code.
+ Remember comments in modern Algol 68 aren't nestable.
+ 
+ Examples:
+ 
+ @example
+ int error_hash = 0;
+ 
+ @{ Return a hash code for the string "s", or `error_hash' if the string
+   is too long.  @}
+ 
+ proc hash_string (string s)
+ 
+ @{@{ int no_longer_needed; @}@}
+ @end example
+ 
+ @node Syntactic Conventions
+ @chapter Syntactic Conventions
+ 
+ @menu
+ * Closed clauses::
+ * Indexers and trimmers::
+ * Conditional clauses::
+ * Loop clauses::
+ * Case and conformity clauses::
+ * Procedure and operator declarations::
+ * Contracted declarations::
+ * Brief clause forms::
+ @end menu
+ 
+ @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
+ and can generally be used according to the programmer's taste.
+ However, this section contains a few guidelines and recommendations on
+ this regard.
+ 
+ Use parentheses for closed clauses that span a single line, regardless
+ of the context.  Having @code{begin} and @code{end} symbols in the
+ same line looks weird and confusing.
+ 
+ As a general rule, always use parentheses in closed clauses that are
+ operands in a formula.  Exceptionally, using @code{begin} and
+ @code{end} in formula operands may be preferable if the operand
+ contains many declarations and units, and only if it spans for more
+ than one line.  In this case, however, please consider factoring the
+ code in the operand into a routine and replace it with a procedure
+ call.
+ 
+ The preferred indentation for a closed clause whose contents span more
+ than one line, and that uses @code{begin} and @code{end} symbols as
+ delimiters, is to indent the contents right at the right of the
+ @code{begin} symbol.  The @code{end} symbol shall then be placed in
+ its own line, with the same indentation level than the opening symbol.
+ 
+ If the closed clause contains empty lines, or if the line preceding
+ the closed clause is so long that it would "hide" the first line in
+ the closed clause, then it is ok to put the first unit or declaration
+ in the line after @code{begin}.  This usually happens when the closed
+ clause is the body of a long routine text.
+ 
+ The preferred indentation for a closed clause whose contents span more
+ than one line, and that uses @code{(} and @code{)} symbols as
+ delimiters, is to indent the contents right at the right of the
+ @code{(} symbol.  The @code{)} symbol finishing the closed clause
+ shall not be placed in its own line.
+ 
+ @example
+ @{ No `begin' and `end' in the same line @}
+ int i = 2 + (3+4);
+ int i = 2 + (int i = random(); i % 10 );
+ bool test = case v in (string): (puts (s); true) out false esac;
+ 
+ @{ Closed clauses as formula operands @}
+ int i = 2 + (int cnt := 0;
+              to UPB data[@@1] do cnt +:= 1 od;
+              cnt)
+ int j = 2 + begin int cnt := 0;
+                   to UPB data[@@1] do cnt +:= 1 od;
+                   cnt
+                   end
+ 
+ @{ Closed clause with no empty lines @}
+ begin int fd = fopen ("data', file_o_rdonly")
+       puts ("first line: " + fgets (fd, 0));
+       fclose (fd)
+ end;
+ 
+ @{ Closed clause with no empty lines but with preceding
+   line of similar length @}
+ proc parse_number = int:
+ begin
+       int num := 0;
+       while num := num * 10 + ABS ch - ABS "0";
+             isdigi(getachar)
+       do ~ od;
+       ungeachar(ch);
+       num
+ end;
+ 
+ @{ Closed clause with empty lines @}
+ proc main_proc = int:
+ begin
+       @{ Auxiliary procs @}
+       proc aux1 = int: ...;
+       proc aux2 = int: ...;
+ 
+       @{ Computation @}
+       aux1;
+       aux2;
+ 
+       @{ Result @}
+       aux1 + aux2
+ end
+ 
+ @{ Indentation of closed clauses using `(' and `)' delimiters @}
+ proc parse_number = int:
+ (int num := 0;
+  while num := num * 10 + ABS ch - ABS "0";
+        isdigi(getachar)
+  do ~ od;
+  ungeachar(ch);
+  num)
+ @end example
+ 
+ 
+ @node Indexers and trimmers
+ @section Indexers and trimmers
+ 
+ Algol 68 allows using @code{(} and @code{)} instead of @code{[} and
+ @code{]} in bounds and slices to represent the SUB and BUS
+ symbols. This is supported by ga68 via the @option{-fbrackets}
+ command-line option in order to ease the porting of old code, and it
+ is disabled by default. Please always use square brackets for indexing
+ in new code.
+ 
+ @node Conditional clauses
+ @section Conditional clauses
+ 
+ If a conditional clause is still clear and not of excessive length
+ when written on a single line, just do it.
+ 
+ Start the enquiry clause in the if-part of a conditional clause right
+ after the @code{if} symbol, not in the next line.
+ 
+ The serial clauses in the then- and if-parts of the conditional clause
+ shall be indented five positions right, which is the length of both
+ the @code{then} and @code{else} symbols plus one.
+ 
+ The first declaration or unit in the then- and if-parts shall be
+ placed in the same line than the @code{then} and @code{else} symbols,
+ respectively.
+ 
+ Place the @code{fi} closing symbol in its own line, with the same
+ indentation level than the matching @code{if}.  The exception to this
+ rule is when the conditional clause has no else-part and the then-part
+ spans for a single line that is not too long.  In that case, place the
+ @code{fi} in the same line than @code{then}.
+ 
+ Examples:
+ 
+ @example
+ @{ Very small conditional clause in a single line @}
+ if idx < 0 then fatal("invalid idx") fi
+ 
+ @{ Short conditional-clause with `fi' in the same line
+   than `then' @}
+ if argc /= 3
+ then puts("expected two arguments'n") fi
+ 
+ @{ A conditional-clause that spans several lines @}
+ if a > 10
+ then puts("truncating");
+      a := 10
+ fi
+ @end example
+ 
+ @node Loop clauses
+ @section Loop clauses
+ 
+ 
+ If a loop clause is small enough to fit in a single line without
+ occupying most of it, just do it.
+ 
+ If a loop clause spans two lines, and the second line is not too long,
+ you can put @code{od} in the same line than @code{do}.
+ 
+ If a loop clause spans several lines, please put the @code{do} symbol
+ in its own line, indented to the same level than the clause's frobyts.
+ 
+ Examples:
+ 
+ @example
+ @{ Very short loop-clause in a single line.  @}
+ for a to argc do puts ("arg: " + argv[a]) od;
+ 
+ @{ Short loop-clause with `od' in the same line than `do' @}
+ for i from LWB a to UPB a
+ do total +:= a[i] od
+ 
+ @{ A loop-clause that spans several lines @}
+ while NOT exit
+ do string cmd = get_command;
+    process_command(cmd)
+ od
+ @end example
+ 
+ 
+ @node Case and conformity clauses
+ @section Case and conformity clauses
+ 
+ Do not write a case or conformity clause in a single line, unless
+ you are using the brief form.  Unlike conditional and loop clauses,
+ these are difficult to read.
+ 
+ Please put the @code{in}, @code{out} and @code{ease} symbols in their
+ own lines, with the same indentation level than the matching
+ @code{case}.
+ 
+ Start the choices right after the @code{in} symbol, in the same line.
+ All the choices may fit in a single line.  If they don't, please put
+ each choice in its own line.
+ 
+ @example
+ @{ Short case clause @}
+ case i
+ in 100, 200, 300 out 0 esac;
+ 
+ @{ Long case clause @}
+ case i
+ in 100,
+    200,
+    300
+ ouse i % 100
+ in 100,
+    200,
+    300
+ esac;
+ 
+ @{ Long conformity clause @}
+ case v
+ in (void): "empty",
+    (bool b): (b | "true" | "false"),
+    (string s): s
+ esac
+ @end example
+ 
+ @node Procedure and operator declarations
+ @section Procedure and operator declarations
+ 
+ In procedure and operator declarations, if the body of a routine text
+ starts with 'begin', put it at the same indentation than the
+ @code{pub}, @code{proc} or @code{op}.  Otherwise, indent it three
+ spaces to the right relative to the @code{pub}, @code{proc} or
+ @code{op}.
+ 
+ Examples:
+ 
+ @example
+ @{ Body of routine is a `begin'..`end' closed clause @}
+ proc checked_div = (int a,b) int:
+ begin
+       if b = 0 then fatal ("div by zero") fi;
+       a % b
+ end;
+ 
+ @{ Body of routine does not start with `begin' @}
+ proc checked_div = (int a,b) int:
+    (b = 0 | fatal ("div by zero"); skip | a % b);
+ 
+ @{ Body of routine is not a closed clause @}
+ proc checked_div = (int a,b) int:
+    if b = 0
+    then fatal ("div by zero"); skip
+    else a % b
+    fi;
+ @end example
+ 
+ @node Contracted declarations
+ @section Contracted declarations
+ 
+ Please don't be shy to use contracted forms of declarations.  They can
+ make the program much more readable and they make it easier to add new
+ declarations, because they prevent writing the same text again and
+ again.
+ 
+ However, care should be taken when declaring operators and procedures.
+ In these cases, contracted declarations should only be used when
+ declaring very short, one or two lines long routines.  The last
+ routine in the list of joined declarations can be a bit longer.
+ 
+ Examples:
+ 
+ @example
+ @{ Contracted declarations lead to compact and very
+   readable code @}
+ int disconnected = 0, connected = 0, unknown = 2;
+ pub ref JSON_Val json_no_val = nil,
+     ref JSON_Elm json_no_elm = nil;
+     ref JSON_Fld json_no_fld = nil;
+ 
+ @{ Use contracted declarations for short routines @}
+ op + = (States ss, State s) States: MoreStates (heap States := ss, s),
+    + = (Transitions ts, Transition t) Transitions:
+          MoreTransitions (heap Transitions := ts, t)
+ @end example
+ 
+ @node Brief clause forms
+ @section Brief clause forms
+ 
+ The obvious context where to use the brief forms of conditional, case
+ and conformity clauses is when these clauses appear as operands in
+ formulas.  They match well with parenthesized closed clauses.
+ 
+ It is also ok to use brief forms of clauses out of formulas,
+ especially inside case and conformiy clauses.  But please be careful,
+ as brief forms may be confused sometimes.
+ 
+ Examples:
+ 
+ @example
+ @{ Brief forms in formulas @}
+ int res = (a=0 | fatal("div by zero"); skip | den/a);
+ 
+ @{ Brief forms out of formulas @}
+ for i to ELEMS str
+ do char newline = REPR 10, tab = REPR 9, c = str[i];
+    (c = "\" | res +:= "\\"
+     |: c = newline | res +:= "\n"
+     |: c = tab | res +:= "\t"
+     |  res +:= c)
+ od
+ @end example
+ 
+ @node Naming
+ @chapter Naming
+ 
+ Unlike most other programming languages, which are not stropped, in
+ Algol 68 it is possible to have tags with the same name as reserved
+ words, by appending an underscore character to the tag. For example, a
+ tag @code{if} can be written as @code{if_}.  It is important to note
+ that the trailing underscore is not part of the tag: it is just a
+ stropping artifact. This is always better than contriving artificious
+ synonyms that are often confusing or too long.  A copying routine has
+ arguments "from" and "to"? Call them @code{from_} and @code{to_}. A
+ struct mode has fields "in" and "out"? Call them @code{in_} and
+ @code{out_}.
+ 
+ Please use fully upper-case bold words for operator indicants.  This
+ makes it easier for text editors to highlight them in a different
+ style than mode indicants, and look more symmetrical in case of dyadic
+ operators.  For example, use @code{ABS} and not @code{Abs}.
+ 
+ @node Programming Style
+ @chapter Programming Style
+ 
+ This section contains some recommendation on the usage of the
+ facilities of the language.
+ 
+ @menu
+ * Writing routines::
+ * Nihils::
+ @end menu
+ 
+ @node Writing routines
+ @section Writing routines
+ 
+ Use routines liberally!  Routines are cheap, very easy to write thanks
+ to the excellent Algol 68 syntax for routine texts, and first-class
+ citizens in the language.  They also have access to the lexical
+ environment.  So if you find yourself wanting to write a macro in
+ order to repeat some little calculation, just write a small procedure
+ or operator instead.
+ 
+ Choose identifiers that are expressive of meaning in order to clarify
+ both the intent of the procedure or operator and the code written that
+ uses it.
+ 
+ Consider using overloaded operators in preference to procedures with
+ united mode parameters to encourage users of the operator to create
+ new versions of the operator for different parameter types, rather
+ than leaving the users trying to figure out how to hack the united
+ mode definition.
+ 
+ The high level of orthogonaliy of Algol 68 combined with the
+ structural type equivalence and the nice compact syntax of declarers
+ makes mode names way less relevant than in many other programming
+ languages.  In particular if a routine takes a parameter that is an
+ united mode, and that particular united mode is either not used
+ anywhere else or very short, just write the declarer, you don't have
+ to name it first.
+ 
+ Please make good use of the lexical block structure of the programming
+ language: is is there to be used.  In little local auxiliary routines,
+ do not add arguments just to pass a value that is in the environment;
+ rather, place the declaration of the auxiliary routine near the
+ declarations of the values it accesses.  If this is not possible, then
+ it may be wise to judiciously pass those non-nearby values as
+ arguments in order that the programmer be aware that non-nearby values
+ are being accessed or possibly altered.
+ 
+ @node Nihils
+ @section Nihils
+ 
+ Never use @code{nil} directly in identity relations; it is very error
+ prone.  It is better to define @dfn{nihils} for all reference modes
+ that are likely to appear in one.
+ 
+ Examples:
+ 
+ @example
+ mode Node = ...;
+ ref Node no_node = nil;
+ while n :/=: no_node do ... od
+ @end example
+ 
+ @c ---------------------------------------------------------------------
+ @c GNU Free Documentation License
+ @c ---------------------------------------------------------------------
+ 
+ @include fdl.texi
+ 
+ 
+ @c ---------------------------------------------------------------------
+ @c Index
+ @c ---------------------------------------------------------------------
+ 
+ @node Index
+ @unnumbered Index
+ 
+ @printindex cp
+ 
+ @bye
diff -Nrcpad gcc-16-20260111/gcc/algol68/ga68.texi gcc-16-20260118/gcc/algol68/ga68.texi
*** gcc-16-20260111/gcc/algol68/ga68.texi	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/algol68/ga68.texi	Sun Jan 18 22:32:06 2026
*************** programs.  @xref{Stropping regimes}.
*** 187,195 ****
  @opindex fbrackets
  @opindex fno-brackets
  @item -fbrackets
! This option controls whether @code{[ .. ]} and @code{@{ .. @}} are
! considered equivalent to @code{( .. )}.  This syntactic variation is
! blessed by the Revised Report and is still strict Algol 68.
  
  This option is disabled by default.
  @end table
--- 187,195 ----
  @opindex fbrackets
  @opindex fno-brackets
  @item -fbrackets
! This option controls whether @code{[ .. ]} is considered equivalent to
! @code{( .. )}.  This syntactic variation is blessed by the Revised
! Report and is still strict Algol 68.
  
  This option is disabled by default.
  @end table
*************** target.
*** 2099,2105 ****
  @item @code{@B{shl}}, @code{@B{up}}
  @item @code{@B{shr}}, @code{@B{down}}
  @item @code{@B{up}}, @code{@B{down}}
- @item @code{^}
  @item @code{@B{lwb}}
  @item @code{@B{upb}}
  @end itemize
--- 2099,2104 ----
*************** Dyadic operator that yields the integer
*** 2232,2238 ****
  @end deftypefn
  
  @deftypefn Operator {} {**} {= (@B{l} @B{int} a, b) @B{l} @B{int}}
- @deftypefnx Operator {} {^} {= (@B{l} @B{int} a, b) @B{l} @B{int}}
  Dyadic operator that yields @code{a} raised to the exponent @code{b}.
  @end deftypefn
  
--- 2231,2236 ----
*************** Dyadic operator that yields the realeger
*** 2366,2377 ****
  @end deftypefn
  
  @deftypefn Operator {} {**} {= (@B{l} @B{real} a, b) @B{l} @B{real}}
- @deftypefnx Operator {} {^} {= (@B{l} @B{real} a, b) @B{l} @B{real}}
  Dyadic operator that yields @code{a} raised to the real exponent @code{b}.
  @end deftypefn
  
  @deftypefn Operator {} {**} {= (@B{l} @B{real} a, @B{int} b) @B{l} @B{real}}
- @deftypefnx Operator {} {^} {= (@B{l} @B{real} a, @B{int} b) @B{l} @B{real}}
  Dyadic operator that yields @code{a} raised to the integral exponent
  @code{b}.
  @end deftypefn
--- 2364,2373 ----
*************** error condition, this procedure yields -
*** 3071,3077 ****
  appropriately.
  @end deftypefn
  
! @deftypefn Procedure {} {lseek} {= (@B{int} fd, @B{long int} offset, @B{int} whence) @B{long long int}}
  Set the file offset of the file characterized by the file descriptor @code{fd}
  depending on the values of @code{offset} and @code{whence}.  On success, the
  resulting offset, as measured in bytes from the beginning of the file, is
--- 3067,3073 ----
  appropriately.
  @end deftypefn
  
! @deftypefn Procedure {} {lseek} {= (@B{int} fd, @B{long long int} offset, @B{int} whence) @B{long long int}}
  Set the file offset of the file characterized by the file descriptor @code{fd}
  depending on the values of @code{offset} and @code{whence}.  On success, the
  resulting offset, as measured in bytes from the beginning of the file, is
*************** sometimes be useful to look up both form
*** 3328,3330 ****
--- 3324,3327 ----
  @printindex cp
  
  @bye
+ b
diff -Nrcpad gcc-16-20260111/gcc/analyzer/ChangeLog gcc-16-20260118/gcc/analyzer/ChangeLog
*** gcc-16-20260111/gcc/analyzer/ChangeLog	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/analyzer/ChangeLog	Sun Jan 18 22:32:06 2026
***************
*** 1,3 ****
--- 1,40 ----
+ 2026-01-16  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* engine.cc (exploded_graph::process_worklist): Remove guard on
+ 	limit being non-zero when checking for -Wanalyzer-too-complex
+ 	on overall number of exploded nodes.  Allow for the origin enode.
+ 
+ 2026-01-16  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/123145
+ 	* supergraph-fixup-locations.cc: Include "timevar.h".
+ 	(supergraph::fixup_locations): Track time spent as
+ 	TV_ANALYZER_SUPERGRAPH_FIXUP_LOCATIONS.
+ 	* supergraph-simplify.cc: Include "timevar.h".
+ 	(supergraph::simplify): Track time spent as
+ 	TV_ANALYZER_SUPERGRAPH_SIMPLIFY.
+ 	* supergraph-sorting.cc: Include "timevar.h".
+ 	(supergraph::sort_nodes): Track time spent as
+ 	TV_ANALYZER_SUPERGRAPH_SORTING.
+ 	* supergraph.cc (supergraph::supergraph): Track time spent as
+ 	TV_ANALYZER_SUPERGRAPH_CREATION rather than
+ 	TV_ANALYZER_SUPERGRAPH.
+ 
+ 2026-01-16  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	PR analyzer/123540
+ 	* ops.cc (eh_dispatch_edge_op::make): Drop dst_snode param to
+ 	ctor.
+ 	(eh_dispatch_edge_op::eh_dispatch_edge_op): Likewise, dropping
+ 	field eh_dispatch_edge_op::m_dst_snode.
+ 	(eh_dispatch_try_edge_op::eh_dispatch_try_edge_op): Likewise.
+ 	(eh_dispatch_allowed_edge_op::eh_dispatch_allowed_edge_op):
+ 	Likewise.
+ 	* ops.h (eh_dispatch_edge_op::eh_dispatch_edge_op): Likewise.
+ 	(eh_dispatch_edge_op::m_dst_snode): Drop unused field.
+ 	(eh_dispatch_try_edge_op::eh_dispatch_try_edge_op): Drop unused
+ 	dst_snode param.
+ 
  2026-01-09  David Malcolm  <dmalcolm@redhat.com>
  
  	* common.h (struct on_frame_popped): New.
diff -Nrcpad gcc-16-20260111/gcc/analyzer/engine.cc gcc-16-20260118/gcc/analyzer/engine.cc
*** gcc-16-20260111/gcc/analyzer/engine.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/analyzer/engine.cc	Sun Jan 18 22:32:06 2026
*************** exploded_graph::process_worklist ()
*** 3400,3418 ****
        /* Impose a hard limit on the number of exploded nodes, to ensure
  	 that the analysis terminates in the face of pathological state
  	 explosion (or bugs).  */
!       if (const int limit
! 	    = m_sg.num_nodes () * param_analyzer_bb_explosion_factor)
! 	if (m_global_stats.m_num_nodes > limit)
! 	  {
! 	    if (logger)
! 	      logger->log ("bailing out; too many nodes");
! 	    warning_at (node->get_point ().get_location (),
! 			OPT_Wanalyzer_too_complex,
! 			"analysis bailed out early"
! 			" (%i enodes)",
! 			m_nodes.length ());
! 	    return;
! 	  }
      }
  }
  
--- 3400,3421 ----
        /* Impose a hard limit on the number of exploded nodes, to ensure
  	 that the analysis terminates in the face of pathological state
  	 explosion (or bugs).  */
!       const int limit
! 	= (// Per-supernode limit:
! 	   (m_sg.num_nodes () * param_analyzer_bb_explosion_factor)
! 	   // Allow one for the "origin" enode:
! 	   + 1);
!       if (m_global_stats.m_num_nodes > limit)
! 	{
! 	  if (logger)
! 	    logger->log ("bailing out; too many nodes");
! 	  warning_at (node->get_point ().get_location (),
! 		      OPT_Wanalyzer_too_complex,
! 		      "analysis bailed out early"
! 		      " (%i enodes)",
! 		      m_nodes.length ());
! 	  return;
! 	}
      }
  }
  
diff -Nrcpad gcc-16-20260111/gcc/analyzer/ops.cc gcc-16-20260118/gcc/analyzer/ops.cc
*** gcc-16-20260111/gcc/analyzer/ops.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/analyzer/ops.cc	Sun Jan 18 22:32:06 2026
*************** eh_dispatch_edge_op::make (supernode *sr
*** 1856,1862 ****
        {
  	eh_catch ehc = get_catch (eh_reg, dst_snode);
  	return std::make_unique<eh_dispatch_try_edge_op>
! 	  (src_snode, dst_snode,
  	   cfg_edge, eh_dispatch_stmt,
  	   eh_reg, ehc);
        }
--- 1856,1862 ----
        {
  	eh_catch ehc = get_catch (eh_reg, dst_snode);
  	return std::make_unique<eh_dispatch_try_edge_op>
! 	  (src_snode,
  	   cfg_edge, eh_dispatch_stmt,
  	   eh_reg, ehc);
        }
*************** eh_dispatch_edge_op::make (supernode *sr
*** 1876,1889 ****
  
  eh_dispatch_edge_op::
  eh_dispatch_edge_op (supernode *src_snode,
- 		     supernode *dst_snode,
  		     enum kind kind_,
  		     ::edge cfg_edge,
  		     const geh_dispatch &geh_dispatch_stmt,
  		     eh_region eh_reg)
  : control_flow_op (kind_, cfg_edge, geh_dispatch_stmt),
    m_src_snode (src_snode),
-   m_dst_snode (dst_snode),
    m_eh_region (eh_reg)
  {
  }
--- 1876,1887 ----
*************** apply_constraints (const superedge *sedg
*** 1913,1924 ****
  
  eh_dispatch_try_edge_op::
  eh_dispatch_try_edge_op (supernode *src_snode,
- 			 supernode *dst_snode,
  			 ::edge cfg_edge,
  			 const geh_dispatch &geh_dispatch_stmt,
  			 eh_region eh_reg,
  			 eh_catch ehc)
! : eh_dispatch_edge_op (src_snode, dst_snode,
  		       kind::eh_dispatch_try_edge,
  		       cfg_edge, geh_dispatch_stmt, eh_reg),
    m_eh_catch (ehc)
--- 1911,1921 ----
  
  eh_dispatch_try_edge_op::
  eh_dispatch_try_edge_op (supernode *src_snode,
  			 ::edge cfg_edge,
  			 const geh_dispatch &geh_dispatch_stmt,
  			 eh_region eh_reg,
  			 eh_catch ehc)
! : eh_dispatch_edge_op (src_snode,
  		       kind::eh_dispatch_try_edge,
  		       cfg_edge, geh_dispatch_stmt, eh_reg),
    m_eh_catch (ehc)
*************** eh_dispatch_allowed_edge_op (supernode *
*** 2037,2043 ****
  			     ::edge cfg_edge,
  			     const geh_dispatch &geh_dispatch_stmt,
  			     eh_region eh_reg)
! : eh_dispatch_edge_op (src_snode, dst_snode,
  		       kind::eh_dispatch_try_edge,
  		       cfg_edge, geh_dispatch_stmt, eh_reg)
  {
--- 2034,2040 ----
  			     ::edge cfg_edge,
  			     const geh_dispatch &geh_dispatch_stmt,
  			     eh_region eh_reg)
! : eh_dispatch_edge_op (src_snode,
  		       kind::eh_dispatch_try_edge,
  		       cfg_edge, geh_dispatch_stmt, eh_reg)
  {
diff -Nrcpad gcc-16-20260111/gcc/analyzer/ops.h gcc-16-20260118/gcc/analyzer/ops.h
*** gcc-16-20260111/gcc/analyzer/ops.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/analyzer/ops.h	Sun Jan 18 22:32:06 2026
*************** public:
*** 810,816 ****
  
  protected:
    eh_dispatch_edge_op (supernode *src_snode,
- 		       supernode *dst_snode,
  		       enum kind kind_,
  		       ::edge cfg_edge,
  		       const geh_dispatch &geh_dispatch_stmt,
--- 810,815 ----
*************** private:
*** 834,840 ****
  			std::unique_ptr<rejected_constraint> *out) const = 0;
  
    supernode *m_src_snode;
-   supernode *m_dst_snode;
    eh_region m_eh_region;
  };
  
--- 833,838 ----
*************** class eh_dispatch_try_edge_op : public e
*** 845,851 ****
  {
  public:
    eh_dispatch_try_edge_op (supernode *src_snode,
- 			   supernode *dst_snode,
  			   ::edge cfg_edge,
  			   const geh_dispatch &geh_dispatch_stmt,
  			   eh_region eh_reg,
--- 843,848 ----
diff -Nrcpad gcc-16-20260111/gcc/analyzer/supergraph-fixup-locations.cc gcc-16-20260118/gcc/analyzer/supergraph-fixup-locations.cc
*** gcc-16-20260111/gcc/analyzer/supergraph-fixup-locations.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/analyzer/supergraph-fixup-locations.cc	Sun Jan 18 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 21,26 ****
--- 21,28 ----
  #define INCLUDE_DEQUE
  #include "analyzer/common.h"
  
+ #include "timevar.h"
+ 
  #include "analyzer/supergraph.h"
  #include "analyzer/analyzer-logging.h"
  #include "analyzer/supergraph-manipulation.h"
*************** private:
*** 108,113 ****
--- 110,116 ----
  void
  supergraph::fixup_locations (logger *logger)
  {
+   auto_timevar tv (TV_ANALYZER_SUPERGRAPH_FIXUP_LOCATIONS);
    LOG_SCOPE (logger);
  
    location_fixer opt (*this, logger);
diff -Nrcpad gcc-16-20260111/gcc/analyzer/supergraph-simplify.cc gcc-16-20260118/gcc/analyzer/supergraph-simplify.cc
*** gcc-16-20260111/gcc/analyzer/supergraph-simplify.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/analyzer/supergraph-simplify.cc	Sun Jan 18 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 23,28 ****
--- 23,29 ----
  #include "analyzer/common.h"
  
  #include "cgraph.h"
+ #include "timevar.h"
  
  #include "analyzer/supergraph.h"
  #include "analyzer/analyzer-logging.h"
*************** supergraph::log_stats (logger *logger) c
*** 293,298 ****
--- 294,300 ----
  void
  supergraph::simplify (logger *logger)
  {
+   auto_timevar tv (TV_ANALYZER_SUPERGRAPH_SIMPLIFY);
    LOG_SCOPE (logger);
  
    {
diff -Nrcpad gcc-16-20260111/gcc/analyzer/supergraph-sorting.cc gcc-16-20260118/gcc/analyzer/supergraph-sorting.cc
*** gcc-16-20260111/gcc/analyzer/supergraph-sorting.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/analyzer/supergraph-sorting.cc	Sun Jan 18 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 24,29 ****
--- 24,30 ----
  #include "cgraph.h"
  #include "alloc-pool.h"
  #include "fibonacci_heap.h"
+ #include "timevar.h"
  
  #include "analyzer/supergraph.h"
  #include "analyzer/analyzer-logging.h"
*************** get_node_ordering (const supergraph &sg,
*** 254,259 ****
--- 255,261 ----
  void
  supergraph::sort_nodes (logger *logger)
  {
+   auto_timevar tv (TV_ANALYZER_SUPERGRAPH_SORTING);
    LOG_SCOPE (logger);
  
    const std::vector<supernode *> ordering = get_node_ordering (*this, logger);
diff -Nrcpad gcc-16-20260111/gcc/analyzer/supergraph.cc gcc-16-20260118/gcc/analyzer/supergraph.cc
*** gcc-16-20260111/gcc/analyzer/supergraph.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/analyzer/supergraph.cc	Sun Jan 18 22:32:06 2026
*************** supergraph::supergraph (region_model_man
*** 142,149 ****
  			logger *logger)
  : m_next_snode_id (0)
  {
!   auto_timevar tv (TV_ANALYZER_SUPERGRAPH);
! 
    LOG_FUNC (logger);
  
    /* For each BB, if present, the stmt that terminates it.  */
--- 142,148 ----
  			logger *logger)
  : m_next_snode_id (0)
  {
!   auto_timevar tv (TV_ANALYZER_SUPERGRAPH_CREATION);
    LOG_FUNC (logger);
  
    /* For each BB, if present, the stmt that terminates it.  */
diff -Nrcpad gcc-16-20260111/gcc/attribs.cc gcc-16-20260118/gcc/attribs.cc
*** gcc-16-20260111/gcc/attribs.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/attribs.cc	Sun Jan 18 22:32:06 2026
*************** attribute_value_equal (const_tree attr1,
*** 1458,1463 ****
--- 1458,1467 ----
        && TREE_VALUE (attr2) != NULL_TREE
        && TREE_CODE (TREE_VALUE (attr2)) == TREE_LIST)
      {
+       if (ATTR_UNIQUE_VALUE_P (TREE_VALUE (attr1))
+ 	  || ATTR_UNIQUE_VALUE_P (TREE_VALUE (attr2)))
+ 	return false;
+ 
        /* Handle attribute format.  */
        if (is_attribute_p ("format", get_attribute_name (attr1)))
  	{
*************** merge_attributes (tree a1, tree a2)
*** 1739,1749 ****
  	attributes = a2;
        else
  	{
! 	  /* Pick the longest list, and hang on the other list.  */
  
! 	  if (list_length (a1) < list_length (a2))
! 	    attributes = a2, a2 = a1;
  
  	  for (; a2 != 0; a2 = TREE_CHAIN (a2))
  	    {
  	      tree a;
--- 1743,1776 ----
  	attributes = a2;
        else
  	{
! 	  /* Pick the longest list, and hang on the other list,
! 	     unless both lists contain ATTR_UNIQUE_VALUE_P values.
! 	     In that case a1 list needs to go after the a2 list
! 	     because attributes from a single declaration are stored
! 	     in reverse order of their declarations.  */
! 	  bool a1_unique_value_p = false, a2_unique_value_p = false;
! 	  tree aa1 = a1, aa2 = a2;
! 	  for (; aa1 && aa2; aa1 = TREE_CHAIN (aa1), aa2 = TREE_CHAIN (aa2))
! 	    {
! 	      if (!a1_unique_value_p
! 		  && TREE_VALUE (aa1)
! 		  && TREE_CODE (TREE_VALUE (aa1)) == TREE_LIST
! 		  && ATTR_UNIQUE_VALUE_P (TREE_VALUE (aa1)))
! 		a1_unique_value_p = true;
! 	      if (!a2_unique_value_p
! 		  && TREE_VALUE (aa2)
! 		  && TREE_CODE (TREE_VALUE (aa2)) == TREE_LIST
! 		  && ATTR_UNIQUE_VALUE_P (TREE_VALUE (aa2)))
! 		a2_unique_value_p = true;
! 	    }
  
! 	  if (aa2 && (!a1_unique_value_p || !a2_unique_value_p))
! 	    {
! 	      attributes = a2;
! 	      a2 = a1;
! 	    }
  
+ 	  tree a3 = NULL_TREE, *pa = &a3;
  	  for (; a2 != 0; a2 = TREE_CHAIN (a2))
  	    {
  	      tree a;
*************** merge_attributes (tree a1, tree a2)
*** 1756,1765 ****
  	      if (a == NULL_TREE)
  		{
  		  a1 = copy_node (a2);
! 		  TREE_CHAIN (a1) = attributes;
! 		  attributes = a1;
  		}
  	    }
  	}
      }
    return attributes;
--- 1783,1797 ----
  	      if (a == NULL_TREE)
  		{
  		  a1 = copy_node (a2);
! 		  *pa = a1;
! 		  pa = &TREE_CHAIN (a1);
  		}
  	    }
+ 	  if (a3)
+ 	    {
+ 	      *pa = attributes;
+ 	      attributes = a3;
+ 	    }
  	}
      }
    return attributes;
diff -Nrcpad gcc-16-20260111/gcc/auto-profile.cc gcc-16-20260118/gcc/auto-profile.cc
*** gcc-16-20260111/gcc/auto-profile.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/auto-profile.cc	Sun Jan 18 22:32:06 2026
*************** public:
*** 320,325 ****
--- 320,327 ----
  
    /* Return cgraph node corresponding to given name index.  */
    cgraph_node *get_cgraph_node (int);
+ 
+   const string_vector& filenames () { return filenames_; }
  private:
    typedef std::map<const char *, unsigned, string_compare> string_index_map;
    typedef std::map<const char *, auto_vec<unsigned>, string_compare>
*************** public:
*** 387,394 ****
       HEAD_COUNT. Recursively read callsites to create nested function_instances
       too. STACK is used to track the recursive creation process.  */
    static function_instance *
!   read_function_instance (function_instance_stack *stack,
!                           gcov_type head_count);
  
    /* Recursively deallocate all callsites (nested function_instances).  */
    ~function_instance ();
--- 389,395 ----
       HEAD_COUNT. Recursively read callsites to create nested function_instances
       too. STACK is used to track the recursive creation process.  */
    static function_instance *
!   read_function_instance (function_instance_stack *stack, bool toplevel = true);
  
    /* Recursively deallocate all callsites (nested function_instances).  */
    ~function_instance ();
*************** public:
*** 412,417 ****
--- 413,430 ----
      return head_count_;
    }
  
+   gcov_type
+   timestamp () const
+   {
+     return timestamp_;
+   }
+ 
+   void set_timestamp (gcov_type timestamp) { timestamp_ = timestamp; }
+ 
+   /* Propagate timestamp from top-level function_instance to
+      inlined instances.  */
+   void prop_timestamp ();
+ 
    /* Traverse callsites of the current function_instance to find one at the
       location of LINENO and callee name represented in DECL.
       LOCATION should match LINENO and is used to output diagnostics.  */
*************** private:
*** 575,583 ****
    function_instance (unsigned symbol_name, unsigned file_name,
  		     gcov_type head_count)
      : descriptor_ (file_name, symbol_name), total_count_ (0),
!       head_count_ (head_count), removed_icall_target_ (false),
!       realized_ (false), in_worklist_ (false), inlined_to_ (NULL),
!       location_ (UNKNOWN_LOCATION), call_location_ (UNKNOWN_LOCATION)
    {
    }
  
--- 588,597 ----
    function_instance (unsigned symbol_name, unsigned file_name,
  		     gcov_type head_count)
      : descriptor_ (file_name, symbol_name), total_count_ (0),
!       head_count_ (head_count), timestamp_ (0),
!       removed_icall_target_ (false), realized_ (false), in_worklist_ (false),
!       inlined_to_ (NULL), location_ (UNKNOWN_LOCATION),
!       call_location_ (UNKNOWN_LOCATION)
    {
    }
  
*************** private:
*** 593,598 ****
--- 607,616 ----
    /* Entry BB's sample count.  */
    gcov_type head_count_;
  
+   /* perf timestamp associated with first execution of function, which is
+      used to compute node->tp_first_run.  */
+   gcov_type timestamp_;
+ 
    /* Map from callsite location to callee function_instance.  */
    callsite_map callsites;
  
*************** private:
*** 620,625 ****
--- 638,646 ----
    /* Turn inline instance to offline.  */
    static bool offline (function_instance *fn,
  		       vec <function_instance *> &new_functions);
+ 
+   /* Helper routine for prop_timestamp.  */
+   void prop_timestamp_1 (gcov_type timestamp);
  };
  
  /* Profile for all functions.  */
*************** public:
*** 640,646 ****
    ~autofdo_source_profile ();
  
    /* For a given DECL, returns the top-level function_instance.  */
!   function_instance *get_function_instance_by_decl (tree decl) const;
  
    /* For a given DESCRIPTOR, return the matching instance if found.  */
    function_instance *
--- 661,667 ----
    ~autofdo_source_profile ();
  
    /* For a given DECL, returns the top-level function_instance.  */
!   function_instance *get_function_instance_by_decl (tree decl, const char * = NULL) const;
  
    /* For a given DESCRIPTOR, return the matching instance if found.  */
    function_instance *
*************** static autofdo_source_profile *afdo_sour
*** 723,728 ****
--- 744,756 ----
  /* gcov_summary structure to store the profile_info.  */
  static gcov_summary *afdo_profile_info;
  
+ /* Map from timestamp -> <name, tp_first_run>.
+ 
+    The purpose of this map is to map 64-bit timestamp values to (1..N) sorted
+    by ascending order of timestamps and assign that to node->tp_first_run,
+    since we don't need the full 64-bit range.  */
+ static std::map<gcov_type, int> timestamp_info_map;
+ 
  /* Scaling factor for afdo data.  Compared to normal profile
     AFDO profile counts are much lower, depending on sampling
     frequency.  We scale data up to reduce effects of roundoff
*************** function_instance::~function_instance ()
*** 1265,1270 ****
--- 1293,1316 ----
      delete iter->second;
  }
  
+ /* Propagate timestamp TS of function_instance to inlined instances if it's
+    not already set.  */
+ 
+ void
+ function_instance::prop_timestamp_1 (gcov_type ts)
+ {
+   if (!timestamp () && total_count () > 0)
+     set_timestamp (ts);
+   for (auto it = callsites.begin (); it != callsites.end (); ++it)
+     it->second->prop_timestamp_1 (ts);
+ }
+ 
+ void
+ function_instance::prop_timestamp (void)
+ {
+   prop_timestamp_1 (timestamp ());
+ }
+ 
  /* Traverse callsites of the current function_instance to find one at the
     location of LINENO and callee name represented in DECL.  */
  
*************** function_instance::merge (function_insta
*** 1326,1331 ****
--- 1372,1381 ----
    else if (head_count_ != -1)
      head_count_ += other->head_count_;
  
+   /* While merging timestamps, set the one that occurs earlier.  */
+   if (other->timestamp () < timestamp ())
+     set_timestamp (other->timestamp ());
+ 
    bool changed = true;
  
    while (changed)
*************** autofdo_source_profile::offline_unrealiz
*** 2645,2651 ****
  	  if (dump_file)
  	    fprintf (dump_file, "Removing optimized out function %s\n",
  		     afdo_string_table->get_symbol_name (f->symbol_name ()));
! 	  remove_function_instance (index_inst);
  	  f->clear_in_worklist ();
  	  delete f;
  	}
--- 2695,2702 ----
  	  if (dump_file)
  	    fprintf (dump_file, "Removing optimized out function %s\n",
  		     afdo_string_table->get_symbol_name (f->symbol_name ()));
! 	  if (in_map)
! 	    remove_function_instance (index_inst);
  	  f->clear_in_worklist ();
  	  delete f;
  	}
*************** autofdo_source_profile::offline_unrealiz
*** 2664,2669 ****
--- 2715,2721 ----
  /* function instance profile format:
  
     ENTRY_COUNT: 8 bytes
+    TIMESTAMP: 8 bytes (only for toplevel symbols)
     NAME_INDEX: 4 bytes
     NUM_POS_COUNTS: 4 bytes
     NUM_CALLSITES: 4 byte
*************** autofdo_source_profile::offline_unrealiz
*** 2690,2697 ****
  
  function_instance *
  function_instance::read_function_instance (function_instance_stack *stack,
! 					   gcov_type head_count)
  {
    unsigned name = gcov_read_unsigned ();
    unsigned num_pos_counts = gcov_read_unsigned ();
    unsigned num_callsites = gcov_read_unsigned ();
--- 2742,2756 ----
  
  function_instance *
  function_instance::read_function_instance (function_instance_stack *stack,
! 					   bool toplevel)
  {
+   gcov_type_unsigned timestamp = 0;
+   gcov_type head_count = -1;
+   if (toplevel)
+     {
+       head_count = gcov_read_counter ();
+       timestamp = (gcov_type_unsigned) gcov_read_counter ();
+     }
    unsigned name = gcov_read_unsigned ();
    unsigned num_pos_counts = gcov_read_unsigned ();
    unsigned num_callsites = gcov_read_unsigned ();
*************** function_instance::read_function_instanc
*** 2699,2704 ****
--- 2758,2765 ----
      = new function_instance (name,
  			     afdo_string_table->get_filename_by_symbol (name),
  			     head_count);
+   if (timestamp > 0)
+     s->set_timestamp (timestamp);
    if (!stack->is_empty ())
      s->set_inlined_to (stack->last ());
    stack->safe_push (s);
*************** function_instance::read_function_instanc
*** 2724,2730 ****
      {
        unsigned offset = gcov_read_unsigned ();
        function_instance *callee_function_instance
!           = read_function_instance (stack, -1);
        s->callsites[std::make_pair (offset,
  				   callee_function_instance->symbol_name ())]
  	= callee_function_instance;
--- 2785,2791 ----
      {
        unsigned offset = gcov_read_unsigned ();
        function_instance *callee_function_instance
! 	= read_function_instance (stack, false);
        s->callsites[std::make_pair (offset,
  				   callee_function_instance->symbol_name ())]
  	= callee_function_instance;
*************** autofdo_source_profile::~autofdo_source_
*** 2745,2753 ****
  /* For a given DECL, returns the top-level function_instance.  */
  
  function_instance *
! autofdo_source_profile::get_function_instance_by_decl (tree decl) const
  {
!   const char *filename = get_normalized_path (DECL_SOURCE_FILE (decl));
    int index = afdo_string_table->get_index_by_decl (decl);
    if (index == -1)
      return NULL;
--- 2806,2815 ----
  /* For a given DECL, returns the top-level function_instance.  */
  
  function_instance *
! autofdo_source_profile::get_function_instance_by_decl (tree decl, const char *filename) const
  {
!   if (!filename)
!     filename = get_normalized_path (DECL_SOURCE_FILE (decl));
    int index = afdo_string_table->get_index_by_decl (decl);
    if (index == -1)
      return NULL;
*************** autofdo_source_profile::read ()
*** 2978,2985 ****
      {
        function_instance::function_instance_stack stack;
        function_instance *s
! 	= function_instance::read_function_instance (&stack,
! 						     gcov_read_counter ());
  
        if (find_function_instance (s->get_descriptor ()) == nullptr)
  	add_function_instance (s);
--- 3040,3046 ----
      {
        function_instance::function_instance_stack stack;
        function_instance *s
! 	= function_instance::read_function_instance (&stack);
  
        if (find_function_instance (s->get_descriptor ()) == nullptr)
  	add_function_instance (s);
*************** autofdo_source_profile::read ()
*** 2987,2993 ****
--- 3048,3067 ----
  	fatal_error (UNKNOWN_LOCATION,
  		     "auto-profile contains duplicated function instance %s",
  		     afdo_string_table->get_symbol_name (s->symbol_name ()));
+       s->prop_timestamp ();
+       timestamp_info_map.insert({s->timestamp (), 0});
      }
+ 
+   /* timestamp_info_map is std::map with timestamp as key,
+      so it's already sorted in ascending order wrt timestamps.
+      This loop maps function with lowest timestamp to 1, and so on.
+      In afdo_annotate_cfg, node->tp_first_run is then set to corresponding
+      tp_first_run value.  */
+ 
+   int tp_first_run = 1;
+   for (auto &p : timestamp_info_map)
+     p.second = tp_first_run++;
+ 
    afdo_profile_info->sum_max = afdo_summary_info->max_count;
    /* Scale up the profile, but leave some bits in case some counts gets
       bigger than sum_max eventually.  */
*************** afdo_annotate_cfg (void)
*** 4368,4373 ****
--- 4442,4458 ----
        = afdo_source_profile->get_function_instance_by_decl (
            current_function_decl);
  
+   /* FIXME: This is a workaround for sourcefile tracking, if afdo_string_table
+      ends up with empty filename or incorrect filename for the function and
+      should be removed once issues with sourcefile tracking get fixed.  */
+   if (s == NULL)
+     for (unsigned i = 0; i < afdo_string_table->filenames ().length (); i++)
+       {
+ 	s = afdo_source_profile->get_function_instance_by_decl (current_function_decl, afdo_string_table->filenames()[i]);
+ 	if (s)
+ 	  break;
+       }
+ 
    if (s == NULL)
      {
        if (dump_file)
*************** afdo_annotate_cfg (void)
*** 4376,4382 ****
        /* create_gcov only dumps symbols with some samples in them.
  	 This means that we get nonempty zero_bbs only if some
  	 nonzero counts in profile were not matched with statements.  */
!       if (!flag_profile_partial_training)
  	{
  	  FOR_ALL_BB_FN (bb, cfun)
  	    if (bb->count.quality () == GUESSED_LOCAL)
--- 4461,4468 ----
        /* create_gcov only dumps symbols with some samples in them.
  	 This means that we get nonempty zero_bbs only if some
  	 nonzero counts in profile were not matched with statements.  */
!       if (!flag_profile_partial_training
! 	  && !param_auto_profile_reorder_only)
  	{
  	  FOR_ALL_BB_FN (bb, cfun)
  	    if (bb->count.quality () == GUESSED_LOCAL)
*************** afdo_annotate_cfg (void)
*** 4386,4391 ****
--- 4472,4491 ----
        return;
      }
  
+   auto ts_it = timestamp_info_map.find (s->timestamp ());
+   if (ts_it != timestamp_info_map.end ())
+     {
+       cgraph_node *node = cgraph_node::get (current_function_decl);
+       node->tp_first_run = ts_it->second;
+ 
+       if (dump_file)
+ 	fprintf (dump_file, "Setting %s->tp_first_run to %d\n",
+ 		 node->asm_name (), node->tp_first_run);
+     }
+ 
+   if (param_auto_profile_reorder_only)
+     return;
+ 
    calculate_dominance_info (CDI_POST_DOMINATORS);
    calculate_dominance_info (CDI_DOMINATORS);
    loop_optimizer_init (0);
diff -Nrcpad gcc-16-20260111/gcc/c/ChangeLog gcc-16-20260118/gcc/c/ChangeLog
*** gcc-16-20260111/gcc/c/ChangeLog	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c/ChangeLog	Sun Jan 18 22:32:06 2026
***************
*** 1,3 ****
--- 1,38 ----
+ 2026-01-16  Jakub Jelinek  <jakub@redhat.com>
+ 	    Peter Damianov  <peter0x44@disroot.org>
+ 
+ 	PR c/123437
+ 	* c-typeck.cc (build_binary_op): Don't use RDIV_EXPR
+ 	resultcode if both types are integral, _BitInt or
+ 	newly VECTOR_TYPE of ENUMERAL_TYPE.
+ 
+ 2026-01-14  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	* c-decl.cc (grokfield): Call verify_counted_by_for_top_anonymous_type
+ 	for named field.
+ 	(verify_counted_by_attribute): Change the prototype to a recursive
+ 	routine.
+ 	(verify_counted_by_for_top_anonymous_type): New routine.
+ 	(finish_struct): Set C_TYPE_FIELDS_HAS_COUNTED_BY and call the routine
+ 	verify_counted_by_attribute only for named structure.
+ 	* c-parser.cc (c_parser_declaration_or_fndef): Call
+ 	verify_counted_by_for_top_anonymous_type for the decl.
+ 	(c_parser_parameter_declaration): Call
+ 	verify_counted_by_for_top_anonymous_type for the parameter.
+ 	(c_parser_type_name): Call verify_counted_by_for_top_anonymous_type
+ 	for the type.
+ 	* c-tree.h (C_TYPE_FIELDS_HAS_COUNTED_BY): New flag.
+ 	(verify_counted_by_for_top_anonymous_type): New routine.
+ 	* c-typeck.cc (build_counted_by_ref): Locate the root named structure,
+ 	build a chain of component_ref starting from the root structure.
+ 
+ 2026-01-13  Martin Uecker  <uecker@tugraz.at>
+ 
+ 	PR c/123309
+ 	* c-typeck.cc (transparent_union_replacement): New function.
+ 	(composite_type_internal): Rewrite logic.
+ 	(type_lists_compatible_p): Remove dead code for NULL arguments.
+ 
  2026-01-10  Martin Uecker  <uecker@tugraz.at>
  
  	PR c/123435
diff -Nrcpad gcc-16-20260111/gcc/c/c-decl.cc gcc-16-20260118/gcc/c/c-decl.cc
*** gcc-16-20260111/gcc/c/c-decl.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c/c-decl.cc	Sun Jan 18 22:32:06 2026
*************** grokfield (location_t loc,
*** 9086,9091 ****
--- 9086,9097 ----
  			  width ? &width : NULL, decl_attrs, expr, NULL,
  			  DEPRECATED_NORMAL);
  
+   /* When this field has name, its type is a top level type, we should
+      call verify_counted_by_for_top_anonymous_type.  */
+   if (DECL_NAME (value) != NULL_TREE
+       && declspecs->typespec_kind == ctsk_tagdef)
+     verify_counted_by_for_top_anonymous_type (declspecs->type);
+ 
    finish_decl (value, loc, NULL_TREE, NULL_TREE, NULL_TREE);
    DECL_INITIAL (value) = width;
    if (width)
*************** c_update_type_canonical (tree t)
*** 9485,9549 ****
      }
  }
  
! /* Verify the argument of the counted_by attribute of each of the
!    FIELDS_WITH_COUNTED_BY is a valid field of the containing structure,
!    STRUCT_TYPE, Report error and remove the corresponding attribute
!    when it's not.  */
  
  static void
! verify_counted_by_attribute (tree struct_type,
! 			     auto_vec<tree> *fields_with_counted_by)
  {
!   for (tree field_decl : *fields_with_counted_by)
      {
!       tree attr_counted_by = lookup_attribute ("counted_by",
! 						DECL_ATTRIBUTES (field_decl));
  
!       if (!attr_counted_by)
! 	continue;
  
!       /* If there is an counted_by attribute attached to the field,
! 	 verify it.  */
  
!       tree fieldname = TREE_VALUE (TREE_VALUE (attr_counted_by));
  
!       /* Verify the argument of the attrbute is a valid field of the
! 	 containing structure.  */
  
!       tree counted_by_field = lookup_field (struct_type, fieldname);
  
!       /* Error when the field is not found in the containing structure and
! 	 remove the corresponding counted_by attribute from the field_decl.  */
!       if (!counted_by_field)
! 	{
! 	  error_at (DECL_SOURCE_LOCATION (field_decl),
  		    "argument %qE to the %<counted_by%> attribute"
  		    " is not a field declaration in the same structure"
! 		    " as %qD", fieldname, field_decl);
! 	  DECL_ATTRIBUTES (field_decl)
! 	    = remove_attribute ("counted_by", DECL_ATTRIBUTES (field_decl));
! 	}
!       else
!       /* Error when the field is not with an integer type.  */
! 	{
! 	  while (TREE_CHAIN (counted_by_field))
! 	    counted_by_field = TREE_CHAIN (counted_by_field);
! 	  tree real_field = TREE_VALUE (counted_by_field);
! 
! 	  if (!INTEGRAL_TYPE_P (TREE_TYPE (real_field)))
  	    {
! 	      error_at (DECL_SOURCE_LOCATION (field_decl),
  			"argument %qE to the %<counted_by%> attribute"
  			" is not a field declaration with an integer type",
  			fieldname);
! 	      DECL_ATTRIBUTES (field_decl)
! 		= remove_attribute ("counted_by",
! 				    DECL_ATTRIBUTES (field_decl));
  	    }
  	}
      }
  }
  
  /* TYPE is a struct or union that we're applying may_alias to after the body is
     parsed.  Fixup any POINTER_TO types.  */
  
--- 9491,9580 ----
      }
  }
  
! /* Verify the argument of the counted_by attribute of each field of
!    the containing structure, OUTMOST_STRUCT_TYPE, including its inner
!    anonymous struct/union, Report error and remove the corresponding
!    attribute when it's not.  */
  
  static void
! verify_counted_by_attribute (tree outmost_struct_type,
! 			     tree cur_struct_type)
  {
!   for (tree field = TYPE_FIELDS (cur_struct_type); field;
!        field = TREE_CHAIN (field))
      {
!       if (c_flexible_array_member_type_p (TREE_TYPE (field))
! 	   || TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE)
! 	{
! 	  tree attr_counted_by = lookup_attribute ("counted_by",
! 						   DECL_ATTRIBUTES (field));
  
! 	  if (!attr_counted_by)
! 	    continue;
  
! 	  /* If there is an counted_by attribute attached to the field,
! 	     verify it.  */
  
! 	  tree fieldname = TREE_VALUE (TREE_VALUE (attr_counted_by));
  
! 	  /* Verify the argument of the attrbute is a valid field of the
! 	     containing structure.  */
  
! 	  tree counted_by_field = lookup_field (outmost_struct_type,
! 						fieldname);
  
! 	  /* Error when the field is not found in the containing structure
! 	     and remove the corresponding counted_by attribute from the
! 	     field_decl.  */
! 	  if (!counted_by_field)
! 	    {
! 	      error_at (DECL_SOURCE_LOCATION (field),
  		    "argument %qE to the %<counted_by%> attribute"
  		    " is not a field declaration in the same structure"
! 		    " as %qD", fieldname, field);
! 	      DECL_ATTRIBUTES (field)
! 		= remove_attribute ("counted_by", DECL_ATTRIBUTES (field));
! 	    }
! 	  else
! 	  /* Error when the field is not with an integer type.  */
  	    {
! 	      while (TREE_CHAIN (counted_by_field))
! 		counted_by_field = TREE_CHAIN (counted_by_field);
! 	      tree real_field = TREE_VALUE (counted_by_field);
! 
! 	      if (!INTEGRAL_TYPE_P (TREE_TYPE (real_field)))
! 		{
! 		  error_at (DECL_SOURCE_LOCATION (field),
  			"argument %qE to the %<counted_by%> attribute"
  			" is not a field declaration with an integer type",
  			fieldname);
! 		  DECL_ATTRIBUTES (field)
! 		    = remove_attribute ("counted_by",
! 				    DECL_ATTRIBUTES (field));
! 		}
  	    }
  	}
+       else if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (field))
+ 	       && (DECL_NAME (field) == NULL_TREE))
+ 	verify_counted_by_attribute (outmost_struct_type, TREE_TYPE (field));
      }
  }
  
+ /* Caller should make sure the TYPE is a top-level type (i.e. not being
+    nested in other structure/uniona). For such type, verify its counted_by
+    if it is an anonymous structure/union.  */
+ 
+ void
+ verify_counted_by_for_top_anonymous_type (tree type)
+ {
+   if (!RECORD_OR_UNION_TYPE_P (type))
+     return;
+ 
+   if (C_TYPE_FIELDS_HAS_COUNTED_BY (type)
+       && c_type_tag (type) == NULL_TREE)
+     verify_counted_by_attribute (type, type);
+ }
+ 
  /* TYPE is a struct or union that we're applying may_alias to after the body is
     parsed.  Fixup any POINTER_TO types.  */
  
*************** finish_struct (location_t loc, tree t, t
*** 9615,9621 ****
       until now.)  */
  
    bool saw_named_field = false;
-   auto_vec<tree> fields_with_counted_by;
    for (x = fieldlist; x; x = DECL_CHAIN (x))
      {
        /* Whether this field is the last field of the structure or union.
--- 9646,9651 ----
*************** finish_struct (location_t loc, tree t, t
*** 9691,9710 ****
  	    pedwarn (DECL_SOURCE_LOCATION (x), OPT_Wpedantic,
  		     "flexible array member in a struct with no named "
  		     "members is a GCC extension");
- 
- 	  /* If there is a counted_by attribute attached to this field,
- 	     record it here and do more verification later after the
- 	     whole structure is complete.  */
  	  if (lookup_attribute ("counted_by", DECL_ATTRIBUTES (x)))
! 	    fields_with_counted_by.safe_push (x);
  	}
  
!       if (TREE_CODE (TREE_TYPE (x)) == POINTER_TYPE)
! 	/* If there is a counted_by attribute attached to this field,
! 	   record it here and do more verification later after the
! 	   whole structure is complete.  */
! 	if (lookup_attribute ("counted_by", DECL_ATTRIBUTES (x)))
! 	  fields_with_counted_by.safe_push (x);
  
        if (pedantic && TREE_CODE (t) == RECORD_TYPE
  	  && flexible_array_type_p (TREE_TYPE (x)))
--- 9721,9742 ----
  	    pedwarn (DECL_SOURCE_LOCATION (x), OPT_Wpedantic,
  		     "flexible array member in a struct with no named "
  		     "members is a GCC extension");
  	  if (lookup_attribute ("counted_by", DECL_ATTRIBUTES (x)))
! 	    C_TYPE_FIELDS_HAS_COUNTED_BY (t) = 1;
  	}
  
!       if (TREE_CODE (TREE_TYPE (x)) == POINTER_TYPE
! 	  && lookup_attribute ("counted_by", DECL_ATTRIBUTES (x)))
! 	C_TYPE_FIELDS_HAS_COUNTED_BY (t) = 1;
! 
!       /* If the field is an anonymous structure that includes a field
! 	 with counted_by attribute, this structure should also be marked
! 	 too.  */
!       if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (x))
! 	  && C_TYPE_FIELDS_HAS_COUNTED_BY (TREE_TYPE (x))
! 	  && DECL_NAME (x) == NULL_TREE
! 	  && c_type_tag (TREE_TYPE (x)) == NULL_TREE)
! 	C_TYPE_FIELDS_HAS_COUNTED_BY (t) = 1;
  
        if (pedantic && TREE_CODE (t) == RECORD_TYPE
  	  && flexible_array_type_p (TREE_TYPE (x)))
*************** finish_struct (location_t loc, tree t, t
*** 9971,9976 ****
--- 10003,10009 ----
        C_TYPE_FIELDS_READONLY (x) = C_TYPE_FIELDS_READONLY (t);
        C_TYPE_FIELDS_VOLATILE (x) = C_TYPE_FIELDS_VOLATILE (t);
        C_TYPE_FIELDS_NON_CONSTEXPR (x) = C_TYPE_FIELDS_NON_CONSTEXPR (t);
+       C_TYPE_FIELDS_HAS_COUNTED_BY (x) = C_TYPE_FIELDS_HAS_COUNTED_BY (t);
        C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
        C_TYPE_VARIABLY_MODIFIED (x) = C_TYPE_VARIABLY_MODIFIED (t);
        C_TYPE_INCOMPLETE_VARS (x) = NULL_TREE;
*************** finish_struct (location_t loc, tree t, t
*** 10011,10018 ****
  	struct_parse_info->struct_types.safe_push (t);
       }
  
!   if (fields_with_counted_by.length () > 0)
!     verify_counted_by_attribute (t, &fields_with_counted_by);
  
    return t;
  }
--- 10044,10053 ----
  	struct_parse_info->struct_types.safe_push (t);
       }
  
!   /* Only when the enclosing struct/union type is not anonymous, do more
!      verification on the fields with counted_by attributes.  */
!   if (C_TYPE_FIELDS_HAS_COUNTED_BY (t) && c_type_tag (t) != NULL_TREE)
!     verify_counted_by_attribute (t, t);
  
    return t;
  }
diff -Nrcpad gcc-16-20260111/gcc/c/c-parser.cc gcc-16-20260118/gcc/c/c-parser.cc
*** gcc-16-20260111/gcc/c/c-parser.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c/c-parser.cc	Sun Jan 18 22:32:06 2026
*************** c_parser_declaration_or_fndef (c_parser
*** 2572,2577 ****
--- 2572,2582 ----
      }
  
    finish_declspecs (specs);
+   /* When the decl is declared, its type is a top level type, we should
+      call verify_counted_by_for_top_anonymous_type.  */
+   if (specs->typespec_kind == ctsk_tagdef)
+     verify_counted_by_for_top_anonymous_type (specs->type);
+ 
    bool gnu_auto_type_p = specs->typespec_word == cts_auto_type;
    bool std_auto_type_p = specs->c23_auto_p;
    bool any_auto_type_p = gnu_auto_type_p || std_auto_type_p;
*************** c_parser_parameter_declaration (c_parser
*** 5498,5503 ****
--- 5503,5513 ----
    c_parser_declspecs (parser, specs, true, true, true, true, false,
  		      !have_gnu_attrs, true, cla_nonabstract_decl);
    finish_declspecs (specs);
+   /* When the param is declared, its type is a top level type, we should
+      call verify_counted_by_for_top_anonymous_type.  */
+   if (specs->typespec_kind == ctsk_tagdef)
+     verify_counted_by_for_top_anonymous_type (specs->type);
+ 
    pending_xref_error ();
    prefix_attrs = specs->attrs;
    specs->attrs = NULL_TREE;
*************** c_parser_type_name (c_parser *parser, bo
*** 6500,6505 ****
--- 6510,6519 ----
      {
        pending_xref_error ();
        finish_declspecs (specs);
+       /* When the typename is declared, its type is a top level type, we should
+ 	 call verify_counted_by_for_top_anonymous_type.  */
+       if (specs->typespec_kind == ctsk_tagdef)
+ 	verify_counted_by_for_top_anonymous_type (specs->type);
      }
    declarator = c_parser_declarator (parser,
  				    specs->typespec_kind != ctsk_none,
diff -Nrcpad gcc-16-20260111/gcc/c/c-tree.h gcc-16-20260118/gcc/c/c-tree.h
*** gcc-16-20260111/gcc/c/c-tree.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c/c-tree.h	Sun Jan 18 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 39,44 ****
--- 39,48 ----
     permitted for a constexpr object.  */
  #define C_TYPE_FIELDS_NON_CONSTEXPR(TYPE) TREE_LANG_FLAG_4 (TYPE)
  
+ /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component has a
+    counted_by attribute.  */
+ #define C_TYPE_FIELDS_HAS_COUNTED_BY(TYPE) TYPE_LANG_FLAG_3 (TYPE)
+ 
  /* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE
     nonzero if the definition of the type has already started.  */
  #define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE)
*************** extern void c_pushtag (location_t, tree,
*** 986,991 ****
--- 990,997 ----
  extern void c_bind (location_t, tree, bool);
  extern bool tag_exists_p (enum tree_code, tree);
  
+ extern void verify_counted_by_for_top_anonymous_type (tree);
+ 
  /* In c-errors.cc */
  extern bool pedwarn_c90 (location_t, diagnostics::option_id, const char *, ...)
      ATTRIBUTE_GCC_DIAG(3,4);
diff -Nrcpad gcc-16-20260111/gcc/c/c-typeck.cc gcc-16-20260118/gcc/c/c-typeck.cc
*** gcc-16-20260111/gcc/c/c-typeck.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c/c-typeck.cc	Sun Jan 18 22:32:06 2026
*************** remove_qualifiers (tree t)
*** 630,635 ****
--- 630,663 ----
  	 : TYPE_MAIN_VARIANT (t);
  }
  
+ 
+ /* Helper function for composite_type_internal.  Find a compatible type
+    in a (transparent) union U compatible to T.  If found, return the
+    type of the corresponding member.  Otherwise, return the union type U.  */
+ static tree
+ transparent_union_replacement (tree u, tree t)
+ {
+   if (u == error_mark_node || t == error_mark_node
+       || TREE_CODE (u) != UNION_TYPE
+       || !(TYPE_TRANSPARENT_AGGR (u) || TYPE_NAME (u) == NULL_TREE)
+       || comptypes (u, t))
+     return u;
+ 
+   for (tree memb = TYPE_FIELDS (u); memb; memb = DECL_CHAIN (memb))
+     {
+       tree m = remove_qualifiers (TREE_TYPE (memb));
+       if (comptypes (m, t))
+ 	{
+ 	  pedwarn (input_location, OPT_Wpedantic,
+ 		    "function types not truly compatible in ISO C");
+ 	  return m;
+ 	}
+     }
+ 
+   return u;
+ }
+ 
+ 
  
  /* Return the composite type of two compatible types.
  
*************** composite_type_internal (tree t1, tree t
*** 689,694 ****
--- 717,723 ----
      case POINTER_TYPE:
        /* For two pointers, do this recursively on the target type.  */
        {
+ 	gcc_checking_assert (TYPE_QUALS (t1) == TYPE_QUALS (t2));
  	tree target = composite_type_internal (TREE_TYPE (t1), TREE_TYPE (t2),
  					       cond, cache);
  	tree n = c_build_pointer_type_for_mode (target, TYPE_MODE (t1), false);
*************** composite_type_internal (tree t1, tree t
*** 904,912 ****
  						cond, cache);
  	tree p1 = TYPE_ARG_TYPES (t1);
  	tree p2 = TYPE_ARG_TYPES (t2);
- 	int len;
- 	tree newargs, n;
- 	int i;
  
  	/* Save space: see if the result is identical to one of the args.  */
  	if (valtype == TREE_TYPE (t1) && !TYPE_ARG_TYPES (t2))
--- 933,938 ----
*************** composite_type_internal (tree t1, tree t
*** 932,1017 ****
  
  	/* If both args specify argument types, we must merge the two
  	   lists, argument by argument.  */
  
! 	for (len = 0, newargs = p1;
! 	     newargs && newargs != void_list_node;
! 	     len++, newargs = TREE_CHAIN (newargs))
! 	  ;
! 
! 	for (i = 0; i < len; i++)
! 	  newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
! 
! 	n = newargs;
! 
! 	for (; p1 && p1 != void_list_node;
! 	     p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n))
  	  {
! 	     tree mv1 = remove_qualifiers (TREE_VALUE (p1));
! 	     tree mv2 = remove_qualifiers (TREE_VALUE (p2));
! 
! 	    /* A null type means arg type is not specified.
! 	       Take whatever the other function type has.  */
! 	    if (TREE_VALUE (p1) == NULL_TREE)
! 	      {
! 		TREE_VALUE (n) = TREE_VALUE (p2);
! 		goto parm_done;
! 	      }
! 	    if (TREE_VALUE (p2) == NULL_TREE)
  	      {
! 		TREE_VALUE (n) = TREE_VALUE (p1);
! 		goto parm_done;
  	      }
  
! 	    /* Given  wait (union {union wait *u; int *i} *)
! 	       and  wait (union wait *),
! 	       prefer  union wait *  as type of parm.  */
! 	    if (TREE_CODE (TREE_VALUE (p1)) == UNION_TYPE
! 		&& TREE_VALUE (p1) != TREE_VALUE (p2))
! 	      {
! 		tree memb;
! 		for (memb = TYPE_FIELDS (TREE_VALUE (p1));
! 		     memb; memb = DECL_CHAIN (memb))
! 		  {
! 		    tree mv3 = TREE_TYPE (memb);
! 		    if (mv3 && mv3 != error_mark_node
! 			&& TREE_CODE (mv3) != ARRAY_TYPE)
! 		      mv3 = TYPE_MAIN_VARIANT (mv3);
! 		    if (comptypes (mv3, mv2))
! 		      {
! 			TREE_VALUE (n) = composite_type_internal (TREE_TYPE (memb),
! 								  TREE_VALUE (p2),
! 								  cond, cache);
! 			pedwarn (input_location, OPT_Wpedantic,
! 				 "function types not truly compatible in ISO C");
! 			goto parm_done;
! 		      }
! 		  }
! 	      }
! 	    if (TREE_CODE (TREE_VALUE (p2)) == UNION_TYPE
! 		&& TREE_VALUE (p2) != TREE_VALUE (p1))
! 	      {
! 		tree memb;
! 		for (memb = TYPE_FIELDS (TREE_VALUE (p2));
! 		     memb; memb = DECL_CHAIN (memb))
! 		  {
! 		    tree mv3 = TREE_TYPE (memb);
! 		    if (mv3 && mv3 != error_mark_node
! 			&& TREE_CODE (mv3) != ARRAY_TYPE)
! 		      mv3 = TYPE_MAIN_VARIANT (mv3);
! 		    if (comptypes (mv3, mv1))
! 		      {
! 			TREE_VALUE (n)
! 				= composite_type_internal (TREE_TYPE (memb),
! 							   TREE_VALUE (p1),
! 							   cond, cache);
! 			pedwarn (input_location, OPT_Wpedantic,
! 				 "function types not truly compatible in ISO C");
! 			goto parm_done;
! 		      }
! 		  }
! 	      }
! 	    TREE_VALUE (n) = composite_type_internal (mv1, mv2, cond, cache);
! 	  parm_done: ;
  	  }
  
  	t1 = c_build_function_type (valtype, newargs);
--- 958,987 ----
  
  	/* If both args specify argument types, we must merge the two
  	   lists, argument by argument.  */
+ 	tree newargs = NULL_TREE;
+ 	tree *endp = &newargs;
  
! 	for (; p1; p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2))
  	  {
! 	    if (p1 == void_list_node)
  	      {
! 		*endp = void_list_node;
! 		break;
  	      }
+ 	    tree mv1 = remove_qualifiers (TREE_VALUE (p1));
+ 	    tree mv2 = remove_qualifiers (TREE_VALUE (p2));
  
! 	    gcc_assert (mv1);
! 	    gcc_assert (mv2);
! 
! 	    mv1 = transparent_union_replacement (mv1, mv2);
! 	    mv2 = transparent_union_replacement (mv2, mv1);
! 
! 	    *endp = tree_cons (NULL_TREE,
! 			       composite_type_internal (mv1, mv2, cond, cache),
! 			       NULL_TREE);
! 
! 	    endp = &TREE_CHAIN (*endp);
  	  }
  
  	t1 = c_build_function_type (valtype, newargs);
*************** type_lists_compatible_p (const_tree args
*** 2158,2181 ****
        tree a2 = TREE_VALUE (args2);
        tree mv1 = remove_qualifiers (a1);
        tree mv2 = remove_qualifiers (a2);
!       /* A null pointer instead of a type
! 	 means there is supposed to be an argument
! 	 but nothing is specified about what type it has.
! 	 So match anything that self-promotes.  */
!       if ((a1 == NULL_TREE) != (a2 == NULL_TREE))
! 	data->different_types_p = true;
!       if (a1 == NULL_TREE)
! 	{
! 	  if (c_type_promotes_to (a2) != a2)
! 	    return false;
! 	}
!       else if (a2 == NULL_TREE)
! 	{
! 	  if (c_type_promotes_to (a1) != a1)
! 	    return false;
! 	}
        /* If one of the lists has an error marker, ignore this arg.  */
!       else if (TREE_CODE (a1) == ERROR_MARK
  	       || TREE_CODE (a2) == ERROR_MARK)
  	;
        else if (!comptypes_internal (mv1, mv2, data))
--- 2128,2139 ----
        tree a2 = TREE_VALUE (args2);
        tree mv1 = remove_qualifiers (a1);
        tree mv2 = remove_qualifiers (a2);
! 
!       gcc_assert (mv2);
!       gcc_assert (mv2);
! 
        /* If one of the lists has an error marker, ignore this arg.  */
!       if (TREE_CODE (a1) == ERROR_MARK
  	       || TREE_CODE (a2) == ERROR_MARK)
  	;
        else if (!comptypes_internal (mv1, mv2, data))
*************** static tree
*** 3120,3126 ****
  build_counted_by_ref (tree datum, tree subdatum,
  		      tree *counted_by_type)
  {
-   tree type = TREE_TYPE (datum);
    tree sub_type = TREE_TYPE (subdatum);
    if (!c_flexible_array_member_type_p (sub_type)
        && TREE_CODE (sub_type) != POINTER_TYPE)
--- 3078,3083 ----
*************** build_counted_by_ref (tree datum, tree s
*** 3128,3155 ****
  
    tree attr_counted_by = lookup_attribute ("counted_by",
  					   DECL_ATTRIBUTES (subdatum));
    tree counted_by_ref = NULL_TREE;
    *counted_by_type = NULL_TREE;
!   if (attr_counted_by)
      {
!       tree field_id = TREE_VALUE (TREE_VALUE (attr_counted_by));
!       counted_by_ref
! 	= build_component_ref (UNKNOWN_LOCATION,
! 			       datum, field_id,
! 			       UNKNOWN_LOCATION, UNKNOWN_LOCATION);
!       counted_by_ref = build_fold_addr_expr (counted_by_ref);
  
        /* Get the TYPE of the counted_by field.  */
!       tree counted_by_field = lookup_field (type, field_id);
!       gcc_assert (counted_by_field);
  
!       do
! 	{
! 	  *counted_by_type = TREE_TYPE (TREE_VALUE (counted_by_field));
! 	  counted_by_field = TREE_CHAIN (counted_by_field);
! 	}
!       while (counted_by_field);
      }
    return counted_by_ref;
  }
  
--- 3085,3130 ----
  
    tree attr_counted_by = lookup_attribute ("counted_by",
  					   DECL_ATTRIBUTES (subdatum));
+   if (!attr_counted_by)
+     return NULL_TREE;
+ 
    tree counted_by_ref = NULL_TREE;
    *counted_by_type = NULL_TREE;
! 
!   tree type = TREE_TYPE (datum);
! 
!   /* If the type of the containing structure is an anonymous struct/union,
!      and this anonymous struct/union is not a root type, get the first
!      outer named structure/union type.  */
!   while (TREE_CODE (datum) == COMPONENT_REF
! 	 && c_type_tag (type) == NULL_TREE
! 	 && DECL_NAME (TREE_OPERAND (datum, 1)) == NULL_TREE)
      {
!       datum = TREE_OPERAND (datum, 0);
!       type = TREE_TYPE (datum);
!     }
! 
!   tree field_id = TREE_VALUE (TREE_VALUE (attr_counted_by));
!   tree counted_by_field = lookup_field (type, field_id);
!   gcc_assert (counted_by_field);
  
+   tree counted_by_subdatum;
+   do
+     {
+       counted_by_subdatum = TREE_VALUE (counted_by_field);
        /* Get the TYPE of the counted_by field.  */
!       *counted_by_type = TREE_TYPE (counted_by_subdatum);
  
!       counted_by_ref
! 	= build3 (COMPONENT_REF, TREE_TYPE (counted_by_subdatum),
! 		  datum, counted_by_subdatum, NULL_TREE);
! 
!       datum = counted_by_ref;
!       counted_by_field = TREE_CHAIN (counted_by_field);
      }
+   while (counted_by_field);
+ 
+   counted_by_ref = build_fold_addr_expr (counted_by_ref);
    return counted_by_ref;
  }
  
*************** build_binary_op (location_t location, en
*** 14494,14501 ****
  	  if (code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
  	    tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
  
! 	  if (!(((tcode0 == INTEGER_TYPE || tcode0 == BITINT_TYPE)
! 		 && (tcode1 == INTEGER_TYPE || tcode1 == BITINT_TYPE))
  		|| (tcode0 == FIXED_POINT_TYPE && tcode1 == FIXED_POINT_TYPE)))
  	    resultcode = RDIV_EXPR;
  	  else
--- 14469,14478 ----
  	  if (code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
  	    tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
  
! 	  if (!(((tcode0 == INTEGER_TYPE || tcode0 == BITINT_TYPE
! 		  || (tcode0 == ENUMERAL_TYPE && code0 == VECTOR_TYPE))
! 		 && (tcode1 == INTEGER_TYPE || tcode1 == BITINT_TYPE
! 		     || (tcode1 == ENUMERAL_TYPE && code1 == VECTOR_TYPE)))
  		|| (tcode0 == FIXED_POINT_TYPE && tcode1 == FIXED_POINT_TYPE)))
  	    resultcode = RDIV_EXPR;
  	  else
diff -Nrcpad gcc-16-20260111/gcc/c-family/ChangeLog gcc-16-20260118/gcc/c-family/ChangeLog
*** gcc-16-20260111/gcc/c-family/ChangeLog	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c-family/ChangeLog	Sun Jan 18 22:32:06 2026
***************
*** 1,3 ****
--- 1,18 ----
+ 2026-01-15  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* c.opt.urls: Regenerate.
+ 
+ 2026-01-15  Marek Polacek  <polacek@redhat.com>
+ 	    Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120775
+ 	PR c++/123081
+ 	PR c++/122634
+ 	* c-attribs.cc (attribute_takes_identifier_p): Return false for C++
+ 	annotations.  Handle "old parm name".
+ 	* c-cppbuiltin.cc (c_cpp_builtins): Define __cpp_impl_reflection.
+ 	* c.opt (freflection): New.
+ 
  2026-01-07  Tobias Burnus  <tburnus@baylibre.com>
  
  	* c-omp.cc (c_omp_directives): Uncomment 'groupprivate'.
diff -Nrcpad gcc-16-20260111/gcc/c-family/c-attribs.cc gcc-16-20260118/gcc/c-family/c-attribs.cc
*** gcc-16-20260111/gcc/c-family/c-attribs.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c-family/c-attribs.cc	Sun Jan 18 22:32:06 2026
*************** attribute_takes_identifier_p (const_tree
*** 715,728 ****
  {
    const struct attribute_spec *spec = lookup_attribute_spec (attr_id);
    if (spec == NULL)
!     /* Unknown attribute that we'll end up ignoring, return true so we
!        don't complain about an identifier argument.  */
!     return true;
    else if (!strcmp ("mode", spec->name)
  	   || !strcmp ("format", spec->name)
  	   || !strcmp ("cleanup", spec->name)
  	   || !strcmp ("access", spec->name)
! 	   || !strcmp ("counted_by", spec->name))
      return true;
    else
      return targetm.attribute_takes_identifier_p (attr_id);
--- 715,734 ----
  {
    const struct attribute_spec *spec = lookup_attribute_spec (attr_id);
    if (spec == NULL)
!     {
!       /* Unknown attribute that we'll end up ignoring, return true so we
! 	 don't complain about an identifier argument.  Except C++
! 	 annotations.  */
!       if (c_dialect_cxx () && id_equal (attr_id, "annotation "))
! 	return false;
!       return true;
!     }
    else if (!strcmp ("mode", spec->name)
  	   || !strcmp ("format", spec->name)
  	   || !strcmp ("cleanup", spec->name)
  	   || !strcmp ("access", spec->name)
! 	   || !strcmp ("counted_by", spec->name)
! 	   || !strcmp ("old parm name", spec->name))
      return true;
    else
      return targetm.attribute_takes_identifier_p (attr_id);
diff -Nrcpad gcc-16-20260111/gcc/c-family/c-cppbuiltin.cc gcc-16-20260118/gcc/c-family/c-cppbuiltin.cc
*** gcc-16-20260111/gcc/c-family/c-cppbuiltin.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c-family/c-cppbuiltin.cc	Sun Jan 18 22:32:06 2026
*************** c_cpp_builtins (cpp_reader *pfile)
*** 1116,1121 ****
--- 1116,1125 ----
  	  cpp_define (pfile, "__cpp_pp_embed=202502L");
  	  cpp_define (pfile, "__cpp_constexpr_virtual_inheritance=202506L");
  	  cpp_define (pfile, "__cpp_expansion_statements=202506L");
+ 	  if (flag_reflection)
+ 	    cpp_define (pfile, "__cpp_impl_reflection=202506L");
+ 	  else
+ 	    cpp_warn (pfile, "__cpp_impl_reflection");
  	}
        if (flag_concepts && cxx_dialect > cxx14)
  	cpp_define (pfile, "__cpp_concepts=202002L");
diff -Nrcpad gcc-16-20260111/gcc/c-family/c.opt gcc-16-20260118/gcc/c-family/c.opt
*** gcc-16-20260111/gcc/c-family/c.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c-family/c.opt	Sun Jan 18 22:32:06 2026
*************** frange-for-ext-temps
*** 2329,2334 ****
--- 2329,2338 ----
  C++ ObjC++ Var(flag_range_for_ext_temps)
  Enable lifetime extension of range based for temporaries.
  
+ freflection
+ C++ ObjC++ Var(flag_reflection) Init(0)
+ Enable experimental C++26 Reflection.
+ 
  freplace-objc-classes
  ObjC ObjC++ LTO Var(flag_replace_objc_classes)
  Used in Fix-and-Continue mode to indicate that object files may be swapped in at runtime.
diff -Nrcpad gcc-16-20260111/gcc/c-family/c.opt.urls gcc-16-20260118/gcc/c-family/c.opt.urls
*** gcc-16-20260111/gcc/c-family/c.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/c-family/c.opt.urls	Sun Jan 18 22:32:06 2026
*************** UrlSuffix(gcc/Optimize-Options.html#inde
*** 1355,1360 ****
--- 1355,1363 ----
  frange-for-ext-temps
  UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-frange-for-ext-temps)
  
+ freflection
+ UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-freflection)
+ 
  freplace-objc-classes
  UrlSuffix(gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html#index-freplace-objc-classes)
  
diff -Nrcpad gcc-16-20260111/gcc/cfgexpand.cc gcc-16-20260118/gcc/cfgexpand.cc
*** gcc-16-20260111/gcc/cfgexpand.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cfgexpand.cc	Sun Jan 18 22:32:06 2026
*************** expand_debug_expr (tree exp)
*** 5657,5668 ****
        else if (TREE_CODE (TREE_TYPE (exp)) == VECTOR_TYPE)
  	{
  	  unsigned i;
! 	  unsigned HOST_WIDE_INT nelts;
  	  tree val;
  
- 	  if (!TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)).is_constant (&nelts))
- 	    goto flag_unsupported;
- 
  	  op0 = gen_rtx_CONCATN (mode, rtvec_alloc (nelts));
  
  	  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), i, val)
--- 5657,5666 ----
        else if (TREE_CODE (TREE_TYPE (exp)) == VECTOR_TYPE)
  	{
  	  unsigned i;
! 	  poly_uint64 elts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp));
! 	  unsigned HOST_WIDE_INT nelts = constant_lower_bound (elts);
  	  tree val;
  
  	  op0 = gen_rtx_CONCATN (mode, rtvec_alloc (nelts));
  
  	  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), i, val)
diff -Nrcpad gcc-16-20260111/gcc/cfgloopmanip.cc gcc-16-20260118/gcc/cfgloopmanip.cc
*** gcc-16-20260111/gcc/cfgloopmanip.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cfgloopmanip.cc	Sun Jan 18 22:32:06 2026
*************** along with GCC; see the file COPYING3.
*** 34,39 ****
--- 34,40 ----
  #include "sreal.h"
  #include "tree-cfg.h"
  #include "tree-pass.h"
+ #include "hierarchical_discriminator.h"
  
  static void copy_loops_to (class loop **, int,
  			   class loop *);
*************** duplicate_loop_body_to_header_edge (clas
*** 1405,1410 ****
--- 1406,1445 ----
    spec_edges[SE_LATCH] = latch_edge;
  
    place_after = e->src;
+   location_t loop_loc = UNKNOWN_LOCATION;
+   unsigned int loop_copyid_base = 0;
+ 
+   /* Find a location from the loop header - works for both GIMPLE and RTL.  */
+   if (current_ir_type () == IR_GIMPLE)
+     {
+       gimple *last = last_nondebug_stmt (loop->header);
+       loop_loc = last ? gimple_location (last) : UNKNOWN_LOCATION;
+     }
+   else
+     {
+       /* For RTL, try to find an instruction with a valid location.  */
+       rtx_insn *insn = BB_END (loop->header);
+       while (insn && insn != BB_HEAD (loop->header))
+ 	{
+ 	  /* Only check location if this is a valid insn.  */
+ 	  if (INSN_P (insn))
+ 	    {
+ 	      location_t loc = INSN_LOCATION (insn);
+ 	      if (loc != UNKNOWN_LOCATION)
+ 		{
+ 		  loop_loc = get_pure_location (loc);
+ 		  break;
+ 		}
+ 	    }
+ 	  insn = PREV_INSN (insn);
+ 	}
+     }
+ 
+   /* Allocate copyid base for this loop duplication - works for both
+      GIMPLE and RTL since allocator is per-function.  */
+   if (loop_loc != UNKNOWN_LOCATION)
+     loop_copyid_base = allocate_copyid_base (loop_loc, ndupl);
+ 
    for (j = 0; j < ndupl; j++)
      {
        /* Copy loops.  */
*************** duplicate_loop_body_to_header_edge (clas
*** 1422,1427 ****
--- 1457,1505 ----
  	    new_bbs[i]->aux = (void *)(size_t)(j + 1);
  	  }
  
+       /* Assign hierarchical discriminators to distinguish loop iterations.  */
+       if (flags & DLTHE_RECORD_HIERARCHICAL_DISCRIMINATOR
+ 	  && loop_copyid_base > 0)
+ 	{
+ 	  /* Calculate copyid for this iteration.  */
+ 	  unsigned int copyid = loop_copyid_base + j;
+ 	  if (copyid > DISCR_COPYID_MAX)
+ 	    copyid = DISCR_COPYID_MAX;
+ 
+ 	  if (current_ir_type () == IR_GIMPLE)
+ 	    {
+ 	      /* Update all basic blocks created in this iteration.  */
+ 	      for (i = 0; i < n; i++)
+ 		assign_discriminators_to_bb (new_bbs[i], 0, copyid);
+ 	    }
+ 	  else
+ 	    {
+ 	      /* For RTL, manually update instruction locations.  */
+ 	      for (i = 0; i < n; i++)
+ 		{
+ 		  basic_block bb = new_bbs[i];
+ 		  rtx_insn *insn;
+ 
+ 		  /* Iterate through all instructions in the block.  */
+ 		  FOR_BB_INSNS (bb, insn)
+ 		    {
+ 		      if (INSN_HAS_LOCATION (insn))
+ 			{
+ 			  location_t loc = INSN_LOCATION (insn);
+ 			  /* Get existing discriminator components.  */
+ 			  discriminator_components comp
+ 			    = get_discriminator_components_from_loc (loc);
+ 			  comp.copyid = copyid;
+ 
+ 			  /* Apply hierarchical discriminator format.  */
+ 			  INSN_LOCATION (insn)
+ 			    = location_with_discriminator_components (loc, comp);
+ 			}
+ 		    }
+ 		}
+ 	    }
+ 	}
+ 
        /* Note whether the blocks and edges belong to an irreducible loop.  */
        if (add_irreducible_flag)
  	{
diff -Nrcpad gcc-16-20260111/gcc/cfgloopmanip.h gcc-16-20260118/gcc/cfgloopmanip.h
*** gcc-16-20260111/gcc/cfgloopmanip.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cfgloopmanip.h	Sun Jan 18 22:32:06 2026
*************** enum
*** 34,39 ****
--- 34,43 ----
  					   a complete peeling.  */
  #define DLTHE_FLAG_FLAT_PROFILE 8	/* Profile is flat; do not reduce
  					   count by unroll factor.  */
+ #define DLTHE_RECORD_HIERARCHICAL_DISCRIMINATOR 16 /* Assign hierarchical
+ 						      discriminators to
+ 						      distinguish loop
+ 						      iterations.  */
  extern edge mfb_kj_edge;
  
  extern bool remove_path (edge, bool * = NULL, bitmap = NULL);
diff -Nrcpad gcc-16-20260111/gcc/cgraph.cc gcc-16-20260118/gcc/cgraph.cc
*** gcc-16-20260111/gcc/cgraph.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cgraph.cc	Sun Jan 18 22:32:06 2026
*************** cgraph_node::verify_node (void)
*** 4404,4410 ****
  	    }
  
  	  if (e->has_callback
! 	      && !callback_is_special_cased (e->callee->decl, e->call_stmt))
  	    {
  	      int ncallbacks = 0;
  	      int nfound_edges = 0;
--- 4404,4411 ----
  	    }
  
  	  if (e->has_callback
! 	      && !callback_is_special_cased (e->callee->decl, e->call_stmt)
! 	      && !fndecl_built_in_p (e->callee->decl, BUILT_IN_UNREACHABLE))
  	    {
  	      int ncallbacks = 0;
  	      int nfound_edges = 0;
*************** cgraph_node::verify_node (void)
*** 4431,4436 ****
--- 4432,4447 ----
  		}
  	    }
  
+ 	  if (e->has_callback
+ 	      && fndecl_built_in_p (e->callee->decl, BUILT_IN_UNREACHABLE))
+ 	    for (cgraph_edge *cbe = e->first_callback_edge (); cbe;
+ 		 cbe = cbe->next_callback_edge ())
+ 	      if (!fndecl_built_in_p (cbe->callee->decl, BUILT_IN_UNREACHABLE))
+ 		error ("callback-carrying edge is pointing towards "
+ 		       "__builtin_unreachable, but its callback edge %s -> %s "
+ 		       "is not",
+ 		       cbe->caller->name (), cbe->callee->name ());
+ 
  	  if (!e->aux && !e->speculative && !e->callback && !e->has_callback)
  	    {
  	      error ("edge %s->%s has no corresponding call_stmt",
diff -Nrcpad gcc-16-20260111/gcc/cobol/ChangeLog gcc-16-20260118/gcc/cobol/ChangeLog
*** gcc-16-20260111/gcc/cobol/ChangeLog	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/ChangeLog	Sun Jan 18 22:32:06 2026
***************
*** 1,3 ****
--- 1,229 ----
+ 2026-01-17  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* lang.opt.urls: Regenerate.
+ 
+ 2026-01-17  Robert Dubner  <rdubner@symas.com>
+ 	    James K. Lowden  <jklowden@cobolworx.com>
+ 
+ 	* cbldiag.h (struct cbl_loc_t): Diagnostics.
+ 	(enum cbl_diag_id_t): Diagnostics.
+ 	* cdf.y: Includes.
+ 	* cobol1.cc (cobol_warning_suppress): Diagnostics.
+ 	(cobol_langhook_handle_option): Implement -fexec-charset.  Expand
+ 	the use of diagnostics.
+ 	* gcobc: Expand options and warnings.
+ 	* gcobol.1: Documentation.
+ 	* genapi.cc (level_88_helper): Charsets.
+ 	(get_level_88_domain): Charsets.
+ 	(get_class_condition_string): Charsets.
+ 	(function_pointer_from_name): Charsets.
+ 	(initialize_variable_internal):  Charsets.
+ 	(parser_initialize): Charsets.
+ 	(get_binary_value_from_float): Charsets.
+ 	(get_bytes_needed): Charsets.
+ 	(cobol_compare): Charsets.
+ 	(move_tree): Eliminate function.
+ 	(move_tree_to_field): Eliminate function.
+ 	(get_string_from): Eliminate function.
+ 	(parser_init_list): Charsets.
+ 	(psa_FldLiteralN): Charsets.
+ 	(parser_accept_date_yymmdd): Charsets.
+ 	(parser_accept_date_yyyymmdd): Charsets.
+ 	(parser_accept_date_yyddd): Charsets.
+ 	(parser_accept_date_yyyyddd): Charsets.
+ 	(parser_accept_date_dow): Charsets.
+ 	(parser_accept_date_hhmmssff): Charsets.
+ 	(parser_alphabet): Charsets.
+ 	(parser_alphabet_use): Charsets.
+ 	(parser_display_internal): Charsets.
+ 	(get_literalN_value): Charsets.
+ 	(tree_type_from_field_type): Charsets.
+ 	(program_end_stuff): Charsets.
+ 	(walk_initialization): Charsets.
+ 	(parser_xml_parse): Charsets.
+ 	(initialize_the_data): Charsets.
+ 	(establish_using): Charsets.
+ 	(parser_setop): Charsets.
+ 	(parser_set_conditional88): Charsets.
+ 	(parser_file_add): Charsets.
+ 	(get_the_filename): Eliminate function.
+ 	(parser_file_open): Charsets.
+ 	(parser_file_delete_file): Charsets.
+ 	(parser_file_start): Charsets.
+ 	(parser_module_name): Charsets.
+ 	(parser_intrinsic_find_string): New function.
+ 	(parser_intrinsic_numval_c): Charsets.
+ 	(parser_intrinsic_convert): New function.
+ 	(parser_intrinsic_call_1): Charsets.
+ 	(create_and_call): Charsets.
+ 	(mh_identical): Charsets.
+ 	(mh_source_is_literalN): Charsets.
+ 	(float_type_of): Charsets.
+ 	(mh_dest_is_float): Charsets.
+ 	(mh_numeric_display): Charsets.
+ 	(mh_little_endian): Charsets.
+ 	(mh_source_is_group): Charsets.
+ 	(mh_source_is_literalA): Charsets.
+ 	(move_helper): Charsets.
+ 	(binary_initial): Eliminate function.
+ 	(digits_from_int128): Eliminate function.
+ 	(digits_from_float128): Eliminate function.
+ 	(initial_from_initial):  Eliminate function.
+ 	(convert_data_initial): New function.
+ 	(actually_create_the_static_field): Charsets.
+ 	(psa_new_var_decl): Charsets.
+ 	(psa_FldLiteralA): Charsets.
+ 	(parser_local_add): Charsets.
+ 	(parser_symbol_add): Charsets.
+ 	* genapi.h (parser_intrinsic_convert): New function.
+ 	(parser_intrinsic_find_string): New function.
+ 	* genmath.cc (arithmetic_operation): Charsets.
+ 	(largest_binary_term): Charsets.
+ 	(fast_add): Charsets.
+ 	(fast_subtract): Charsets.
+ 	(fast_multiply): Charsets.
+ 	(fast_divide): Charsets.
+ 	(parser_subtract): Fix subtract float from float.
+ 	* genutil.cc (get_any_capacity): Charsets.
+ 	(get_and_check_refstart_and_reflen): Charsets.
+ 	(get_data_offset): Charsets.
+ 	(get_binary_value): Charsets.
+ 	(tree_type_from_field): Charsets.
+ 	(copy_little_endian_into_place): Charsets.
+ 	(get_literal_string): Charsets.
+ 	(refer_is_clean): Charsets.
+ 	(refer_fill_depends): Charsets.
+ 	(refer_size_source): Comment.
+ 	* lang-specs.h: Charsets.
+ 	* lang.opt: Charsets.
+ 	* lexio.cc (parse_copy_directive): Diagnostics.
+ 	* messages.cc (cbl_diagnostic_kind): Diagnostics.
+ 	(cobol_warning_suppress): Diagnostics.
+ 	* parse.y: Many changes for charsets and diagnostics.
+ 	* parse_ante.h (MAXLENGTH_FORMATTED_DATE): Charsets.
+ 	(MAXLENGTH_FORMATTED_TIME): Charsets.
+ 	(MAXLENGTH_CALENDAR_DATE): Charsets.
+ 	(MAXLENGTH_FORMATTED_DATETIME): Charsets.
+ 	(consistent_encoding_check): Charsets.
+ 	(enum data_clause_t): Charsets.
+ 	(new_alphanumeric): Charsets.
+ 	(name_of): Charsets.
+ 	(class eval_subject_t): Charsets.
+ 	(struct domain_t): Charsets.
+ 	(struct file_list_t): Charsets.
+ 	(current_encoding): Charsets.
+ 	(new_tempnumeric): Charsets.
+ 	(is_integer_literal): Charsets.
+ 	(new_literal): Charsets.
+ 	(new_constant): Charsets.
+ 	(conditional_set): Charsets.
+ 	(field_find): Charsets.
+ 	(valid_redefine): Charsets.
+ 	(field_value_all): Charsets.
+ 	(parent_has_picture): Charsets.
+ 	(parent_has_value): Charsets.
+ 	(blank_pad_initial): Charsets.
+ 	(blankit): Charsets.
+ 	(cbl_field_t::blank_initial): Charsets.
+ 	(value_encoding_check): Charsets.
+ 	(cbl_field_t::set_initial): Charsets.
+ 	(field_alloc): Charsets.
+ 	(parser_move_carefully): Charsets.
+ 	(data_division_ready): Charsets.
+ 	(anybody_redefines): Charsets.
+ 	(procedure_division_ready): Charsets.
+ 	(file_section_parent_set): Charsets.
+ 	(field_binary_usage): Charsets.
+ 	(goodnight_gracie): Formatting.
+ 	* scan.l: Charsets.
+ 	* scan_ante.h (numstr_of): Charsets.
+ 	(typed_name): Charsets.
+ 	* show_parse.h: Charsets.
+ 	* structs.cc (create_cblc_file_t): Charsets.
+ 	* symbols.cc (symbol_table_extend): Charsets.
+ 	(WARNING_FIELD): Diagnostics.
+ 	(constq): Charsets.
+ 	(elementize): Charsets.
+ 	(field_size): Charsets.
+ 	(cbl_field_t::set_attr): Eliminate run-time component.
+ 	(cbl_field_t::clear_attr): Eliminate run-time component.
+ 	(field_memsize): Charsets.
+ 	(cbl_encoding_str): Charsets.
+ 	(symbols_dump): Charsets.
+ 	(is_variable_length): Formatting.
+ 	(field_str): Charsets.
+ 	(extend_66_capacity): Charsets.
+ 	(operator<<): Charsets.
+ 	(symbols_update): Charsets.
+ 	(symbol_field_parent_set): Charsets.
+ 	(symbol_table_init): Charsets.
+ 	(numeric_group_attrs): Charsets.
+ 	(symbol_field_add): Charsets.
+ 	(symbol_field_alias): Charsets.
+ 	(fd_record_size_cmp): Charsets.
+ 	(symbol_file_record_sizes): Charsets.
+ 	(cbl_alphabet_t::reencode): Charsets.
+ 	(symbol_temporary_location): Charsets.
+ 	(new_literal_2): Charsets.
+ 	(new_alphanumeric): Charsets.
+ 	(standard_internal): Charsets.
+ 	(cbl_field_t::codeset_t::stride): Charsets.
+ 	(cobol_alpha_encoding): Charsets.
+ 	(cobol_national_encoding): Charsets.
+ 	(new_temporary): Charsets.
+ 	(new_literal_float): Charsets.
+ 	(cbl_field_t::is_ascii): Charsets.
+ 	(cbl_field_t::internalize): Eliminate function.
+ 	(cbl_field_t::source_code_check): Charsets.
+ 	(iconv_cd): Charsets.
+ 	(cbl_field_t::encode): New function for charsets.
+ 	(cbl_field_t::set_capacity): Charsets.
+ 	(cbl_field_t::add_capacity): Charsets.
+ 	(cbl_field_t::char_capacity): Charsets.
+ 	(symbol_label_section_exists): Charsets.
+ 	(size): Charsets.
+ 	(validate_numeric_edited): Charsets.
+ 	* symbols.h (cobol_alpha_encoding): Charsets.
+ 	(cobol_national_encoding): Charsets.
+ 	(consistent_encoding_check): Charsets.
+ 	(class cbl_domain_elem_t): Charsets.
+ 	(struct cbl_domain_t): Charsets.
+ 	(struct cbl_field_data_t): Charsets.
+ 	(class cbl_field_data_t): Charsets.
+ 	(struct cbl_subtable_t): Charsets.
+ 	(struct cbl_field_t): Charsets.
+ 	(new_literal_float): Charsets.
+ 	(new_temporary): Charsets.
+ 	(new_literal_2): Charsets.
+ 	(symbol_temporary_location): Charsets.
+ 	(class temporaries_t): Charsets.
+ 	(struct symbol_elem_t): Charsets.
+ 	(symbol_elem_of): Charsets.
+ 	(symbol_unique_index): Charsets.
+ 	(cbl_field_type_name): Charsets.
+ 	(validate_numeric_edited): Charsets.
+ 	* token_names.h: Charsets.
+ 	* util.cc (cdf_literalize): Charsets.
+ 	(cbl_field_type_name): Charsets.
+ 	(determine_intermediate_type): Charsets.
+ 	(is_alpha_edited): Charsets.
+ 	(cbl_field_data_t::is_alpha_edited): Charsets.
+ 	(symbol_field_type_update): Charsets.
+ 	(redefine_field): Charsets.
+ 	(FIXED_WIDE_INT): Charsets.
+ 	(dirty_to_binary): Charsets.
+ 	(digits_from_int128): Charsets.
+ 	(binary_initial): Charsets.
+ 	(cbl_field_t::encode_numeric): Charsets.
+ 	(FOR_JIM): Temporary conditional demonstration code.
+ 	(parse_error_inc): Diagnostics.
+ 	(parse_error_count): Diagnostics.
+ 	(cbl_field_t::report_invalid_initial_value): Diagnostics.
+ 	(valid_move): Diagnostics.
+ 	(type_capacity): Charsets.
+ 	(symbol_unique_index): New function.
+ 	(cbl_unimplementedw): Formatting.
+ 
  2025-12-19  Jakub Jelinek  <jakub@redhat.com>
  
  	* lexio.cc (parse_replace_pairs): Fix comment typo, statment
diff -Nrcpad gcc-16-20260111/gcc/cobol/cbldiag.h gcc-16-20260118/gcc/cobol/cbldiag.h
*** gcc-16-20260111/gcc/cobol/cbldiag.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/cbldiag.h	Sun Jan 18 22:32:06 2026
*************** struct cbl_loc_t {
*** 83,88 ****
--- 83,94 ----
    int last_line;
    int last_column;
  
+   cbl_loc_t() 
+     : first_line(0)
+     , first_column(0)
+     , last_line(0)
+     , last_column(0)
+   {}
    cbl_loc_t( const YYLTYPE& loc ) 
      : first_line(loc.first_line)
      , first_column(loc.first_column)
*************** struct cbl_loc_t {
*** 90,96 ****
      , last_column(loc.last_column)
    {}
  
!   operator YYLTYPE() const {
      return { first_line, first_column, last_line, last_column };
    } 
  };
--- 96,102 ----
      , last_column(loc.last_column)
    {}
  
!   operator YYLTYPE() const {  //  cppcheck-suppress syntaxError
      return { first_line, first_column, last_line, last_column };
    } 
  };
*************** enum cbl_diag_id_t : uint64_t {
*** 137,147 ****
--- 143,156 ----
  
    MfBinaryLongLong,
    MfCallGiving,
+   MfCallLiteral,
    MfCdfDollar, 
    MfComp6,
    MfCompX,
    MfLevel_1_Occurs, 
    MfLevel78,
+   MfAnyLength, 
+   MfMoveIndex, 
    MfMovePointer, 
    MfReturningNum,
    MfUsageTypename,
diff -Nrcpad gcc-16-20260111/gcc/cobol/cdf.y gcc-16-20260118/gcc/cobol/cdf.y
*** gcc-16-20260111/gcc/cobol/cdf.y	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/cdf.y	Sun Jan 18 22:32:06 2026
***************
*** 30,38 ****
  %{
  
  #include "cobol-system.h"
! #include "coretypes.h"
! #include "tree.h"
  #undef yy_flex_debug
  #include "../../libgcobol/ec.h"
  #include "../../libgcobol/common-defs.h"
  #include "util.h"
--- 30,40 ----
  %{
  
  #include "cobol-system.h"
! #include <coretypes.h>
! #include <tree.h>
! 
  #undef yy_flex_debug
+ 
  #include "../../libgcobol/ec.h"
  #include "../../libgcobol/common-defs.h"
  #include "util.h"
diff -Nrcpad gcc-16-20260111/gcc/cobol/cobol1.cc gcc-16-20260118/gcc/cobol/cobol1.cc
*** gcc-16-20260111/gcc/cobol/cobol1.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/cobol1.cc	Sun Jan 18 22:32:06 2026
*************** enable_exceptions( bool enable ) {
*** 329,334 ****
--- 329,335 ----
  }
  
  void cobol_warning( cbl_diag_id_t id, int yn, bool );
+ void cobol_warning_suppress( cbl_dialect_t dialect );
  
  static bool
  cobol_langhook_handle_option (size_t scode,
*************** cobol_langhook_handle_option (size_t sco
*** 360,365 ****
--- 361,378 ----
              copybook_extension_add(cobol_copyext);
              return true;
  
+         case OPT_fexec_charset_:
+             if( ! cobol_alpha_encoding( arg ) ) {
+               cbl_errx( "no such charset %qs", arg);
+             }
+             return true;
+ 
+         case OPT_fexec_national_charset_:
+           if( ! cobol_national_encoding( arg ) ) {
+               cbl_errx( "no such national charset %qs", arg);
+             }
+             return true;
+ 
          case OPT_M:
              cobol_set_pp_option('M');
              return true;
*************** cobol_langhook_handle_option (size_t sco
*** 369,375 ****
              return true;
  
          case OPT_fdefaultbyte:
!             // cobol_default_byte is an unsigned ing
              wsclear(cobol_default_byte);
              return true;
  
--- 382,388 ----
              return true;
  
          case OPT_fdefaultbyte:
!             // cobol_default_byte is an unsigned int
              wsclear(cobol_default_byte);
              return true;
  
*************** cobol_langhook_handle_option (size_t sco
*** 410,415 ****
--- 423,429 ----
              // gcc disallows 0 as an enumerated value, so we used 0x10 for iso.
              if( cobol_dialect == 0x100 ) cobol_dialect = 0; 
              cobol_dialect_set(cbl_dialect_t(cobol_dialect));
+             cobol_warning_suppress(cbl_dialect_t(cobol_dialect));
              return true;
  
          case OPT_fsyntax_only:
*************** cobol_langhook_handle_option (size_t sco
*** 441,450 ****
          case OPT_nomain:
              return true;
  
-         case OPT_finternal_ebcdic:
-             cobol_gcobol_feature_set(feature_internal_ebcdic_e);
-             return true;
- 
          // Warnings and errors
  
          case OPT_Wbinary_long_long:
--- 455,460 ----
*************** cobol_langhook_handle_option (size_t sco
*** 455,460 ****
--- 465,474 ----
            cobol_warning(MfCallGiving, call_giving, warning_as_error);
            return true;
  
+         case OPT_Wcall_literal:
+           cobol_warning(MfCallLiteral, call_literal, warning_as_error);
+           return true;
+ 
          case OPT_Wcdf_dollar:
            cobol_warning(MfCdfDollar, cdf_dollar, warning_as_error);
            return true;
*************** cobol_langhook_handle_option (size_t sco
*** 479,484 ****
--- 493,502 ----
            cobol_warning(Par78CdfDefinedW, level_78_defined, warning_as_error);
            return true;
  
+         case OPT_Wmove_index:
+           cobol_warning(MfMoveIndex, move_index, warning_as_error);
+           return true;
+ 
          case OPT_Wmove_pointer:
            cobol_warning(MfMovePointer, move_pointer, warning_as_error);
            return true;
*************** cobol_langhook_handle_option (size_t sco
*** 487,492 ****
--- 505,514 ----
            cobol_warning(MfLevel78, level_78, warning_as_error);
            return true;
  
+         case OPT_Wany_length:
+           cobol_warning(MfAnyLength, cobol_any_length, warning_as_error);
+           return true;
+ 
          case OPT_Wreturning_number:
            cobol_warning(MfReturningNum, returning_number, warning_as_error);
            return true;
diff -Nrcpad gcc-16-20260111/gcc/cobol/gcobc gcc-16-20260118/gcc/cobol/gcobc
*** gcc-16-20260111/gcc/cobol/gcobc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/gcobc	Sun Jan 18 22:32:06 2026
*************** do
*** 184,190 ****
           -C) error "$opt $incomparable"
               ;;
          -d | -debug | --debug) opts="$opts -fcobol-exceptions=EC-ALL"
-                        warn "$opt implies -fstack-check:"
                         ;;
          # define for preprocessor, note: -D* is directly passed
          -D)
--- 184,189 ----
*************** do
*** 200,206 ****
               opts="$opts $opt"
               ;;
           -ext)
!             pending_arg="$opt "
               ;;
           -ext=*) opts="$opts $(echo "$opt" | sed 's/-ext=/-copyext ./')"
                   ;;
--- 199,205 ----
               opts="$opts $opt"
               ;;
           -ext)
!             pending_arg="-copyext "
               ;;
           -ext=*) opts="$opts $(echo "$opt" | sed 's/-ext=/-copyext ./')"
                   ;;
*************** do
*** 230,236 ****
          -fwrite-after) warn "$opt" ;;
          -fmfcomment) warn "$opt" ;;
          -facucomment) warn "$opt" ;;
!         -fno-trunc) no_warn "$opt" ;;
          -fsingle-quote) warn "$opt" ;;
          -foptional-file) warn "$opt" ;;
          -fstatic-call | -fno-static-call)
--- 229,235 ----
          -fwrite-after) warn "$opt" ;;
          -fmfcomment) warn "$opt" ;;
          -facucomment) warn "$opt" ;;
!         -ftrunc | -fno-trunc | -fnotrunc) no_warn "$opt" ;;
          -fsingle-quote) warn "$opt" ;;
          -foptional-file) warn "$opt" ;;
          -fstatic-call | -fno-static-call)
*************** do
*** 384,391 ****
          -fformat=auto) ;; # gcobol and gnucobol default
  
          -fixed | --fixed | -fformat=fixed | -fformat=variable | -fformat=xcard)
!                     # note: variable + xcard are only _more similar_ to fixed than free,
!                     # (with changing right-column to 250/255, which isn't supported in gcobol, yet)
                       opts="$opts -ffixed-form"
                       ;;
  
--- 383,391 ----
          -fformat=auto) ;; # gcobol and gnucobol default
  
          -fixed | --fixed | -fformat=fixed | -fformat=variable | -fformat=xcard)
!                     # note: variable + xcard are only _more similar_
!                     # to fixed than free, (with changing right-column
!                     # to 250/255, which isn't supported in gcobol
                       opts="$opts -ffixed-form"
                       ;;
  
*************** do
*** 400,407 ****
                 ;;
          -i | --info) warn "$opt"
                       ;;
! 
!         # -I
          -fimplicit-init) warn "$opt"
                           ;;
          -j | -job)  warn "$opt"
--- 400,410 ----
                 ;;
          -i | --info) warn "$opt"
                       ;;
!         -I) pending_arg=$opt
!             ;;
!         -I*)
!             opts="$opts $opt"
!             ;;
          -fimplicit-init) warn "$opt"
                           ;;
          -j | -job)  warn "$opt"
*************** do
*** 411,417 ****
          -K*) warn "$opt"
              ;;
          # -l
!         # -L
          --list*) warn "$opt"
                   ;;
          -m) mode="-shared"
--- 414,421 ----
          -K*) warn "$opt"
              ;;
          # -l
!         -L) pending_arg=$opt
!             ;;
          --list*) warn "$opt"
                   ;;
          -m) mode="-shared"
*************** do
*** 425,433 ****
               opts="$opts $opt"
              ;;
  
-         # -O0, -Ox
-         -O | -O2 | -Os) warn "$opt"
-                         ;;
          -S) mode="$opt"
              ;;
          -save-temps=*) opt="$(echo "$opt" | sed -E 's/^.+=//')"
--- 429,434 ----
diff -Nrcpad gcc-16-20260111/gcc/cobol/gcobol.1 gcc-16-20260118/gcc/cobol/gcobol.1
*** gcc-16-20260111/gcc/cobol/gcobol.1	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/gcobol.1	Sun Jan 18 22:32:06 2026
***************
*** 25,31 ****
  .Op Fl copyext Ar ext
  .Op Fl ffixed-form | Fl ffree-form
  .Op Fl findicator-column
! .Op Fl finternal-ebcdic
  .Op Fl dialect Ar dialect-name
  .Op Fl include Ar filename
  .Op Fl preprocess Ar preprocess-filter
--- 25,35 ----
  .Op Fl copyext Ar ext
  .Op Fl ffixed-form | Fl ffree-form
  .Op Fl findicator-column
! .Op Fl fexec-charset= Ns Ar encoding
! .Op Fl fexec-national-charset= Ns Ar encoding
! .ig
! .Op Fl collseq Ar encoding Ns \/, Fl ncolseq Ar encoding
! ..
  .Op Fl dialect Ar dialect-name
  .Op Fl include Ar filename
  .Op Fl preprocess Ar preprocess-filter
***************
*** 39,44 ****
--- 43,49 ----
  .Op Fl Wno-bad-numeric
  .Op Fl Wno-binary-long-long
  .Op Fl Wno-call-giving
+ .Op Fl Wno-call-literal
  .Op Fl Wno-cdf-dollar
  .Op Fl Wno-cdf-invalid-parameter
  .Op Fl Wno-cdf-name-not-found
***************
*** 61,66 ****
--- 66,72 ----
  .Op Fl Wno-literal-concat
  .Op Fl Wno-locale-error
  .Op Fl Wno-move-corresponding
+ .Op Fl Wno-move-index
  .Op Fl Wno-move-pointer
  .Op Fl Wno-nllanginfo-error
  .Op Fl Wno-operator-space
*************** is a non-constant data item, it is alway
*** 325,330 ****
--- 331,365 ----
  linking, with
  .Xr dlsym 3 Ns Li ,
  because its value is determined at run time.
+ .
+ .It Fl fexec-charset= Ns Ar encoding
+ Set the default execution character set for alphanumeric data items
+ and literals in the absence of
+ .Sy "CHARACTER CLASSIFICATION"
+ in
+ .Sy "CONFIGURATION SECTION" .
+ .Ar encoding
+ is an encoding name as defined by
+ .Xr iconv 3 .
+ Unless otherwise specified, the runtime encoding for both alphanumeric
+ and NATIONAL is
+ .Sy CP1252
+ as defined by
+ .Xr iconv 3 .
+ .
+ .It Fl fexec-national-charset= Ns Ar encoding
+ Set the default execution character set for NATIONAL data items
+ and literals in the absence of
+ .Sy "CHARACTER CLASSIFICATION"
+ in
+ .Sy "CONFIGURATION SECTION" .
+ .Ar encoding
+ is an encoding name as defined by
+ .Xr iconv 3 .
+ To use an EBCDIC encoding for data items, one might use
+ .D1 Fl fexec-national-charset= Ns Li CP1140
+ for example. 
+ .
  .It Fl dialect Ar dialect-name
  By default,
  .Nm
*************** Warn if malformed %<#line%> directive is
*** 476,481 ****
--- 511,518 ----
  Warn if BINARY-LONG-LONG is used.
  .It Fl Wno-call_giving
  Warn if CALL ... GIVING is used.
+ .It Fl Wno-call_literal
+ Warn if CALL is used is used with a literal parameter by reference.
  .It Fl Wno-cdf-dollar
  Warn if CDF \[Do]IF is used.
  .It Fl Wno-comp-6
*************** Warn if INSPECT ... TRAILING is used.
*** 490,495 ****
--- 527,534 ----
  Warn if Level 01 is used with OCCURS.
  .It Fl Wno-level-78-defined
  Warn if CDF defines Level 78 constant.
+ .It Fl Wno-move-index
+ Warn if MOVE INDEX is used.
  .It Fl Wno-move-pointer
  Warn if MOVE POINTER is used.
  .It Fl Wno-returning-number
*************** The fourth links the three .o files into
*** 633,639 ****
  .
  .Sh EBCDIC
  The
! .Fl finternal-ebcdic
  option is useful when working with mainframe \*[lang] programs intended
  for EBCDIC-encoded files.  With this option, while the \*[lang] text
  remains in ASCII, the character literals and field initial values
--- 672,678 ----
  .
  .Sh EBCDIC
  The
! .Fl fexec-charset=cp1140
  option is useful when working with mainframe \*[lang] programs intended
  for EBCDIC-encoded files.  With this option, while the \*[lang] text
  remains in ASCII, the character literals and field initial values
*************** produce EBCDIC strings in the compiled b
*** 641,650 ****
  read from a file are interpreted as EBCDIC data.  The file data are
  not
  .Em converted ;
! rather, the file is assumed to use EBCDIC representation. String
  literals in the \*[lang] text
  .Em are
! converted, so that they can be compared meaningfully with data in the file.
  .Pp
  Only file data and character literals are affected.  Data read from
  and written to the environment, or taken from the command line, are
--- 680,692 ----
  read from a file are interpreted as EBCDIC data.  The file data are
  not
  .Em converted ;
! rather, the file is assumed to use EBCDIC representation.  String
  literals in the \*[lang] text
  .Em are
! converted, so that they can be compared meaningfully with data in the
! file.  Code Page 1140 is one of a number of EBCDIC code pages; it is
! often useful because it closely parallels the commonly-used Code Page
! 1252 that provides many Western European characters.
  .Pp
  Only file data and character literals are affected.  Data read from
  and written to the environment, or taken from the command line, are
*************** in the name, which is otherwise invalid
*** 1387,1393 ****
  .Bl -tag -compact
  .It Sy %EBCDIC-MODE
  is set by
! .Fl finternal-ebcdic .
  .It Sy %64-BIT-POINTER
  is implied by
  .Fl "dialect ibm" .
--- 1429,1436 ----
  .Bl -tag -compact
  .It Sy %EBCDIC-MODE
  is set by
! .Fl fexec-charset= Ns Ar <encoding>
! for all EBCDIC encodings.
  .It Sy %64-BIT-POINTER
  is implied by
  .Fl "dialect ibm" .
diff -Nrcpad gcc-16-20260111/gcc/cobol/genapi.cc gcc-16-20260118/gcc/cobol/genapi.cc
*** gcc-16-20260111/gcc/cobol/genapi.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/genapi.cc	Sun Jan 18 22:32:06 2026
*************** static
*** 366,373 ****
  char *
  level_88_helper(size_t parent_capacity,
                  const cbl_domain_elem_t &elem,
!                 size_t &returned_size,
!                 cbl_encoding_t encoding)
    {
    // We return a MALLOCed return value, which the caller must free.
    char *retval  = static_cast<char *>(xmalloc(parent_capacity + 64));
--- 366,372 ----
  char *
  level_88_helper(size_t parent_capacity,
                  const cbl_domain_elem_t &elem,
!                 size_t &returned_size)
    {
    // We return a MALLOCed return value, which the caller must free.
    char *retval  = static_cast<char *>(xmalloc(parent_capacity + 64));
*************** level_88_helper(size_t parent_capacity,
*** 385,391 ****
      switch(figconst)
        {
        case normal_value_e :
!         // This really should never happend
          abort();
          break;
        case low_value_e    :
--- 384,390 ----
      switch(figconst)
        {
        case normal_value_e :
!         // This really should never happen
          abort();
          break;
        case low_value_e    :
*************** level_88_helper(size_t parent_capacity,
*** 420,440 ****
      memcpy(first_name, elem.name(), first_name_length);
      first_name[first_name_length] = '\0';
  
-     /*  By rights, the parser should have given us this string in the target
-         encoding.  When I discovered that it was not, Jim Lowden was out of
-         town for a week, and I didn't feel like figuring out where in the
-         parser the fix should be.
- 
-         So, I am doing the conversion here.  Eventually that will be fixed, and
-         chaos will reign here.  When that happens, remove the following
-         conversion. */
-     charmap_t *charmap = __gg__get_charmap(encoding);
-     for(size_t i=0; i<strlen(first_name); i++)
-       {
-       first_name[i] = charmap->mapped_character(first_name[i]);
-       }
-     ///////////////// end of conversion
- 
      if( parent_capacity == 0 )
        {
        // Special case:  parent_capacity is zero when this routine has been
--- 419,424 ----
*************** get_level_88_domain(size_t parent_capaci
*** 517,524 ****
      // Do the first element of the domain
      stream = level_88_helper( parent_capacity,
                                domain->first,
!                               stream_len,
!                               var->codeset.encoding);
      if( output_index + stream_len > retval_capacity )
        {
        retval_capacity *= 2;
--- 501,507 ----
      // Do the first element of the domain
      stream = level_88_helper( parent_capacity,
                                domain->first,
!                               stream_len);
      if( output_index + stream_len > retval_capacity )
        {
        retval_capacity *= 2;
*************** get_level_88_domain(size_t parent_capaci
*** 533,540 ****
      // Do the second element of the domain
      stream = level_88_helper( parent_capacity,
                                domain->last,
!                               stream_len,
!                               var->codeset.encoding);
      if( output_index + stream_len > retval_capacity )
        {
        retval_capacity *= 2;
--- 516,522 ----
      // Do the second element of the domain
      stream = level_88_helper( parent_capacity,
                                domain->last,
!                               stream_len);
      if( output_index + stream_len > retval_capacity )
        {
        retval_capacity *= 2;
*************** static
*** 563,568 ****
--- 545,552 ----
  char *
  get_class_condition_string(cbl_field_t *var)
    {
+   // This routine returns a malloced pointer.
+ 
    // We know at this point that var is FldClass
    // The LEVEL is not 88, so this is a CLASS SPECIAL-NAME
  
*************** get_class_condition_string(cbl_field_t *
*** 579,599 ****
        "ABCJ12"        // This is the same as "A" "B" "C" ...
  
        Expressly presented numbers are the ordinal positions in the run-time
!       character set.  So, an ASCII "A" would be given as 66, which is one
!       greater than 65, which is the ASCII codepoint for "A".  An EBCDIC "A"
!       would be presented as 194, which is one greater than 193, which is the
!       decimal representation of an EBCDIC "A", whose hex code is 0xC2.
  
!       We need to account for EBCDIC as well as ASCII.  In EBCDIC,
!       "A" THROUGH "Z" doesn't mean what it looks like it means, because EBCIDC
!       encoding has gaps between I and J, and between R and S.  That isn't true
!       in ASCII.  We don't want to deal with these issues at compile time, so we
!       are encoding numeric ordinals with their negated values, while other
!       characters are given as the numeric forms of their ASCII encoding.
!       Conversion to EBCDIC occurs at runtime.
  
!       In support of this strategy, character strings like "ABCD" are broken up
!       into "A" "B" "C" "D" and converted to their hexadecimal representations.
        */
  
    char ach[8192];
--- 563,579 ----
        "ABCJ12"        // This is the same as "A" "B" "C" ...
  
        Expressly presented numbers are the ordinal positions in the run-time
!       character set. We encode those values with a leading ascii_hyphen to
!       distinguish them from characters.
  
!       Characters are converted to UTF32 values, and then encoded as big-endian
!       hexadecimal characters.
  
!       A range of values is encoded as a pair of hexadecimal values with an
!       ascii_slash between them.  The second value ends with a space
! 
!       A list of characters is encoded simply as a stream of hexadecimal values
!       separated by spaces.
        */
  
    char ach[8192];
*************** get_class_condition_string(cbl_field_t *
*** 602,667 ****
  
    while( domain->first.is_numeric || domain->first.name() )
      {
-     // *What* were they smoking back then?
- 
-     uint8_t value1;
-     uint8_t value2;
- 
      size_t first_name_length = domain->first.size()
                                ? domain->first.size()
                                : strlen(domain->first.name());
  
      if( domain->first.is_numeric )
        {
        if( strlen(ach) > sizeof(ach) - 1000  )
          {
!         cbl_internal_error("Nice try, but you cannot fire me.");
          }
  
!       // We are working with unquoted strings that contain the values 1 through
!       // 256:
!       value1 = (uint8_t)atoi(domain->first.name());
!       value2 = (uint8_t)atoi(domain->last.name());
        if( value2 < value1 )
          {
          std::swap(value1, value2);
          }
        if( value1 != value2  )
          {
!         p += sprintf(p, "-%2.2X/-%2.2X ", value1-1, value2-1);
          }
        else
          {
!         p += sprintf(p, "-%2.2X ", value1-1);
          }
        }
      else if( first_name_length == 1 )
        {
        // Since the first.name is a single character, we can do this as
        // a single-character pair.
!       uint8_t ch1;
!       uint8_t ch2;
! 
!       ch2 = domain->last.name()[0];
!       ch1 = domain->first.name()[0];
  
!       if( ch1 < ch2 )
!         {
!         value1 = ch1;
!         value2 = ch2;
!         }
!       else
          {
!         value2 = ch1;
!         value1 = ch2;
          }
!       if( value1 != value2  )
          {
!         p += sprintf(p, "%2.2X/%2.2X ", value1, value2);
          }
        else
          {
!         p += sprintf(p, "%2.2X ", value1);
          }
        }
      else
--- 582,647 ----
  
    while( domain->first.is_numeric || domain->first.name() )
      {
      size_t first_name_length = domain->first.size()
                                ? domain->first.size()
                                : strlen(domain->first.name());
  
+     cbl_encoding_t from = var->codeset.default_encodings.source->type;
+     cbl_encoding_t to = DEFAULT_32_ENCODING;
+     size_t nbytes;
+     const char *converted;
+ 
      if( domain->first.is_numeric )
        {
        if( strlen(ach) > sizeof(ach) - 1000  )
          {
!         cbl_internal_error("That string should not be that long.");
          }
  
!       // We are working with unquoted strings that contain the values
!       uint32_t value1 = atoll(domain->first.name());
!       uint32_t value2 = atoll(domain->last.name());
        if( value2 < value1 )
          {
          std::swap(value1, value2);
          }
        if( value1 != value2  )
          {
!         p += sprintf(p, "-%X/-%X ", value1, value2);
          }
        else
          {
!         p += sprintf(p, "-%X ", value1);
          }
        }
      else if( first_name_length == 1 )
        {
        // Since the first.name is a single character, we can do this as
        // a single-character pair.
!       converted = __gg__iconverter(from,
!                                    to,
!                                    domain->first.name(),
!                                    1,
!                                    &nbytes);
!       cbl_char_t ch1 = *reinterpret_cast<const cbl_char_t *>(converted);
!       converted = __gg__iconverter(from,
!                                    to,
!                                    domain->last.name(),
!                                    1,
!                                    &nbytes);
!       cbl_char_t ch2 = *reinterpret_cast<const cbl_char_t *>(converted);
  
!       if( ch1 > ch2 )
          {
!         std::swap(ch1, ch2);
          }
!       if( ch1 != ch2  )
          {
!         p += sprintf(p, "%X/%X ", ch1, ch2);
          }
        else
          {
!         p += sprintf(p, "%X ", ch1);
          }
        }
      else
*************** get_class_condition_string(cbl_field_t *
*** 675,681 ****
                                  // : strlen(domain->first.name());
        for(size_t i=0; i<first_name_length; i++)
          {
!         p += sprintf(p, "%2.2X ", (unsigned char)domain->first.name()[i]);
          }
        }
      domain += 1;
--- 655,667 ----
                                  // : strlen(domain->first.name());
        for(size_t i=0; i<first_name_length; i++)
          {
!         converted = __gg__iconverter(from,
!                                      to,
!                                      domain->first.name()+i,
!                                      1,
!                                      &nbytes);
!         cbl_char_t ch1 = *reinterpret_cast<const cbl_char_t *>(converted);
!         p += sprintf(p, "%X ", ch1);
          }
        }
      domain += 1;
*************** function_pointer_from_name(const cbl_ref
*** 863,871 ****
                         NULL); // And, hence, no types
  
      // Fetch the FUNCTION_DECL for that FUNCTION_TYPE
!     char *tname = static_cast<char *>(xmalloc(name.field->data.capacity+1));
!     memcpy(tname, name.field->data.original(), name.field->data.capacity);
!     tname[name.field->data.capacity] = '\0';
      tree function_decl = gg_build_fn_decl(tname,
                                            fndecl_type);
      free(tname);
--- 849,857 ----
                         NULL); // And, hence, no types
  
      // Fetch the FUNCTION_DECL for that FUNCTION_TYPE
!     char *tname = static_cast<char *>(xmalloc(name.field->data.capacity()+1));
!     memcpy(tname, name.field->data.original(), name.field->data.capacity());
!     tname[name.field->data.capacity()] = '\0';
      tree function_decl = gg_build_fn_decl(tname,
                                            fndecl_type);
      free(tname);
*************** initialize_variable_internal( cbl_refer_
*** 1210,1219 ****
                                bool explicitly=false,
                                bool just_once=false)
    {
-   // fprintf(stderr, "initialize_variable_internal for %s\n", refer.field->name);
-   // gg_printf("initialize_variable_internal for %s\n",
-             // gg_string_literal(refer.field->name),
-             // NULL_TREE);
    cbl_field_t *parsed_var = refer.field;
    if( !parsed_var )
      {
--- 1196,1201 ----
*************** initialize_variable_internal( cbl_refer_
*** 1245,1251 ****
        }
      while(0);
      SHOW_PARSE_REF(" ", refer);
!     if( parsed_var->data.initial )
        {
        SHOW_PARSE_TEXT(" >>")
        if( parsed_var->level == 88)
--- 1227,1233 ----
        }
      while(0);
      SHOW_PARSE_REF(" ", refer);
!     if( parsed_var->data.original() )
        {
        SHOW_PARSE_TEXT(" >>")
        if( parsed_var->level == 88)
*************** initialize_variable_internal( cbl_refer_
*** 1327,1333 ****
            case FldNumericEdited:
            case FldAlphaEdited:
            case FldLiteralA:
!             SHOW_PARSE_TEXT(parsed_var->data.initial);
              break;
            default:
              {
--- 1309,1315 ----
            case FldNumericEdited:
            case FldAlphaEdited:
            case FldLiteralA:
!             SHOW_PARSE_TEXT(parsed_var->data.original());
              break;
            default:
              {
*************** initialize_variable_internal( cbl_refer_
*** 1370,1376 ****
      is_redefined = true;
      }
  
!   if( parsed_var->data.initial )
      {
      bool a_parent_initialized = false;
      const cbl_field_t *parent = parent_of(parsed_var);
--- 1352,1358 ----
      is_redefined = true;
      }
  
!   if( parsed_var->data.original() )
      {
      bool a_parent_initialized = false;
      const cbl_field_t *parent = parent_of(parsed_var);
*************** initialize_variable_internal( cbl_refer_
*** 1407,1413 ****
    flag_bits     |= just_once ? JUST_ONCE_BIT : 0 ;
  
    suppress_dest_depends = false;  // Set this to false so that refer_is_clean is valid
-   //fprintf(stderr, "refer_is_clean %2.2d %s %d 0x%lx\n", refer.field->level, refer.field->name, refer_is_clean(refer), refer.field->attr);
  
    if( !refer_is_clean(refer) )
      {
--- 1389,1394 ----
*************** initialize_variable_internal( cbl_refer_
*** 1524,1530 ****
           || parsed_var->type == FldLiteralA )
          {
          gg_assign(spaces, integer_one_node);
!         tree counter = gg_define_int(parsed_var->data.capacity);
          WHILE(counter, gt_op, integer_zero_node)
            {
            gg_decrement(counter);
--- 1505,1511 ----
           || parsed_var->type == FldLiteralA )
          {
          gg_assign(spaces, integer_one_node);
!         tree counter = gg_define_int(parsed_var->data.capacity());
          WHILE(counter, gt_op, integer_zero_node)
            {
            gg_decrement(counter);
*************** initialize_variable_internal( cbl_refer_
*** 1556,1572 ****
    suppress_dest_depends = false;
    }
  
- //static void
- //initialize_variable_internal( cbl_field_t *field,
- //                              bool explicitly=false,
- //                              bool just_once=false)
- //  {
- //  cbl_refer_t wrapper(field);
- //  initialize_variable_internal( wrapper,
- //                                explicitly,
- //                                just_once);
- //  }
- 
  void
  parser_initialize(const cbl_refer_t& refer, bool like_parser_symbol_add)
    {
--- 1537,1542 ----
*************** parser_initialize(const cbl_refer_t& ref
*** 1577,1583 ****
      }
    else
      {
!     gcc_assert(refer.field->data.initial);
      static const bool explicitly = true;
      initialize_variable_internal(refer, explicitly);
      }
--- 1547,1553 ----
      }
    else
      {
!     gcc_assert(refer.field->data.original());
      static const bool explicitly = true;
      initialize_variable_internal(refer, explicitly);
      }
*************** get_binary_value_from_float(tree
*** 1592,1598 ****
    {
    // The destination is something with rdigits; the source is FldFloat
    tree ftype;
!   switch( source->data.capacity )
      {
      case 4:
        ftype = FLOAT;
--- 1562,1568 ----
    {
    // The destination is something with rdigits; the source is FldFloat
    tree ftype;
!   switch( source->data.capacity() )
      {
      case 4:
        ftype = FLOAT;
*************** get_bytes_needed(cbl_field_t *field)
*** 1722,1728 ****
      case FldPointer:
      case FldFloat:
      case FldLiteralN:
!       retval = field->data.capacity;
        break;
  
      case FldNumericDisplay:
--- 1692,1698 ----
      case FldPointer:
      case FldFloat:
      case FldLiteralN:
!       retval = field->data.capacity();
        break;
  
      case FldNumericDisplay:
*************** get_bytes_needed(cbl_field_t *field)
*** 1778,1784 ****
          }
        else
          {
!         retval = field->data.capacity;
          }
        break;
        }
--- 1748,1754 ----
          }
        else
          {
!         retval = field->data.capacity();
          }
        break;
        }
*************** cobol_compare(  tree return_int,
*** 2195,2201 ****
            // gg_string_literal(left_side_ref.field->name),
            // gg_string_literal(right_side_ref.field->name),
            // member(left_side_ref.field, "data"),
!           // gg_string_literal(right_side_ref.field->data.initial),
            // NULL_TREE);
  
    CHECK_FIELD(left_side_ref.field);
--- 2165,2171 ----
            // gg_string_literal(left_side_ref.field->name),
            // gg_string_literal(right_side_ref.field->name),
            // member(left_side_ref.field, "data"),
!           // gg_string_literal(right_side_ref.field->data.original()),
            // NULL_TREE);
  
    CHECK_FIELD(left_side_ref.field);
*************** cobol_compare(  tree return_int,
*** 2246,2273 ****
  
              case FldGroup:
              case FldAlphanumeric:
-             case FldLiteralA:
                {
!               // Comparing a FldLiteralN to an alphanumeric
! 
!               // This next conversion may be overkill.  But just in case
!               // the encodings of the two variables are different, we are
!               // going to convert left-side text to the right-side encoding
!               cbl_encoding_t enc_left  = lefty->field->codeset.encoding;
!               cbl_encoding_t enc_right = righty->field->codeset.encoding;
                size_t outlength;
!               size_t inlength = strlen(lefty->field->data.initial);
                char *converted = __gg__iconverter(
!                                          enc_left,
                                           enc_right,
!                                          lefty->field->data.initial,
!                                          inlength,
                                           &outlength );
                gg_assign(  return_int, gg_call_expr(
                            INT,
                            "__gg__literaln_alpha_compare",
!                     build_string_literal(strlen(lefty->field->data.initial)+1,
!                                          converted),
                            gg_get_address_of(righty->field->var_decl_node),
                            refer_offset(*righty),
                            refer_size_source(  *righty),
--- 2216,2240 ----
  
              case FldGroup:
              case FldAlphanumeric:
                {
!               // Comparing a FldLiteralN to an alphanumeric.  The alphanumeric
!               // is encoded in its codeset.encoding, but the FldLiteralN is,
!               // in accordance with the rules in cbl_field_t::internalize,
!               // encoded in the source-code encoding.  The routine we are about
!               // to call assumes that the literal string is encoded the same
!               // as the alphanumeric, so we have to make it match.
                size_t outlength;
!               cbl_encoding_t enc_right = righty->field->codeset.encoding;
                char *converted = __gg__iconverter(
!                                          DEFAULT_SOURCE_ENCODING,
                                           enc_right,
!                                          lefty->field->data.original(),
!                                          strlen(lefty->field->data.original()),
                                           &outlength );
                gg_assign(  return_int, gg_call_expr(
                            INT,
                            "__gg__literaln_alpha_compare",
!                           gg_string_literal(converted),
                            gg_get_address_of(righty->field->var_decl_node),
                            refer_offset(*righty),
                            refer_size_source(  *righty),
*************** cobol_compare(  tree return_int,
*** 2278,2283 ****
--- 2245,2264 ----
                break;
                }
  
+             case FldLiteralA:
+               {
+               // Comparing a FldLiteralN to an FldLiteralA.
+               // lefty->field->data.original() is the numeric string in ASCII.
+               // righty->field->data.original() is original alphanumeric
+               // string in ASCII.
+               int icmp = strcmp(lefty->field->data.original(),
+                                 righty->field->data.original());
+               gg_assign(return_int, build_int_cst_type(INT, icmp));
+               compared = true;
+               break;
+               }
+ 
+ 
              default:
                break;
              }
*************** cobol_compare(  tree return_int,
*** 2338,2343 ****
--- 2319,2325 ----
      int rightflags =   (right_side_ref.all         ? REFER_T_MOVE_ALL   : 0)
                      +  (right_side_ref.addr_of     ? REFER_T_ADDRESS_OF : 0)
                      +  (right_side_ref.refmod.from ? REFER_T_REFMOD     : 0);
+ 
      gg_assign(  return_int, gg_call_expr(
                  INT,
                  "__gg__compare",
*************** cobol_compare(  tree return_int,
*** 2355,2572 ****
      }
    }
  
- static void
- move_tree(  cbl_field_t  *dest,
-             tree          offset,
-             tree          psz_source, // psz_source is a null-terminated string
-             tree length_bump=integer_zero_node)
-   {
-   // This routine assumes that the psz_source is in the same codeset as the
-   // dest.
- 
-   Analyze();
-   SHOW_PARSE
-     {
-     SHOW_PARSE_HEADER
-     SHOW_PARSE_FIELD(" ", dest);
-     SHOW_PARSE_END
-     }
- 
-   CHECK_FIELD(dest);
- 
-   bool moved = true;
- 
-   tree source_length = gg_define_size_t();
-   gg_assign(source_length, gg_strlen(psz_source));
-   gg_assign(source_length, gg_add(source_length, gg_cast(SIZE_T, length_bump)));
- 
-   tree min_length = gg_define_size_t();
- 
-   tree location = gg_define_uchar_star();
-   tree length   = gg_define_size_t();
- 
-   gg_assign(location,
-             gg_add(member(dest->var_decl_node, "data"),
-                    offset));
-   gg_assign(length,
-             member(dest->var_decl_node, "capacity"));
- 
-   IF(source_length, lt_op, length)
-     {
-     gg_assign(min_length, source_length);
-     }
-   ELSE
-     {
-     gg_assign(min_length, length);
-     }
-   ENDIF
- 
-   tree value;
-   tree rdigits;
- 
-   switch( dest->type )
-     {
-     case FldGroup:
-     case FldAlphanumeric:
-       {
-       // Space out the alphanumeric destination:
-       charmap_t *charmap = __gg__get_charmap(dest->codeset.encoding);
- 
-       gg_memset(  location,
-                   build_int_cst_type(INT,
-                                      charmap->mapped_character(ascii_space)),
-                   length );
-       // Copy the alphanumeric result over.
-       gg_memcpy(  location,
-                   psz_source,
-                   min_length );
-       break;
-       }
- 
-     case FldNumericDisplay:
-     case FldNumericEdited:
-     case FldNumericBinary:
-     case FldNumericBin5:
-     case FldPacked:
-     case FldIndex:
-       {
-       value   = gg_define_int128();
-       rdigits = gg_define_int();
- 
-       gg_assign(value,
-                 gg_call_expr( INT128,
-                               "__gg__dirty_to_binary",
-                               psz_source,
-                               build_int_cst_type(INT, dest->codeset.encoding),
-                               source_length,
-                               gg_get_address_of(rdigits),
-                               NULL_TREE));
- 
-       gg_call(VOID,
-               "__gg__int128_to_qualified_field",
-               gg_get_address_of(dest->var_decl_node),
-               offset,
-               build_int_cst_type(SIZE_T, dest->data.capacity),
-               value,
-               rdigits,
-               build_int_cst_type(INT, truncation_e),
-               null_pointer_node,
-               NULL_TREE);
-       }
-     break;
- 
-     case FldAlphaEdited:
-       {
-       gg_call(VOID,
-               "__gg__string_to_alpha_edited",
-               location,
-               build_int_cst_type(INT, DEFAULT_SOURCE_ENCODING),
-               psz_source,
-               min_length,
-               member(dest->var_decl_node, "picture"),
-               NULL_TREE);
-       break;
-       }
- 
-     default:
-       moved = false;
-       break;
-     }
- 
-   TRACE1
-     {
-     TRACE1_HEADER
-     gg_fprintf(trace_handle, 1, "source: \"%s\"", psz_source);
-     TRACE1_END
-     TRACE1_INDENT
-     TRACE1_FIELD(               "dest  : ", dest, "")
-     TRACE1_END
-     }
- 
-   if( !moved )
-     {
-     dbgmsg("%10s in %s:%d", __func__, __FILE__, __LINE__ );
-     cbl_internal_error( "I don%'t know how to MOVE an alphabetical string to %s(%s)",
-                         cbl_field_type_str(dest->type),
-                         dest->name
-          );
-     return;
-     }
-   }
- 
- static void
- move_tree_to_field(cbl_field_t *field, tree psz)
-   {
-   // psz has to be in the same encoding as field
-   move_tree(field, integer_zero_node, psz);
-   }
- 
- static tree
- get_string_from(cbl_field_t *field)
-   {
-   // This returns a malloced copy of either a literal string or a
-   // an alphanumeric field.  The idea is that eventually free() will be
-   // called in the runtime space:
- 
-   tree psz = gg_define_char_star();
- 
-   if( field )
-     {
-     switch( field->type )
-       {
-       case FldLiteralA:
-         {
-         gg_assign(psz,
-                   gg_cast(CHAR_P,
-                           gg_malloc(build_int_cst_type(SIZE_T,
-                                                      field->data.capacity+1))));
-         const char *litstring = get_literal_string(field);
-         gg_memcpy(psz,
-                   gg_string_literal(litstring),
-                   build_int_cst_type(SIZE_T, field->data.capacity+1));
-         break;
-         }
- 
-       case FldGroup:
-       case FldAlphanumeric:
-         // make a copy of .data:
-         gg_assign(psz,
-                   gg_cast(CHAR_P,
-                           gg_malloc(build_int_cst_type(SIZE_T,
-                                                     field->data.capacity+1))));
-         gg_memcpy(  psz,
-                     member(field, "data"),
-                     member(field, "capacity"));
-         // null-terminate it:
-         gg_assign(  gg_array_value(psz, member(field, "capacity")),
-                     char_nodes[0]);
-         break;
- 
-       case FldForward:
-         {
-         // At the present time, we are assuming this happens when somebody
-         // specifies an unquoted file name in an ASSIGN statement:
-         //    SELECT file3 ASSIGN DISK.
-         //
-         // In that case, we just return DISK, which is field->name:
-         psz = gg_strdup(gg_string_literal(field->name));
-         break;
-         }
- 
-       default:
-         cbl_internal_error(
-                 "%s: %<field->type%> %s must be literal or alphanumeric",
-                 __func__, cbl_field_type_str(field->type));
-       break;
-       }
-     }
-   else
-     {
-     gg_assign(psz, gg_cast(CHAR_P, null_pointer_node));
-     }
-   return psz;
-   }
- 
  static char *
  combined_name(const cbl_label_t *label)
    {
--- 2337,2342 ----
*************** parser_init_list()
*** 4165,4171 ****
    gg_call(VOID,
            "__gg__variables_to_init",
            gg_get_address_of(array),
!           wsclear() ? build_string_literal(1, (const char *)wsclear())
                      : null_pointer_node,
            NULL_TREE);
    }
--- 3935,3943 ----
    gg_call(VOID,
            "__gg__variables_to_init",
            gg_get_address_of(array),
!           wsclear() ? build_string_literal(
!                                     1, 
!                                     reinterpret_cast<const char *>(wsclear()))
                      : null_pointer_node,
            NULL_TREE);
    }
*************** psa_FldLiteralN(struct cbl_field_t *fiel
*** 4345,4358 ****
    uint32_t digits;
    int32_t  rdigits;
    uint64_t attr;
!   FIXED_WIDE_INT(128) value = dirty_to_binary(field->data.original(),
                                                capacity,
                                                digits,
                                                rdigits,
                                                attr);
    // This is a rare occurrence of a parser_xxx call changing the entry
    // in the symbol table.
!   field->data.capacity = capacity;
    field->data.digits   = digits;
    field->data.rdigits  = rdigits;
    field->attr         |= attr;
--- 4117,4134 ----
    uint32_t digits;
    int32_t  rdigits;
    uint64_t attr;
!   //// DUBNERHACK.  Necessary to prevent UAT lockup:
!   const char *source_text = field->data.original()
!                           ? field->data.original()
!                           : field->data.initial;
!   FIXED_WIDE_INT(128) value = dirty_to_binary(source_text,
                                                capacity,
                                                digits,
                                                rdigits,
                                                attr);
    // This is a rare occurrence of a parser_xxx call changing the entry
    // in the symbol table.
!   field->data.capacity(  capacity );
    field->data.digits   = digits;
    field->data.rdigits  = rdigits;
    field->attr         |= attr;
*************** psa_FldLiteralN(struct cbl_field_t *fiel
*** 4370,4376 ****
  
    // The value is 1, 2, 4, 8 or 16 bytes, so an ordinary constructor can be
    // used.
!   var_type = tree_type_from_size( field->data.capacity,
                                    field->attr & signable_e);
    tree new_var_decl = gg_define_variable( var_type,
                                            base_name,
--- 4146,4152 ----
  
    // The value is 1, 2, 4, 8 or 16 bytes, so an ordinary constructor can be
    // used.
!   var_type = tree_type_from_size( field->data.capacity(),
                                    field->attr & signable_e);
    tree new_var_decl = gg_define_variable( var_type,
                                            base_name,
*************** parser_accept_date_yymmdd( struct cbl_fi
*** 4914,4929 ****
  
    CHECK_FIELD(target);
  
!   tree pointer = gg_define_char_star();
!   gg_assign(pointer, gg_call_expr(CHAR_P,
!                                   "__gg__get_date_yymmdd",
!                                   gg_get_address_of(target->var_decl_node),
!                                   NULL_TREE));
!   move_tree_to_field( target,
!                       pointer);
! 
!   gg_free(pointer);
! 
    TRACE1
      {
      TRACE1_HEADER
--- 4690,4699 ----
  
    CHECK_FIELD(target);
  
!   gg_call(VOID,
!           "__gg__get_date_yymmdd",
!           gg_get_address_of(target->var_decl_node),
!           NULL_TREE);
    TRACE1
      {
      TRACE1_HEADER
*************** parser_accept_date_yyyymmdd( struct cbl_
*** 4941,4959 ****
      SHOW_PARSE_HEADER
      SHOW_PARSE_END
      }
! 
!   CHECK_FIELD(target);
! 
!   tree pointer = gg_define_char_star();
!   gg_assign(pointer, gg_call_expr(CHAR_P,
!                                   "__gg__get_date_yyyymmdd",
!                                   gg_get_address_of(target->var_decl_node),
!                                   NULL_TREE));
!   move_tree_to_field( target,
!                       pointer);
! 
!   gg_free(pointer);
! 
    TRACE1
      {
      TRACE1_HEADER
--- 4711,4720 ----
      SHOW_PARSE_HEADER
      SHOW_PARSE_END
      }
!   gg_call(VOID,
!           "__gg__get_date_yyyymmdd",
!           gg_get_address_of(target->var_decl_node),
!           NULL_TREE);
    TRACE1
      {
      TRACE1_HEADER
*************** parser_accept_date_yyddd( struct cbl_fie
*** 4974,4989 ****
  
    CHECK_FIELD(target);
  
!   tree pointer = gg_define_char_star();
!   gg_assign(pointer, gg_call_expr(CHAR_P,
!                                   "__gg__get_date_yyddd",
!                                   gg_get_address_of(target->var_decl_node),
!                                   NULL_TREE));
!   move_tree_to_field( target,
!                       pointer);
! 
!   gg_free(pointer);
! 
    TRACE1
      {
      TRACE1_HEADER
--- 4735,4744 ----
  
    CHECK_FIELD(target);
  
!   gg_call(VOID,
!           "__gg__get_date_yyddd",
!           gg_get_address_of(target->var_decl_node),
!           NULL_TREE);
    TRACE1
      {
      TRACE1_HEADER
*************** parser_accept_date_yyyyddd( struct cbl_f
*** 5004,5019 ****
  
    CHECK_FIELD(target);
  
!   tree pointer = gg_define_char_star();
!   gg_assign(pointer, gg_call_expr(CHAR_P,
!                                   "__gg__get_yyyyddd",
!                                   gg_get_address_of(target->var_decl_node),
!                                   NULL_TREE));
!   move_tree_to_field( target,
!                       pointer);
! 
!   gg_free(pointer);
! 
    TRACE1
      {
      TRACE1_HEADER
--- 4759,4768 ----
  
    CHECK_FIELD(target);
  
!   gg_call(VOID,
!           "__gg__get_yyyyddd",
!           gg_get_address_of(target->var_decl_node),
!           NULL_TREE);
    TRACE1
      {
      TRACE1_HEADER
*************** parser_accept_date_dow( struct cbl_field
*** 5034,5049 ****
  
    CHECK_FIELD(target);
  
!   tree pointer = gg_define_char_star();
!   gg_assign(pointer, gg_call_expr(CHAR_P,
!                                   "__gg__get_date_dow",
!                                   gg_get_address_of(target->var_decl_node),
!                                   NULL_TREE));
!   move_tree_to_field( target,
!                       pointer);
! 
!   gg_free(pointer);
! 
    TRACE1
      {
      TRACE1_HEADER
--- 4783,4792 ----
  
    CHECK_FIELD(target);
  
!   gg_call(VOID,
!           "__gg__get_date_dow",
!           gg_get_address_of(target->var_decl_node),
!           NULL_TREE);
    TRACE1
      {
      TRACE1_HEADER
*************** parser_accept_date_hhmmssff( struct cbl_
*** 5064,5079 ****
  
    CHECK_FIELD(target);
  
!   tree pointer = gg_define_char_star();
!   gg_assign(pointer, gg_call_expr(CHAR_P,
!                                   "__gg__get_date_hhmmssff",
!                                   gg_get_address_of(target->var_decl_node),
!                                   NULL_TREE));
!   move_tree_to_field( target,
!                       pointer);
! 
!   gg_free(pointer);
! 
    TRACE1
      {
      TRACE1_HEADER
--- 4807,4816 ----
  
    CHECK_FIELD(target);
  
!   gg_call(VOID,
!           "__gg__get_date_hhmmssff",
!           gg_get_address_of(target->var_decl_node),
!           NULL_TREE);
    TRACE1
      {
      TRACE1_HEADER
*************** parser_alphabet( const cbl_alphabet_t& a
*** 5144,5151 ****
  
      case custom_encoding_e:
        {
! #pragma message "Verify program-id is disambiguated"
!       size_t alphabet_index = symbol_unique_index(symbol_elem_of(&alphabet));
  
        unsigned char ach[256];
  
--- 4881,4887 ----
  
      case custom_encoding_e:
        {
!       uint64_t alphabet_index = symbol_unique_index(symbol_elem_of(&alphabet));
  
        unsigned char ach[256];
  
*************** parser_alphabet_use( cbl_alphabet_t& alp
*** 5224,5230 ****
      SHOW_PARSE_END
      }
  
!   size_t alphabet_index = symbol_index(symbol_elem_of(&alphabet));
  
    switch(alphabet.encoding)
      {
--- 4960,4966 ----
      SHOW_PARSE_END
      }
  
!   uint64_t alphabet_index = symbol_unique_index(symbol_elem_of(&alphabet));
  
    switch(alphabet.encoding)
      {
*************** parser_display_internal(tree file_descri
*** 5316,5333 ****
        ENDIF
        }
      }
-   else if( refer.field->type == FldLiteralA )
-     {
-     gg_call(VOID,
-             "__gg__display_string",
-             file_descriptor,
-             build_int_cst_type(INT, refer.field->codeset.encoding),
-             build_string_literal(refer.field->data.capacity,
-                                  refer.field->data.initial),
-             build_int_cst_type(SIZE_T, refer.field->data.capacity),
-             advance ? integer_one_node : integer_zero_node,
-             NULL_TREE );
-     }
    else if( refer.field->type == FldLiteralN )
      {
      // The parser found the string of digits from the source code and converted
--- 5052,5057 ----
*************** parser_display_internal(tree file_descri
*** 5421,5426 ****
--- 5145,5178 ----
                   integer_one_node);
        }
      }
+   else if(    refer.field->type == FldFloat
+            && refer.field->attr & constant_e
+            && !(refer.field->attr & intermediate_e) )
+     {
+     // We are going to output what we think the user typed in the first place
+     char * const to_print = xstrdup(refer.field->data.original());
+     char *p = to_print;
+     if( *p == ascii_plus )
+       {
+       p += 1;
+       }
+     size_t len = strlen(p);
+     if(len > 2 && p[len-2] == ascii_E && p[len-1] == ascii_0 )
+       {
+       len -= 2;
+       }
+     gg_write(  file_descriptor,
+                build_string_literal(len, p),
+                build_int_cst_type(SIZE_T, len));
+     free(to_print);
+ 
+     if( advance )
+       {
+       gg_write(  file_descriptor,
+                  gg_string_literal("\n"),
+                  integer_one_node);
+       }
+     }
    else
      {
      if( refer_is_clean(refer) )
*************** get_literalN_value(cbl_field_t *var)
*** 5751,5757 ****
    {
    // Get the literal N value from the integer var_decl
    tree retval = NULL_TREE;
!   tree var_type = tree_type_from_size(var->data.capacity,
                                        var->attr & signable_e);
    retval = gg_cast(var_type, var->data_decl_node);
    return retval;
--- 5503,5509 ----
    {
    // Get the literal N value from the integer var_decl
    tree retval = NULL_TREE;
!   tree var_type = tree_type_from_size(var->data.capacity(),
                                        var->attr & signable_e);
    retval = gg_cast(var_type, var->data_decl_node);
    return retval;
*************** tree_type_from_field_type(cbl_field_t *f
*** 6400,6406 ****
        case FldAlphaEdited:
        case FldNumericEdited:
          retval = CHAR_P;
!         nbytes = field->data.capacity;
          break;
  
        case FldNumericDisplay:
--- 6152,6158 ----
        case FldAlphaEdited:
        case FldNumericEdited:
          retval = CHAR_P;
!         nbytes = field->data.capacity();
          break;
  
        case FldNumericDisplay:
*************** tree_type_from_field_type(cbl_field_t *f
*** 6421,6427 ****
        case FldNumericBin5:
        case FldIndex:
        case FldPointer:
!         if( field->data.capacity > 8 )
            {
            retval = UINT128;
            nbytes = 16;
--- 6173,6179 ----
        case FldNumericBin5:
        case FldIndex:
        case FldPointer:
!         if( field->data.capacity() > 8 )
            {
            retval = UINT128;
            nbytes = 16;
*************** tree_type_from_field_type(cbl_field_t *f
*** 6434,6445 ****
          break;
  
        case FldFloat:
!         if( field->data.capacity == 8 )
            {
            retval = DOUBLE;
            nbytes = 8;
            }
!         else if( field->data.capacity == 4 )
            {
            retval = FLOAT;
            nbytes = 4;
--- 6186,6197 ----
          break;
  
        case FldFloat:
!         if( field->data.capacity() == 8 )
            {
            retval = DOUBLE;
            nbytes = 8;
            }
!         else if( field->data.capacity() == 4 )
            {
            retval = FLOAT;
            nbytes = 4;
*************** program_end_stuff(cbl_refer_t refer, ec_
*** 6595,6601 ****
          gg_memcpy(gg_get_address_of(retval),
                    member(returner, "data"),
                    build_int_cst_type( SIZE_T,
!                                       std::min(nbytes, (size_t)returner->data.capacity)));
          }
        else
          {
--- 6347,6353 ----
          gg_memcpy(gg_get_address_of(retval),
                    member(returner, "data"),
                    build_int_cst_type( SIZE_T,
!                                       std::min(nbytes, (size_t)returner->data.capacity())));
          }
        else
          {
*************** program_end_stuff(cbl_refer_t refer, ec_
*** 6622,6628 ****
        // error of returning a pointer to data on the stack.
  
        tree array_type = build_array_type_nelts(UCHAR,
!                                     returner->data.capacity);
        tree array     =  gg_define_variable(array_type, vs_static);
        gg_memcpy(gg_get_address_of(array),
                  member(returner->var_decl_node, "data"),
--- 6374,6380 ----
        // error of returning a pointer to data on the stack.
  
        tree array_type = build_array_type_nelts(UCHAR,
!                                     returner->data.capacity());
        tree array     =  gg_define_variable(array_type, vs_static);
        gg_memcpy(gg_get_address_of(array),
                  member(returner->var_decl_node, "data"),
*************** walk_initialization(cbl_field_t *field,
*** 6778,6784 ****
              {
              gg_memset(member(this_one->var_decl_node, "data"),
                     integer_zero_node,
!                    build_int_cst_type(SIZE_T, this_one->data.capacity));
              }
            }
          }
--- 6530,6536 ----
              {
              gg_memset(member(this_one->var_decl_node, "data"),
                     integer_zero_node,
!                    build_int_cst_type(SIZE_T, this_one->data.capacity()));
              }
            }
          }
*************** parser_xml_parse( cbl_label_t *instance,
*** 6941,6951 ****
            current_function->our_name,
            instance_counter++);
  
!   cbl_field_t for_entry = {};
!   for_entry.type = FldAlphanumeric;
!   for_entry.data.capacity = strlen(ach);
!   for_entry.data.initial = ach;
!   for_entry.codeset.encoding = iconv_CP1252_e;
  
    // build an island for the callback:
    tree island_goto;
--- 6693,6701 ----
            current_function->our_name,
            instance_counter++);
  
!   cbl_field_data_t data( 0, strlen(ach), 0,0, ach );
!   cbl_field_t for_entry(FldAlphanumeric, 0, data, 0);
!   for_entry.codeset.set(iconv_CP1252_e);
  
    // build an island for the callback:
    tree island_goto;
*************** initialize_the_data()
*** 7211,7216 ****
--- 6961,6980 ----
              "__gg__decimal_point_is_comma",
              NULL_TREE);
      }
+ 
+   // This is where we tell the library about this program's initialization
+   // values:
+   cbl_field_t *init_working = current_options().initial_working();
+   cbl_field_t *init_local   = current_options().initial_local();
+   gg_call(VOID,
+           "__gg__initialization_values",
+           build_int_cst_type(UINT, wsclear() ? *wsclear()
+                                     : static_cast<uint32_t>(NOT_A_CHARACTER)),
+           init_working ? gg_get_address_of(init_working->var_decl_node)
+                        : null_pointer_node,
+           init_local   ? gg_get_address_of(init_local->var_decl_node)
+                        : null_pointer_node,
+           NULL_TREE);
    }
  
  static
*************** establish_using(size_t nusing,
*** 7423,7429 ****
                    gg_get_address_of(base),
                    build_int_cst_type(SIZE_T, nbytes));
  
!         tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity);
          tree data_decl_node = gg_define_variable( array_type,
                                                    NULL,
                                                    vs_static);
--- 7187,7193 ----
                    gg_get_address_of(base),
                    build_int_cst_type(SIZE_T, nbytes));
  
!         tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity());
          tree data_decl_node = gg_define_variable( array_type,
                                                    NULL,
                                                    vs_static);
*************** parser_setop( struct cbl_field_t *tgt,
*** 8309,8316 ****
      }
  
    gcc_assert(tgt->type == FldConditional);
-   gcc_assert(domain->data.initial);
-   gcc_assert(strlen(domain->data.initial));
  
    switch(op)
      {
--- 8073,8078 ----
*************** parser_setop( struct cbl_field_t *tgt,
*** 8322,8332 ****
            gg_assign(tgt->var_decl_node, gg_build_relational_expression(
                        gg_call_expr(INT,
                                     "__gg__setop_compare",
!                                    member(candidate, "data"),
!                                    member(candidate, "capacity"),
                                     member(domain, "initial"),
-                                    build_int_cst_type(INT,
-                                                      domain->codeset.encoding),
                                     NULL_TREE),
                        ne_op,
                        integer_zero_node));
--- 8084,8091 ----
            gg_assign(tgt->var_decl_node, gg_build_relational_expression(
                        gg_call_expr(INT,
                                     "__gg__setop_compare",
!                                    gg_get_address_of(candidate->var_decl_node),
                                     member(domain, "initial"),
                                     NULL_TREE),
                        ne_op,
                        integer_zero_node));
*************** parser_set_conditional88( const cbl_refe
*** 9689,9711 ****
      {
      // We are dealing with an ordinary string.
  
!     // When Jim gets around to converting the domain to the target encoding,
!     // this code will have to be removed
! #if 1
!     char *fname = xstrdup(src->first.name());
!     charmap_t *charmap = __gg__get_charmap(tgt->codeset.encoding);
!     for(size_t i=0; i<strlen(fname); i++)
!       {
!       fname[i] = charmap->mapped_character(fname[i]);
!       }
!     move_tree_to_field( parent,
!                         build_string_literal(strlen(fname)+1, fname));
!     free(fname);
! #else
!     move_tree_to_field( parent,
!                         build_string_literal(src->first.size()+1,
!                                              src->first.name()));
! #endif
      }
    else
      {
--- 9448,9467 ----
      {
      // We are dealing with an ordinary string.
  
!     size_t converted_bytes;
!     const char *converted =
!                   __gg__iconverter(parent->codeset.default_encodings.source->type,
!                                    parent->codeset.encoding,
!                                    src->first.name(),
!                                    strlen(src->first.name())+1,
!                                    &converted_bytes);
!     gg_call(VOID,
!             "__gg__refer_from_string",
!             gg_get_address_of(parent->var_decl_node),
!             size_t_zero_node,
!             build_int_cst_type(SIZE_T, parent->data.capacity()),
!             build_string_literal(converted_bytes, converted),
!             NULL_TREE);
      }
    else
      {
*************** parser_file_add(struct cbl_file_t *file)
*** 9899,9912 ****
            __func__);
      }
  
! #pragma message "Verify program-id is disambiguated"
!   size_t symbol_table_index = symbol_unique_index(symbol_elem_of(file));
  
    gg_call(VOID,
            "__gg__file_init",
            gg_get_address_of(new_var_decl),
            gg_string_literal(file->name),
!           build_int_cst_type(SIZE_T, symbol_table_index),
            array_of_keys,
            key_numbers,
            unique_flags,
--- 9655,9691 ----
            __func__);
      }
  
!   // This code is a hack needed until the parser sets the varies.min/max
!   // properly when they are not equal:
!   if(    varies.min != varies.max
!       && current_encoding(display_encoding_e) == iconv_UTF16LE_e
!       && varies.max == symbol_file_record(file)->data.capacity() )
!     {
!     fprintf(stderr,
!         "There is a hack in genapi.cc to take into account a parser error,\n"
!         "namely the fact that when there is a RECORD VARYING clause, the\n"
!         "min/max values reflect the values in the source code, while when\n"
!         "there is no VARYING clause the min/max values are the same as the\n"
!         "default_record's data.capacity().  If you are seeing this message,\n"
!         "it would appear the parser has been updated to supply the stride-\n"
!         "corrected min/max, and the hack should be removed.\n");
!     gcc_assert(false);
!     }
!   if( varies.max < symbol_file_record(file)->data.capacity())
!     {
!     const charmap_t *charmap = 
!                      __gg__get_charmap(current_encoding(display_encoding_e));
!     varies.min *= charmap->stride();
!     varies.max *= charmap->stride();
!     }
! 
!   uint64_t symbol_table_index = symbol_unique_index(symbol_elem_of(file));
  
    gg_call(VOID,
            "__gg__file_init",
            gg_get_address_of(new_var_decl),
            gg_string_literal(file->name),
!           build_int_cst_type(ULONGLONG, symbol_table_index),
            array_of_keys,
            key_numbers,
            unique_flags,
*************** parser_file_add(struct cbl_file_t *file)
*** 9923,9930 ****
            build_int_cst_type(INT, (int)file->optional),
            build_int_cst_type(SIZE_T, varies.min),
            build_int_cst_type(SIZE_T, varies.max),
! /*  Right now, file->codeset.encoding is not being set properly.  Remove this
!     comment and fix the following code when that's repaired.  */
  //          build_int_cst_type(INT, (int)file->codeset.encoding),
            build_int_cst_type(INT, current_encoding(display_encoding_e)),
            build_int_cst_type(INT, (int)file->codeset.alphabet),
--- 9702,9713 ----
            build_int_cst_type(INT, (int)file->optional),
            build_int_cst_type(SIZE_T, varies.min),
            build_int_cst_type(SIZE_T, varies.max),
! /*  Right now, file->codeset.encoding is not being set properly.  For example,
!     when the exec-charset is EBCDIC, file->codeset is coming through as CP1252.
!     However, when exec-charset is UTF32LE, file->codeset is arriving here as
!     UTF32LE.  Go figure.
! 
!     Remove this comment and fix the following code when that's repaired.  */
  //          build_int_cst_type(INT, (int)file->codeset.encoding),
            build_int_cst_type(INT, current_encoding(display_encoding_e)),
            build_int_cst_type(INT, (int)file->codeset.alphabet),
*************** parser_file_open( size_t nfiles, struct
*** 9942,9985 ****
      }
    }
  
- static
- tree get_the_filename(bool &quoted_name, const cbl_file_t *file)
-   {
-   // The cbl_file_t has a cbl_field_t *filename.  This can be a FldAlphanumeric.
-   // The runtime has a (char *)filename, so we need to
-   // do a runtime conversion.
- 
-   tree psz;   // This is going to be either the name of the file, or the
-   // possible run-time environment variable that will contain
-   // the name of the file.
- 
-   cbl_field_t *field_of_name = symbol_field_forward(file->filename);
-   quoted_name = false;
-   if( field_of_name->type == FldForward )
-     {
-     // The target of ASSIGN TO was unquoted, but didn't resolve to a
-     // cbl_field_t.  This means that the name of the field is an
-     // environment variable that will hold the file name
-     psz = gg_define_char_star();
-     gg_assign(psz, gg_strdup(gg_string_literal(field_of_name->name)));
-     }
-   else
-     {
-     // The name is coming from a presumably FldAlphaNumeric variable
-     psz = get_string_from(field_of_name);
-     gg_call( CHAR_P,
-              "__gg__convert_encoding",
-              psz,
-              build_int_cst_type(INT,
-                                 field_of_name->codeset.encoding),
-              build_int_cst_type(INT,
-                                 DEFAULT_SOURCE_ENCODING),
-              NULL_TREE);
-     quoted_name = true;
-     }
-   return psz;
-   }
- 
  void
  parser_file_open( struct cbl_file_t *file, int mode_char )
    {
--- 9725,9730 ----
*************** parser_file_open( struct cbl_file_t *fil
*** 10032,10048 ****
      TRACE1_END
      }
  
!   bool quoted_name;
!   tree pszFilename = get_the_filename(quoted_name, file);
  
    sv_is_i_o = true;
    store_location_stuff("OPEN");
    gg_call(VOID,
            "__gg__file_open",
            gg_get_address_of(file->var_decl_node),
            pszFilename,
            build_int_cst_type(INT, mode_char),
-           quoted_name ? integer_one_node : integer_zero_node,
            NULL_TREE);
    set_user_status(file);
    }
--- 9777,9806 ----
      TRACE1_END
      }
  
!   tree pszFilename = gg_define_char_star();
!   cbl_field_t *field_of_name = symbol_field_forward(file->filename);
!   if( field_of_name->type == FldForward )
!     {
!     // The target of ASSIGN TO was unquoted, but didn't resolve to a
!     // cbl_field_t.  This means that the name of the field is an
!     // environment variable that will hold the file name
!     gg_assign(pszFilename, gg_strdup(gg_string_literal(field_of_name->name)));
!     }
!   else
!     {
!     gg_assign(pszFilename, gg_cast(CHAR_P, null_pointer_node));
!     }
  
    sv_is_i_o = true;
    store_location_stuff("OPEN");
    gg_call(VOID,
            "__gg__file_open",
            gg_get_address_of(file->var_decl_node),
+           field_of_name->var_decl_node
+                   ? gg_get_address_of(field_of_name->var_decl_node)
+                   : null_pointer_node,
            pszFilename,
            build_int_cst_type(INT, mode_char),
            NULL_TREE);
    set_user_status(file);
    }
*************** parser_file_delete_file( cbl_label_t *na
*** 10450,10465 ****
    tree there_was_an_error = gg_define_int(0);
    for(size_t i=0; i<filenames.size(); i++)
      {
!     bool quoted_name;
!     tree pszFilename = get_the_filename(quoted_name, filenames[i]);
      gg_assign(there_was_an_error,
                gg_bitwise_or(there_was_an_error,
                              gg_call_expr(
                              INT,
                              "__gg__file_remove",
                              gg_get_address_of(filenames[i]->var_decl_node),
                              pszFilename,
-                             quoted_name ? integer_one_node : integer_zero_node,
                              NULL_TREE)));
      set_user_status(filenames[i]);
      }
--- 10208,10237 ----
    tree there_was_an_error = gg_define_int(0);
    for(size_t i=0; i<filenames.size(); i++)
      {
!     tree pszFilename = gg_define_char_star();
!     cbl_field_t *field_of_name = symbol_field_forward(filenames[i]->filename);
!     if( field_of_name->type == FldForward )
!       {
!       // The target of ASSIGN TO was unquoted, but didn't resolve to a
!       // cbl_field_t.  This means that the name of the field is an
!       // environment variable that will hold the file name
!       gg_assign(pszFilename,
!                 gg_strdup(gg_string_literal(field_of_name->name)));
!       }
!     else
!       {
!       gg_assign(pszFilename, gg_cast(CHAR_P, null_pointer_node));
!       }
      gg_assign(there_was_an_error,
                gg_bitwise_or(there_was_an_error,
                              gg_call_expr(
                              INT,
                              "__gg__file_remove",
                              gg_get_address_of(filenames[i]->var_decl_node),
+                             field_of_name->var_decl_node
+                               ? gg_get_address_of(field_of_name->var_decl_node)
+                               : null_pointer_node,
                              pszFilename,
                              NULL_TREE)));
      set_user_status(filenames[i]);
      }
*************** parser_file_start(struct cbl_file_t *fil
*** 10653,10659 ****
        {
        size_t nfield = file->keys[key_number].fields[ifield];
        cbl_field_t *field = cbl_field_of(symbol_at(nfield));
!       combined_length += field->data.capacity;
        }
      gg_assign(length, build_int_cst_type(SIZE_T, combined_length));
      }
--- 10425,10431 ----
        {
        size_t nfield = file->keys[key_number].fields[ifield];
        cbl_field_t *field = cbl_field_of(symbol_at(nfield));
!       combined_length += field->data.capacity();
        }
      gg_assign(length, build_int_cst_type(SIZE_T, combined_length));
      }
*************** parser_inspect_conv(cbl_refer_t input,
*** 11151,11156 ****
--- 10923,10982 ----
    }
  
  void
+ parser_intrinsic_find_string(cbl_field_t *tgt,
+                              const cbl_refer_t& haystack,
+                              const cbl_refer_t& needle,
+                              const cbl_refer_t *after,
+                              bool last,
+                              bool anycase)
+   {
+   SHOW_PARSE
+     {
+     SHOW_PARSE_HEADER
+     SHOW_PARSE_END
+     }
+   gg_call(VOID,
+           "__gg__find_string",
+           gg_get_address_of( tgt->var_decl_node),
+           gg_get_address_of( haystack.field->var_decl_node),
+           refer_offset(      haystack),
+           refer_size_source( haystack),
+           gg_get_address_of( needle.field->var_decl_node),
+           refer_offset(      needle),
+           refer_size_source( needle),
+           after ? gg_get_address_of( after->field->var_decl_node)
+                 : null_pointer_node,
+           after ? refer_offset(*after) : size_t_zero_node,
+           after ? refer_size_source(*after) : size_t_zero_node,
+           last   ?integer_one_node:integer_zero_node,
+           anycase?integer_one_node:integer_zero_node,
+           NULL_TREE
+           );
+   }
+ 
+ void
+ parser_intrinsic_convert(cbl_field_t *tgt,
+                          const cbl_refer_t& input,
+                          convert_type_t src_fmt,
+                          unsigned int   dst_fmt )
+   {
+   SHOW_PARSE
+     {
+     SHOW_PARSE_HEADER
+     SHOW_PARSE_END
+     }
+   gg_call(VOID,
+           "__gg__convert",
+           gg_get_address_of(tgt->var_decl_node),
+           gg_get_address_of(input.field->var_decl_node),
+           refer_offset(input),
+           refer_size_source(input),
+           build_int_cst_type(INT, src_fmt),
+           build_int_cst_type(INT, dst_fmt),
+           NULL_TREE);
+   }
+ 
+ void
  parser_module_name( cbl_field_t *tgt, module_type_t type )
    {
    SHOW_PARSE
*************** parser_intrinsic_call_1( cbl_field_t *tg
*** 11428,11433 ****
--- 11254,11296 ----
        TRACE1_INDENT
        TRACE1_REFER("parameter: ", ref1, "")
        }
+ 
+     const charmap_t *charmap = __gg__get_charmap(ref1.field->codeset.encoding);
+     tree stride = gg_cast(LONG, integer_one_node);
+ 
+     switch(ref1.field->type)
+       {
+       case FldInvalid:
+       case FldGroup:
+       case FldAlphanumeric:
+       case FldNumericDisplay:
+       case FldNumericEdited:
+       case FldAlphaEdited:
+       case FldLiteralA:
+         stride = build_int_cst_type(LONG, charmap->stride());
+         break;
+ 
+       case FldNumericBinary:
+       case FldFloat:
+       case FldPacked:
+       case FldNumericBin5:
+       case FldLiteralN:
+       case FldClass:
+       case FldConditional:
+       case FldForward:
+       case FldIndex:
+       case FldSwitch:
+       case FldDisplay:
+       case FldPointer:
+         stride = gg_cast(LONG, integer_one_node);
+         break;
+       }
+ 
+     if( ref1.field->attr & hex_encoded_e )
+       {
+       stride = gg_cast(LONG, integer_one_node);
+       }
+ 
      size_t upper = ref1.field->occurs.bounds.upper
                                      ? ref1.field->occurs.bounds.upper : 1;
      if( ref1.nsubscript() )
*************** parser_intrinsic_call_1( cbl_field_t *tg
*** 11443,11450 ****
                "__gg__int128_to_field",
                gg_get_address_of(tgt->var_decl_node),
                gg_cast(INT128,
!                       gg_multiply(refer_size_source(ref1),
!                                   depending_on)),
                integer_zero_node,
                build_int_cst_type(INT, truncation_e),
                null_pointer_node,
--- 11306,11314 ----
                "__gg__int128_to_field",
                gg_get_address_of(tgt->var_decl_node),
                gg_cast(INT128,
!                       gg_divide(gg_multiply(refer_size_source(ref1),
!                                             depending_on),
!                                 stride)),
                integer_zero_node,
                build_int_cst_type(INT, truncation_e),
                null_pointer_node,
*************** parser_intrinsic_call_1( cbl_field_t *tg
*** 11458,11464 ****
                  "__gg__int128_to_field",
                  gg_get_address_of(tgt->var_decl_node),
                  gg_cast(INT128,
!                         refer_size_source(ref1)),
                  integer_zero_node,
                  build_int_cst_type(INT, truncation_e),
                  null_pointer_node,
--- 11322,11329 ----
                  "__gg__int128_to_field",
                  gg_get_address_of(tgt->var_decl_node),
                  gg_cast(INT128,
!                         gg_divide(refer_size_source(ref1),
!                                   stride)),
                  integer_zero_node,
                  build_int_cst_type(INT, truncation_e),
                  null_pointer_node,
*************** parser_intrinsic_call_1( cbl_field_t *tg
*** 11470,11477 ****
                  "__gg__int128_to_field",
                  gg_get_address_of(tgt->var_decl_node),
                  gg_cast(INT128,
!                         gg_multiply(refer_size_source(ref1),
!                                     build_int_cst_type(SIZE_T, upper))),
                  integer_zero_node,
                  build_int_cst_type(INT, truncation_e),
                  null_pointer_node,
--- 11335,11343 ----
                  "__gg__int128_to_field",
                  gg_get_address_of(tgt->var_decl_node),
                  gg_cast(INT128,
!                         gg_divide(gg_multiply(refer_size_source(ref1),
!                                             build_int_cst_type(LONG, upper)),
!                                   stride)),
                  integer_zero_node,
                  build_int_cst_type(INT, truncation_e),
                  null_pointer_node,
*************** parser_intrinsic_call_1( cbl_field_t *tg
*** 11500,11505 ****
--- 11366,11376 ----
        TRACE1_INDENT
        TRACE1_REFER("parameter: ", ref1, "")
        }
+             gg_get_address_of(tgt->var_decl_node);
+             gg_get_address_of(ref1.field->var_decl_node);
+             refer_offset(ref1);
+             refer_size_source(ref1);
+ 
      gg_call(VOID,
              function_name,
              gg_get_address_of(tgt->var_decl_node),
*************** create_and_call(size_t narg,
*** 13309,13319 ****
          {
          crv = by_content_e;
          gg_assign(location,
!                   gg_cast(UCHAR_P, build_string_literal(args[i].refer.field->data.capacity,
!                                        args[i].refer.field->data.initial)));
          gg_assign(length,
                    build_int_cst_type( SIZE_T,
!                                       args[i].refer.field->data.capacity));
          }
        else
          {
--- 13180,13190 ----
          {
          crv = by_content_e;
          gg_assign(location,
!                   gg_cast(UCHAR_P, build_string_literal(args[i].refer.field->data.capacity(),
!                                        args[i].refer.field->data.original())));
          gg_assign(length,
                    build_int_cst_type( SIZE_T,
!                                       args[i].refer.field->data.capacity()));
          }
        else
          {
*************** create_and_call(size_t narg,
*** 13430,13442 ****
                {
                // All temporaries are SIZE_T
                if( args[i].refer.field->type == FldFloat
!                   && args[i].refer.field->data.capacity == 16 )
                  {
                  as_int128 = true;
                  }
                else if(   args[i].refer.field->type == FldNumericBin5
                        && args[i].refer.field->data.digits   == 0
!                       && args[i].refer.field->data.capacity == 16 )
                  {
                  as_int128 = true;
                  }
--- 13301,13313 ----
                {
                // All temporaries are SIZE_T
                if( args[i].refer.field->type == FldFloat
!                   && args[i].refer.field->data.capacity() == 16 )
                  {
                  as_int128 = true;
                  }
                else if(   args[i].refer.field->type == FldNumericBin5
                        && args[i].refer.field->data.digits   == 0
!                       && args[i].refer.field->data.capacity() == 16 )
                  {
                  as_int128 = true;
                  }
*************** create_and_call(size_t narg,
*** 13543,13588 ****
      // We expect the return value to be a 64-bit or 128-bit integer.  How
      // we treat that returned value depends on the target.
  
!     // Pick up that value:
      returned_value = gg_define_variable(returned_value_type);
      push_program_state();
      gg_assign(returned_value, gg_cast(returned_value_type, call_expr));
      pop_program_state();
  
      if( returned_value_type == CHAR_P )
        {
!       tree returned_location = gg_define_uchar_star();
!       tree returned_length   = gg_define_size_t();
!       // we were given a returned::field, so find its location and length:
!       gg_assign(returned_location,
!                 gg_add( member(returned.field->var_decl_node, "data"),
!                         refer_offset(returned)));
!       gg_assign(returned_length,
!                 gg_cast(TREE_TYPE(returned_length), refer_size_dest(returned)));
! 
!       // The returned value is a string of nbytes, which by specification
!       // has to be at least as long as the returned_length of the target:
!       IF( returned_value,
!           eq_op,
!           gg_cast(returned_value_type, null_pointer_node ) )
!         {
!         // Somebody was discourteous enough to return a NULL pointer
!         // We'll jam in spaces:
!         charmap_t *charmap = __gg__get_charmap(returned.field->codeset.encoding);
!         int dest_space = charmap->mapped_character(ascii_space);
!         gg_memset(  returned_location,
!                     char_nodes[(unsigned char)dest_space],
!                     returned_length );
!         }
!       ELSE
!         {
!         // There is a valid pointer.  Do the assignment.
!         move_tree(returned.field,
!                   refer_offset(returned),
!                   returned_value,
!                   integer_one_node);
!         }
!       ENDIF
        TRACE1
          {
          TRACE1_HEADER
--- 13414,13440 ----
      // We expect the return value to be a 64-bit or 128-bit integer.  How
      // we treat that returned value depends on the target.
  
!     // Create a variable of the type expected from the called function
      returned_value = gg_define_variable(returned_value_type);
+ 
+     // Actually call the function, assigning the returned value to that
+     // variable:
      push_program_state();
      gg_assign(returned_value, gg_cast(returned_value_type, call_expr));
      pop_program_state();
  
+     // Now we decided what to do with the returned value, based on its type.
      if( returned_value_type == CHAR_P )
        {
!       // Let the library do the assignment of the 'char *returned_value' to the
!       // target 'refer returned'
!       gg_call(VOID,
!               "__gg__refer_from_psz",
!               gg_get_address_of(returned.field->var_decl_node),
!               refer_offset(returned),
!               refer_size_dest(returned),
!               returned_value,
!               NULL_TREE);
        TRACE1
          {
          TRACE1_HEADER
*************** create_and_call(size_t narg,
*** 13643,13648 ****
--- 13495,13502 ----
        }
      else
        {
+       // Getting here should be impossible; it means we didn't anticipate
+       // the type of the returned value:
        cbl_internal_error(
              "%s: What in the name of Nero are we doing here?",
              __func__);
*************** mh_identical(const cbl_refer_t &destref,
*** 14716,14722 ****
    // for a simple byte-for-byte copy of the data areas:
    bool moved = false;
    if(     destref.field->type          == sourceref.field->type
!       &&  destref.field->data.capacity == sourceref.field->data.capacity
        &&  destref.field->data.digits   == sourceref.field->data.digits
        &&  destref.field->data.rdigits  == sourceref.field->data.rdigits
        &&       (destref.field->attr   & (signable_e|separate_e|leading_e))
--- 14570,14576 ----
    // for a simple byte-for-byte copy of the data areas:
    bool moved = false;
    if(     destref.field->type          == sourceref.field->type
!       &&  destref.field->data.capacity() == sourceref.field->data.capacity()
        &&  destref.field->data.digits   == sourceref.field->data.digits
        &&  destref.field->data.rdigits  == sourceref.field->data.rdigits
        &&       (destref.field->attr   & (signable_e|separate_e|leading_e))
*************** mh_identical(const cbl_refer_t &destref,
*** 14746,14752 ****
                         refer_offset(destref)),
                  gg_add(member(sourceref.field->var_decl_node, "data"),
                         tsource.offset),
!                 build_int_cst_type(SIZE_T, sourceref.field->data.capacity));
        moved = true;
        }
      }
--- 14600,14606 ----
                         refer_offset(destref)),
                  gg_add(member(sourceref.field->var_decl_node, "data"),
                         tsource.offset),
!                 build_int_cst_type(SIZE_T, sourceref.field->data.capacity()));
        moved = true;
        }
      }
*************** mh_source_is_literalN(cbl_refer_t &destr
*** 14776,14796 ****
            }
  
          // We need the data sent to __gg__psz_to_alpha_move to be in the
!         // encoding of the destination
  
          size_t charsout;
          const char *converted = __gg__iconverter(
!                                          sourceref.field->codeset.encoding,
                                           destref.field->codeset.encoding,
!                                          sourceref.field->data.initial,
!                                          strlen(sourceref.field->data.initial),
                                           &charsout);
          gg_call(VOID,
                  "__gg__psz_to_alpha_move",
                  gg_get_address_of(destref.field->var_decl_node),
                  refer_offset(destref),
                  refer_size_dest(destref),
!                 gg_string_literal(converted),
                  build_int_cst_type(SIZE_T, charsout),
                  NULL_TREE);
          moved = true;
--- 14630,14652 ----
            }
  
          // We need the data sent to __gg__psz_to_alpha_move to be in the
!         // encoding of the destination.  In accordance with the rules of
!         // cbl_field_t::internalize, the FldLiteralN is in source-code
!         // encoding, so we have to convert.
  
          size_t charsout;
          const char *converted = __gg__iconverter(
!                                          DEFAULT_SOURCE_ENCODING,
                                           destref.field->codeset.encoding,
!                                          sourceref.field->data.original(),
!                                          strlen(sourceref.field->data.original()),
                                           &charsout);
          gg_call(VOID,
                  "__gg__psz_to_alpha_move",
                  gg_get_address_of(destref.field->var_decl_node),
                  refer_offset(destref),
                  refer_size_dest(destref),
!                 build_string_literal(charsout, converted),
                  build_int_cst_type(SIZE_T, charsout),
                  NULL_TREE);
          moved = true;
*************** mh_source_is_literalN(cbl_refer_t &destr
*** 14807,14813 ****
            SHOW_PARSE_TEXT("mh_source_is_literalN: pointer/index")
            }
  
!         if( sourceref.field->data.capacity < 8 )
            {
            // There are too few bytes in sourceref
            if( sourceref.field->attr & signable_e )
--- 14663,14669 ----
            SHOW_PARSE_TEXT("mh_source_is_literalN: pointer/index")
            }
  
!         if( sourceref.field->data.capacity() < 8 )
            {
            // There are too few bytes in sourceref
            if( sourceref.field->attr & signable_e )
*************** mh_source_is_literalN(cbl_refer_t &destr
*** 14818,14824 ****
                        gg_get_indirect_reference(gg_add(member(sourceref.field->var_decl_node,
                                                                "data"),
                                                  build_int_cst_type(SIZE_T,
!                                                                    sourceref.field->data.capacity-1)),
                        integer_zero_node));
              IF( gg_bitwise_and(highbyte, build_int_cst_type(UCHAR, 0x80)),
                  eq_op,
--- 14674,14680 ----
                        gg_get_indirect_reference(gg_add(member(sourceref.field->var_decl_node,
                                                                "data"),
                                                  build_int_cst_type(SIZE_T,
!                                                                    sourceref.field->data.capacity()-1)),
                        integer_zero_node));
              IF( gg_bitwise_and(highbyte, build_int_cst_type(UCHAR, 0x80)),
                  eq_op,
*************** mh_source_is_literalN(cbl_refer_t &destr
*** 14852,14858 ****
          gg_memcpy(gg_add(member(destref.field->var_decl_node, "data"),
                                 refer_offset(destref)),
                    gg_get_address_of(literalN_value),
!                   build_int_cst_type(SIZE_T, sourceref.field->data.capacity));
          moved = true;
  
          break;
--- 14708,14714 ----
          gg_memcpy(gg_add(member(destref.field->var_decl_node, "data"),
                                 refer_offset(destref)),
                    gg_get_address_of(literalN_value),
!                   build_int_cst_type(SIZE_T, sourceref.field->data.capacity()));
          moved = true;
  
          break;
*************** mh_source_is_literalN(cbl_refer_t &destr
*** 14872,14882 ****
          // For now, we are ignoring intermediates:
          assert( !(destref.field->attr & intermediate_e) );
  
!         int bytes_needed = std::max(destref.field->data.capacity,
!                                     sourceref.field->data.capacity);
          tree calc_type = tree_type_from_size(bytes_needed,
                                              sourceref.field->attr & signable_e);
!         tree dest_type = tree_type_from_size( destref.field->data.capacity,
                                                destref.field->attr & signable_e);
  
          // Pick up the source data.
--- 14728,14738 ----
          // For now, we are ignoring intermediates:
          assert( !(destref.field->attr & intermediate_e) );
  
!         int bytes_needed = std::max(destref.field->data.capacity(),
!                                     sourceref.field->data.capacity());
          tree calc_type = tree_type_from_size(bytes_needed,
                                              sourceref.field->attr & signable_e);
!         tree dest_type = tree_type_from_size( destref.field->data.capacity(),
                                                destref.field->attr & signable_e);
  
          // Pick up the source data.
*************** mh_source_is_literalN(cbl_refer_t &destr
*** 14970,15000 ****
            }
  
          // __gg__string_to_alpha_edited expects the source string to be in
!         // the same encoding as the target:
!         size_t len = strlen(sourceref.field->data.initial);
!         char *src =
!          static_cast<char *>(xmalloc(len+1));
!         memcpy( src,
!                 sourceref.field->data.initial,
!                 strlen(sourceref.field->data.initial));
          size_t charsout;
!         const char *converted = __gg__iconverter(
!                                             sourceref.field->codeset.encoding,
                                              destref.field->codeset.encoding,
!                                             src,
!                                             len,
                                              &charsout);
          gg_call(VOID,
                  "__gg__string_to_alpha_edited",
                  gg_add( member(destref.field->var_decl_node, "data"),
                          refer_offset(destref) ),
                  build_int_cst_type(INT, destref.field->codeset.encoding),
                  gg_string_literal(converted),
!                 build_int_cst_type(INT, len),
                  gg_string_literal(destref.field->data.picture),
                  NULL_TREE);
-         free(src);
          moved = true;
          break;
          }
  
--- 14826,14856 ----
            }
  
          // __gg__string_to_alpha_edited expects the source string to be in
!         // the same encoding as the target.  The rule in internalize is that
!         // a FldLiteralN::data.initial is left in source-code space, so it
!         // needs to be converted to the destination encoding.
          size_t charsout;
!         const char *converted_ = __gg__iconverter(
!                                             DEFAULT_SOURCE_ENCODING,
                                              destref.field->codeset.encoding,
!                                             sourceref.field->data.original(),
!                                             strlen(sourceref.field->data.original()),
                                              &charsout);
+         // Copy converted, because __gg__string_to_alpha_edited might have its
+         // own reasons to use charmap_t, which could mess up the static buffer
+         // used by __gg__iconverter:
+         char *converted = xstrdup(converted_);
          gg_call(VOID,
                  "__gg__string_to_alpha_edited",
                  gg_add( member(destref.field->var_decl_node, "data"),
                          refer_offset(destref) ),
                  build_int_cst_type(INT, destref.field->codeset.encoding),
                  gg_string_literal(converted),
!                 build_int_cst_type(INT, strlen(converted)),
                  gg_string_literal(destref.field->data.picture),
                  NULL_TREE);
          moved = true;
+         free(converted);
          break;
          }
  
*************** mh_source_is_literalN(cbl_refer_t &destr
*** 15002,15014 ****
          {
          tree tdest = gg_add(member(destref.field->var_decl_node, "data"),
                              refer_offset(destref) );
!         switch( destref.field->data.capacity )
            {
-           // For some reason, using FLOAT128 in the build_pointer_type causes
-           // a SEGFAULT.  So, we'll use other types with equivalent sizes. I
-           // am speculating that the use of floating-point types causes the -O0
-           // compilation to move things using the mmx registers.  So, I am using
-           // intxx types in the hope that they are simpler.
            case 4:
              {
              // The following generated code is the exact equivalent
--- 14858,14865 ----
          {
          tree tdest = gg_add(member(destref.field->var_decl_node, "data"),
                              refer_offset(destref) );
!         switch( destref.field->data.capacity() )
            {
            case 4:
              {
              // The following generated code is the exact equivalent
*************** static tree
*** 15069,15075 ****
  float_type_of(const cbl_field_t *field)
    {
    gcc_assert(field->type == FldFloat);
!   return float_type_of(field->data.capacity);
    }
  
  static tree
--- 14920,14926 ----
  float_type_of(const cbl_field_t *field)
    {
    gcc_assert(field->type == FldFloat);
!   return float_type_of(field->data.capacity());
    }
  
  static tree
*************** mh_dest_is_float( cbl_refer_t &destref,
*** 15099,15105 ****
        case FldNumericEdited:
        case FldPacked:
          {
!         switch( destref.field->data.capacity )
            {
            case 4:
              gg_call(VOID,
--- 14950,14956 ----
        case FldNumericEdited:
        case FldPacked:
          {
!         switch( destref.field->data.capacity() )
            {
            case 4:
              gg_call(VOID,
*************** mh_dest_is_float( cbl_refer_t &destref,
*** 15163,15169 ****
            // If the destination is bigger than the source, then we can
            // do an untested move:
  
!           if( destref.field->data.capacity >= sourceref.field->data.capacity )
              {
              tree dtype = float_type_of(&destref);
              tree stype = float_type_of(&sourceref);
--- 15014,15020 ----
            // If the destination is bigger than the source, then we can
            // do an untested move:
  
!           if( destref.field->data.capacity() >= sourceref.field->data.capacity() )
              {
              tree dtype = float_type_of(&destref);
              tree stype = float_type_of(&sourceref);
*************** mh_dest_is_float( cbl_refer_t &destref,
*** 15180,15186 ****
            else
              {
              // There are only three possible moves left:
!             if(destref.field->data.capacity == 8 )
                {
                if( size_error )
                  {
--- 15031,15037 ----
            else
              {
              // There are only three possible moves left:
!             if(destref.field->data.capacity() == 8 )
                {
                if( size_error )
                  {
*************** mh_dest_is_float( cbl_refer_t &destref,
*** 15207,15213 ****
              else
                {
                // The destination has to be float32
!               if( sourceref.field->data.capacity == 8 )
                  {
                  if( size_error )
                    {
--- 15058,15064 ----
              else
                {
                // The destination has to be float32
!               if( sourceref.field->data.capacity() == 8 )
                  {
                  if( size_error )
                    {
*************** mh_dest_is_float( cbl_refer_t &destref,
*** 15267,15272 ****
--- 15118,15124 ----
  
        case FldLiteralA:
        case FldAlphanumeric:
+       case FldGroup:
          {
          // Alphanumeric to float is inherently slow.  Send it off to the library
          break;
*************** mh_numeric_display( const cbl_refer_t &d
*** 15337,15347 ****
    {
    bool moved = false;
  
    if(     destref.field->type   == FldNumericDisplay
        &&  sourceref.field->type == FldNumericDisplay
        &&  !(destref.field->attr   & scaled_e)
!       &&  !(sourceref.field->attr & scaled_e) )
      {
      Analyze();
      // I believe that there are 450 pathways through the following code.
      // That's because there are five different valid combination of signable_e,
--- 15189,15207 ----
    {
    bool moved = false;
  
+   charmap_t *charmap_source =
+                        __gg__get_charmap(sourceref.field->codeset.encoding);
    if(     destref.field->type   == FldNumericDisplay
        &&  sourceref.field->type == FldNumericDisplay
        &&  !(destref.field->attr   & scaled_e)
!       &&  !(sourceref.field->attr & scaled_e)
!       &&  charmap_source->stride() == 1
!       &&  sourceref.field->codeset.encoding == destref.field->codeset.encoding
!       )
      {
+     // We can do simple moves of single-byte same-encoding numeric display.
+     // More complex ones get sent to __gg__move
+ 
      Analyze();
      // I believe that there are 450 pathways through the following code.
      // That's because there are five different valid combination of signable_e,
*************** mh_numeric_display( const cbl_refer_t &d
*** 15367,15376 ****
      // nybble is 0xC0 for positive values, and 0xD0 for negative; all other
      // digits are 0x70.
  
-     charmap_t *charmap_source =
-                          __gg__get_charmap(sourceref.field->codeset.encoding);
      charmap_t *charmap_dest   =
!                          __gg__get_charmap(  destref.field->codeset.encoding);
  
      static tree source_sign_loc  = gg_define_variable(UCHAR_P,
                                                        "..mhnd_sign_loc",
--- 15227,15234 ----
      // nybble is 0xC0 for positive values, and 0xD0 for negative; all other
      // digits are 0x70.
  
      charmap_t *charmap_dest   =
!                        __gg__get_charmap(  destref.field->codeset.encoding);
  
      static tree source_sign_loc  = gg_define_variable(UCHAR_P,
                                                        "..mhnd_sign_loc",
*************** mh_numeric_display( const cbl_refer_t &d
*** 15435,15441 ****
          gg_assign(source_sign_loc,
                    gg_add(source_p,
                          build_int_cst_type(SIZE_T,
!                                           sourceref.field->data.capacity-1)));
          break;
        case 5:
          //     signable, not leading,     separate
--- 15293,15299 ----
          gg_assign(source_sign_loc,
                    gg_add(source_p,
                          build_int_cst_type(SIZE_T,
!                                           sourceref.field->data.capacity()-1)));
          break;
        case 5:
          //     signable, not leading,     separate
*************** mh_numeric_display( const cbl_refer_t &d
*** 15443,15449 ****
          gg_assign(source_sign_loc,
                    gg_add(source_p,
                          build_int_cst_type(SIZE_T,
!                                           sourceref.field->data.capacity-1)));
          break;
        case 6:
          //     signable,     leading, not separate
--- 15301,15307 ----
          gg_assign(source_sign_loc,
                    gg_add(source_p,
                          build_int_cst_type(SIZE_T,
!                                           sourceref.field->data.capacity()-1)));
          break;
        case 6:
          //     signable,     leading, not separate
*************** mh_numeric_display( const cbl_refer_t &d
*** 15529,15535 ****
          gg_assign(dest_sign_loc,
                    gg_add(dest_p,
                          build_int_cst_type(SIZE_T,
!                                           destref.field->data.capacity-1)));
          break;
        case 5:
          //     signable, not leading,     separate
--- 15387,15393 ----
          gg_assign(dest_sign_loc,
                    gg_add(dest_p,
                          build_int_cst_type(SIZE_T,
!                                           destref.field->data.capacity()-1)));
          break;
        case 5:
          //     signable, not leading,     separate
*************** mh_numeric_display( const cbl_refer_t &d
*** 15537,15543 ****
          gg_assign(dest_sign_loc,
                    gg_add(dest_p,
                          build_int_cst_type(SIZE_T,
!                                           destref.field->data.capacity-1)));
          break;
        case 6:
          //     signable,     leading, not separate
--- 15395,15401 ----
          gg_assign(dest_sign_loc,
                    gg_add(dest_p,
                          build_int_cst_type(SIZE_T,
!                                           destref.field->data.capacity()-1)));
          break;
        case 6:
          //     signable,     leading, not separate
*************** mh_little_endian( const cbl_refer_t &des
*** 15725,15736 ****
    {
    bool moved = false;
  
!   cbl_figconst_t figconst = cbl_figconst_of( sourceref.field->data.initial);
  
    if(     !figconst
        &&  !(destref.field->attr    & scaled_e)
        &&  !(destref.field->attr    & (intermediate_e  ))
        &&  !(sourceref.field->attr  & (intermediate_e  ))
        &&  sourceref.field->type     != FldLiteralA
        &&  sourceref.field->type     != FldAlphanumeric
        &&  sourceref.field->type     != FldNumericEdited
--- 15583,15595 ----
    {
    bool moved = false;
  
!   cbl_figconst_t figconst = cbl_figconst_of( sourceref.field->data.original());
  
    if(     !figconst
        &&  !(destref.field->attr    & scaled_e)
        &&  !(destref.field->attr    & (intermediate_e  ))
        &&  !(sourceref.field->attr  & (intermediate_e  ))
+       &&  sourceref.field->type     != FldGroup
        &&  sourceref.field->type     != FldLiteralA
        &&  sourceref.field->type     != FldAlphanumeric
        &&  sourceref.field->type     != FldNumericEdited
*************** mh_source_is_group( const cbl_refer_t &d
*** 15794,15800 ****
                      const TREEPLET    &tsrc)
    {
    bool retval = false;
!   if( sourceref.field->type == FldGroup && !(destref.field->attr & rjust_e) )
      {
      Analyze();
      // We are moving a group to a something.  The rule here is just move as
--- 15653,15662 ----
                      const TREEPLET    &tsrc)
    {
    bool retval = false;
!  charmap_t *charmap = __gg__get_charmap(destref.field->codeset.encoding);
!   if(   sourceref.field->type == FldGroup && !(destref.field->attr & rjust_e)
!      && sourceref.field->codeset.encoding == destref.field->codeset.encoding
!      && charmap->stride() == 1)
      {
      Analyze();
      // We are moving a group to a something.  The rule here is just move as
*************** mh_source_is_group( const cbl_refer_t &d
*** 15814,15820 ****
      ELSE
        {
        // There are too-few source bytes:
-       charmap_t *charmap = __gg__get_charmap(destref.field->codeset.encoding);
        int dest_space = charmap->mapped_character(ascii_space);
        gg_memset(tdest, build_int_cst_type(INT, dest_space), dbytes);
        gg_memcpy(tdest, tsource, sbytes);
--- 15676,15681 ----
*************** mh_source_is_literalA(const cbl_refer_t
*** 15840,15847 ****
      // construct a string with the same number of characters as the source, but
      // in the target variable's encoding.
  
!     // We will then call a library routine that will be in charge of trimming
!     // and space filling.
  
      cbl_encoding_t encoding_dest =   destref.field->codeset.encoding;
      charmap_t *charmap_dest = __gg__get_charmap(encoding_dest);
--- 15701,15708 ----
      // construct a string with the same number of characters as the source, but
      // in the target variable's encoding.
  
!     // We will then call a library routine that will be in charge of run-time
!     // trimming or space filling, as necessary.
  
      cbl_encoding_t encoding_dest =   destref.field->codeset.encoding;
      charmap_t *charmap_dest = __gg__get_charmap(encoding_dest);
*************** mh_source_is_literalA(const cbl_refer_t
*** 15855,15870 ****
  
      static char *buffer = NULL;
      static size_t buffer_size = 0;
!     size_t source_length = sourceref.field->data.capacity;
  
!     if( buffer_size < source_length )
        {
!       buffer_size = source_length;
!       buffer = static_cast<char *>(xrealloc(buffer, source_length));
        }
      gcc_assert(buffer);
  
!     cbl_figconst_t figconst = cbl_figconst_of( sourceref.field->data.initial);
      if( figconst )
        {
        // We are going to fill 'buffer' with a solid run of the figurative
--- 15716,15750 ----
  
      static char *buffer = NULL;
      static size_t buffer_size = 0;
!     size_t source_length;
!     size_t dest_length;
!     if( sourceref.field->attr & hex_encoded_e )
!       {
!       // Hex-encoded data is moved as-is
!       source_length = sourceref.field->data.capacity();
!       dest_length   = std::min(source_length,
!                           static_cast<size_t>(destref.field->data.capacity()));
!       }
!     else
!       {
!       // Otherwise, data.initial prevails:
!       size_t source_based_on_strlen = strlen(sourceref.field->data.original());
!       size_t source_based_on_capacity = sourceref.field->data.capacity() /
!                                         sourceref.field->codeset.stride() ;
!       source_length = std::max( source_based_on_strlen ,
!                                 source_based_on_capacity );
!       dest_length   = source_length * charmap_dest->stride();
!       }
  
!     if( buffer_size < dest_length )
        {
!       buffer_size = dest_length;
!       buffer = static_cast<char *>(xrealloc(buffer, buffer_size));
        }
      gcc_assert(buffer);
  
!     cbl_figconst_t figconst = cbl_figconst_of( sourceref.field->data.original());
!     size_t outlength;
      if( figconst )
        {
        // We are going to fill 'buffer' with a solid run of the figurative
*************** mh_source_is_literalA(const cbl_refer_t
*** 15875,15881 ****
          {
          case normal_value_e :
            // This is not possible, it says here in the fine print.
!           abort();
            break;
          case low_value_e    :
            const_char = charmap_dest->low_value_character();
--- 15755,15761 ----
          {
          case normal_value_e :
            // This is not possible, it says here in the fine print.
!           gcc_unreachable();
            break;
          case low_value_e    :
            const_char = charmap_dest->low_value_character();
*************** mh_source_is_literalA(const cbl_refer_t
*** 15900,15926 ****
        }
       else
        {
!       // We are going to convert the source string to the destination codeset,
!       // and then copy it to 'buffer', trimming if necessary, and space-filling
!       // to the right if necessary:
!       cbl_encoding_t encoding_src  = sourceref.field->codeset.encoding;
! 
!       size_t outlength;
!       const char *source_string = __gg__iconverter( encoding_src,
!                                                  encoding_dest,
!                                                  sourceref.field->data.initial,
!                                                  source_length,
!                                                  &outlength );
!       // Copy over the converted string
!       memcpy( buffer,
!               source_string,
!               outlength );
        }
  
      // If the source is flagged ALL, or if we are setting the destination to
      // a figurative constant, pass along the ALL bit:
      int rounded_parameter = rounded
!                             | ((sourceref.all || figconst ) ? REFER_ALL_BIT : 0);
  
      if( size_error )
        {
--- 15780,15818 ----
        }
       else
        {
!       if( sourceref.field->attr & hex_encoded_e )
!         {
!         // hex_encoded data goes as is:
!         memcpy(buffer, sourceref.field->data.original(), dest_length);
!         outlength = dest_length;
!         }
!       else
!         {
!         // We are going to convert the source string to the destination
!         // codeset, and then copy it to 'buffer', trimming if necessary, and
!         // space-filling to the right if necessary:
!         const char *source_string =
!         __gg__iconverter(
!                        sourceref.field->codeset.default_encodings.source->type,
!                        encoding_dest,
!                        sourceref.field->data.original(),
!                        source_length,
!                        &outlength );
!         if( outlength > dest_length )
!           {
!           outlength = dest_length;
!           }
!         // Copy over the converted string
!         memcpy( buffer,
!                 source_string,
!                 outlength );
!         }
        }
  
      // If the source is flagged ALL, or if we are setting the destination to
      // a figurative constant, pass along the ALL bit:
      int rounded_parameter = rounded
!                            | ((sourceref.all || figconst ) ? REFER_ALL_BIT : 0);
  
      if( size_error )
        {
*************** mh_source_is_literalA(const cbl_refer_t
*** 15931,15939 ****
                                refer_offset(destref),
                                refer_size_dest(destref),
                                build_int_cst_type(INT, rounded_parameter),
!                               build_string_literal(source_length,
                                                     buffer),
!                               build_int_cst_type( SIZE_T, source_length),
                                NULL_TREE));
        }
      else
--- 15823,15831 ----
                                refer_offset(destref),
                                refer_size_dest(destref),
                                build_int_cst_type(INT, rounded_parameter),
!                               build_string_literal(outlength,
                                                     buffer),
!                               build_int_cst_type( SIZE_T, outlength),
                                NULL_TREE));
        }
      else
*************** mh_source_is_literalA(const cbl_refer_t
*** 15944,15952 ****
                                refer_offset(destref),
                                refer_size_dest(destref),
                                build_int_cst_type(INT, rounded_parameter),
!                               build_string_literal(source_length,
                                                     buffer),
!                               build_int_cst_type( SIZE_T, source_length),
                                NULL_TREE);
        }
      if(    destref.refmod.from
--- 15836,15844 ----
                                refer_offset(destref),
                                refer_size_dest(destref),
                                build_int_cst_type(INT, rounded_parameter),
!                               build_string_literal(outlength,
                                                     buffer),
!                               build_int_cst_type( SIZE_T, outlength),
                                NULL_TREE);
        }
      if(    destref.refmod.from
*************** move_helper(tree size_error,        // T
*** 16000,16008 ****
        first_time = false;
        gg_assign(stash, gg_cast(UCHAR_P, gg_malloc(stash_size)));
        }
!     if( stash_size < destref.field->data.capacity )
        {
!       stash_size = destref.field->data.capacity;
        gg_assign(stash, gg_cast(UCHAR_P, gg_realloc(stash, stash_size)));
        }
      st_data = qualified_data_location(destref);
--- 15892,15900 ----
        first_time = false;
        gg_assign(stash, gg_cast(UCHAR_P, gg_malloc(stash_size)));
        }
!     if( stash_size < destref.field->data.capacity() )
        {
!       stash_size = destref.field->data.capacity();
        gg_assign(stash, gg_cast(UCHAR_P, gg_realloc(stash, stash_size)));
        }
      st_data = qualified_data_location(destref);
*************** move_helper(tree size_error,        // T
*** 16063,16069 ****
                                size_error);
      }
  
!   if( !moved && sourceref.field->type == FldLiteralA)
      {
      moved = mh_source_is_literalA(destref,
                                    sourceref,
--- 15955,15961 ----
                                size_error);
      }
  
!   if( !moved )
      {
      moved = mh_source_is_literalA(destref,
                                    sourceref,
*************** real_powi10 (uint32_t x)
*** 16218,16813 ****
    return pow10;
  }
  
! static
! char *
! binary_initial(cbl_field_t *field)
!   {
!   // This routine returns an xmalloced buffer designed to replace the
!   // data.initial member of the incoming field
!   char *retval = NULL;
! 
!   uint32_t capacity;
!   uint32_t ddigits;
!   int32_t  drdigits;
!   uint64_t attr;
!   FIXED_WIDE_INT(128) value128 = dirty_to_binary(field->data.original(),
!                                                  capacity,
!                                                  ddigits,
!                                                  drdigits,
!                                                  attr);
!   int scaled_rdigits = get_scaled_rdigits(field);
! 
!   int i = field->data.rdigits;
!   while( i<0 )
!     {
!     value128 = value128/10;
!     i += 1;
!     }
! 
!   // We take the digits of value128, and put them into ach.  We line up
!   // the rdigits, and we truncate the string after desired_digits
!   while(drdigits < scaled_rdigits)
!     {
!     value128 *= 10;
!     drdigits += 1;
!     }
!   while(drdigits > scaled_rdigits)
!     {
!     value128 = value128 / 10;
!     drdigits -= 1;
!     }
! 
!   retval = static_cast<char *>(xmalloc(field->data.capacity));
!   gcc_assert(retval);
!   switch(field->data.capacity)
!     {
!     tree type;
!     case 1:
!     case 2:
!     case 4:
!     case 8:
!     case 16:
!       type = build_nonstandard_integer_type ( field->data.capacity
!                                               * BITS_PER_UNIT, 0);
!       native_encode_wide_int (type, value128, PTRCAST(unsigned char, retval),
!                               field->data.capacity);
!       break;
!     default:
!       fprintf(stderr,
!               "Trouble in binary_initial at %s() %s:%d\n",
!               __func__,
!               __FILE__,
!               __LINE__);
!       abort();
!       break;
!     }
! 
!   return retval;
!   }
! 
! static void
! digits_from_int128( char                *ach,
!                     cbl_field_t         *field,
!                     uint32_t             desired_digits,
!                     FIXED_WIDE_INT(128)  value128, // cppcheck-suppress unknownMacro
!                     int32_t              rdigits)
!   {
!   if( value128 < 0 )
!     {
!     value128 = -value128;
!     }
! 
!   // 'rdigits' are the number of rdigits in value128.
! 
!   int scaled_rdigits = get_scaled_rdigits(field);
! 
!   int i = field->data.rdigits;
!   while( i<0 )
!     {
!     value128 = value128/10;
!     i += 1;
!     }
! 
!   // We take the digits of value128, and put them into ach.  We line up
!   // the rdigits, and we truncate the string after desired_digits
!   while(rdigits < scaled_rdigits)
!     {
!     value128 *= 10;
!     rdigits += 1;
!     }
!   while(rdigits > scaled_rdigits)
!     {
!     value128 = value128 / 10;
!     rdigits -= 1;
!     }
!   char conv[128];
!   print_dec (value128, conv, SIGNED);
!   size_t len = strlen(conv);
! 
!   if( len<desired_digits )
!     {
!     memset(ach, ascii_0, desired_digits - len);
!     strcpy(ach+desired_digits - len, conv);
!     }
!   else
!     {
!     strcpy(ach, conv + len-desired_digits);
!     }
!   }
! 
! #if 0
! // This routine was replaced with digits_from_int1289.  However, I am choosing
! // to keep it around for a while, because it is a master class in manipulating
! // REAL_VALUE_TYPE and FIXED_WIDE_INT
! 
! static void
! digits_from_float128(char *retval, cbl_field_t *field, size_t width, int rdigits, REAL_VALUE_TYPE value)
!   {
!   char ach[128];
! 
!   // We need to adjust value so that it has no decimal places
!   if( rdigits )
!     {
!       REAL_VALUE_TYPE pow10 = real_powi10 (rdigits);
!       real_arithmetic (&value, MULT_EXPR, &value, &pow10);
!     }
!   // We need to make sure that the resulting string will fit into
!   // a number with 'digits' digits
!   REAL_VALUE_TYPE pow10 = real_powi10 (field->data.digits);
!   mpfr_t m0, m1;
! 
!   mpfr_inits2 (FLOAT_MODE_FORMAT (TYPE_MODE (float128_type_node))->p, m0, m1,
!                NULL);
!   mpfr_from_real (m0, &value, MPFR_RNDN);
!   mpfr_from_real (m1, &pow10, MPFR_RNDN);
!   mpfr_clear_flags ();
!   mpfr_fmod (m0, m0, m1, MPFR_RNDN);
!   real_from_mpfr (&value, m0,
!                   REAL_MODE_FORMAT (TYPE_MODE (float128_type_node)),
!                   MPFR_RNDN);
!   real_convert (&value, TYPE_MODE (float128_type_node), &value);
!   mpfr_clears (m0, m1, NULL);
!   real_roundeven (&value, TYPE_MODE (float128_type_node), &value);
! 
!   bool fail = false;
!   FIXED_WIDE_INT(128) i
!     = FIXED_WIDE_INT(128)::from (real_to_integer (&value, &fail, 128), SIGNED);
! 
!   // We convert it to a integer string of digits:
!   print_dec (i, ach, SIGNED);
! 
!   gcc_assert( strlen(ach) <= field->data.digits );
!   if( strlen(ach) < width )
!     {
!     memset(retval, '0', width-strlen(ach) );
!     }
!   strcpy(retval + (width-strlen(ach)), ach);
!   }
! #endif
! 
! static char *
! initial_from_initial(cbl_field_t *field)
    {
!   Analyze();
!   // This routine returns an xmalloced buffer that is intended to replace the
!   // data.initial member of the incoming field.
! 
!   //fprintf(stderr, " %s\n", field->name);
! 
!   char *retval = NULL;
! 
!   // Let's handle the possibility of a figurative constant
!   cbl_figconst_t figconst = cbl_figconst_of(field->data.initial);
!   if( figconst )
!     {
!     charmap_t *charmap = __gg__get_charmap(field->codeset.encoding);
!     int const_char = charmap->figconst_character(figconst);
!     bool set_return = figconst != zero_value_e;
!     if( !set_return )
!       {
!       // The figconst is zero
!       switch(field->type)
!         {
!         case FldGroup:
!         case FldAlphanumeric:
!           set_return = true;
!           break;
! 
!         default:
!           break;
!         }
!       }
!     if( set_return )
!       {
!       retval = static_cast<char *>(xmalloc(field->data.capacity+1));
!       gcc_assert(retval);
!       memset(retval, const_char, field->data.capacity);
!       retval[field->data.capacity] = '\0';
!       return retval;
!       }
!     }
! 
!   // ???  Refactoring the cases below that do not need 'value' would
!   // make this less ugly
!   REAL_VALUE_TYPE value;
!   if( field->data.etc_type == cbl_field_data_t::value_e )
!     value = TREE_REAL_CST (field->data.value_of ());
! 
! #if 0
!   int rdigits;
!   // There is always the infuriating possibility of a P-scaled number
!   if( field->attr & scaled_e )
!     {
!     rdigits = 0;
!     if( field->data.rdigits >= 0 )
!       {
!       // Suppose our PIC is PPPPPP999, meaning that field->digits
!       // is 3, and field->rdigits is 6.
! 
!       // Our result has no decimal places, and we have to multiply the value
!       // by 10**9 to get the significant bdigits where they belong.
! 
!       REAL_VALUE_TYPE pow10
!         = real_powi10 (field->data.digits + field->data.rdigits);
!       real_arithmetic (&value, MULT_EXPR, &value, &pow10);
!       }
!     else
!       {
!       // Suppose our target is 999PPPPPP, so there is a ->digits
!       // of 3 and field->rdigits of -6.
! 
!       // If our caller gave us 123000000, we need to divide
!       // it by 1000000 to line up the 123 with where we want it to go:
! 
!       REAL_VALUE_TYPE pow10 = real_powi10 (-field->data.rdigits);
!       real_arithmetic (&value, RDIV_EXPR, &value, &pow10);
!       }
!     // Either way, we now have everything aligned for the remainder of the
!     // processing to work:
!     }
!   else
!     {
!     // Not P-scaled
!     rdigits = field->data.rdigits;
!     }
! #endif
! 
!   switch(field->type)
!     {
!     case FldNumericBin5:
!     case FldIndex:
!       retval = binary_initial(field);
!       break;
! 
!     case FldNumericBinary:
!       {
!       retval = binary_initial(field);
!       size_t left = 0;
!       size_t right = field->data.capacity - 1;
!       while(left < right)
!         {
!         std::swap(retval[left++], retval[right--]);
!         }
!       break;
!       }
! 
!     case FldNumericDisplay:
!       {
!       charmap_t *charmap = __gg__get_charmap(field->codeset.encoding);
! 
!       retval = static_cast<char *>(xmalloc(field->data.capacity));
!       gcc_assert(retval);
!       char *pretval = retval;
!       char ach[128];
! 
!       bool negative;
!       if( real_isneg (&value) )
!         {
!         negative = true;
!         value = real_value_negate (&value);
!         }
!       else
!         {
!         negative = false;
!         }
! 
!       // Convert the data.initial to a __int128
!       uint32_t capacity;
!       uint32_t ddigits;
!       int32_t  drdigits;
!       uint64_t attr;
!       FIXED_WIDE_INT(128) value128 = dirty_to_binary(field->data.initial,
!                                                      capacity,
!                                                      ddigits,
!                                                      drdigits,
!                                                      attr);
!       digits_from_int128(ach, field, field->data.digits, value128, drdigits);
! 
!       const char *digits = ach;
!       if(    (field->attr & signable_e)
!           && (field->attr & separate_e)
!           && (field->attr & leading_e ) )
!         {
!         // This zoned decimal value is signable, separate, and leading.
!         if( negative )
!           {
!           *pretval++ = charmap->mapped_character(ascii_minus);
!           }
!         else
!           {
!           *pretval++ = charmap->mapped_character(ascii_plus);
!           }
!         }
!       for(size_t i=0; i<field->data.digits; i++)
!         {
!         // Start by assuming it's an value that can't be signed
!         *pretval++ = charmap->mapped_character(ascii_0) + ((*digits++) & 0x0F);
!         }
!       if(     (field->attr & signable_e)
!           &&  (field->attr & separate_e)
!           && !(field->attr & leading_e ) )
!         {
!         // The value is signable, separate, and trailing
!         if( negative )
!           {
!           *pretval++ = charmap->mapped_character(ascii_minus);
!           }
!         else
!           {
!           *pretval++ = charmap->mapped_character(ascii_plus);
!           }
!         }
!       if(     (field->attr & signable_e)
!           && !(field->attr & separate_e) )
!         {
!         // This value is signable, and not separate.  So, the sign information
!         // goes into the first or last byte:
!         char *sign_location = field->attr & leading_e ?
!                               retval : retval + field->data.digits - 1 ;
!         *sign_location = charmap->set_digit_negative(*sign_location,
!                                                       negative);
!         }
!       break;
!       }
! 
!     case FldPacked:
!       {
!       retval = static_cast<char *>(xmalloc(field->data.capacity));
!       gcc_assert(retval);
!       char *pretval = retval;
!       char ach[128];
! 
!       bool negative;
!       if( real_isneg (&value) )
!         {
!           negative = true;
!           value = real_value_negate (&value);
!         }
!       else
!         {
!           negative = false;
!         }
! 
!       // For COMP-6 (flagged by separate_e), the number of required digits is
!       // twice the capacity.
! 
!       // For COMP-3, the number of digits is 2*capacity minus 1, because the
!       // the final "digit" is a sign nybble.
! 
!       size_t ndigits =   (field->attr & separate_e)
!                        ? field->data.capacity * 2
!                        : field->data.capacity * 2 - 1;
!       uint32_t capacity;
!       uint32_t ddigits;
!       int32_t  drdigits;
!       uint64_t attr;
!       FIXED_WIDE_INT(128) value128 = dirty_to_binary(field->data.initial,
!                                                      capacity,
!                                                      ddigits,
!                                                      drdigits,
!                                                      attr);
!       digits_from_int128(ach, field, ndigits, value128, drdigits);
! 
!       const char *digits = ach;
!       for(size_t i=0; i<ndigits; i++)
!         {
!         if( !(i & 0x01) )
!           {
!           *pretval    = ((*digits++) & 0x0F)<<4;;
!           }
!         else
!           {
!           *pretval++ += (*digits++) & 0x0F;
!           }
!         }
!       if( !(field->attr & separate_e) )
!         {
!         // This is COMP-3, so put in a sign nybble
!         if( (field->attr & signable_e) )
!           {
!           if( negative )
!             {
!             *pretval++ += 0x0D;   // Means signable and negative
!             }
!           else
!             {
!             *pretval++ += 0x0C;   // Means signable and non-negative
!             }
!           }
!         else
!           {
!           *pretval++ += 0x0F;     // Means not signable
!           }
!         }
!       break;
!       }
! 
!     case FldGroup:
!     case FldAlphanumeric:
!     case FldLiteralA:
!     case FldAlphaEdited:
!       {
!       if( field->data.initial )
!         {
!         retval = static_cast<char *>(xmalloc(field->data.capacity+1));
!         gcc_assert(retval);
!         if( field->attr & hex_encoded_e)
!           {
!           memcpy(retval, field->data.initial, field->data.capacity);
!           }
!         else
!           {
!           size_t length = field->data.capacity;
!           memcpy(retval, field->data.initial, length);
!           if( strlen(field->data.initial) < length )
!             {
!             // If this is true, then the initial string must've been Z'xyz'
!             retval[strlen(field->data.initial)] = '\0';
!             }
!           }
!         retval[field->data.capacity] = '\0';
!         }
!       break;
!       }
! 
!     case FldNumericEdited:
!       {
!       charmap_t *charmap = __gg__get_charmap(field->codeset.encoding);
!       retval = static_cast<char *>(xmalloc(field->data.capacity+1));
!       gcc_assert(retval);
!       if( field->data.initial && field->attr & quoted_e )
!         {
!         // What the programmer says the value is, the value becomes, no
!         // matter how wrong it might be.
!         size_t length = std::min( (size_t)field->data.capacity,
!                                   strlen(field->data.initial));
!         for(size_t i=0; i<length; i++)
!           {
!           retval[i] = field->data.initial[i];
!           }
!         if( length < (size_t)field->data.capacity )
!           {
!           memset( retval+length,
!                   charmap->mapped_character(ascii_space),
!                   (size_t)field->data.capacity - length);
!           }
!         }
!       else
!         {
!         // It's not a quoted string, so we use data.value:
!         bool negative;
!         if( real_isneg (&value) )
!           {
!           negative = true;
!           value = real_value_negate (&value);
!           }
!         else
!           {
!           negative = false;
!           }
! 
!         char ach[128];
!         memset(ach, 0, sizeof(ach));
!         memset(retval, 0, field->data.capacity);
! 
!         if( (field->attr & blank_zero_e) && real_iszero (&value) )
!           {
!           memset( retval,
!                   charmap->mapped_character(ascii_space),
!                   field->data.capacity);
!           }
!         else
!           {
!           size_t ndigits = field->data.capacity;
!           uint32_t capacity;
!           uint32_t ddigits;
!           int32_t  drdigits;
!           uint64_t attr;
!           FIXED_WIDE_INT(128) value128 = dirty_to_binary(field->data.original(),
!                                                          capacity,
!                                                          ddigits,
!                                                          drdigits,
!                                                          attr);
!           digits_from_int128(ach, field, ndigits, value128, drdigits);
! 
!           // __gg__string_to_numeric_edited operates in ASCII space:
!           __gg__string_to_numeric_edited( retval,
!                                           ach,
!                                           field->data.rdigits,
!                                           negative,
!                                           field->data.picture);
!           // So now we convert it to the target encoding:
!           size_t nbytes;
!           const char *converted = __gg__iconverter(DEFAULT_SOURCE_ENCODING,
!                                                    field->codeset.encoding,
!                                                    retval,
!                                                    strlen(retval),
!                                                    &nbytes);
!           strcpy(retval, converted);
!           }
!         }
!       break;
!       }
! 
!     case FldFloat:
!       {
!       retval = static_cast<char *>(xmalloc(field->data.capacity));
!       gcc_assert(retval);
!       switch( field->data.capacity )
!         {
!         case 4:
!           value = real_value_truncate (TYPE_MODE (FLOAT), value);
!           native_encode_real (SCALAR_FLOAT_TYPE_MODE (FLOAT), &value,
!                               PTRCAST(unsigned char, retval), 4, 0);
!           break;
!         case 8:
!           value = real_value_truncate (TYPE_MODE (DOUBLE), value);
!           native_encode_real (SCALAR_FLOAT_TYPE_MODE (DOUBLE), &value,
!                               PTRCAST(unsigned char, retval), 8, 0);
!           break;
!         case 16:
!           value = real_value_truncate (TYPE_MODE (FLOAT128), value);
!           native_encode_real (SCALAR_FLOAT_TYPE_MODE (FLOAT128), &value,
!                               PTRCAST(unsigned char, retval), 16, 0);
!           break;
!         }
!       break;
!       }
! 
!     case FldLiteralN:
!       {
!       // This requires annotation.
  
!       // The compiler originally used ASCII for field->data.initial. Later we
!       // expanded the field with the addition of the codeset.encoding
!       // For consistency in the parser processing, the FldLiteralN is arriving
!       // with the Object-Computer's character encoding, and field->data.initial
!       // is showing up encoded.
  
!       // But on the run-time side, if the initial string is needed, it is
!       // invariably more useful in ASCII.  Consider converting that string to
!       // a floating-point value, for example.
  
!       // So, we are going to convert the data.initial string back to ASCII
!       // here.  Later on, when we establish the run-time encoding, we will
!       // check for FldLiteralN and set that to ASCII as well. See
!       // actually_create_the_static_field().
  
!       size_t nbytes;
!       const char *converted = __gg__iconverter(field->codeset.encoding,
!                                                DEFAULT_SOURCE_ENCODING,
!                                                field->data.initial,
!                                                strlen(field->data.initial),
!                                                &nbytes);
!       retval = static_cast<char *>(xmalloc(strlen(field->data.initial)+1));
!       gcc_assert(retval);
!       strcpy(retval, converted);
!       break;
!       }
  
!     default:
!       break;
!     }
    return retval;
    }
  
--- 16110,16139 ----
    return pow10;
  }
  
! static tree
! convert_data_initial(cbl_field_t * field)
    {
!   // This routine returns a tree from field->data.initial, extended with
!   // a NUL on the end.
!   size_t buffer_size = field->data.capacity() + field->codeset.stride();
!   char *buffer = static_cast<char *>(xmalloc(buffer_size));
!   gcc_assert(buffer);
  
!   size_t nbytes = field->data.capacity();
  
!   const char *converted = field->data.initial;
  
!   // Copy the converted bytes
!   gcc_assert(nbytes < buffer_size);
!   memcpy(buffer, converted, nbytes);
!   charmap_t *charmap = __gg__get_charmap(field->codeset.encoding);
  
!   // Tack on a final NUL
!   charmap->putch(0, buffer, nbytes);
  
!   tree retval = build_string_literal( buffer_size,
!                                       buffer);
!   free(buffer);
    return retval;
    }
  
*************** actually_create_the_static_field( cbl_fi
*** 16839,16845 ****
    CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
                            next_field,
                            build_int_cst_type( SIZE_T,
!                                               new_var->data.capacity) );
    next_field = TREE_CHAIN(next_field);
  
    //  SIZE_T,  "allocated",
--- 16165,16171 ----
    CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
                            next_field,
                            build_int_cst_type( SIZE_T,
!                                               new_var->data.capacity()) );
    next_field = TREE_CHAIN(next_field);
  
    //  SIZE_T,  "allocated",
*************** actually_create_the_static_field( cbl_fi
*** 16848,16854 ****
      CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
                              next_field,
                              build_int_cst_type( SIZE_T,
!                                                 new_var->data.capacity) );
      }
    else
      {
--- 16174,16180 ----
      CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
                              next_field,
                              build_int_cst_type( SIZE_T,
!                                                 new_var->data.capacity()) );
      }
    else
      {
*************** actually_create_the_static_field( cbl_fi
*** 16861,16884 ****
    next_field = TREE_CHAIN(next_field);
  
    //  SIZE_T,  "offset",
! 
!   if( new_var->type == FldAlphanumeric &&
!       new_var->attr & intermediate_e )
!     {
!     // This is in support of FUNCTION TRIM.  That function can make the capacity
!     // of the intermediate target smaller so that TRIM("abc   ") returns
!     // "abc".  By putting the capacity here for such variables, we have a
!     // mechanism for restoring it the capacity to the original.
!     CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
!                             next_field,
!                             build_int_cst_type(SIZE_T, new_var->data.capacity));
!     }
!   else
!     {
!     CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
                              next_field,
                              build_int_cst_type(SIZE_T, new_var->offset) );
-     }
  
    next_field = TREE_CHAIN(next_field);
  
--- 16187,16195 ----
    next_field = TREE_CHAIN(next_field);
  
    //  SIZE_T,  "offset",
!   CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
                              next_field,
                              build_int_cst_type(SIZE_T, new_var->offset) );
  
    next_field = TREE_CHAIN(next_field);
  
*************** actually_create_the_static_field( cbl_fi
*** 16895,16901 ****
    next_field = TREE_CHAIN(next_field);
  
    //  CHAR_P,  "initial",
!   if( length_of_initial_string == 0 )
      {
      CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
                              next_field,
--- 16206,16212 ----
    next_field = TREE_CHAIN(next_field);
  
    //  CHAR_P,  "initial",
!   if( length_of_initial_string == 0 || !new_var->data.has_initial_value() )
      {
      CONSTRUCTOR_APPEND_ELT( CONSTRUCTOR_ELTS(constr),
                              next_field,
*************** actually_create_the_static_field( cbl_fi
*** 16960,16971 ****
    //  INT,     "encoding",
    //  For FldLiteralN we force the encoding to be ASCII.
    //  See initial_from_initial() for an explanation.
    CONSTRUCTOR_APPEND_ELT(CONSTRUCTOR_ELTS(constr),
                          next_field,
!                         build_int_cst_type(INT,
!                                            new_var->type == FldLiteralN ?
!                                                 DEFAULT_SOURCE_ENCODING
!                                               : new_var->codeset.encoding));
    next_field = TREE_CHAIN(next_field);
  
    //  INT,     "alphabet",
--- 16271,16295 ----
    //  INT,     "encoding",
    //  For FldLiteralN we force the encoding to be ASCII.
    //  See initial_from_initial() for an explanation.
+   //  For FldClass, we force the encoding to be UTF32; see
+ 
+   cbl_encoding_t encoding;
+   if( new_var->type == FldLiteralN )
+     {
+     encoding = new_var->codeset.default_encodings.source->type;
+     }
+   else if( new_var->type == FldClass )
+     {
+     encoding = DEFAULT_32_ENCODING;
+     }
+   else
+     {
+     encoding = new_var->codeset.encoding;
+     }
+ 
    CONSTRUCTOR_APPEND_ELT(CONSTRUCTOR_ELTS(constr),
                          next_field,
!                         build_int_cst_type(INT, encoding));
    next_field = TREE_CHAIN(next_field);
  
    //  INT,     "alphabet",
*************** psa_new_var_decl(cbl_field_t *new_var, c
*** 17063,17069 ****
      // to do a linear search of the symbol table for each symbol
  
      if(   !our_index
!           && new_var->type != FldLiteralN
            && !(new_var->attr & intermediate_e))
        {
        our_index = field_index(new_var);
--- 16387,16393 ----
      // to do a linear search of the symbol table for each symbol
  
      if(   !our_index
!           && ! new_var->is_numeric_constant()
            && !(new_var->attr & intermediate_e))
        {
        our_index = field_index(new_var);
*************** psa_new_var_decl(cbl_field_t *new_var, c
*** 17164,17170 ****
    return new_var_decl;
    }
  
- #if 1
  static void
  psa_FldLiteralA(struct cbl_field_t *field )
    {
--- 16488,16493 ----
*************** psa_FldLiteralA(struct cbl_field_t *fiel
*** 17183,17274 ****
      }
  
    // We are constructing a completely static constant structure.  We know the
!   // capacity.  We'll create it from the data.initial.  The cblc_field_t:data
!   // will be a copy of the .initial data. The var_decl_node will be an ordinary
!   // cblc_field_t, which means that at this point in time, a FldLiteralA can be
!   // used anywhere a FldGroup or FldAlphanumeric can be used.  We are counting
!   // on the parser not allowing a FldLiteralA to be a left-hand-side variable.
! 
!   // First make room
!   static size_t buffer_size = 1024;
!   static char *buffer = static_cast<char *>(xmalloc(buffer_size));
!   if( buffer_size < field->data.capacity+1 )
!     {
!     buffer_size = field->data.capacity+1;
!     buffer = static_cast<char *>(xrealloc(buffer, buffer_size));
!     }
!   gcc_assert(buffer);
! 
!   cbl_figconst_t figconst = cbl_figconst_of( field->data.initial );
!   gcc_assert(figconst == normal_value_e);
! 
!   memcpy(buffer, field->data.initial, field->data.capacity);
!   buffer[field->data.capacity] = '\0';
  
!   // We have the original nul-terminated text at data.initial.  We have a
!   // copy of it in buffer[] in the internal codeset.
  
    static const char name_base[] = "_literal_a_";
  
!   // We will reuse a single static structure for each string
!   static std::unordered_map<std::string, int> seen_before;
! 
!   std::string field_string(buffer);
! 
! #if 0
!   /*  This code is suppoed to re-use literals, and seems to work just fine in
!       x86_64-linux and on an Apple aarch64 M1 Macbook Pro.  But on an M1
!       mini, using -Os optimization, attempts were made in the generated
!       assembly language to define _literal_a_1 more than once.
! 
!       I didn't know how to try to track this one down, so I decided simply to
!       punt by removing the code.
! 
!       I am leaving the code here because of a conviction that it someday should
!       be tracked down. */
! 
!   std::unordered_map<std::string, int>::const_iterator it =
!               seen_before.find(field_string);
! 
!   if( it != seen_before.end() )
!     {
!     // We've seen that string before.
!     int nvar = it->second;
!     char ach[32];
!     sprintf(ach, "%s%d", name_base, nvar);
!     field->var_decl_node = gg_declare_variable(cblc_field_type_node,
!                                                   ach,
!                                                   NULL,
!                                                   vs_file_static);
!     }
!   else
! #endif
!     {
!     // We have not seen that string before
!     static int nvar = 0;
!     nvar += 1;
!     seen_before[field_string] = nvar;
  
!     char ach[32];
!     sprintf(ach, "%s%d", name_base, nvar);
!     field->var_decl_node  = gg_define_variable( cblc_field_type_node,
!                                                 ach,
!                                                 vs_file_static);
!     actually_create_the_static_field(
!                 field,
!                 build_string_literal(field->data.capacity,
!                                      buffer),
!                 field->data.capacity,
!                 field->data.initial,
!                 NULL_TREE,
!                 field->var_decl_node);
!     TREE_READONLY(field->var_decl_node) = 1;
!     TREE_USED(field->var_decl_node) = 1;
!     TREE_STATIC(field->var_decl_node) = 1;
!     DECL_PRESERVE_P (field->var_decl_node) = 1;
!     }
    }
- #endif
  
  void
  parser_local_add(struct cbl_field_t *new_var )
--- 16506,16537 ----
      }
  
    // We are constructing a completely static constant structure.  We know the
!   // capacity.  We'll create it from the data.initial.
  
!   tree converted = convert_data_initial(field);
  
    static const char name_base[] = "_literal_a_";
  
!   static int nvar = 0;
!   nvar += 1;
  
!   char ach[32];
!   sprintf(ach, "%s%d", name_base, nvar);
!   field->var_decl_node  = gg_define_variable( cblc_field_type_node,
!                                               ach,
!                                               vs_file_static);
!   actually_create_the_static_field(
!               field,
!               converted,
!               strlen(field->data.original())+1,
!               field->data.original(),
!               NULL_TREE,
!               field->var_decl_node);
!   TREE_READONLY(field->var_decl_node) = 1;
!   TREE_USED(field->var_decl_node) = 1;
!   TREE_STATIC(field->var_decl_node) = 1;
!   DECL_PRESERVE_P (field->var_decl_node) = 1;
    }
  
  void
  parser_local_add(struct cbl_field_t *new_var )
*************** parser_local_add(struct cbl_field_t *new
*** 17297,17303 ****
    if( new_var->level == LEVEL01 || new_var->level == LEVEL77)
      {
      // We need to allocate memory on the stack for this variable
!     tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity);
      tree data_decl_node = gg_define_variable( array_type,
                                                      NULL,
                                                      vs_stack);
--- 16560,16566 ----
    if( new_var->level == LEVEL01 || new_var->level == LEVEL77)
      {
      // We need to allocate memory on the stack for this variable
!     tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity());
      tree data_decl_node = gg_define_variable( array_type,
                                                      NULL,
                                                      vs_stack);
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17332,17368 ****
    Analyze();
    SHOW_PARSE
      {
!     do
!       {
!       fprintf(stderr, "( %d ) %s:", CURRENT_LINE_NUMBER, __func__);
!       }
!     while(0);
  
!     fprintf(stderr, " %2.2u %s<%s> off:" HOST_SIZE_T_PRINT_UNSIGNED " "
                      "msiz:%u cap:%u dig:%u rdig:%d attr:0x" HOST_SIZE_T_PRINT_HEX_PURE " loc:%p",
              new_var->level,
              new_var->name,
              cbl_field_type_str(new_var->type),
              (fmt_size_t)new_var->offset,
              new_var->data.memsize,
!             new_var->data.capacity,
              new_var->data.digits,
              new_var->data.rdigits,
              (fmt_size_t)new_var->attr,
              static_cast<void*>(new_var));
  
      if( is_table(new_var) )
        {
!       fprintf(stderr," OCCURS:" HOST_SIZE_T_PRINT_DEC,
                (fmt_size_t)new_var->occurs.ntimes());
        }
      const cbl_field_t *parent = parent_of(new_var);
      if( parent )
        {
!       fprintf(stderr,
                " parent:(" HOST_SIZE_T_PRINT_DEC ")%s",
                (fmt_size_t)new_var->parent,
                parent->name);
        }
      else
        {
--- 16595,16631 ----
    Analyze();
    SHOW_PARSE
      {
!     char ach[1024];
!     SHOW_PARSE_HEADER
  
!     sprintf(ach, " %2.2u %s<%s> off:" HOST_SIZE_T_PRINT_UNSIGNED " "
                      "msiz:%u cap:%u dig:%u rdig:%d attr:0x" HOST_SIZE_T_PRINT_HEX_PURE " loc:%p",
              new_var->level,
              new_var->name,
              cbl_field_type_str(new_var->type),
              (fmt_size_t)new_var->offset,
              new_var->data.memsize,
!             new_var->data.capacity(),
              new_var->data.digits,
              new_var->data.rdigits,
              (fmt_size_t)new_var->attr,
              static_cast<void*>(new_var));
+     SHOW_PARSE_TEXT(ach)
  
      if( is_table(new_var) )
        {
!       sprintf(ach, " OCCURS:" HOST_SIZE_T_PRINT_DEC,
                (fmt_size_t)new_var->occurs.ntimes());
+       SHOW_PARSE_TEXT(ach)
        }
      const cbl_field_t *parent = parent_of(new_var);
      if( parent )
        {
!       sprintf(ach,
                " parent:(" HOST_SIZE_T_PRINT_DEC ")%s",
                (fmt_size_t)new_var->parent,
                parent->name);
+       SHOW_PARSE_TEXT(ach)
        }
      else
        {
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17373,17385 ****
          const symbol_elem_t *e = symbol_at(parent_index);
          if( e->type == SymFile )
            {
!           fprintf(stderr,
                    " parent_file:(" HOST_SIZE_T_PRINT_DEC ")%s",
                    (fmt_size_t)new_var->parent,
                    e->elem.file.name);
            if( e->elem.file.attr & external_e )
              {
!             fprintf(stderr, " (flagged external)");
              }
            }
          }
--- 16636,16650 ----
          const symbol_elem_t *e = symbol_at(parent_index);
          if( e->type == SymFile )
            {
!           sprintf(ach,
                    " parent_file:(" HOST_SIZE_T_PRINT_DEC ")%s",
                    (fmt_size_t)new_var->parent,
                    e->elem.file.name);
+           SHOW_PARSE_TEXT(ach)
            if( e->elem.file.attr & external_e )
              {
!             sprintf(ach, " (flagged external)");
!             SHOW_PARSE_TEXT(ach)
              }
            }
          }
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17387,17404 ****
  
      if( symbol_redefines(new_var) )
        {
!       fprintf(stderr,
                " redefines:(%p)%s",
                static_cast<void*>(symbol_redefines(new_var)),
                symbol_redefines(new_var)->name);
        }
  
      SHOW_PARSE_END
      }
  
    if( new_var->level == 1  && new_var->occurs.bounds.upper )
      {
!     if( new_var->data.memsize < new_var->data.capacity * new_var->occurs.bounds.upper )
        {
        cbl_internal_error("LEVEL 01 (%s) OCCURS "
                           "has insufficient data.memsize", new_var->name);
--- 16652,16695 ----
  
      if( symbol_redefines(new_var) )
        {
!       sprintf(ach,
                " redefines:(%p)%s",
                static_cast<void*>(symbol_redefines(new_var)),
                symbol_redefines(new_var)->name);
+       SHOW_PARSE_TEXT(ach)
        }
  
+     if(    new_var->type == FldGroup
+         || new_var->type == FldAlphanumeric
+         || new_var->type == FldNumericEdited
+         || new_var->type == FldAlphaEdited
+         || new_var->type == FldLiteralA
+         )
+       {
+       if( new_var->data.initial && new_var->data.capacity() )
+         {
+         SHOW_PARSE_INDENT
+         for(size_t i=0; i<new_var->data.capacity(); i++)
+           {
+           fprintf(stderr, "%2.2X ", static_cast<unsigned char>(new_var->data.initial[i]));
+           }
+         }
+       }
+     if( new_var->data.original() && strlen(new_var->data.original()) )
+       {
+       SHOW_PARSE_INDENT
+       sprintf(ach,
+               "\"%s\" (%d)",
+               new_var->data.original(),
+               static_cast<int>(strlen(new_var->data.original())));
+       SHOW_PARSE_TEXT(ach);
+       }
      SHOW_PARSE_END
      }
  
    if( new_var->level == 1  && new_var->occurs.bounds.upper )
      {
!     if( new_var->data.memsize < new_var->data.capacity() * new_var->occurs.bounds.upper )
        {
        cbl_internal_error("LEVEL 01 (%s) OCCURS "
                           "has insufficient data.memsize", new_var->name);
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17419,17427 ****
            {
            gg_free(member(new_var, "data"));
            gg_assign(member(new_var, "data"),
!                     gg_cast(UCHAR_P, gg_malloc(new_var->data.capacity)));
            gg_assign(member(new_var, "allocated"),
!                     build_int_cst_type(SIZE_T, new_var->data.capacity));
            }
          ELSE
            {
--- 16710,16718 ----
            {
            gg_free(member(new_var, "data"));
            gg_assign(member(new_var, "data"),
!                     gg_cast(UCHAR_P, gg_malloc(new_var->data.capacity())));
            gg_assign(member(new_var, "allocated"),
!                     build_int_cst_type(SIZE_T, new_var->data.capacity()));
            }
          ELSE
            {
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17455,17461 ****
        }
  
      size_t length_of_initial_string = 0;
!     char *new_initial = NULL;
  
      //  Make sure we have a new variable to work with.
      if( !new_var )
--- 16746,16752 ----
        }
  
      size_t length_of_initial_string = 0;
!     const char *new_initial = NULL;
  
      //  Make sure we have a new variable to work with.
      if( !new_var )
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17487,17493 ****
        TRACE1_END
        }
  
!     if( is_table(new_var) && new_var->data.capacity == 0)
        {
        cbl_internal_error(
            "%s: %d %s is a table, but it improperly has a capacity of zero",
--- 16778,16784 ----
        TRACE1_END
        }
  
!     if( is_table(new_var) && new_var->data.capacity() == 0)
        {
        cbl_internal_error(
            "%s: %d %s is a table, but it improperly has a capacity of zero",
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17546,17552 ****
                            "%<var_decl_node%>", __func__, new_var->name);
        }
  
!     switch( new_var->type )
        {
        static int counter=1;
        char ach[2*sizeof(cbl_name_t)];
--- 16837,16843 ----
                            "%<var_decl_node%>", __func__, new_var->name);
        }
  
!     switch( new_var->type ) // Trap_here for ordinary variables.
        {
        static int counter=1;
        char ach[2*sizeof(cbl_name_t)];
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17566,17572 ****
      if(    new_var->type == FldNumericBinary
          || new_var->type == FldNumericBin5 )
        {
!       switch( new_var->data.capacity )
          {
          case 1:
          case 2:
--- 16857,16863 ----
      if(    new_var->type == FldNumericBinary
          || new_var->type == FldNumericBin5 )
        {
!       switch( new_var->data.capacity() )
          {
          case 1:
          case 2:
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17579,17585 ****
                    "%s is type %s and has capacity %u\n",
                    new_var->name,
                    cbl_field_type_str(new_var->type),
!                   new_var->data.capacity);
            gcc_unreachable();
            break;
          }
--- 16870,16876 ----
                    "%s is type %s and has capacity %u\n",
                    new_var->name,
                    cbl_field_type_str(new_var->type),
!                   new_var->data.capacity());
            gcc_unreachable();
            break;
          }
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17587,17595 ****
  
      size_t level_88_string_size = 0;
      char *level_88_string = NULL;
      if( ancestor )
        {
!       level_88_string = get_level_88_domain(ancestor->data.capacity, new_var, level_88_string_size);
        }
  
      if( !new_var->data.picture )
--- 16878,16910 ----
  
      size_t level_88_string_size = 0;
      char *level_88_string = NULL;
+     char *class_string = NULL;
      if( ancestor )
        {
!       level_88_string = get_level_88_domain(ancestor->data.capacity(),
!                                             new_var,
!                                             level_88_string_size);
!       if( level_88_string )
!         {
!         // At this point, the string is in source_code encoding, no matter what
!         // the variable's encoding might be.  In the run-time, we will be doing
!         // any comparisons of text strings using UTF32 (because that's how we
!         // handle somebody specifying a UTF-8 exec-charset.)  Rather than
!         // convert this string at run-time, we convert it here:
!         size_t converted_length;
!         const char *converted = __gg__iconverter(
!                                  new_var->codeset.default_encodings.source->type,
!                                  DEFAULT_32_ENCODING,
!                                  level_88_string,
!                                  level_88_string_size,  // Convert the NUL
!                                  &converted_length);
!         level_88_string_size = converted_length;
!         level_88_string = static_cast<char *>(xrealloc(level_88_string,
!                                                        level_88_string_size));
!         memcpy(level_88_string, converted, level_88_string_size);
!         // level_88_string is now a UTF32 string with a terminating four-byte
!         // NUL.
!         }
        }
  
      if( !new_var->data.picture )
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17609,17638 ****
  
      if( new_var->type == FldClass && new_var->level != 88 )
        {
!       new_var->data.initial = get_class_condition_string(new_var);
        }
! 
!     if( new_var->type == FldLiteralA )
        {
!       length_of_initial_string = new_var->data.capacity;
        }
!     else if( new_var->data.initial && new_var->data.initial[0] != '\0' )
        {
        if( new_var->type == FldClass )
          {
!         length_of_initial_string = strlen(new_var->data.initial)+1;
          }
        else if( new_var->type == FldNumericDisplay )
          {
!         length_of_initial_string = strlen(new_var->data.initial)+1;
          }
        else
          {
!         // This is an ordinary string
!         // fprintf(stderr, ">>>>>>> parser_symbol_add %s %s \n", cbl_field_type_str(new_var->type), new_var->name);
!         // fprintf(stderr, "        %d %d\n", (int)strlen(new_var->data.initial), (int)new_var->data.capacity);
!         //length_of_initial_string = strlen(new_var->data.initial) + 1;
!         length_of_initial_string = new_var->data.capacity + 1;
          }
        }
      else
--- 16924,16950 ----
  
      if( new_var->type == FldClass && new_var->level != 88 )
        {
!       class_string = get_class_condition_string(new_var);
!       length_of_initial_string = strlen(class_string)+1;
!       new_initial = class_string;
        }
!     else if( new_var->type == FldLiteralA )
        {
!       length_of_initial_string = new_var->data.capacity();
        }
!     else if( new_var->data.original() && new_var->data.original()[0] != '\0' )
        {
        if( new_var->type == FldClass )
          {
!         length_of_initial_string = strlen(new_var->data.original())+1;
          }
        else if( new_var->type == FldNumericDisplay )
          {
!         length_of_initial_string = strlen(new_var->data.original())+1;
          }
        else
          {
!         length_of_initial_string = new_var->data.capacity() + 1;
          }
        }
      else
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17650,17660 ****
            && new_var->type != FldLiteralN
            && !(new_var->attr & intermediate_e))
        {
!       // During the early stages of implementing cbl_field_t::our_index, there
!       // were execution paths in parse.y and parser.cc that resulted in
!       // our_index not being set.  Those should be gone.
!       fprintf(stderr, "our_index is NULL under unanticipated circumstances");
!       gcc_assert(false);
        }
  
      // When we create the cblc_field_t structure, we need a data pointer
--- 16962,16975 ----
            && new_var->type != FldLiteralN
            && !(new_var->attr & intermediate_e))
        {
!       if( ! (new_var->type == FldFloat && new_var->has_attr(constant_e)) )
!         {
!         // N.B. If level is 0 then we're not participating in a hierarchy.
!         // During the early stages of implementing cbl_field_t::our_index, there
!         // were execution paths in parse.y and parser.cc that resulted in
!         // our_index not being set.  Those should be gone.
!         cbl_errx("%<our_index%> is NULL under unanticipated circumstances");
!         }
        }
  
      // When we create the cblc_field_t structure, we need a data pointer
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17727,17737 ****
       * As of Tue Apr  4 10:29:35 2023, we support 01 CONSTANT numeric values as follows:
       * 1.  FldNumericBin5
       * 2.  always constant_e, also potentially global_e
!      * 3.  compile-time value in cbl_field_data_t::value
       * 4.  cbl_field_data_t::capacity is 0 because it requires no working storage
       */
  
!     if( new_var->data.capacity == 0
          && new_var->level != 88
          && new_var->type  != FldClass
          && new_var->type  != FldLiteralN
--- 17042,17052 ----
       * As of Tue Apr  4 10:29:35 2023, we support 01 CONSTANT numeric values as follows:
       * 1.  FldNumericBin5
       * 2.  always constant_e, also potentially global_e
!      * 3.  compile-time value in cbl_field_data_t::valuer
       * 4.  cbl_field_data_t::capacity is 0 because it requires no working storage
       */
  
!     if( new_var->data.capacity() == 0
          && new_var->level != 88
          && new_var->type  != FldClass
          && new_var->type  != FldLiteralN
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17748,17754 ****
  
      if( level_88_string )
        {
!       new_var->data.initial = level_88_string;
        length_of_initial_string = level_88_string_size;
        }
  
--- 17063,17070 ----
  
      if( level_88_string )
        {
!       new_var->data.original(level_88_string);
!       new_initial = level_88_string;
        length_of_initial_string = level_88_string_size;
        }
  
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17758,17764 ****
        {
        char achDataName[256];
        sprintf(achDataName, "__%s_vardata", external_record_base);
!       tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity);
        new_var->data_decl_node = gg_define_variable(
                            array_type,
                            achDataName,
--- 17074,17080 ----
        {
        char achDataName[256];
        sprintf(achDataName, "__%s_vardata", external_record_base);
!       tree array_type = build_array_type_nelts(UCHAR, new_var->data.capacity());
        new_var->data_decl_node = gg_define_variable(
                            array_type,
                            achDataName,
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17789,17797 ****
          {
          // Create a static array of UCHAR, and make that the data_decl_node
          // size_t bytes_to_allocate = new_var->data.memsize ?
!                                 // new_var->data.memsize : new_var->data.capacity;
          size_t bytes_to_allocate = std::max(new_var->data.memsize,
!                                             new_var->data.capacity);
  
          // A FldClass actually doesn't need any bytes, because the only important
          // thing about it is the .initial field.  We will allocate a single byte,
--- 17105,17113 ----
          {
          // Create a static array of UCHAR, and make that the data_decl_node
          // size_t bytes_to_allocate = new_var->data.memsize ?
!                                 // new_var->data.memsize : new_var->data.capacity();
          size_t bytes_to_allocate = std::max(new_var->data.memsize,
!                                             new_var->data.capacity());
  
          // A FldClass actually doesn't need any bytes, because the only important
          // thing about it is the .initial field.  We will allocate a single byte,
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17876,17909 ****
          }
        }
  
!     if( new_var->data.initial )
!       {
!       new_initial = initial_from_initial(new_var);
!       }
!     if( new_initial )
!       {
!       switch(new_var->type)
!         {
!         case FldGroup:
!         case FldAlphanumeric:
!         case FldLiteralA:
!           length_of_initial_string = new_var->data.capacity+1;
!           break;
! 
!         case FldLiteralN:
!           length_of_initial_string = strlen(new_initial)+1;
!           break;
! 
!         default:
!           length_of_initial_string = new_var->data.capacity;
!           break;
!         }
!       }
!     else
        {
!       new_initial = static_cast<char *>(xmalloc(length_of_initial_string));
!       gcc_assert(new_initial);
!       memcpy(new_initial, new_var->data.initial, length_of_initial_string);
        }
  
      actual_allocate:
--- 17192,17203 ----
          }
        }
  
!     // At this point, new_initial might have been set by
!     // get_class_condition_string.  If not, we set it another way:
!     if( !level_88_string && !class_string)
        {
!       new_initial = const_cast<char *>(new_var->data.initial);
!       length_of_initial_string = new_var->data.capacity();
        }
  
      actual_allocate:
*************** parser_symbol_add(struct cbl_field_t *ne
*** 17913,17924 ****
                                        new_initial,
                                        immediate_parent,
                                        new_var_decl);
!     free(new_initial);
! 
!     if( level_88_string )
!       {
!       free(level_88_string);
!       }
  
      if(  !(new_var->attr & ( linkage_e | based_e)) )
        {
--- 17207,17214 ----
                                        new_initial,
                                        immediate_parent,
                                        new_var_decl);
!     free(level_88_string);
!     free(class_string);
  
      if(  !(new_var->attr & ( linkage_e | based_e)) )
        {
diff -Nrcpad gcc-16-20260111/gcc/cobol/genapi.h gcc-16-20260118/gcc/cobol/genapi.h
*** gcc-16-20260111/gcc/cobol/genapi.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/genapi.h	Sun Jan 18 22:32:06 2026
*************** void
*** 470,475 ****
--- 470,489 ----
  parser_exception_file( cbl_field_t *tgt, cbl_file_t* file = NULL );
  
  void
+ parser_intrinsic_convert(cbl_field_t *tgt,
+                          const cbl_refer_t& input,                           
+                          convert_type_t src_fmt, 
+                          unsigned int   dst_fmt );
+ 
+ void
+ parser_intrinsic_find_string(cbl_field_t *tgt,
+                              const cbl_refer_t& haystack,
+                              const cbl_refer_t& needle,
+                              const cbl_refer_t *after,
+                              bool last,
+                              bool anycase);
+ 
+ void
  parser_module_name( cbl_field_t *tgt, module_type_t type );
  
  void
diff -Nrcpad gcc-16-20260111/gcc/cobol/genmath.cc gcc-16-20260118/gcc/cobol/genmath.cc
*** gcc-16-20260111/gcc/cobol/genmath.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/genmath.cc	Sun Jan 18 22:32:06 2026
*************** arithmetic_operation(size_t nC, cbl_num_
*** 173,185 ****
      temp_field.type = remainder->field->type;
      temp_field.attr = (remainder->field->attr | intermediate_e) & ~initialized_e;
      temp_field.level = 1;
!     temp_field.data.memsize   = remainder->field->data.memsize ;
!     temp_field.data.capacity  = remainder->field->data.capacity;
!     temp_field.data.digits    = remainder->field->data.digits  ;
!     temp_field.data.rdigits   = remainder->field->data.rdigits ;
!     temp_field.data.initial   = remainder->field->data.initial ;
!     temp_field.data.picture   = remainder->field->data.picture ;
!     temp_field.codeset        = remainder->field->codeset ;
      parser_symbol_add(&temp_field);
      temp_remainder.field = &temp_field;
  
--- 173,180 ----
      temp_field.type = remainder->field->type;
      temp_field.attr = (remainder->field->attr | intermediate_e) & ~initialized_e;
      temp_field.level = 1;
!     temp_field.data = remainder->field->data;
!     temp_field.codeset = remainder->field->codeset ;
      parser_symbol_add(&temp_field);
      temp_remainder.field = &temp_field;
  
*************** largest_binary_term(size_t nA, cbl_refer
*** 373,379 ****
        {
        // This is an integer type that can be worked with quickly
        is_negative |= ( A[i].field->attr & signable_e );
!       max_capacity = std::max(max_capacity, A[i].field->data.capacity);
        retval = tree_type_from_size(max_capacity, is_negative);
        }
      else
--- 368,374 ----
        {
        // This is an integer type that can be worked with quickly
        is_negative |= ( A[i].field->attr & signable_e );
!       max_capacity = std::max(max_capacity, A[i].field->data.capacity());
        retval = tree_type_from_size(max_capacity, is_negative);
        }
      else
*************** fast_add( size_t nC, cbl_num_result_t *C
*** 425,431 ****
        // We now either accumulate into C[n] or assign to C[n]:
        for(size_t i=0; i<nC; i++ )
          {
!         tree dest_type = tree_type_from_size(C[i].refer.field->data.capacity, 0);
          tree dest_addr = gg_add(member(C[i].refer.field->var_decl_node, "data"),
                                  refer_offset(C[i].refer));
          tree ptr = gg_cast(build_pointer_type(dest_type), dest_addr);
--- 420,426 ----
        // We now either accumulate into C[n] or assign to C[n]:
        for(size_t i=0; i<nC; i++ )
          {
!         tree dest_type = tree_type_from_size(C[i].refer.field->data.capacity(), 0);
          tree dest_addr = gg_add(member(C[i].refer.field->var_decl_node, "data"),
                                  refer_offset(C[i].refer));
          tree ptr = gg_cast(build_pointer_type(dest_type), dest_addr);
*************** fast_subtract(size_t nC, cbl_num_result_
*** 511,517 ****
        // We now either accumulate into C[n] or assign to C[n]:
        for(size_t i=0; i<nC; i++ )
          {
!         tree dest_type = tree_type_from_size(C[i].refer.field->data.capacity, 0);
          tree dest_addr = gg_add(member(C[i].refer.field->var_decl_node, "data"),
                                  refer_offset(C[i].refer));
          tree ptr = gg_cast(build_pointer_type(dest_type), dest_addr);
--- 506,512 ----
        // We now either accumulate into C[n] or assign to C[n]:
        for(size_t i=0; i<nC; i++ )
          {
!         tree dest_type = tree_type_from_size(C[i].refer.field->data.capacity(), 0);
          tree dest_addr = gg_add(member(C[i].refer.field->var_decl_node, "data"),
                                  refer_offset(C[i].refer));
          tree ptr = gg_cast(build_pointer_type(dest_type), dest_addr);
*************** fast_multiply(size_t nC, cbl_num_result_
*** 583,589 ****
        // We now either multiply into C[n] or assign A * B to C[n]:
        for(size_t i=0; i<nC; i++ )
          {
!         tree dest_type = tree_type_from_size(C[i].refer.field->data.capacity, 0);
          tree dest_addr = gg_add(member(C[i].refer.field->var_decl_node, "data"),
                                  refer_offset(C[i].refer));
          tree ptr = gg_cast(build_pointer_type(dest_type), dest_addr);
--- 578,584 ----
        // We now either multiply into C[n] or assign A * B to C[n]:
        for(size_t i=0; i<nC; i++ )
          {
!         tree dest_type = tree_type_from_size(C[i].refer.field->data.capacity(), 0);
          tree dest_addr = gg_add(member(C[i].refer.field->var_decl_node, "data"),
                                  refer_offset(C[i].refer));
          tree ptr = gg_cast(build_pointer_type(dest_type), dest_addr);
*************** fast_divide(size_t nC, cbl_num_result_t
*** 663,669 ****
        for(size_t i=0; i<nC; i++ )
          {
          tree dest_type =
!                        tree_type_from_size(C[i].refer.field->data.capacity, 0);
          tree dest_addr = gg_add(member( C[i].refer.field->var_decl_node,
                                          "data"),
                                  refer_offset(C[i].refer));
--- 658,664 ----
        for(size_t i=0; i<nC; i++ )
          {
          tree dest_type =
!                        tree_type_from_size(C[i].refer.field->data.capacity(), 0);
          tree dest_addr = gg_add(member( C[i].refer.field->var_decl_node,
                                          "data"),
                                  refer_offset(C[i].refer));
*************** fast_divide(size_t nC, cbl_num_result_t
*** 690,696 ****
            {
            dest_addr = gg_add( member(remainder.field->var_decl_node, "data"),
                                refer_offset(remainder));
!           dest_type = tree_type_from_size(remainder.field->data.capacity, 0);
            ptr = gg_cast(build_pointer_type(dest_type), dest_addr);
  
            gg_assign(gg_indirect(ptr),
--- 685,691 ----
            {
            dest_addr = gg_add( member(remainder.field->var_decl_node, "data"),
                                refer_offset(remainder));
!           dest_type = tree_type_from_size(remainder.field->data.capacity(), 0);
            ptr = gg_cast(build_pointer_type(dest_type), dest_addr);
  
            gg_assign(gg_indirect(ptr),
*************** parser_subtract(size_t nC, cbl_num_resul
*** 1536,1542 ****
                                    error,
                                    not_error,
                                    compute_error,
!                                   "__gg__fixed_phase2_assign_to_c");
              }
            arithmetic_error_handler( error,
                                      not_error,
--- 1531,1537 ----
                                    error,
                                    not_error,
                                    compute_error,
!                                   "__gg__float_phase2_assign_to_c");
              }
            arithmetic_error_handler( error,
                                      not_error,
diff -Nrcpad gcc-16-20260111/gcc/cobol/genutil.cc gcc-16-20260118/gcc/cobol/genutil.cc
*** gcc-16-20260111/gcc/cobol/genutil.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/genutil.cc	Sun Jan 18 22:32:06 2026
*************** get_any_capacity(cbl_field_t *field)
*** 295,301 ****
      }
    else
      {
!     return build_int_cst_type(SIZE_T, field->data.capacity);
      }
    }
  
--- 295,301 ----
      }
    else
      {
!     return build_int_cst_type(SIZE_T, field->data.capacity());
      }
    }
  
*************** get_and_check_refstart_and_reflen(  tree
*** 316,321 ****
--- 316,326 ----
    const cbl_enabled_exceptions_t&
                                  enabled_exceptions( cdf_enabled_exceptions() );
  
+   // These calculations are based on position within the field, so offset and
+   // length have to be multiplied by the stride of the encoding:
+   const charmap_t *charmap = __gg__get_charmap(refer.field->codeset.encoding);
+   tree stride = build_int_cst_type(LONG, charmap->stride());
+ 
    if( !enabled_exceptions.match(ec_bound_ref_mod_e) )
      {
      // This is normal operation -- no exception checking.  Thus, we won't
*************** get_and_check_refstart_and_reflen(  tree
*** 327,332 ****
--- 332,338 ----
                        refer.refmod.from->field,
                        refer_offset(*refer.refmod.from));
      gg_decrement(refstart);
+     gg_assign(refstart, gg_multiply(refstart, stride));
  
      if( refer.refmod.len )
        {
*************** get_and_check_refstart_and_reflen(  tree
*** 334,345 ****
        get_integer_value(reflen,
                          refer.refmod.len->field,
                          refer_offset(*refer.refmod.len));
        }
      else
        {
        // The length was not specified, so we need to return the distance
        // between refmod.from and the end of the field:
!       gg_assign(reflen, gg_subtract( get_any_capacity(refer.field), refstart) );
        }
      return;
      }
--- 340,355 ----
        get_integer_value(reflen,
                          refer.refmod.len->field,
                          refer_offset(*refer.refmod.len));
+       // Modify refer.length by stride:
+       gg_assign(reflen, gg_multiply(reflen, stride));
        }
      else
        {
        // The length was not specified, so we need to return the distance
        // between refmod.from and the end of the field:
!       gg_assign(reflen,
!                 gg_subtract( get_any_capacity(refer.field),
!                                      refstart) );
        }
      return;
      }
*************** get_and_check_refstart_and_reflen(  tree
*** 366,371 ****
--- 376,382 ----
  
    // Make refstart zero-based:
    gg_decrement(refstart);
+   gg_assign(refstart, gg_multiply(refstart, stride));
  
    IF( refstart, lt_op, build_int_cst_type(LONG, 0 ) )
      {
*************** get_and_check_refstart_and_reflen(  tree
*** 374,389 ****
      gg_assign(refstart, gg_cast(LONG, integer_zero_node));
      // Set reflen to one here, because otherwise it won't be established.
      gg_assign(reflen, gg_cast(TREE_TYPE(reflen), integer_one_node));
      }
    ELSE
      {
      IF( refstart, gt_op, gg_cast(TREE_TYPE(refstart), get_any_capacity(refer.field)) )
        {
!       // refstart greater than zero is an error condition:
        set_exception_code(ec_bound_ref_mod_e);
        gg_assign(refstart, gg_cast(LONG, integer_zero_node));
        // Set reflen to one here, because otherwise it won't be established.
        gg_assign(reflen, gg_cast(TREE_TYPE(reflen), integer_one_node));
        }
      ELSE
        {
--- 385,402 ----
      gg_assign(refstart, gg_cast(LONG, integer_zero_node));
      // Set reflen to one here, because otherwise it won't be established.
      gg_assign(reflen, gg_cast(TREE_TYPE(reflen), integer_one_node));
+     gg_assign(reflen, gg_multiply(reflen, stride));
      }
    ELSE
      {
      IF( refstart, gt_op, gg_cast(TREE_TYPE(refstart), get_any_capacity(refer.field)) )
        {
!       // refstart greater than capacity is an error condition:
        set_exception_code(ec_bound_ref_mod_e);
        gg_assign(refstart, gg_cast(LONG, integer_zero_node));
        // Set reflen to one here, because otherwise it won't be established.
        gg_assign(reflen, gg_cast(TREE_TYPE(reflen), integer_one_node));
+       gg_assign(reflen, gg_multiply(reflen, stride));
        }
      ELSE
        {
*************** get_and_check_refstart_and_reflen(  tree
*** 393,398 ****
--- 406,412 ----
                            refer.refmod.len->field,
                            refer_offset(*refer.refmod.len),
                            CHECK_FOR_FRACTIONAL_DIGITS);
+         gg_assign(reflen, gg_multiply(reflen, stride));
          IF( var_decl_rdigits,
              ne_op,
              integer_zero_node )
*************** get_and_check_refstart_and_reflen(  tree
*** 400,405 ****
--- 414,420 ----
            // length is not an integer, which is an error condition
            set_exception_code(ec_bound_ref_mod_e);
            gg_assign(reflen, gg_cast(LONG, integer_one_node));
+           gg_assign(reflen, gg_multiply(reflen, stride));
            gg_assign(var_decl_rdigits, integer_zero_node);
            }
          ELSE
*************** get_and_check_refstart_and_reflen(  tree
*** 410,415 ****
--- 425,431 ----
              // length is too small, which is an error condition.
              set_exception_code(ec_bound_ref_mod_e);
              gg_assign(reflen, gg_cast(LONG, integer_one_node));
+             gg_assign(reflen, gg_multiply(reflen, stride));
              }
            ELSE
              {
*************** get_and_check_refstart_and_reflen(  tree
*** 431,436 ****
--- 447,453 ----
                // as the TODO item.
                gg_assign(refstart, gg_cast(LONG, integer_zero_node));
                gg_assign(reflen, gg_cast(LONG, integer_one_node));
+               gg_assign(reflen, gg_multiply(reflen, stride));
                }
              ELSE
                {
*************** get_and_check_refstart_and_reflen(  tree
*** 442,447 ****
--- 459,466 ----
              ENDIF
            }
            ENDIF
+         // Modify the length calculation for stride:
+         //gg_assign(reflen, gg_multiply(reflen, stride));
          }
        else
          {
*************** get_data_offset(const cbl_refer_t &refer
*** 578,584 ****
  
      // We need to start with the rightmost subscript, and work our way up through
      // our parents.  As we find each parent with an OCCURS, we increment qual_data
!     // by (subscript-1)*An->data.capacity
  
      // Establish the field_t pointer for walking up through our ancestors:
      cbl_field_t *parent = refer.field;
--- 597,603 ----
  
      // We need to start with the rightmost subscript, and work our way up through
      // our parents.  As we find each parent with an OCCURS, we increment qual_data
!     // by (subscript-1)*An->data.capacity()
  
      // Establish the field_t pointer for walking up through our ancestors:
      cbl_field_t *parent = refer.field;
*************** get_binary_value( tree value,
*** 788,793 ****
--- 807,815 ----
      case FldNumericDisplay:
        {
        Analyzer.Message("FldNumericDisplay");
+       const charmap_t *charmap = __gg__get_charmap(field->codeset.encoding);
+       int stride = charmap->stride();
+ 
        // Establish the source
        tree source_address = get_data_address(field, field_offset);
  
*************** get_binary_value( tree value,
*** 859,866 ****
                  // The final byte is '+' or '-'
                  gg_assign(signp,
                            gg_add(source_address,
!                                 build_int_cst_type( SIZE_T,
!                                                     field->data.digits)));
                  }
                }
              else
--- 881,888 ----
                  // The final byte is '+' or '-'
                  gg_assign(signp,
                            gg_add(source_address,
!                                 build_int_cst_type(SIZE_T,
!                                                   field->data.digits*stride)));
                  }
                }
              else
*************** get_binary_value( tree value,
*** 877,883 ****
                  gg_assign(signp,
                            gg_add(source_address,
                                  build_int_cst_type( SIZE_T,
!                                                     field->data.digits-1)));
                  }
                }
              }
--- 899,905 ----
                  gg_assign(signp,
                            gg_add(source_address,
                                  build_int_cst_type( SIZE_T,
!                                               (field->data.digits-1)*stride)));
                  }
                }
              }
*************** get_binary_value( tree value,
*** 913,919 ****
        tree source = get_data_address(field, field_offset);
  
        size_t dest_nbytes   = gg_sizeof(value);
!       size_t source_nbytes = field->data.capacity;
  
        if( debugging )
          {
--- 935,941 ----
        tree source = get_data_address(field, field_offset);
  
        size_t dest_nbytes   = gg_sizeof(value);
!       size_t source_nbytes = field->data.capacity();
  
        if( debugging )
          {
*************** get_binary_value( tree value,
*** 1014,1020 ****
          }
        tree source_address = get_data_address(field, field_offset);
        tree dest_type = TREE_TYPE(value);
!       tree source_type = tree_type_from_size( field->data.capacity,
                                                field->attr & signable_e);
        if( debugging && rdigits)
          {
--- 1036,1042 ----
          }
        tree source_address = get_data_address(field, field_offset);
        tree dest_type = TREE_TYPE(value);
!       tree source_type = tree_type_from_size( field->data.capacity(),
                                                field->attr & signable_e);
        if( debugging && rdigits)
          {
*************** get_binary_value( tree value,
*** 1045,1051 ****
                                      get_data_address( field,
                                                        field_offset),
                                      build_int_cst_type(INT,
!                                                       field->data.capacity),
                                      NULL_TREE)));
        break;
        }
--- 1067,1073 ----
                                      get_data_address( field,
                                                        field_offset),
                                      build_int_cst_type(INT,
!                                                       field->data.capacity()),
                                      NULL_TREE)));
        break;
        }
*************** static tree
*** 1096,1102 ****
  tree_type_from_field(const cbl_field_t *field)
    {
    gcc_assert(field);
!   return tree_type_from_size(field->data.capacity, field->attr & signable_e);
    }
  
  tree
--- 1118,1124 ----
  tree_type_from_field(const cbl_field_t *field)
    {
    gcc_assert(field);
!   return tree_type_from_size(field->data.capacity(), field->attr & signable_e);
    }
  
  tree
*************** copy_little_endian_into_place(cbl_field_
*** 1566,1572 ****
      }
    scale_by_power_of_ten_N(value, dest->data.rdigits - rhs_rdigits);
  
!   tree dest_type = tree_type_from_size( dest->data.capacity,
                                          dest->attr & signable_e);
    tree dest_pointer = gg_add(member(dest->var_decl_node, "data"),
                               dest_offset);
--- 1588,1594 ----
      }
    scale_by_power_of_ten_N(value, dest->data.rdigits - rhs_rdigits);
  
!   tree dest_type = tree_type_from_size( dest->data.capacity(),
                                          dest->attr & signable_e);
    tree dest_pointer = gg_add(member(dest->var_decl_node, "data"),
                               dest_offset);
*************** char *
*** 1740,1762 ****
  get_literal_string(cbl_field_t *field)
    {
    assert(field->type == FldLiteralA);
!   size_t buffer_length = field->data.capacity+1;
    char *buffer = static_cast<char *>(xcalloc(1, buffer_length));
  
    size_t charsout;
    const char *converted = __gg__iconverter(DEFAULT_SOURCE_ENCODING,
                                       field->codeset.encoding,
!                                      field->data.initial,
!                                      field->data.capacity,
                                       &charsout);
!   memcpy(buffer, converted, field->data.capacity+1);
    return buffer;
    }
  
  bool
  refer_is_clean(const cbl_refer_t &refer)
    {
!   if( !refer.field || refer.field->type == FldLiteralN )
      {
      // It is routine for a refer to have no field.  It happens when the parser
      // passes us a refer for an optional parameter that has been omitted, for
--- 1762,1784 ----
  get_literal_string(cbl_field_t *field)
    {
    assert(field->type == FldLiteralA);
!   size_t buffer_length = field->data.capacity()+1;
    char *buffer = static_cast<char *>(xcalloc(1, buffer_length));
  
    size_t charsout;
    const char *converted = __gg__iconverter(DEFAULT_SOURCE_ENCODING,
                                       field->codeset.encoding,
!                                      field->data.original(),
!                                      field->data.capacity(),
                                       &charsout);
!   memcpy(buffer, converted, field->data.capacity()+1);
    return buffer;
    }
  
  bool
  refer_is_clean(const cbl_refer_t &refer)
    {
!     if( !refer.field || refer.field->is_numeric_constant() )
      {
      // It is routine for a refer to have no field.  It happens when the parser
      // passes us a refer for an optional parameter that has been omitted, for
*************** refer_is_clean(const cbl_refer_t &refer)
*** 1766,1772 ****
      // like.
      return true;
      }
! 
    return     !refer.all
            && !refer.addr_of
            && !refer.nsubscript()
--- 1788,1794 ----
      // like.
      return true;
      }
!     
    return     !refer.all
            && !refer.addr_of
            && !refer.nsubscript()
*************** refer_fill_depends(const cbl_refer_t &re
*** 1818,1824 ****
    // We multiply the ODO value by the size of the data capacity to get the
    // shortened length:
  
!   tree mult_expr = gg_multiply( build_int_cst_type(TREE_TYPE(value64), odo->data.capacity),
                                  value64 );
  
    // And we add that to the distance from the requested variable to the odo
--- 1840,1847 ----
    // We multiply the ODO value by the size of the data capacity to get the
    // shortened length:
  
!   tree mult_expr = gg_multiply( build_int_cst_type(TREE_TYPE(value64),
!                                                    odo->data.capacity()),
                                  value64 );
  
    // And we add that to the distance from the requested variable to the odo
*************** refer_size_source(const cbl_refer_t &ref
*** 1918,1925 ****
  
        */
  
-   // This test has to be here, otherwise there are failures in regression
-   // testing.
    if( !refer.field )
      {
      return size_t_zero_node;
--- 1941,1946 ----
diff -Nrcpad gcc-16-20260111/gcc/cobol/lang-specs.h gcc-16-20260118/gcc/cobol/lang-specs.h
*** gcc-16-20260111/gcc/cobol/lang-specs.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/lang-specs.h	Sun Jan 18 22:32:06 2026
***************
*** 37,54 ****
--- 37,58 ----
          "%{D*} %{E} %{I*} %{M} %{fmax-errors*} %{fsyntax-only*} "
          "%{fcobol-exceptions*} "
          "%{copyext} "
+         "%{fexec-charset*} "
+         "%{fexec-national-charset*} "
          "%{fstatic-call} %{fdefaultbyte} "
          "%{ffixed-form} %{ffree-form} %{indicator-column*} "
          "%{preprocess} "
          "%{dialect} "
          "%{include} "
  	"%{Wno-apply-commit} "
+ 	"%{Wno-any-length} "
  	"%{Wno-file-code-set} "
  	"%{Wno-high-order-bit} "
  	"%{Wno-bad-line-directive} "
  	"%{Wno-bad-numeric} "
  	"%{Wno-binary-long-long} "
  	"%{Wno-call-giving} "
+ 	"%{Wno-call-literal} "
  	"%{Wno-cdf-dollar} "
  	"%{Wno-cdf-invalid-parameter} "
  	"%{Wno-cdf-name-not-found} "
***************
*** 71,76 ****
--- 75,81 ----
  	"%{Wno-literal-concat} "
  	"%{Wno-locale-error} "
  	"%{Wno-move-corresponding} "
+ 	"%{Wno-move-index} "
  	"%{Wno-move-pointer} "
  	"%{Wno-nllanginfo-error} "
  	"%{Wno-operator-space} "
diff -Nrcpad gcc-16-20260111/gcc/cobol/lang.opt gcc-16-20260118/gcc/cobol/lang.opt
*** gcc-16-20260111/gcc/cobol/lang.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/lang.opt	Sun Jan 18 22:32:06 2026
*************** copyext
*** 73,78 ****
--- 73,86 ----
  Cobol Joined Separate Var(cobol_copyext) Init(0)
  Define alternative implicit copybook filename extension.
  
+ fexec-charset=
+ Cobol Joined Var(cobol_charset) RejectNegative
+ ; Documented in c.opt
+ 
+ fexec-national-charset=
+ Cobol Joined Var(cobol_national_charset) RejectNegative
+ Set the default execution character set for NATIONAL data items
+ 
  ;; warnings
  
  ; Par78CdfDefinedW
*************** Wcall-giving
*** 90,95 ****
--- 98,108 ----
  Cobol Warning Var(call_giving, 1) Init(1)
  Warn if CALL ... GIVING is used.
  
+ ; MfCallLiteral
+ Wcall-literal
+ Cobol Warning Var(call_literal, 1) Init(1)
+ Warn if CALL is used is used with a literal parameter by reference.
+ 
  ; MfCdfDollar
  Wcdf-dollar
  Cobol Warning Var(cdf_dollar, 1) Init(1)
*************** Wlevel-78
*** 120,125 ****
--- 133,148 ----
  Cobol Warning Var(level_78, 1) Init(1)
  Warn if Level 78 is used.
  
+ ; MfAnyLengthContained
+ Wany-length
+ Cobol Warning Var(cobol_any_length, 1) Init(1)
+ Warn if ANY LENGTH is used in outermost program.
+ 
+ ; MfMoveIndex
+ Wmove-index
+ Cobol Warning Var(move_index, 1) Init(1)
+ Warn if MOVE INDEX is used
+ 
  ; MfMovePointer
  Wmove-pointer
  Cobol Warning Var(move_pointer, 1) Init(1)
*************** findicator-column
*** 336,345 ****
  Cobol RejectNegative Joined Separate UInteger Var(indicator_column) Init(0) IntegerRange(0, 8)
  -findicator-column=<n>	Column after which Region A begins.
  
- finternal-ebcdic
- Cobol Var(cobol_ebcdic, 1) Init(0)
- -finternal-ebcdic	Internal processing is in EBCDIC Code Page 1140.
- 
  fstatic-call
  Cobol Var(cobol_static_call, 1) Init(1)
  Enable/disable static linkage for CALL literals.
--- 359,364 ----
diff -Nrcpad gcc-16-20260111/gcc/cobol/lang.opt.urls gcc-16-20260118/gcc/cobol/lang.opt.urls
*** gcc-16-20260111/gcc/cobol/lang.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/lang.opt.urls	Sun Jan 18 22:32:06 2026
*************** UrlSuffix(gcc/Directory-Options.html#ind
*** 13,18 ****
--- 13,21 ----
  M
  UrlSuffix(gcc/Preprocessor-Options.html#index-M) LangUrlSuffix_D(gdc/Code-Generation.html#index-M)
  
+ fexec-charset=
+ UrlSuffix(gcc/Preprocessor-Options.html#index-fexec-charset)
+ 
  ffixed-form
  LangUrlSuffix_Fortran(gfortran/Fortran-Dialect-Options.html#index-ffixed-form)
  
diff -Nrcpad gcc-16-20260111/gcc/cobol/lexio.cc gcc-16-20260118/gcc/cobol/lexio.cc
*** gcc-16-20260111/gcc/cobol/lexio.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/lexio.cc	Sun Jan 18 22:32:06 2026
*************** parse_copy_directive( filespan_t& mfile
*** 991,999 ****
        if( yy_flex_debug ) {
          size_t nnl = 1 + count_newlines(mfile.data, copy_stmt.p);
          size_t nst = 1 + count_newlines(copy_stmt.p, copy_stmt.pend);
!         dbgmsg("%s:%d: line " HOST_SIZE_T_PRINT_UNSIGNED
                 ": COPY directive is " HOST_SIZE_T_PRINT_UNSIGNED " lines '%.*s'",
!                __func__, __LINE__,
                 (fmt_size_t)nnl, (fmt_size_t)nst, copy_stmt.size(), copy_stmt.p);
        }
      }
--- 991,999 ----
        if( yy_flex_debug ) {
          size_t nnl = 1 + count_newlines(mfile.data, copy_stmt.p);
          size_t nst = 1 + count_newlines(copy_stmt.p, copy_stmt.pend);
!         dbgmsg("%s:%d: %s:" HOST_SIZE_T_PRINT_UNSIGNED
                 ": COPY directive is " HOST_SIZE_T_PRINT_UNSIGNED " lines '%.*s'",
!                __func__, __LINE__, cobol_filename(), 
                 (fmt_size_t)nnl, (fmt_size_t)nst, copy_stmt.size(), copy_stmt.p);
        }
      }
diff -Nrcpad gcc-16-20260111/gcc/cobol/messages.cc gcc-16-20260118/gcc/cobol/messages.cc
*** gcc-16-20260111/gcc/cobol/messages.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/messages.cc	Sun Jan 18 22:32:06 2026
*************** std::set<cbl_diag_t> cbl_diagnostics {
*** 138,148 ****
  
    { MfBinaryLongLong, "-Wbinary-long-long", diagnostics::kind::error, dialect_mf_gnu },
    { MfCallGiving, "-Wcall-giving", diagnostics::kind::error, dialect_mf_gnu },
    { MfCdfDollar, "-Wcdf-dollar", diagnostics::kind::error, dialect_mf_gnu },
    { MfComp6, "-Wcomp-6", diagnostics::kind::error, dialect_mf_gnu },
    { MfCompX, "-Wcomp-x", diagnostics::kind::error, dialect_mf_gnu },
!   { MfLevel_1_Occurs, "Wlevel-1-occurs", diagnostics::kind::error, dialect_mf_gnu },
    { MfLevel78, "-Wlevel-78", diagnostics::kind::error, dialect_mf_gnu },
    { MfMovePointer, "-Wmove-pointer", diagnostics::kind::error, dialect_mf_gnu },
    { MfReturningNum, "-Wreturning-number", diagnostics::kind::error, dialect_mf_gnu },
    { MfUsageTypename, "-Wusage-typename", diagnostics::kind::error, dialect_mf_gnu },
--- 138,151 ----
  
    { MfBinaryLongLong, "-Wbinary-long-long", diagnostics::kind::error, dialect_mf_gnu },
    { MfCallGiving, "-Wcall-giving", diagnostics::kind::error, dialect_mf_gnu },
+   { MfCallLiteral, "-Wcall-literal", diagnostics::kind::error, dialect_mf_e },
    { MfCdfDollar, "-Wcdf-dollar", diagnostics::kind::error, dialect_mf_gnu },
    { MfComp6, "-Wcomp-6", diagnostics::kind::error, dialect_mf_gnu },
    { MfCompX, "-Wcomp-x", diagnostics::kind::error, dialect_mf_gnu },
!   { MfLevel_1_Occurs, "-Wlevel-1-occurs", diagnostics::kind::error, dialect_mf_gnu },
    { MfLevel78, "-Wlevel-78", diagnostics::kind::error, dialect_mf_gnu },
+   { MfAnyLength, "-Wany-length", diagnostics::kind::error, dialect_mf_gnu },
+   { MfMoveIndex, "-Wmove-index", diagnostics::kind::error, dialect_gnu_e },
    { MfMovePointer, "-Wmove-pointer", diagnostics::kind::error, dialect_mf_gnu },
    { MfReturningNum, "-Wreturning-number", diagnostics::kind::error, dialect_mf_gnu },
    { MfUsageTypename, "-Wusage-typename", diagnostics::kind::error, dialect_mf_gnu },
*************** cbl_diagnostic_kind( cbl_diag_id_t id, d
*** 221,237 ****
    return false;
  }
  
- bool
- cbl_diagnostic_kind( cbl_dialect_t dialect, diagnostics::kind kind ) {
-   bool ok = true;
-   for( auto diag : cbl_diagnostics ) {
-     if( diag.dialect == dialect ) {
-       if( ! cbl_diagnostic_kind(diag.id, kind) ) ok = false;
-     }
-   }
-   return ok;
- }
- 
  void
  cobol_warning( cbl_diag_id_t id, int yn, bool warning_as_error ) {
    gcc_assert( 0 <= yn && yn <= 1 );
--- 224,229 ----
*************** cobol_warning( cbl_diag_id_t id, int yn,
*** 246,251 ****
--- 238,270 ----
    cbl_diagnostic_kind(id, kind);
  }
  
+ /*
+  * Set diagnostics associated with a dialog to be ignored, because the
+  * constructs are valid for that dialog.  We cannot use cbl_diagnostic_kind()
+  * for this purpose because it modified the std::set that we're iterating over.
+  */
+ void
+ cobol_warning_suppress( cbl_dialect_t dialect ) {
+   std::set<cbl_diag_t> modified;
+ 
+   for( auto diag : cbl_diagnostics ) {
+     if( diag.dialect & dialect ) {
+       switch(diag.id) {
+       case IbmSectionNegE:
+       case IbmSectionRangeE:
+       case IbmSectionSegmentW:
+         break; // do not suppress
+       default:
+         diag.kind = diagnostics::kind::ignored;
+         break;
+       }
+     }
+     modified.insert(diag);
+   }
+   cbl_diagnostics.clear();
+   cbl_diagnostics.insert(modified.begin(), modified.end());
+ }
+ 
  static inline const char *
  option_of( cbl_diag_id_t id ) {
    auto diag = cbl_diagnostics.find(cbl_diag_t(id));
diff -Nrcpad gcc-16-20260111/gcc/cobol/parse.y gcc-16-20260118/gcc/cobol/parse.y
*** gcc-16-20260111/gcc/cobol/parse.y	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/parse.y	Sun Jan 18 22:32:06 2026
*************** class locale_tgt_t {
*** 132,137 ****
--- 132,154 ----
        }
        return true;
      }
+     cbl_encoding_t encode_as() const {
+       switch(prefix[0]) {
+       case '\0':
+       case 'X': 
+       case 'Z': 
+         return current_encoding('A');
+       case 'N': 
+         return current_encoding('N');
+       default:
+         dbgmsg("no such prefix '%s'", prefix);
+         if( prefix[0] != ftoupper(prefix[0]) ) {
+           gcc_unreachable();
+         }
+         break;
+       }
+       gcc_unreachable();
+     }
    };
  
    struct acrc_t { // Abbreviated combined relation condition
*************** class locale_tgt_t {
*** 238,244 ****
  
    struct cbl_field_t;
    static inline cbl_field_t *
!   new_literal( const char initial[], enum radix_t radix );
  #pragma GCC diagnostic pop
  
    enum select_clause_t {
--- 255,261 ----
  
    struct cbl_field_t;
    static inline cbl_field_t *
!   new_literal( const cbl_loc_t loc, const char initial[], enum radix_t radix );
  #pragma GCC diagnostic pop
  
    enum select_clause_t {
*************** class locale_tgt_t {
*** 716,722 ****
  
  %type   <field_data>    value78
  %type   <field>         literal name nume typename
! %type   <field>         num_literal signed_literal
  
  %type	<number>	perform_start
  %type   <refer>         perform_times
--- 733,739 ----
  
  %type   <field_data>    value78
  %type   <field>         literal name nume typename
! %type   <field>         num_constant num_literal signed_literal
  
  %type	<number>	perform_start
  %type   <refer>         perform_times
*************** class locale_tgt_t {
*** 750,756 ****
  %type   <refer>         advancing  advance_by
  %type   <refer>         alphaval alpha_val numeref scalar scalar88
  %type   <refer>         tableref tableish
! %type   <refer>         varg varg1 varg1a
  %type   <refer>         expr expr_term compute_expr free_tgt by_value_arg
  %type   <refer>         move_tgt selected_name read_key read_into vary_by
  %type   <refer>         accept_refer num_operand envar search_expr any_arg
--- 767,773 ----
  %type   <refer>         advancing  advance_by
  %type   <refer>         alphaval alpha_val numeref scalar scalar88
  %type   <refer>         tableref tableish
! %type   <refer>         varg varg1 varg1a start_after start_pos
  %type   <refer>         expr expr_term compute_expr free_tgt by_value_arg
  %type   <refer>         move_tgt selected_name read_key read_into vary_by
  %type   <refer>         accept_refer num_operand envar search_expr any_arg
*************** class locale_tgt_t {
*** 791,797 ****
  %type   <field>         intrinsic0
  %type   <number>        intrinsic_v intrinsic_I intrinsic_N intrinsic_X
  %type   <number>        intrinsic_I2 intrinsic_N2 intrinsic_X2
! %type   <number>        lopper_case
  %type   <number>        return_body return_file
  %type   <field>         trim_trailing function_udf
  
--- 808,814 ----
  %type   <field>         intrinsic0
  %type   <number>        intrinsic_v intrinsic_I intrinsic_N intrinsic_X
  %type   <number>        intrinsic_I2 intrinsic_N2 intrinsic_X2
! %type   <number>        lopper_case 
  %type   <number>        return_body return_file
  %type   <field>         trim_trailing function_udf
  
*************** class locale_tgt_t {
*** 835,850 ****
  %type   <boolean>       io_invalid  read_eof  write_eop
                          global is_global anycase backward
                          end_display
!                         exh_changed exh_named
                          override
  %type   <number>        mistake globally first_last
! %type   <io_mode>   io_mode
  
  %type   <label_pair>    xmlprocs
  %type   <error>         xmlexcept xmlexcepts
  %type   <field>         xmlencoding xmlvalidating
  %type   <number>        xmlreturning
  %type   <label>         xmlparse_body
  
  %type   <labels>        labels
  %type   <label>         label_1 section_name
--- 852,869 ----
  %type   <boolean>       io_invalid  read_eof  write_eop
                          global is_global anycase backward
                          end_display
!                         exh_changed exh_named last
                          override
  %type   <number>        mistake globally first_last
! %type   <io_mode>       io_mode
  
  %type   <label_pair>    xmlprocs
  %type   <error>         xmlexcept xmlexcepts
  %type   <field>         xmlencoding xmlvalidating
+ %type   <field>         xmlgen_count
  %type   <number>        xmlreturning
  %type   <label>         xmlparse_body
+ %type   <xml_decl_attr> xmlgen_decl
  
  %type   <labels>        labels
  %type   <label>         label_1 section_name
*************** class locale_tgt_t {
*** 863,869 ****
  %type   <replacement>   init_by
  %type   <replacements>  init_bys init_replace
  %type   <refer>         init_data exit_with stop_status
! %type   <float128>      cce_expr cce_factor const_value
  %type   <prog_end>      end_program1
  %type   <substitution>  subst_input
  %type   <substitutions> subst_inputs
--- 882,888 ----
  %type   <replacement>   init_by
  %type   <replacements>  init_bys init_replace
  %type   <refer>         init_data exit_with stop_status
! %type   <cce_type>      cce_expr cce_factor const_value
  %type   <prog_end>      end_program1
  %type   <substitution>  subst_input
  %type   <substitutions> subst_inputs
*************** class locale_tgt_t {
*** 888,899 ****
  %type   <namelocs>      repo_func_names
  %type   <codeset>       codeset_name
  %type   <locale_phrase> locale_phrase
  
  %union {
      bool boolean;
      int number;
      char *string;
!     REAL_VALUE_TYPE float128;
      literal_t literal;
      cbl_field_attr_t field_attr;
      ec_type_t ec_type;
--- 907,919 ----
  %type   <namelocs>      repo_func_names
  %type   <codeset>       codeset_name
  %type   <locale_phrase> locale_phrase
+ %type   <number>        convert_hex convert_nat convert_alpha // convert_fmt
  
  %union {
      bool boolean;
      int number;
      char *string;
!     struct { REAL_VALUE_TYPE r; char *s; } cce_type;
      literal_t literal;
      cbl_field_attr_t field_attr;
      ec_type_t ec_type;
*************** class locale_tgt_t {
*** 902,908 ****
      cbl_namelocs_t *namelocs;
             declarative_list_t* dcl_list_t;
             isym_list_t* isym_list;
!     struct { radix_t radix; char *string; } numstr;
      struct { YYLTYPE loc; int token; literal_t name; } prog_end;
      struct { int token; special_name_t id; } special_type;
      struct { char locale_type; const char * name; } locale_phrase;
--- 922,928 ----
      cbl_namelocs_t *namelocs;
             declarative_list_t* dcl_list_t;
             isym_list_t* isym_list;
!     struct { bool is_float; radix_t radix; char *string; } numstr;
      struct { YYLTYPE loc; int token; literal_t name; } prog_end;
      struct { int token; special_name_t id; } special_type;
      struct { char locale_type; const char * name; } locale_phrase;
*************** class locale_tgt_t {
*** 979,985 ****
      struct { enum select_clause_t clause; cbl_file_t *file; } select_clause;
      struct { size_t clauses; cbl_file_t *file; } select_clauses;
      struct { YYLTYPE loc; char *on, *off; } switches;
!     struct cbl_domain_t *false_domain;
      struct { size_t also; unsigned char *low, *high; } colseq;
      struct { cbl_field_attr_t attr; int nbyte; } pic_part;
  
--- 999,1005 ----
      struct { enum select_clause_t clause; cbl_file_t *file; } select_clause;
      struct { size_t clauses; cbl_file_t *file; } select_clauses;
      struct { YYLTYPE loc; char *on, *off; } switches;
!     struct { cbl_encoding_t encoding; cbl_domain_t *domain; } false_domain;
      struct { size_t also; unsigned char *low, *high; } colseq;
      struct { cbl_field_attr_t attr; int nbyte; } pic_part;
  
*************** class locale_tgt_t {
*** 993,998 ****
--- 1013,1020 ----
      struct { bool is_locale; cbl_refer_t *arg2; } numval_locale_t;
             locale_tgt_t *token_list;
  
+     struct xml_decl_attr_t { bool with_decl, with_attr; } xml_decl_attr;
+ 
      cbl_options_t::arith_t opt_arith;
      cbl_round_t opt_round;
      cbl_section_type_t opt_init_sect;
*************** class locale_tgt_t {
*** 1000,1015 ****
      module_type_t module_type;
  }
  
  %printer { fprintf(yyo, "clauses: 0x%04x", $$); } data_clauses
! %printer { fprintf(yyo, "%s %s %s",
                          refer_type_str($$),
                          $$? $$->name() : "<none>",
!                         $$ && $$->field? $$->field->codeset.name() : "<none>"); } <refer>
! %printer { fprintf(yyo, "%s", $$->field? name_of($$->field) : "[omitted]"); } alloc_ret
! %printer { fprintf(yyo, "%s %s '%s' (%s)",
                          $$? cbl_field_type_str($$->type) : "<%empty>",
                          $$? name_of($$) : "",
!                         $$? $$->data.initial? $$->data.initial : "<nil>" : "",
                          $$? $$->value_str() : "" ); } <field>
  
  %printer { fprintf(yyo, "%c %s",
--- 1022,1046 ----
      module_type_t module_type;
  }
  
+ %printer { fprintf(yyo, "%s", $$->field? name_of($$->field) : "[omitted]"); } alloc_ret
  %printer { fprintf(yyo, "clauses: 0x%04x", $$); } data_clauses
!                         
! %printer { fprintf(yyo, "%s{%u/%u} %s '%s' (%s)",
                          refer_type_str($$),
+                         $$ && $$->field? $$->field->char_capacity() : 0,
+                         $$ && $$->field? $$->field->data.capacity() : 0, 
                          $$? $$->name() : "<none>",
!                         $$ && $$->field? $$->field->data.original()?
!                                          $$->field->data.original() : "<nil>" : "",
!                         $$ && $$->field? $$->field->value_str() : "" ); } <refer>
! 
! %printer { fprintf(yyo, "%s{%u/%u} %s '%s' (%s)",
                          $$? cbl_field_type_str($$->type) : "<%empty>",
+                         $$? $$->char_capacity() : 0,
+                         $$? $$->data.capacity() : 0, 
                          $$? name_of($$) : "",
!                         $$? $$->data.original()?
!                             $$->data.original() : "<nil>" : "",
                          $$? $$->value_str() : "" ); } <field>
  
  %printer { fprintf(yyo, "%c %s",
*************** class locale_tgt_t {
*** 1021,1027 ****
  %printer { fprintf(yyo, "%s'%.*s'{" HOST_SIZE_T_PRINT_UNSIGNED "} %s",
                          $$.prefix, int($$.len), $$.data, (fmt_size_t)$$.len,
                          $$.symbol_name()); } <literal>
! %printer { fprintf(yyo,"%s (1st of" HOST_SIZE_T_PRINT_UNSIGNED")",
                          $$->targets.empty()? "" : $$->targets.front().refer.field->name,
                          (fmt_size_t)$$->targets.size() ); } <targets>
  %printer { fprintf(yyo, "#" HOST_SIZE_T_PRINT_UNSIGNED ": %s",
--- 1052,1058 ----
  %printer { fprintf(yyo, "%s'%.*s'{" HOST_SIZE_T_PRINT_UNSIGNED "} %s",
                          $$.prefix, int($$.len), $$.data, (fmt_size_t)$$.len,
                          $$.symbol_name()); } <literal>
! %printer { fprintf(yyo,"%s (1st of " HOST_SIZE_T_PRINT_UNSIGNED")",
                          $$->targets.empty()? "" : $$->targets.front().refer.field->name,
                          (fmt_size_t)$$->targets.size() ); } <targets>
  %printer { fprintf(yyo, "#" HOST_SIZE_T_PRINT_UNSIGNED ": %s",
*************** class locale_tgt_t {
*** 1034,1041 ****
  		         teed_up_names().front(), (fmt_size_t) teed_up_names().size() ); } qname
  %printer { fprintf(yyo, "{%d}", $$ ); } <number>
  %printer { fprintf(yyo, "'%s'", $$.string ); } <numstr>
! %printer { const char *s = string_of($$);
!            fprintf(yyo, "{%s}", s? s : "??" ); } <float128>
  %printer { fprintf(yyo, "{%s %c%u}", cbl_field_type_str($$.type),
                                       $$.signable? '+' : ' ',
                                       $$.capacity ); } <computational>
--- 1065,1072 ----
  		         teed_up_names().front(), (fmt_size_t) teed_up_names().size() ); } qname
  %printer { fprintf(yyo, "{%d}", $$ ); } <number>
  %printer { fprintf(yyo, "'%s'", $$.string ); } <numstr>
! %printer { const char *s = string_of($$.r);
!            fprintf(yyo, "{%s}", s? s : "??" ); } <cce_type>
  %printer { fprintf(yyo, "{%s %c%u}", cbl_field_type_str($$.type),
                                       $$.signable? '+' : ' ',
                                       $$.capacity ); } <computational>
*************** class locale_tgt_t {
*** 1476,1487 ****
        return xstrdup(output);
    }
  
!   static inline char * string_of( tree cce ) {
!       return string_of (TREE_REAL_CST (cce));
    }
  
    cbl_field_t *
!   new_literal( const literal_t& lit, enum cbl_field_attr_t attr );
  
    static YYLTYPE first_line_of( YYLTYPE loc );
  %}
--- 1507,1522 ----
        return xstrdup(output);
    }
  
!   static inline const char * string_of( tree cce ) {
!     tree_node *node = TREE_TYPE(cce);
!     if( INTEGRAL_TYPE_P(node) ) {
!                         return "integer";
!     } 
!     return string_of (TREE_REAL_CST (cce));
    }
  
    cbl_field_t *
!   new_literal( const cbl_loc_t loc, const literal_t& lit, enum cbl_field_attr_t attr );
  
    static YYLTYPE first_line_of( YYLTYPE loc );
  %}
*************** opt_init_value: BINARY ZERO { $$ = const
*** 1781,1790 ****
  		  if( $1.len != 1 ) {
  		    error_msg(@1, "1-byte hexadecimal literal required");
  		  }
!       char ach[16];
!       sprintf(ach, "%d", (int)($1.data[0]));
  		  //auto f = new_literal($1.data);
! 		  auto f = new_literal(ach);
  		  f = field_add(@1, f);
  		  $$ = field_index(f);
  		}
--- 1816,1825 ----
  		  if( $1.len != 1 ) {
  		    error_msg(@1, "1-byte hexadecimal literal required");
  		  }
!                   char ach[16];
!                   sprintf(ach, "%d", (int)($1.data[0]));
  		  //auto f = new_literal($1.data);
! 		  auto f = new_literal(@1, ach);
  		  f = field_add(@1, f);
  		  $$ = field_index(f);
  		}
*************** namestr:        ctx_name {
*** 1801,1809 ****
                  }
          |       LITERAL {
                    if( $$.prefix[0] != '\0' ) {
!                     error_msg(@1, "literal cannot use %s prefix in this context",
!                               $$.prefix);
!                     YYERROR;
                    }
  		  if( !is_cobol_charset($$.data) ) {
  		    error_msg(@1, "literal '%s' must be a COBOL or C identifier",
--- 1836,1846 ----
                  }
          |       LITERAL {
                    if( $$.prefix[0] != '\0' ) {
!                     if( $$.prefix[0] != 'N' ) {
!                       error_msg(@1, "literal cannot use %s prefix in this context",
!                                 $$.prefix);
!                       YYERROR;
!                     }
                    }
  		  if( !is_cobol_charset($$.data) ) {
  		    error_msg(@1, "literal '%s' must be a COBOL or C identifier",
*************** special_name:   dev_mnemonic
*** 2662,2676 ****
                    struct cbl_field_t field = { FldClass, 0, {}, 0, $NAME };
                    if( !namcpy(@NAME, field.name, $2) ) YYERROR;
  
                    struct cbl_domain_t *domain =
                      new cbl_domain_t[ domains.size() + 1 ] ;
! 
                    std::copy(domains.begin(), domains.end(), domain);
  
!                   field.data.false_value_as($domains);
                    field.data.domain_as(domain);
!                   field.codeset.set();
!                   domains.clear();
  
                    if( field_add(@2, &field) == NULL ) {
                      dbgmsg("failed class");
--- 2699,2728 ----
                    struct cbl_field_t field = { FldClass, 0, {}, 0, $NAME };
                    if( !namcpy(@NAME, field.name, $2) ) YYERROR;
  
+                   assert( ! domains.empty() );
+                   auto encoding = domains.front().encoding;
+ 
                    struct cbl_domain_t *domain =
                      new cbl_domain_t[ domains.size() + 1 ] ;
!                   auto p = std::find_if( domains.begin(), domains.end(),
!                                          [enc = encoding]
!                                          ( const auto& dom ) {
!                                            return ! dom.encoding_ok(enc);
!                                          } );
!                   if( p != domains.end() ) {
!                     error_msg( @domains, "%qs has encoding %qs "
!                                "but value %qs has encoding %qs",
!                                $NAME, 
!                                current_t::cbl_encoding_str(domains.front().encoding),
!                                p->first.name(), 
!                                current_t::cbl_encoding_str(p->encoding) );
!                   }
                    std::copy(domains.begin(), domains.end(), domain);
+                   domains.clear();
  
!                   field.data.false_value_as($domains.domain);
                    field.data.domain_as(domain);
!                   field.codeset.set(encoding);
  
                    if( field_add(@2, &field) == NULL ) {
                      dbgmsg("failed class");
*************** picture_sym:    %empty                {
*** 3018,3089 ****
                   * "CLASS NAME is domains".
                   */
  domains:        domain
!         |       domains domain { $$ = $1? $1 : $2; }
                  ;
  
  domain:         all LITERAL[a]
                  {
!                   $$ = NULL;
!                   cbl_domain_t domain(@a, $all, $a.len, $a.data);
!                   domains.push_back(domain);
                  }
          |       all[a_all] LITERAL[a] THRU all[z_all] LITERAL[z]
                  {
!                   $$ = NULL;
!                   cbl_domain_elem_t first(@a, $a_all, $a.len, $a.data),
!                                      last(@z, $z_all, $z.len, $z.data);
!                   domains.push_back(cbl_domain_t(first, last));
                  }
          |       all NUMSTR[n]
                  {
!                   $$ = NULL;
!                   cbl_domain_t dom(@n, $all, strlen($n.string), $n.string, true);
!                   domains.push_back(dom);
                  }
          |       all[n_all] NUMSTR[n] THRU all[m_all] NUMSTR[m]
                  {
!                   $$ = NULL;
!                   cbl_domain_elem_t first(@n, $n_all, strlen($n.string), $n.string, true),
! 		                     last(@m, $m_all, strlen($m.string), $m.string, true);
!                   domains.push_back(cbl_domain_t(first, last));
                  }
          |       all reserved_value {
!                   $$ = NULL;
                    if( $2 == NULLS ) YYERROR;
                    auto value = constant_of(constant_index($2))->data.initial;
!                   struct cbl_domain_t domain( @2, $all, strlen(value), value );
!                   domains.push_back(domain);
                  }
          |       all[a_all] reserved_value[a] THRU all[z_all] LITERAL[z] {
!                   $$ = NULL;
                    if( $a == NULLS ) YYERROR;
                    auto value = constant_of(constant_index($a))->data.initial;
!                   cbl_domain_elem_t first(@a, $a_all, strlen(value), value),
!                                      last(@z, $z_all, $z.len, $z.data);
!                   domains.push_back(cbl_domain_t(first, last));
                  }
          |       all[a_all] reserved_value[a] THRU all[z_all] NUMSTR[z] {
!                   $$ = NULL;
                    if( $a == NULLS ) YYERROR;
                    auto value = constant_of(constant_index($a))->data.initial;
!                   cbl_domain_elem_t first(@a, $a_all, strlen(value), value, true),
!                                      last(@z, $z_all, strlen($z.string), $z.string, true);
!                   domains.push_back(cbl_domain_t(first, last));
                  }
          |       when_set_to FALSE_kw is LITERAL[value]
                  {
                    const char *dom = $value.data;
!                   $$ = new cbl_domain_t(@value, false, $value.len, dom);
                  }
          |       when_set_to FALSE_kw is reserved_value
                  {
                    if( $4 == NULLS ) YYERROR;
                    auto value = constant_of(constant_index($4))->data.initial;
!                   $$ = new cbl_domain_t(@4, false, strlen(value), value );
                  }
          |       when_set_to FALSE_kw is NUMSTR[n]
                  {
! 		  $$ = new cbl_domain_t(@n, false, strlen($n.string), $n.string, true);
                  }
                  ;
  when_set_to:    %empty
--- 3070,3152 ----
                   * "CLASS NAME is domains".
                   */
  domains:        domain
!         |       domains domain { $$ = $1.domain? $1 : $2; }
                  ;
  
  domain:         all LITERAL[a]
                  {
!                   $$.domain = nullptr;
!                   cbl_domain_t domain($all, $a.len, $a.data);
!                   domains.push_back( domain_t($a.encode_as(), domain) );
                  }
          |       all[a_all] LITERAL[a] THRU all[z_all] LITERAL[z]
                  {
!                   $$.domain = nullptr;
!                   cbl_domain_elem_t first($a_all, $a.len, $a.data),
!                                      last($z_all, $z.len, $z.data);
!                   if( $a.encode_as() == $z.encode_as() ) {
!                     domains.push_back( domain_t($a.encode_as(),
!                                                 cbl_domain_t(first, last)) );
!                   } else {
!                     error_msg(@z, "encooding of %qs differs from that of %qs",
!                               $a.data, $z.data);
!                   }
                  }
          |       all NUMSTR[n]
                  {
!                   $$.domain = nullptr;
!                   cbl_domain_t dom($all, strlen($n.string), $n.string, true);
!                   domains.push_back( domain_t(dom) );
                  }
          |       all[n_all] NUMSTR[n] THRU all[m_all] NUMSTR[m]
                  {
!                   $$.domain = nullptr;
!                   cbl_domain_elem_t first($n_all, strlen($n.string), $n.string, true),
! 		                     last($m_all, strlen($m.string), $m.string, true);
!                   domains.push_back( domain_t(cbl_domain_t(first, last)) );
                  }
          |       all reserved_value {
!                   $$.domain = nullptr;
                    if( $2 == NULLS ) YYERROR;
                    auto value = constant_of(constant_index($2))->data.initial;
!                   struct cbl_domain_t domain( $all, strlen(value), value );
!                   domains.push_back(domain_t(domain));
                  }
          |       all[a_all] reserved_value[a] THRU all[z_all] LITERAL[z] {
!                   $$.domain = nullptr;
                    if( $a == NULLS ) YYERROR;
                    auto value = constant_of(constant_index($a))->data.initial;
!                   cbl_domain_elem_t first($a_all, strlen(value), value),
!                                      last($z_all, $z.len, $z.data);
!                   domains.push_back( domain_t($z.encode_as(),
!                                               cbl_domain_t(first, last)) );
                  }
          |       all[a_all] reserved_value[a] THRU all[z_all] NUMSTR[z] {
!                   $$.domain = nullptr;
                    if( $a == NULLS ) YYERROR;
                    auto value = constant_of(constant_index($a))->data.initial;
!                   cbl_domain_elem_t first($a_all, strlen(value), value, true),
!                                      last($z_all, strlen($z.string), $z.string, true);
!                   domains.push_back( domain_t(cbl_domain_t(first, last)) );
                  }
          |       when_set_to FALSE_kw is LITERAL[value]
                  {
                    const char *dom = $value.data;
!                   $$.domain = new cbl_domain_t(false, $value.len, dom);
!                   $$.encoding = $value.encode_as();
                  }
          |       when_set_to FALSE_kw is reserved_value
                  {
                    if( $4 == NULLS ) YYERROR;
                    auto value = constant_of(constant_index($4))->data.initial;
!                   $$.domain = new cbl_domain_t(false, strlen(value), value );
!                   $$.encoding = no_encoding_e;
                  }
          |       when_set_to FALSE_kw is NUMSTR[n]
                  {
! 		  $$.domain = new cbl_domain_t(false,
!                                                strlen($n.string), $n.string, true);
!                   $$.encoding = current_encoding('A');
                  }
                  ;
  when_set_to:    %empty
*************** when_set_to:    %empty
*** 3096,3102 ****
          |       WHEN SET TO
          ;
  
! data_div:       %empty
          |       DATA_DIV
          |       DATA_DIV { current_division = data_div_e; } data_sections
                  {
--- 3159,3165 ----
          |       WHEN SET TO
          ;
  
! data_div:       %empty 
          |       DATA_DIV
          |       DATA_DIV { current_division = data_div_e; } data_sections
                  {
*************** fd_clause:      record_desc
*** 3146,3153 ****
                    auto f = cbl_file_of(symbol_at(file_section_fd));
                    f->varying_size.min = $1.min;
                    f->varying_size.max = $1.max;
!                   auto& cap = cbl_field_of(symbol_at(f->default_record))->data.capacity;
!                   cap = std::max(cap, uint32_t(f->varying_size.max));
                    // If min != max now, we know varying is explicitly defined.
                    f->varying_size.explicitly = f->varies();
                    if( f->varying_size.max != 0 ) {
--- 3209,3217 ----
                    auto f = cbl_file_of(symbol_at(file_section_fd));
                    f->varying_size.min = $1.min;
                    f->varying_size.max = $1.max;
!                   auto& data = cbl_field_of(symbol_at(f->default_record))->data;
!                   data.capacity( std::max(data.capacity(),
!                                           uint32_t(f->varying_size.max)) );
                    // If min != max now, we know varying is explicitly defined.
                    f->varying_size.explicitly = f->varies();
                    if( f->varying_size.max != 0 ) {
*************** fd_clause:      record_desc
*** 3225,3230 ****
--- 3289,3298 ----
                    f->attr |= external_e;
                    cbl_unimplemented("AS LITERAL");
                  }
+         |       is error
+                 {
+                   error_msg(@1, "invalid FD phrase");
+                 }
          |       fd_linage { cbl_unimplemented("LINAGE"); }
          |       fd_report {
                    cbl_unimplemented("REPORT WRITER");
*************** field:          cdf
*** 3456,3461 ****
--- 3524,3530 ----
                    }
                    field_done();
  
+ #if 0
                    const auto& field(*$data_descr);
  
                    // Format data.initial per picture
*************** field:          cdf
*** 3492,3497 ****
--- 3561,3567 ----
                        }
                      }
                    }
+ #endif
                  }
                  ;
  
*************** data_descr:     data_descr1
*** 3651,3683 ****
                  ;
  
  const_value:    cce_expr
!         |       BYTE_LENGTH of name { set_real_from_capacity(@name, $name, &$$); }
!         |       LENGTH      of name { set_real_from_capacity(@name, $name, &$$); }
!         |       LENGTH_OF   of name { set_real_from_capacity(@name, $name, &$$); }
          |       LENGTH_OF   of binary_type[type] {
! 		                real_from_integer(&$$, VOIDmode, $type, SIGNED); }
                  ;
  
  value78:        literalism
                  {
                    cbl_field_data_t data;
! 		  data.capacity = capacity_cast(strlen($1.data));
!                   data.initial = $1.data;
                    $$.encoding = $1.encoding;
                    $$.data = new cbl_field_data_t(data);
                  }
          |       const_value
                  {
                    cbl_field_data_t data;
! 		  data = build_real (float128_type_node, $1);
!                   $$.encoding = current_encoding('A');
                    $$.data = new cbl_field_data_t(data);
                  }
          |       reserved_value[value]
                  {
! 		  const auto field = constant_of(constant_index($value));
                    $$.encoding = current_encoding('A');
!                   $$.data = new cbl_field_data_t(field->data);
                  }
  
          |       true_false
--- 3721,3766 ----
                  ;
  
  const_value:    cce_expr
!         |       BYTE_LENGTH of name {
!                   $$.s = nullptr;
!                   set_real_from_capacity(@name, $name, &$$.r);
!                 }
!         |       LENGTH      of name { 
!                   $$.s = nullptr;
!                   set_real_from_capacity(@name, $name, &$$.r);
!                 }
!         |       LENGTH_OF   of name { 
!                   $$.s = nullptr;
!                   set_real_from_capacity(@name, $name, &$$.r);
!                 }
          |       LENGTH_OF   of binary_type[type] {
!                   $$.s = nullptr;
!                   real_from_integer(&$$.r, VOIDmode, $type, SIGNED);
!                 }
                  ;
  
  value78:        literalism
                  {
                    cbl_field_data_t data;
!                   data.capacity( capacity_cast(strlen($1.data)) );
!                   data.original($1.data);
                    $$.encoding = $1.encoding;
                    $$.data = new cbl_field_data_t(data);
                  }
          |       const_value
                  {
                    cbl_field_data_t data;
! 		  data = build_real (float128_type_node, $1.r);
!                   auto s = $1.s ? $1.s : reinterpret_cast<char*>(data.etc.value);
!                   data.original(s);
!                   $$.encoding = no_encoding_e;
                    $$.data = new cbl_field_data_t(data);
                  }
          |       reserved_value[value]
                  {
! 		  const auto figconst = constant_of(constant_index($value));
                    $$.encoding = current_encoding('A');
!                   $$.data = new cbl_field_data_t(figconst->data);
                  }
  
          |       true_false
*************** data_descr1:    level_name
*** 3695,3701 ****
                    }
                  }
  
!         |       level_name CONSTANT is_global as const_value
                  {
                    cbl_field_t& field = *$1;
                    if( field.level != 1 ) {
--- 3778,3784 ----
                    }
                  }
  
!         |       level_name CONSTANT is_global as const_value[cce]
                  {
                    cbl_field_t& field = *$1;
                    if( field.level != 1 ) {
*************** data_descr1:    level_name
*** 3706,3717 ****
                    field.attr |= constant_e;
                    if( $is_global ) field.attr |= global_e;
                    field.type = FldLiteralN;
! 		  field.data = build_real (float128_type_node, $const_value);
!                   field.data.initial = string_of($const_value);
                    field.codeset.set();
  
!                   if( !cdf_value(field.name, cdfval_t($const_value)) ) {
!                     error_msg(@1, "%s was defined by CDF", field.name);
                    }
                  }
  
--- 3789,3803 ----
                    field.attr |= constant_e;
                    if( $is_global ) field.attr |= global_e;
                    field.type = FldLiteralN;
! 		  field.data = build_real (float128_type_node, $cce.r);
!                   const char *s = $cce.s? $cce.s : string_of($cce.r);
!                   field.data.original( s );
                    field.codeset.set();
+                   field.set_initial(@cce);
  
!                   if( cdf_value(field.name) ) {
!                     cbl_message(@1, Par78CdfDefinedW,
!                                 "%s was defined by CDF", field.name);
                    }
                  }
  
*************** data_descr1:    level_name
*** 3727,3732 ****
--- 3813,3820 ----
                    field.type = FldLiteralA;
  		  auto fig = constant_of(constant_index($value));
                    field.data = fig->data;
+                   field.codeset.set();
+                   field.set_initial(@value);
                  }
  
          |       level_name CONSTANT is_global as literalism[lit]
*************** data_descr1:    level_name
*** 3735,3800 ****
                    field.attr |= constant_e;
                    if( $is_global ) field.attr |= global_e;
                    field.type = FldLiteralA;
-                   field.data.capacity = $lit.len;
-                   field.data.initial  = $lit.data;
                    field.attr |= literal_attr($lit.prefix);
                    if( field.level != 1 ) {
                      error_msg(@lit, "%s must be an 01-level data item", field.name);
                      YYERROR;
                    }
!                   if( !cdf_value(field.name, $lit.data) ) {
!                     error_msg(@1, "%s was defined by CDF", field.name);
!                   }
!                   if( ! field.codeset.set() ) {
!                     error_msg(@lit, "CONSTANT inconsistent with encoding %s",
!                               cbl_alphabet_t::encoding_str(field.codeset.encoding));
                    }
-                   
-                   value_encoding_check(@lit, $1);
                  }
          |       level_name CONSTANT is_global FROM NAME
                  {
                    assert($1 == current_field());
                    const cdfval_t *cdfval = cdf_value($NAME);
                    if( !cdfval ) {
!                     error_msg(@1, "%s was defined by CDF", $NAME);
                      YYERROR;
                    }
-                   cbl_field_t& field = *$1;
                    field.attr |= ($is_global | constant_e);
!                   field.data.capacity = cdfval->string ? strlen(cdfval->string)
!                                                   : sizeof(field.data.value_of());
!                   field.data.initial  = cdfval->string;
!                   field.data = cdfval->number;
!                   if( !cdf_value(field.name, *cdfval) ) {
!                     error_msg(@1, "%s was defined by CDF", field.name);
                    }
                  }
- 
          |       LEVEL78 NAME[name] VALUE is value78[data]
                  {
                    dialect_ok(@1, MfLevel78, "LEVEL 78");
                    cbl_field_t field = { FldLiteralA, constant_e, *$data.data,
                                          78, $name, @name.first_line };
!                   if( field.data.initial ) {
!                     field.attr |= quoted_e;
!                     field.codeset.set($data.encoding);
!                     if( !cdf_value(field.name, field.data.initial) ) {
!                       cbl_message(Par78CdfDefinedW,
!                                   "%s was defined by CDF", field.name);
!                     }
!                   } else {
                      field.type = FldLiteralN;
                      field.data.initial = string_of(field.data.value_of());
                      field.codeset.set($data.encoding);
!                     if( !cdf_value(field.name, field.as_integer()) ) {
!                       cbl_message(Par78CdfDefinedW,
                                    "%s was defined by CDF", field.name);
                      }
                    }
                    if( ($$ = field_add(@name, &field)) == NULL ) {
                      error_msg(@name, "failed level 78");
-                     YYERROR;
                    }
                  }
  
--- 3823,3896 ----
                    field.attr |= constant_e;
                    if( $is_global ) field.attr |= global_e;
                    field.type = FldLiteralA;
                    field.attr |= literal_attr($lit.prefix);
+ 
+                   if( ! field.codeset.set($lit.encode_as()) ) {
+                     error_msg(@lit, "CONSTANT inconsistent with encoding %s",
+                               cbl_alphabet_t::encoding_str(field.codeset.encoding));
+                   }
+                   field.data.original( $lit.data );
+                   field.set_initial(@lit);
+ 
                    if( field.level != 1 ) {
                      error_msg(@lit, "%s must be an 01-level data item", field.name);
                      YYERROR;
                    }
!                   if( cdf_value(field.name) ) {
!                     cbl_message(@1, Par78CdfDefinedW,
!                                 "%s was defined by CDF", field.name);
                    }
                  }
          |       level_name CONSTANT is_global FROM NAME
                  {
                    assert($1 == current_field());
+                   cbl_field_t& field(*$1);
+                   if( cdf_value(field.name) ) {
+                     cbl_message(@1, Par78CdfDefinedW,
+                                 "%s was defined by CDF", field.name);
+                   }
                    const cdfval_t *cdfval = cdf_value($NAME);
                    if( !cdfval ) {
!                     error_msg(@NAME, "%s was not defined by CDF", $NAME);
                      YYERROR;
                    }
                    field.attr |= ($is_global | constant_e);
!                   field.codeset.set();
!                 // Does a const field want an initial string for a numeric value? --jkl
!                   if( cdfval->string ) {
!                     field.data.original( cdfval->string );
!                     field.set_initial(@NAME);
!                   } else {
!                     field.data.capacity(sizeof(field.data.value_of()));
!                     field.data = cdfval->number;
                    }
                  }
          |       LEVEL78 NAME[name] VALUE is value78[data]
                  {
                    dialect_ok(@1, MfLevel78, "LEVEL 78");
                    cbl_field_t field = { FldLiteralA, constant_e, *$data.data,
                                          78, $name, @name.first_line };
!                   // cce reports no encoded initial value
!                   if( $data.encoding == no_encoding_e ) { 
                      field.type = FldLiteralN;
+                     field.codeset.set();
                      field.data.initial = string_of(field.data.value_of());
+                     if( cdf_value(field.name) ) {
+                       cbl_message(@name, Par78CdfDefinedW,
+                                   "%s was defined by CDF", field.name);
+                     }
+                   } else{ 
+                     field.attr |= quoted_e;
                      field.codeset.set($data.encoding);
!                     field.set_initial(@data);
!                     if( cdf_value(field.name) ) {
!                       cbl_message(@name, Par78CdfDefinedW,
                                    "%s was defined by CDF", field.name);
                      }
                    }
+ 
                    if( ($$ = field_add(@name, &field)) == NULL ) {
                      error_msg(@name, "failed level 78");
                    }
                  }
  
*************** data_descr1:    level_name
*** 3807,3813 ****
                    auto fig = constant_of(constant_index(NULLS))->data.initial;
                    struct cbl_domain_t *domain = new cbl_domain_t[2];
  
!                   domain[0] = cbl_domain_t(@NAME, false, strlen(fig), fig);
  
                    field.data.domain_as(domain);
  
--- 3903,3909 ----
                    auto fig = constant_of(constant_index(NULLS))->data.initial;
                    struct cbl_domain_t *domain = new cbl_domain_t[2];
  
!                   domain[0] = cbl_domain_t(false, strlen(fig), fig);
  
                    field.data.domain_as(domain);
  
*************** data_descr1:    level_name
*** 3829,3845 ****
                    cbl_domain_t *domain =
                      new cbl_domain_t[ domains.size() + 1];
  
                    std::copy(domains.begin(), domains.end(), domain);
  
                    field.data.domain_as(domain);
!                   field.data.false_value_as($domains);
                    field.codeset.set();
-                   domains.clear();
  
                    if( ($$ = field_add(@2, &field)) == NULL ) {
                      error_msg(@NAME, "failed level 88");
                      YYERROR;
                    }
                  }
  
          |       name66[alias] RENAMES name[orig]
--- 3925,3963 ----
                    cbl_domain_t *domain =
                      new cbl_domain_t[ domains.size() + 1];
  
+                   auto enc = domains.front().encoding;
+                   auto p = std::find_if( domains.begin(), domains.end(),
+                                          [enc]( const auto& dom ) {
+                                            return !dom.encoding_ok(enc);
+                                          } );
+                   if( p != domains.end() ) {
+                     error_msg( @domains, "%qs has encoding %qs "
+                                "but value %qs has encoding %qs",
+                                $NAME, 
+                                current_t::cbl_encoding_str(domains.front().encoding),
+                                p->first.name(), 
+                                current_t::cbl_encoding_str(p->encoding) );
+                   }
                    std::copy(domains.begin(), domains.end(), domain);
+                   domains.clear();
  
                    field.data.domain_as(domain);
!                   field.data.false_value_as($domains.domain);
                    field.codeset.set();
  
                    if( ($$ = field_add(@2, &field)) == NULL ) {
                      error_msg(@NAME, "failed level 88");
                      YYERROR;
                    }
+                   cbl_field_t *parent = parent_of($$);
+                   if( parent->codeset.valid() &&
+                       enc != parent->codeset.encoding ) {
+                     error_msg( @NAME, "%qs has encoding %qs "
+                                "but values have encoding %qs",
+                                $NAME, 
+                                current_t::cbl_encoding_str(parent->codeset.encoding),
+                                current_t::cbl_encoding_str(enc) );
+                   } 
                  }
  
          |       name66[alias] RENAMES name[orig]
*************** data_descr1:    level_name
*** 3941,3954 ****
          |       level_name[field] data_clauses
                  {
                    gcc_assert($field == current_field());
                    if( $data_clauses == value_clause_e ) { // only VALUE, no PIC
                      // Error unless VALUE is a figurative constant or (quoted) string.
!                     if( $field->type != FldPointer &&
!                         ! $field->has_attr(quoted_e) &&
!                         normal_value_e == cbl_figconst_of($field->data.initial) )
!                     {
!                       error_msg(@field, "%s numeric VALUE %s requires PICTURE",
!                                $field->name, $field->data.initial);
                      }
                      if( null_value_e == cbl_figconst_of($field->data.initial) ) {
                        // don't change the type
--- 4059,4078 ----
          |       level_name[field] data_clauses
                  {
                    gcc_assert($field == current_field());
+                   //// cbl_field_t& F(*$field);
+ 
                    if( $data_clauses == value_clause_e ) { // only VALUE, no PIC
                      // Error unless VALUE is a figurative constant or (quoted) string.
!                     if( $field->type != FldPointer && ! $field->has_attr(quoted_e) ) {
!                       switch( cbl_figconst_of($field->data.initial) ) {
!                       case normal_value_e:
!                       case zero_value_e:
!                         break;
!                       default:
!                         error_msg(@field, "%qs numeric VALUE %qs requires PICTURE",
!                                   $field->name, $field->data.original());
!                         YYERROR; // do not attempt to set capacity
!                       }
                      }
                      if( null_value_e == cbl_figconst_of($field->data.initial) ) {
                        // don't change the type
*************** data_descr1:    level_name
*** 3958,3964 ****
                        assert(FldPointer != $field->type);
                        $field->type = FldAlphanumeric;
                        if( $field->data.initial ) {
!                         $field->data.capacity = strlen($field->data.initial);
                        }
                      }
                    }
--- 4082,4088 ----
                        assert(FldPointer != $field->type);
                        $field->type = FldAlphanumeric;
                        if( $field->data.initial ) {
!                         $field->set_capacity(strlen($field->data.initial));
                        }
                      }
                    }
*************** data_descr1:    level_name
*** 4000,4064 ****
  
                    // Increase numeric display capacity by 1 for SIGN SEPARATE.
                    if( $field->type == FldNumericDisplay &&
!                       is_signable($field) &&
!                       $field->has_attr(separate_e) ){
!                     $field->data.capacity++;
                    }
  
                    // Set Packed-Decimal capacity
                    if( $field->type == FldPacked ) {
!                     $field->data.capacity = type_capacity($field->type,
!                                                           $field->data.digits);
!                   if( $field->attr & separate_e )
!                     {
!                     // This is a gentle kludge required by the the belated
!                     // introduction of COMP-6, which is like COMP-3 but with no
!                     // sign nybble.  The code in type_capacity assumes a sign
!                     // nybble.
!                     $field->data.capacity = ($field->data.digits+1)/2;
!                     }
                    }
  
                    // Check COMP-5 capacity
  		  // No capacity means no PICTURE, valid only for a (potential) group
!                   if( $field->type == FldNumericBin5 && $field->data.capacity == 0 ) {
!                     if(  has_clause ($data_clauses, usage_clause_e) &&
!                         !has_clause ($data_clauses, picture_clause_e) ) {
! 			// invalidate until a child is born
! 		      $field->type = FldInvalid;
                      }
                    }
  
                    // Ensure signed initial VALUE is for signed numeric type
                    if( is_numeric($field) ) {
!                     if( $field->data.initial && $field->type != FldFloat ) {
!                       switch( $field->data.initial[0] ) {
                        case '-':
                          if( !$field->has_attr(signable_e) ) {
                            error_msg(@field, "%s is unsigned but has signed VALUE '%s'",
!                                     $field->name, $field->data.initial);
                          }
                        }
                      }
                    }
  
                    // Verify VALUE
!                   $field->report_invalid_initial_value(@data_clauses);
! 
!                   bool numerical =
!                       $field->type == FldNumericDisplay || is_numeric($field);
! 
!                   if( $field->data.initial && ! numerical ) {
!                     if( normal_value_e == cbl_figconst_of($field->data.initial) ) {
!                       value_encoding_check(@data_clauses, $field);
!                     }
!                   }
  
                    // verify REDEFINES
                    const auto parent = parent_of($field);
                    if( parent && $field->level == parent->level ) {
                      valid_redefine(@field, $field, parent); // calls yyerror
                    }
                  }
                  ;
  
--- 4124,4227 ----
  
                    // Increase numeric display capacity by 1 for SIGN SEPARATE.
                    if( $field->type == FldNumericDisplay &&
!                       $field->has_attr(separate_e) ) {
!                     gcc_assert(is_signable($field));
!                     $field->add_capacity(1);
!                     $field->blank_initial($field->char_capacity());
                    }
  
                    // Set Packed-Decimal capacity
                    if( $field->type == FldPacked ) {
!                     // COMP-6 is like COMP-3 but with no sign nybble.  The
!                     // code in type_capacity assumes a sign nybble.
!                     auto one_less = $field->has_attr(separate_e) ? 1 : 0;
! 
!                     $field->set_capacity(type_capacity($field->type,
!                                                        $field->data.digits - one_less));
                    }
  
                    // Check COMP-5 capacity
  		  // No capacity means no PICTURE, valid only for a (potential) group
!                   if( $field->type == FldNumericBin5 ) {
!                     if( $field->data.capacity() == 0 ) {
!                       if(  has_clause ($data_clauses, usage_clause_e) &&
!                           !has_clause ($data_clauses, picture_clause_e) ) {
! 		          // invalidate until a child is born
! 		        $field->type = FldInvalid;
!                       }
!                     } else {
!                       if( ($field->data.initial) ) {
!                         if( strlen($field->data.initial) < $field->data.capacity() ) {
!                           $field->blank_initial( $field->data.capacity() );
!                         }
!                       }
                      }
                    }
  
                    // Ensure signed initial VALUE is for signed numeric type
                    if( is_numeric($field) ) {
!                     auto original = $field->data.original();
!                     if( original && $field->type != FldFloat ) {
!                       switch( original[0] ) {
                        case '-':
                          if( !$field->has_attr(signable_e) ) {
                            error_msg(@field, "%s is unsigned but has signed VALUE '%s'",
!                                     $field->name, original);
                          }
                        }
                      }
                    }
  
                    // Verify VALUE
!                   bool bad_value = $field->report_invalid_initial_value(@data_clauses);
  
                    // verify REDEFINES
                    const auto parent = parent_of($field);
                    if( parent && $field->level == parent->level ) {
                      valid_redefine(@field, $field, parent); // calls yyerror
                    }
+                   
+                   // verify VALUE for Numeric Edited
+                   if( $field->type == FldNumericEdited ) {
+                     if( !validate_numeric_edited ($field) ) {
+                       error_msg(@data_clauses, "%s: PICTURE and VALUE are incompatible",
+                                 $field->name);
+                     }
+                   }
+ 
+                   // verify VALUE for numeric
+                   if ($data_clauses & value_clause_e) {
+                     bool good_value =
+                         ($field->data.etc_ok() || $field->data.original()) && ! bad_value;
+                     if( good_value ) { // ensure VALUE had a value
+                       if( is_numeric($field) || $field->type == FldNumericEdited ) {
+                         if( zero_value_e == cbl_figconst_of($field->data.original()) ) {
+                           $field->blank_initial($field->char_capacity());
+                         }
+                         $field->encode_numeric($field->data.original(), 
+                                                data_clause_locations[value_clause_e],
+                                                $field->data.original_numeric());
+                       }
+                     }
+                   } else { // no VALUE clause
+                     if( false && $field->data.initial ) {
+                       free(const_cast<char*>($field->data.initial));
+                       $field->data.initial = nullptr;
+                     }                      
+                   }
+ 
+                   // Any field may become a group, so may have VALUE with no PICTURE
+                   const auto stooges3 = (picture_clause_e |
+                                          value_clause_e |
+                                          usage_clause_e);
+                   if( ($data_clauses & stooges3) == value_clause_e ) { // only
+                     $field->type = FldInvalid;
+                     auto fig = cbl_figconst_of($field->data.original());
+                     if( null_value_e != fig ) {
+                       $field->set_initial( $field->data.capacity(),
+                                            data_clause_locations[value_clause_e]);
+                     }
+                   }
                  }
                  ;
  
*************** data_clauses:   data_clause
*** 4136,4141 ****
--- 4299,4310 ----
                      YYERROR;
                    }
  
+ 		  // We could be more judicious. We could clear the map when
+ 		  // the first clause is encountered, and e.g. set the location
+ 		  // to just the VALUE string, not the whole clause.  As of now
+ 		  // the map isn't used, though.
+                   data_clause_locations[data_clause_t($2)] = @data_clause;
+ 
                    if( $data_clause == redefines_clause_e ) {
                      error_msg(@2, "REDEFINES must appear "
                               "immediately after LEVEL and NAME");
*************** data_clauses:   data_clause
*** 4185,4191 ****
                    }
  
                    if( gcobol_feature_embiggen() ) {
!                     if( field->is_binary_integer() && field->data.capacity == 4) {
                        auto redefined = symbol_redefines(field);
                        if( redefined && redefined->type == FldPointer ) {
                          dbgmsg("expanding %s size from %u bytes to %lu "
--- 4354,4360 ----
                    }
  
                    if( gcobol_feature_embiggen() ) {
!                     if( field->is_binary_integer() && field->data.capacity() == 4) {
                        auto redefined = symbol_redefines(field);
                        if( redefined && redefined->type == FldPointer ) {
                          dbgmsg("expanding %s size from %u bytes to %lu "
*************** data_clause:    any_length        { $$ =
*** 4248,4270 ****
          |       value_clause      { $$ = value_clause_e;
                    cbl_field_t *field = current_field();
  
-                   if( field->type != FldAlphanumeric &&
-                       field->data.initial && field->data.initial[0] )
-                   {
-                     // Embedded NULs are valid only in FldAlphanumeric, and are
-                     // already handled.
-                     if( strlen(field->data.initial) < field->data.capacity ) {
-                       auto p = blank_pad_initial( field->data.initial,
-                                                   strlen(field->data.initial),
-                                                   field->data.capacity );
-                       if( !p ) YYERROR;
-                       field->data.initial = p;
-                     }
-                   }
  		  const cbl_field_t *parent;
  		  if( (parent = parent_has_value(field)) != NULL ) {
! 		    error_msg(@1, "VALUE invalid because group %s has VALUE clause",
! 		              parent->name);
  		  }
                  }
          |       volatile_clause      { $$ = volatile_clause_e; }
--- 4417,4430 ----
          |       value_clause      { $$ = value_clause_e;
                    cbl_field_t *field = current_field();
  
  		  const cbl_field_t *parent;
+ 		  if( (parent = parent_has_picture(field)) != NULL ) {
+ 		    error_msg(@1, "VALUE invalid because group %s (%s) has PICTURE clause",
+ 		              parent->name, 3 + cbl_field_type_str(parent->type));
+ 		  }
  		  if( (parent = parent_has_value(field)) != NULL ) {
! 		    error_msg(@1, "VALUE invalid because group %s (%s) has VALUE clause",
! 		              parent->name, 3 + cbl_field_type_str(parent->type));
  		  }
                  }
          |       volatile_clause      { $$ = volatile_clause_e; }
*************** data_clause:    any_length        { $$ =
*** 4273,4291 ****
  picture_clause: PIC signed nps[fore] nines nps[aft]
                  {
                    cbl_field_t *field = current_field();
                    if( !field_type_update(field, FldNumericDisplay, @$) ) {
                      YYERROR;
                    }
                    ERROR_IF_CAPACITY(@PIC, field);
!                   field->attr |= $signed;
!                   field->data.capacity = type_capacity(field->type, $4);
!                   field->data.digits = $4;
!                   if( long(field->data.digits) != $4 ) {
!                     error_msg(@2, "indicated size would be %d bytes, "
!                              "maximum data item size is %u",
!                              $4, UINT32_MAX);
                    }
! 
                    if( $fore && $aft ) { // leading and trailing P's
                      error_msg(@2, "PIC cannot have both leading and trailing P");
                      YYERROR;
--- 4433,4456 ----
  picture_clause: PIC signed nps[fore] nines nps[aft]
                  {
                    cbl_field_t *field = current_field();
+                   if( ! field->codeset.set() ) {
+                     error_msg(@nines, "PICTURE inconsistent with encoding %s",
+                               cbl_alphabet_t::encoding_str(field->codeset.encoding));
+                   }
                    if( !field_type_update(field, FldNumericDisplay, @$) ) {
                      YYERROR;
                    }
                    ERROR_IF_CAPACITY(@PIC, field);
!                   // If signable_e is inherited from the group, it is effective
!                   // regardless of an 'S' in PICTURE.
!                   if( field->has_attr(signable_e) && ! $signed ) {
!                     dbgmsg("%s PICTURE must be signed for SIGN IS", field->name);
                    }
!                   field->attr |= $signed;
!                   field->data.digits = $nines;
!                   auto nchar = type_capacity(field->type, $nines);
!                   field->set_capacity(nchar);
!                   field->blank_initial(nchar);
                    if( $fore && $aft ) { // leading and trailing P's
                      error_msg(@2, "PIC cannot have both leading and trailing P");
                      YYERROR;
*************** picture_clause: PIC signed nps[fore] nin
*** 4296,4354 ****
                    }
                    if( ! field->reasonable_capacity() ) {
                      error_msg(@2, "%s limited to capacity of %d (would need %u)",
! 			     field->name, MAX_FIXED_POINT_DIGITS, field->data.capacity);
                    }
                  }
  
          |       PIC signed NINEV[left] nine[rdigits]
                  {
                    cbl_field_t *field = current_field();
                    field->data.digits = $left + $rdigits;
                    field->attr |= $signed;
  
                    if( field->is_binary_integer() ) {
!                     field->data.capacity = type_capacity(field->type,
!                                                          field->data.digits);
                      field->data.rdigits = $rdigits;
                    } else {
                      if( !field_type_update(field, FldNumericDisplay, @$) ) {
                        YYERROR;
                      }
                      ERROR_IF_CAPACITY(@PIC, field);
!                     field->data.capacity = field->data.digits;
                      field->data.rdigits = $rdigits;
                    }
                    if( ! field->reasonable_capacity() ) {
                      error_msg(@2, "%s limited to capacity of %d (would need %u)",
! 			     field->name, MAX_FIXED_POINT_DIGITS, field->data.capacity);
                    }
                  }
          |       PIC signed NINEDOT[left] nine[rdigits]
                  {
                    uint32_t size = $left + $rdigits;
  
-                   cbl_field_t *field = current_field();
                    if( !field_type_update(field, FldNumericEdited, @$) ) {
                      YYERROR;
                    }
                    ERROR_IF_CAPACITY(@PIC, field);
                    field->attr |= $signed;
                    field->data.digits = size;
!                   field->data.capacity = ++size;
                    field->data.rdigits = $rdigits;
  
                    if( ! field->reasonable_capacity() ) {
                      error_msg(@2, "%s limited to capacity of %d (would need %u)",
! 			     field->name, MAX_FIXED_POINT_DIGITS, field->data.capacity);
                    }
!                 }
  
!         |       PIC alphanum_pic[size]
                  {
                    cbl_field_t *field = current_field();
! 
  		  if( field->type == FldNumericBin5 &&
! 		      field->data.capacity == 0xFF  &&
  		      dialect_ok(@2, MfCompX, "alphanumeric PICTURE with numeric USAGE") )
  		  { // PIC X COMP-X or COMP-9
  		    if( ! field->has_attr(all_x_e) ) {
--- 4461,4536 ----
                    }
                    if( ! field->reasonable_capacity() ) {
                      error_msg(@2, "%s limited to capacity of %d (would need %u)",
! 			     field->name, MAX_FIXED_POINT_DIGITS, field->char_capacity());
                    }
                  }
  
          |       PIC signed NINEV[left] nine[rdigits]
                  {
                    cbl_field_t *field = current_field();
+                   if( ! field->codeset.set() ) {
+                     error_msg(@$, "PICTURE inconsistent with encoding %s",
+                               cbl_alphabet_t::encoding_str(field->codeset.encoding));
+                   }
                    field->data.digits = $left + $rdigits;
                    field->attr |= $signed;
  
                    if( field->is_binary_integer() ) {
!                     field->set_capacity(type_capacity(field->type,
!                                                       field->data.digits));
                      field->data.rdigits = $rdigits;
                    } else {
                      if( !field_type_update(field, FldNumericDisplay, @$) ) {
                        YYERROR;
                      }
                      ERROR_IF_CAPACITY(@PIC, field);
!                     field->set_capacity(field->data.digits);
                      field->data.rdigits = $rdigits;
                    }
+                   // data.initial has blanks for character-encoded data
+ 		  // data.capacity may reflect the binary size, if any. 
+                   field->blank_initial(field->data.digits);
+ 
                    if( ! field->reasonable_capacity() ) {
                      error_msg(@2, "%s limited to capacity of %d (would need %u)",
! 			     field->name, MAX_FIXED_POINT_DIGITS, field->char_capacity());
                    }
                  }
          |       PIC signed NINEDOT[left] nine[rdigits]
                  {
+                   cbl_field_t *field = current_field();
+                   if( ! field->codeset.set() ) {
+                     error_msg(@$, "PICTURE inconsistent with encoding %s",
+                               cbl_alphabet_t::encoding_str(field->codeset.encoding));
+                   }
+ 
                    uint32_t size = $left + $rdigits;
  
                    if( !field_type_update(field, FldNumericEdited, @$) ) {
                      YYERROR;
                    }
                    ERROR_IF_CAPACITY(@PIC, field);
                    field->attr |= $signed;
                    field->data.digits = size;
!                   field->set_capacity(++size);
                    field->data.rdigits = $rdigits;
+                   field->blank_initial(size);
  
                    if( ! field->reasonable_capacity() ) {
                      error_msg(@2, "%s limited to capacity of %d (would need %u)",
! 			     field->name, MAX_FIXED_POINT_DIGITS, field->char_capacity());
                    }
!                 } 
  
!         |       PIC alphanum_pic[nchar]
                  {
                    cbl_field_t *field = current_field();
!                   if( ! field->codeset.valid() ) { // set by the picture
!                     dbgmsg("%s:%d: %s has invalid encoding",
!                            __FILE__, __LINE__, field->name);
!                   }
  		  if( field->type == FldNumericBin5 &&
! 		      field->data.capacity() == 0xFF  &&
  		      dialect_ok(@2, MfCompX, "alphanumeric PICTURE with numeric USAGE") )
  		  { // PIC X COMP-X or COMP-9
  		    if( ! field->has_attr(all_x_e) ) {
*************** picture_clause: PIC signed nps[fore] nin
*** 4361,4389 ****
                        YYERROR;
                      }
  		  }
!                   assert(0 < $size);
!                   if( field->data.initial != NULL ) {
!                     if( 0 < field->data.capacity &&
!                             field->data.capacity < uint32_t($size) ) {
!                       auto p = blank_pad_initial(field->data.initial,
!                                                  field->data.capacity, $size );
!                       if( !p ) YYERROR;
!                       field->data.initial = p;
!                     }
                    }
! 
!                   charmap_t *charmap = 
!                                     __gg__get_charmap(field->codeset.encoding);
!                   field->data.capacity = $size * charmap->stride();
!                   field->data.picture = NULL;
! 
!                   if( false ) dbgmsg("PIC alphanum_pic[size]:%d: %s",
!                                       field->line, field_str(field));
                  }
  
          |       PIC numed[picture]
                  {
                    cbl_field_t *field = current_field();
                    if( !field_type_update(field, FldNumericEdited, @$) ) {
                      YYERROR;
                    }
--- 4543,4566 ----
                        YYERROR;
                      }
  		  }
!                   assert(0 < $nchar);
!                   field->data.picture = nullptr;
!                   auto nchar = std::min($nchar, MAXIMUM_ALPHA_LENGTH);
!                   if( nchar < $nchar ) {
!                     error_msg(@2, "alphanumeric data-item size (%d) "
!                                    "exceeds maximum of %d bytes",
!                               $nchar, MAXIMUM_ALPHA_LENGTH);
                    }
!                   field->set_initial(nchar, @nchar);
                  }
  
          |       PIC numed[picture]
                  {
                    cbl_field_t *field = current_field();
+                   if( ! field->codeset.set() ) {
+                     error_msg(@picture, "PICTURE inconsistent with encoding %s",
+                               cbl_alphabet_t::encoding_str(field->codeset.encoding));
+                   }
                    if( !field_type_update(field, FldNumericEdited, @$) ) {
                      YYERROR;
                    }
*************** picture_clause: PIC signed nps[fore] nin
*** 4393,4419 ****
                      YYERROR;
                    }
                    field->data.picture = $picture;
-                   field->data.capacity =  length_of_picture($picture);
                    field->data.digits   =  digits_of_picture($picture, false);
                    field->data.rdigits  = rdigits_of_picture($picture);
                    if( is_picture_scaled($picture) ) field->attr |= scaled_e;
                  }
  
          |       PIC ALPHED[picture]
                  {
-                   bool is_alpha_edited( const char picture[] );
- 
                    cbl_field_t *field = current_field();
                    ERROR_IF_CAPACITY(@PIC, field);
-                   field->data.capacity = length_of_picture($picture);
-                   field->data.picture = $picture;
- 
                    // In case the lexer guesses wrong.
                    cbl_field_type_t type = is_numeric_edited($picture)?
                                            FldNumericEdited : FldAlphaEdited;
                    if( !field_type_update(field, type, @$) ) {
                      YYERROR;
                    }
  
                    switch( type ) {
                    case FldNumericEdited:
--- 4570,4595 ----
                      YYERROR;
                    }
                    field->data.picture = $picture;
                    field->data.digits   =  digits_of_picture($picture, false);
                    field->data.rdigits  = rdigits_of_picture($picture);
                    if( is_picture_scaled($picture) ) field->attr |= scaled_e;
+                   auto nchar = length_of_picture($picture);
+                   field->set_capacity(nchar);
+                   field->blank_initial(nchar);
                  }
  
          |       PIC ALPHED[picture]
                  {
                    cbl_field_t *field = current_field();
                    ERROR_IF_CAPACITY(@PIC, field);
                    // In case the lexer guesses wrong.
                    cbl_field_type_t type = is_numeric_edited($picture)?
                                            FldNumericEdited : FldAlphaEdited;
                    if( !field_type_update(field, type, @$) ) {
                      YYERROR;
                    }
+                   field->data.picture = $picture;
+                   field->data.capacity(length_of_picture($picture));
  
                    switch( type ) {
                    case FldNumericEdited:
*************** picture_clause: PIC signed nps[fore] nin
*** 4422,4428 ****
                      if( is_picture_scaled($picture) ) field->attr |= scaled_e;
                      break;
                    case FldAlphaEdited:
!                     if( !is_alpha_edited(field->data.picture) ) {
                        error_msg(@picture, "invalid picture for Alphanumeric-edited");
                        YYERROR;
                      }
--- 4598,4604 ----
                      if( is_picture_scaled($picture) ) field->attr |= scaled_e;
                      break;
                    case FldAlphaEdited:
!                     if( ! field->data.is_alpha_edited() ) {
                        error_msg(@picture, "invalid picture for Alphanumeric-edited");
                        YYERROR;
                      }
*************** picture_clause: PIC signed nps[fore] nin
*** 4430,4435 ****
--- 4606,4616 ----
                    default:
                      gcc_unreachable();
                    }
+                   if( ! field->codeset.set() ) {
+                     error_msg(@picture, "PICTURE inconsistent with encoding %s",
+                               cbl_alphabet_t::encoding_str(field->codeset.encoding));
+                   }
+                   field->set_initial(@picture);
                  }
  	|	PIC ones
                  ;
*************** alphanum_part:  ALNUM[picture] count
*** 4468,4473 ****
--- 4649,4658 ----
                    $$.attr = uniform_picture($picture);
                    $$.nbyte = strlen($picture);
  		  auto count($count);
+ 		  if( false && count == 0 ) { // zero count has no effect
+ 		    error_msg(@2, "PICTURE count %<(%d)%> is zero", count );
+ 		    YYERROR;
+ 		  }
                    if( count > 0 ) {
                      --count;
                      $$.nbyte += count; // AX9(3) has count 5
*************** count:          %empty           { $$ =
*** 4511,4539 ****
                  }
  	|	'(' NAME ')'
                  {
  		  auto value = cdf_value($NAME);
! 		  if( ! (value && value->is_numeric()) ) {
! 		    error_msg(@NAME, "PICTURE %qs requires a CONSTANT value", $NAME );
! 		    YYERROR;
! 		  }
! 		  int nmsg = 0;
! 		  auto e = symbol_field(PROGRAM, 0, $NAME);
! 		  if( e ) { // verify not floating point with nonzero fraction
! 		    auto field = cbl_field_of(e);
! 		    assert(is_literal(field));
! 		    REAL_VALUE_TYPE vi;
! 		    real_from_integer (&vi, VOIDmode, field->as_integer(), SIGNED);
! 		    if( !real_identical (TREE_REAL_CST_PTR (field->data.value_of()),
! 				         &vi) ) {
! 		      nmsg++;
! 		      error_msg(@NAME, "invalid PICTURE count %<(%s)%>",
! 				field->data.initial );
! 		    }
! 		  }
! 		  $$ = value->as_number();
! 		  if( $$ <= 0 && !nmsg) {
! 		    error_msg(@NAME, "invalid PICTURE count %<(%s)%>", $NAME );
! 		  }
                  }
                  ;
  
--- 4696,4734 ----
                  }
  	|	'(' NAME ')'
                  {
+                   int64_t output = 1;
  		  auto value = cdf_value($NAME);
! 		  if( value && ! value->is_numeric() ) {
! 		    error_msg(@NAME,
!                               "PICTURE %qs requires a CONSTANT NUMERIC value",
!                               $NAME );
!                     output = value->as_number();
! 		  } else {
! 		    auto e = symbol_field(PROGRAM, 0, $NAME);
! 		    if( ! e ) {
! 		      error_msg(@NAME, "%qs not defined", $NAME );
!                     } else { // verify it's integer-like
! 		      auto field = cbl_field_of(e);
!                       if( ! field->has_attr(constant_e) ) {
!                         error_msg(@NAME, "count %qs must be CONSTANT", $NAME);
!                       }
!                       if( ! is_numeric(field) ) {
!                         auto s = field->data.original();
!                         error_msg(@NAME, "%qs invalid as PICTURE count %<(%s)%>",
!                                   $NAME, s? s : "" );
!                       } else {
!                         auto ok = field->data.int64_of();
!                         if( ! ok.second ) {
!                           error_msg(@NAME, "%qs invalid as PICTURE count %<(%ld)%>",
!                                     $NAME, long(ok.first) );
!                         } else {
!                           output = ok.first;
!                         }
! 		      }
!                     }
!                   }
!                   $$ = output;
!                   dbgmsg("%s:%d: count: (%s) is %ld", __FILE__, __LINE__, $NAME, long($$));
                  }
                  ;
  
*************** usage_clause1:  usage BIT
*** 4557,4725 ****
  		}
          |       usage BINARY_INTEGER [comp] is_signed
                  {
! 		  // action for BINARY_INTEGER is repeated for COMPUTATIONAL, below. 
! 		  // If it changes, consolidate in a function. 
!                   bool infer = true;
!                   cbl_field_t *field = current_field();
! 
! 		  if( ! $is_signed ) {
! 		    $comp.signable = false;
! 		  }
! 
!                   // Some binary types have defined capacity;
!                   switch($comp.type) {
!                   // COMPUTATIONAL and COMP-5 rely on PICTURE.
!                   case FldNumericBinary:
!                     field->attr |= big_endian_e;
!                     __attribute__((fallthrough));
!                   case FldNumericBin5:
! 		    // If no capacity yet, then no picture, infer $comp.capacity.
! 		    // If field has capacity, ensure USAGE is compatible.
! 		    if( field->data.capacity > 0 ) { // PICTURE before USAGE
! 		      infer = false;
! 		      switch( field->type ) {
! 		      case FldAlphanumeric:   // PIC X COMP-5 or COMP-X
! 			assert( field->data.digits == 0 );
! 			assert( field->data.rdigits == 0 );
! 		        dialect_ok(@2, MfCompX, "alphanumeric PICTURE with numeric USAGE");
! 
!                         field->type = $comp.type;
! 			field->clear_attr(signable_e);
!                         break;
! 		      case FldNumericDisplay: // PIC 9 COMP-5 or COMP-X
! 		        if( $comp.capacity == 0xFF ) { // comp-x is a bit like comp-5
! 			  assert( field->data.digits == field->data.capacity );
! 		          dialect_ok(@2, MfCompX, "alphanumeric PICTURE with numeric USAGE");
! 			}
!                         field->type = $comp.type;
!                         field->data.capacity = type_capacity(field->type,
!                                                              field->data.digits);
! 		        break;
! 		      default: break;
!                       }
! 		    }
!                     break;
! 		  case FldPacked: // comp-6 is unsigned comp-3
! 		    assert(! $comp.signable);  // else PACKED_DECIMAL from scanner
! 		    field->attr |= separate_e;
!                     dialect_ok(@2, MfComp6, "COMP-6");
!                     if( field->type == FldNumericDisplay ) {// PICTURE before USAGE
!                       infer = false;
!                       assert(field->data.capacity > 0);
!                       field->type = $comp.type;
!                       field->data.capacity = type_capacity(field->type,
!                                                            field->data.digits);
!                     }
! 		    break;
!                   default:
!                     break;
!                   }
  
!                   if( infer ) {
!                     if( $comp.capacity > 0 ) {
!                       if( field->data.capacity > 0 ) {
!                         error_msg(@comp, "%s is BINARY type, incompatible with PICTURE",
!                                field->name);
!                         YYERROR;
!                       }
!                       field->data.capacity = $comp.capacity;
!                       field->type = $comp.type;
!                       if( $comp.signable ) {
!                         field->attr = (field->attr | signable_e);
!                       }
!                     }
!                   }
!                   $$ = $comp.type;
                  }
  	|	usage COMPUTATIONAL[comp] native
                  { 
! 		  // logic below duplicates BINARY_INTEGER, above.
! 		  // If it changes, consolidate in a function. 
!                   bool infer = true;
!                   cbl_field_t *field = current_field();
! 
!                   // Some binary types have defined capacity;
!                   switch($comp.type) {
!                   // COMPUTATIONAL and COMP-5 rely on PICTURE.
!                   case FldNumericBinary:
!                     field->attr |= big_endian_e;
!                     __attribute__((fallthrough));
!                   case FldNumericBin5:
! 		    // If no capacity yet, then no picture, infer $comp.capacity.
! 		    // If field has capacity, ensure USAGE is compatible.
! 		    if( field->data.capacity > 0 ) { // PICTURE before USAGE
! 		      infer = false;
! 		      switch( field->type ) {
! 		      case FldAlphanumeric:   // PIC X COMP-5 or COMP-X
! 			assert( field->data.digits == 0 );
! 			assert( field->data.rdigits == 0 );
! 		        dialect_ok(@2, MfCompX, "alphanumeric PICTURE with numeric USAGE");
!                         field->type = $comp.type;
! 			field->clear_attr(signable_e);
!                         break;
! 		      case FldNumericDisplay: // PIC 9 COMP-5 or COMP-X
! 		        if( $comp.capacity == 0xFF ) { // comp-x is a bit like comp-5
! 			  assert( field->data.digits == field->data.capacity );
!                           dialect_ok(@2, MfCompX, "alphanumeric PICTURE with numeric USAGE");
! 			}
!                         field->type = $comp.type;
!                         field->data.capacity = type_capacity(field->type,
!                                                              field->data.digits);
! 		        break;
! 		      default: break;
!                       }
! 		    }
!                     break;
! 		  case FldPacked: // comp-6 is unsigned comp-3
! 		    assert(! $comp.signable);  // else PACKED_DECIMAL from scanner
! 		    field->attr |= separate_e;
!                     dialect_ok(@2, MfComp6, "COMP-6");
!                     if( field->type == FldNumericDisplay ) {// PICTURE before USAGE
!                       infer = false;
!                       assert(field->data.capacity > 0);
!                       field->type = $comp.type;
!                       field->data.capacity = type_capacity(field->type,
!                                                            field->data.digits);
!                     }
! 		    break;
!                   default:
!                     break;
!                   }
! 
!                   if( infer ) {
!                     if( $comp.capacity > 0 ) {
!                       if( field->data.capacity > 0 ) {
!                         error_msg(@comp, "%s is BINARY type, incompatible with PICTURE",
!                                field->name);
!                         YYERROR;
!                       }
!                       field->data.capacity = $comp.capacity;
!                       field->type = $comp.type;
!                       if( $comp.signable ) {
!                         field->attr = (field->attr | signable_e);
!                       }
!                     }
                    }
!                   $$ = $comp.type;
                  }
-         |       usage DISPLAY         native { $$ = FldDisplay; }
-         |       usage PACKED_DECIMAL  native { $$ = FldPacked; }
          |       usage PACKED_DECIMAL  with NO SIGN
  		{
                    cbl_field_t *field = current_field();
! 		  if( field->data.capacity > 0 &&
  		      field->type != FldNumericDisplay) {
! 		    error_msg(@2, "%s PICTURE is incompatible with USAGE PACKED DECIMAL",
! 			     field->name);
  		    YYERROR;
  		  }
  		  field->clear_attr(separate_e);
  		  field->clear_attr(signable_e);
-                   if( field->type == FldNumericDisplay ) {// PICTURE before USAGE
-                     assert(field->data.capacity > 0);
-                     field->data.capacity = type_capacity(FldPacked,
-                                                          field->data.digits);
-                   }
  		  $$ = field->type = FldPacked;
  		}
          |       usage INDEX                  {
--- 4752,4802 ----
  		}
          |       usage BINARY_INTEGER [comp] is_signed
                  {
!                   bool signable = $is_signed? $comp.signable : false;
  
!                   $$ = field_binary_usage( @comp, current_field(), 
!                                            $comp.type, $comp.capacity,
!                                            signable );
                  }
+ 
  	|	usage COMPUTATIONAL[comp] native
                  { 
!                   $$ = field_binary_usage( @comp, current_field(), 
!                                            $comp.type, $comp.capacity,
!                                            $comp.signable );
!                 } 
!         |       usage DISPLAY         native {
!                   auto field = current_field();
!                   if( ! field->codeset.set() ) {
!                     error_msg(@2, "USAGE DISPLAY conflicts with PICTURE");
                    }
!                   $$ = FldDisplay;
!                 }
!         |       usage PACKED_DECIMAL  native {
!                   cbl_field_t *field = current_field();
! 		  if( field->data.capacity() > 0 &&
! 		      field->type != FldNumericDisplay) {
! 		    error_msg(@2, "USAGE PACKED DECIMAL conflicts with PICTURE");
! 		    YYERROR;
! 		  }
!                   $$ = FldPacked;
                  }
          |       usage PACKED_DECIMAL  with NO SIGN
  		{
                    cbl_field_t *field = current_field();
! 		  if( field->data.capacity() > 0 &&
  		      field->type != FldNumericDisplay) {
! 		    error_msg(@2, "USAGE PACKED DECIMAL conflicts with PICTURE");
  		    YYERROR;
  		  }
+ 		  if( field->has_attr(signable_e) ) {
+                     error_msg(@$, "signed PICTURE conflicts with NO SIGN");
+                   }
+ 		  if( field->has_attr(separate_e) ) {
+                     error_msg(@$, "SIGN clause conflicts with NO SIGN");
+                   }
  		  field->clear_attr(separate_e);
  		  field->clear_attr(signable_e);
  		  $$ = field->type = FldPacked;
  		}
          |       usage INDEX                  {
*************** usage_clause1:  usage BIT
*** 4727,4736 ****
                  }
          |       usage NATIONAL {
                    auto field = current_field();
!                   if( ! field->codeset.set(EBCDIC_e) ) {
!                     error_msg(@2, "usage NATIONAL conflicts with PICTURE");
                    }
!                   $$ = FldInvalid;
                  } 
                  // We should enforce data/code pointers with a different type.
          |       usage POINTER
--- 4804,4814 ----
                  }
          |       usage NATIONAL {
                    auto field = current_field();
!                   auto encoding = current_encoding('N');
!                   if( ! field->codeset.set(encoding) ) {
!                     error_msg(@2, "USAGE NATIONAL conflicts with PICTURE");
                    }
!                   $$ = FldDisplay;
                  } 
                  // We should enforce data/code pointers with a different type.
          |       usage POINTER
*************** usage_clause1:  usage BIT
*** 4744,4755 ****
  		  }
                    if( gcobol_feature_embiggen() && redefined &&
                        is_numeric(redefined->type) && redefined->size() == 4) {
!                     // For now, we allow POINTER to expand a 32-bit item to 64 bits.
!                     field->data.capacity = int_size_in_bytes(ptr_type_node);
                      dbgmsg("%s: expanding #" HOST_SIZE_T_PRINT_UNSIGNED
                            " %s capacity %u => %u", __func__,
                            (fmt_size_t)field_index(redefined), redefined->name,
!                           redefined->data.capacity, field->data.capacity);
  
                      redefined->embiggen();
  
--- 4822,4833 ----
  		  }
                    if( gcobol_feature_embiggen() && redefined &&
                        is_numeric(redefined->type) && redefined->size() == 4) {
!                     // Allow POINTER to expand a 32-bit item to 64 bits.
!                     field->data.capacity(int_size_in_bytes(ptr_type_node));
                      dbgmsg("%s: expanding #" HOST_SIZE_T_PRINT_UNSIGNED
                            " %s capacity %u => %u", __func__,
                            (fmt_size_t)field_index(redefined), redefined->name,
!                           redefined->data.capacity(), field->data.capacity());
  
                      redefined->embiggen();
  
*************** value_clause:   VALUE all LITERAL[lit] {
*** 4784,4854 ****
                                $lit.prefix, $lit.data);
                    }
  
-                   field->data.initial  = $lit.data;
                    field->attr |= literal_attr($lit.prefix);
                    field->attr |= quoted_e;
  
!                   if( field->data.capacity == 0 ) {
!                     field->data.capacity = $lit.len;
!                   } else {
!                     if( $all ) {
!                       field_value_all(field);
!                     } else {
!                       if( $lit.len < field->data.capacity ) {
!                         auto p = blank_pad_initial( $lit.data, $lit.len,
!                                                     field->data.capacity );
!                         if( !p ) YYERROR;
!                         field->data.initial = p;
!                       }
                      }
                    }
                  }
!         |       VALUE all cce_expr[value] {
                    cbl_field_t *field = current_field();
!                   auto orig_str = original_number();
! 		  REAL_VALUE_TYPE orig_val;
! 		  real_from_string3 (&orig_val, orig_str,
! 				     TYPE_MODE (float128_type_node));
!                   char *initial = NULL;
! 
!                   if( real_identical (&orig_val, &$value) ) {
!                     initial = orig_str;
!                     pristine_values.insert(initial);
                    } else {
!                     initial = string_of($value);
!                     gcc_assert(initial);
                    }
- 
-                   char decimal = symbol_decimal_point();
-                   std::replace(initial, initial + strlen(initial), '.', decimal);
- 
-                   field->data.initial = initial;
-                   field->data = build_real (float128_type_node, $value);
- 
-                   if( $all ) field_value_all(field);
                  }
          |       VALUE all reserved_value[value]
                  {
                    cbl_field_t *field = current_field();
!                   if( ! field->codeset.set() ) {
!                     error_msg(@value, "VALUE inconsistent with encoding %s",
!                               cbl_alphabet_t::encoding_str(field->codeset.encoding));
                    }
!                   if( $value != NULLS ) {
!                     auto fig = constant_of(constant_index($value));
!                     cbl_field_t *field = current_field();
!                     field->data.initial = fig->data.initial;
                    }
                  }
          |       /* VALUE is */ NULLPTR
                  {
!                     auto fig = constant_of(constant_index(NULLS));
!                     cbl_field_t *field = current_field();
!                     field->data.initial = fig->data.initial;
                  }
          |       VALUE error
                  {
!                   error_msg(@2, "no valid VALUE supplied");
                  }
                  ;
  
--- 4862,4933 ----
                                $lit.prefix, $lit.data);
                    }
  
                    field->attr |= literal_attr($lit.prefix);
                    field->attr |= quoted_e;
  
!                   auto capacity = field->data.capacity();
!                   field->data.original($lit.data, $all); // oops, sets capacity to strlen
! 
!                   if( capacity ) { // via PICTURE or USAGE
!                     field->data.capacity(capacity); // restore it (unnecessary)
!                     if (field->data.initial) { // PICTURE created blank initial
!                       field->encode($lit.len, @lit);
                      }
                    }
                  }
!         |       VALUE all cce_expr[cce] {
! 		  /*
!                    * cce has two parts: 
! 		   * cce.r) Host binary value
! 		   * cce.s) string value, if supplied as numeric literal 
!                    */
                    cbl_field_t *field = current_field();
!                   if( $cce.s ) {
!                     field->data.original($cce.s, $all);
                    } else {
!                     field->data.original($cce.r);
                    }
                  }
          |       VALUE all reserved_value[value]
                  {
                    cbl_field_t *field = current_field();
!                   field->codeset.set();
!                   assert( $value != NULLS );
!                   auto fig = constant_of(constant_index($value));
!                   auto orig_str = fig->data.initial;
!                   auto capacity = field->data.capacity();
!                   field->data.original(orig_str, $all);
! 
!                   if( capacity ) { // via PICTURE or USAGE
!                     field->data.capacity(capacity); // restore it
!                     if (field->data.initial) { // PICTURE created blank initial
!                       field->encode( strlen(orig_str), @value );
!                     }
                    }
!                   if(  $value != ZERO ) {
!                     if( ($value != SPACES && field->type == FldNumericEdited)
!                       || is_numeric(field) )
!                     {
!                       error_msg(@value,
!                                 "unexpected initial value for %s",
!                                 cbl_field_type_name(field->type));
!                     }
                    }
                  }
          |       /* VALUE is */ NULLPTR
                  {
!                   auto fig = constant_of(constant_index(NULLS));
!                   cbl_field_t *field = current_field();
!                   auto capacity = field->data.capacity();
!                   field->data.original(fig->data.initial);
!                   if( capacity ) { // via PICTURE or USAGE
!                     field->data.capacity(capacity); // restore it
!                     // do not encode
!                   }
                  }
          |       VALUE error
                  {
!                   error_msg(@2, "invalid VALUE");
                  }
                  ;
  
*************** any_length:     ANY LENGTH
*** 4936,4949 ****
                    }
                    const char *prog_name = current.program()->name;
                    bool is_compat = 0 < compat_programs.count(prog_name);
!                   if( ! (field->level == 1 &&
!                          current_data_section == linkage_datasect_e &&
!                          (1 < current.program_level() ||
! 			      current.program()->is_function() ||
!                               is_compat)) ) {
!                     error_msg(@1, "ANY LENGTH valid only for 01 "
!                             "in LINKAGE SECTION of a function or contained program");
!                     YYERROR;
                    }
                    field->attr |= any_length_e;
                  }
--- 5015,5029 ----
                    }
                    const char *prog_name = current.program()->name;
                    bool is_compat = 0 < compat_programs.count(prog_name);
!                   if( field->level != 1 || current_data_section != linkage_datasect_e ) {
!                     error_msg(@1, "ANY LENGTH valid only for 01 data-item "
!                                   "in LINKAGE SECTION");
!                   }
!                   if( ! current.program()->is_function() ) {
!                     if( 1 == current.program_level() && ! is_compat) {
!                         cbl_message(@$, MfAnyLength,
!                                     "ANY LENGTH not valid in outermost program");
!                     }
                    }
                    field->attr |= any_length_e;
                  }
*************** same_clause:    SAME AS name
*** 5021,5033 ****
  sign_clause:    sign_is sign_leading sign_separate
                  {
                    cbl_field_t *field = current_field();
                    if( $sign_leading ) {
!                     field->attr |= leading_e;
                    } else {
!                     field->attr &= ~uint64_t(leading_e); // turn off in case inherited
!                     field->attr |= signable_e;
                    }
!                   if( $sign_separate ) field->attr |= separate_e;
                  }
                  ;
  sign_is:        %empty
--- 5101,5118 ----
  sign_clause:    sign_is sign_leading sign_separate
                  {
                    cbl_field_t *field = current_field();
+                   if( 0 < field->data.capacity() ) { // PICTURE set size
+                     if( ! field->has_attr(signable_e) ) {
+                       error_msg(@1, "%qs must be signed for SIGN IS", field->name);
+                     }
+                   }
+                   field->set_attr(signable_e);
                    if( $sign_leading ) {
!                     field->set_attr(leading_e);
                    } else {
!                     field->clear_attr(leading_e); // turn off in case inherited
                    }
!                   if( $sign_separate ) field->set_attr(separate_e);
                  }
                  ;
  sign_is:        %empty
*************** procedure_use:  optional scalar {
*** 5163,5169 ****
                  }
                  ;
  by_value_arg:   scalar
!         |       LITERAL  { $$ = new_reference(new_literal($1, quoted_e)); }
          |       reserved_value
                  {
                    $$ = new_reference(constant_of(constant_index($1)));
--- 5248,5254 ----
                  }
                  ;
  by_value_arg:   scalar
!         |       LITERAL  { $$ = new_reference(new_literal(@1, $1, quoted_e)); }
          |       reserved_value
                  {
                    $$ = new_reference(constant_of(constant_index($1)));
*************** accept_except:	EXCEPTION
*** 5559,5565 ****
  
  envar:          scalar { $$ = $1; $$->field->attr |= envar_e; }
          |       LITERAL {
!                   $$ = new_reference(new_literal($1, quoted_e));
                    $$->field->attr |= envar_e;
                  }
                  ;
--- 5644,5650 ----
  
  envar:          scalar { $$ = $1; $$->field->attr |= envar_e; }
          |       LITERAL {
!                   $$ = new_reference(new_literal(@1, $1, quoted_e));
                    $$->field->attr |= envar_e;
                  }
                  ;
*************** name88:		NAME88 {
*** 5732,5738 ****
                    name_queue.qualify(@1, $1);
  		  auto namelocs( name_queue.pop() );
  		  auto names( name_queue.namelist_of(namelocs) );
!                   if( ($$ = field_find(names)) == NULL ) {
                      if( procedure_div_e == current_division  ) {
  		      error_msg(namelocs.back().loc,
  				"DATA-ITEM '%s' not found", names.back() );
--- 5817,5823 ----
                    name_queue.qualify(@1, $1);
  		  auto namelocs( name_queue.pop() );
  		  auto names( name_queue.namelist_of(namelocs) );
!                   if( ($$ = field_find(@1, names)) == NULL ) {
                      if( procedure_div_e == current_division  ) {
  		      error_msg(namelocs.back().loc,
  				"DATA-ITEM '%s' not found", names.back() );
*************** rel_term:	rel_term1
*** 6455,6461 ****
  rel_term1:	all LITERAL
                  {
  		  $$.invert = false;
!                   $$.term = new_reference(new_literal($2, quoted_e));
                    $$.term->all = $all;
                  }
          |       all spaces_etc[value]
--- 6540,6546 ----
  rel_term1:	all LITERAL
                  {
  		  $$.invert = false;
!                   $$.term = new_reference(new_literal(@2, $2, quoted_e));
                    $$.term->all = $all;
                  }
          |       all spaces_etc[value]
*************** name:           qname
*** 6925,6931 ****
                    auto namelocs( name_queue.pop() );
                    auto names( name_queue.namelist_of(namelocs) );
                    auto inner = namelocs.back();
!                   if( ($$ = field_find(names)) == NULL ) {
                      if( procedure_div_e == current_division  ) {
                        error_msg(inner.loc,
                                  "DATA-ITEM '%s' not found", inner.name );
--- 7010,7016 ----
                    auto namelocs( name_queue.pop() );
                    auto names( name_queue.namelist_of(namelocs) );
                    auto inner = namelocs.back();
!                   if( ($$ = field_find(@1, names)) == NULL ) {
                      if( procedure_div_e == current_division  ) {
                        error_msg(inner.loc,
                                  "DATA-ITEM '%s' not found", inner.name );
*************** context_word:   APPLY
*** 6993,6998 ****
--- 7078,7085 ----
                                           $$ = s; } // USAGE clause and FLOAT-DECIMAL clause
          |       BLINK                  { static char s[] ="BLINK";
                                           $$ = s; } // screen description entry and SET attribute statement
+         |       BYTE                   { static char s[] ="BYTE";
+                                          $$ = s; } // CONVERT intrinsic function
          |       BYTE_LENGTH            { static char s[] ="BYTE-LENGTH";
                                           $$ = s; } // constant entry
          |       CAPACITY               { static char s[] ="CAPACITY";
*************** move:           MOVE scalar TO move_tgts
*** 7147,7162 ****
                  {
                    statement_begin(@1, MOVE);
                    if( $scalar->field->type == FldIndex ) {
!                     error_msg(@1, "%qs cannot be MOVEd because it is an %<INDEX%>",
! 			     name_of($scalar->field) );
!                     YYERROR;
                    }
                    if( !parser_move2($tgts, *$scalar) ) { YYERROR; }
                  }
          |       MOVE all literalism[input] TO move_tgts[tgts]
                  {
                    statement_begin(@1, MOVE);
!                   struct cbl_refer_t *src = new_reference(new_literal($input,
                                                                        quoted_e));
                    src->all = $all;
                    if( !parser_move2($tgts, *src) ) { YYERROR; }
--- 7234,7249 ----
                  {
                    statement_begin(@1, MOVE);
                    if( $scalar->field->type == FldIndex ) {
!                     cbl_message(@1, MfMoveIndex,
!                                 "cannot MOVE %qs because it is an %<INDEX%>",
!                                 name_of($scalar->field) );
                    }
                    if( !parser_move2($tgts, *$scalar) ) { YYERROR; }
                  }
          |       MOVE all literalism[input] TO move_tgts[tgts]
                  {
                    statement_begin(@1, MOVE);
!                   struct cbl_refer_t *src = new_reference(new_literal(@input, $input,
                                                                        quoted_e));
                    src->all = $all;
                    if( !parser_move2($tgts, *src) ) { YYERROR; }
*************** move:           MOVE scalar TO move_tgts
*** 7174,7181 ****
                                              } );
  
                    if( p != $tgts->targets.end() ) {
!                     error_msg(@src, "cannot MOVE %s "
! 			            "to numeric receiving field %s",
  			      constant_of(constant_index($src))->name,
  			      field->name );
                      YYERROR;
--- 7261,7268 ----
                                              } );
  
                    if( p != $tgts->targets.end() ) {
!                     error_msg(@src, "cannot MOVE %qs "
! 			            "to numeric receiving field %qs",
  			      constant_of(constant_index($src))->name,
  			      field->name );
                      YYERROR;
*************** move_tgt:	scalar[tgt] {
*** 7251,7257 ****
  		  }
  		  auto litcon = field.name[0] == '_'? "literal" : "constant";
  		  error_msg(@literal, "%s is a %s", value_str, litcon);
! 		  $$ = NULL;
  		}
          |       error
                  {
--- 7338,7344 ----
  		  }
  		  auto litcon = field.name[0] == '_'? "literal" : "constant";
  		  error_msg(@literal, "%s is a %s", value_str, litcon);
! 		  $$ = nullptr;
  		}
          |       error
                  {
*************** move_tgt:	scalar[tgt] {
*** 7260,7266 ****
  		    error_at = yytext;
  		    error_msg(first_line_of(@1), "invalid receiving operand");
  		  }
! 		  $$ = NULL;
                  }
                  ;
  
--- 7347,7353 ----
  		    error_at = yytext;
  		    error_msg(first_line_of(@1), "invalid receiving operand");
  		  }
! 		  $$ = nullptr;
                  }
                  ;
  
*************** num_value:      scalar // might actually
*** 7431,7437 ****
                    location_set(@1);
                    $$ = new cbl_refer_t( new_tempnumeric(none_e) );
  		  dialect_ok(@1, IbmLengthOf, "LENGTH OF");
! 		  parser_set_numeric($$->field, $val->data.capacity);
                  }
          |       LENGTH_OF name[val] subscripts[subs] {
                    location_set(@1);
--- 7518,7524 ----
                    location_set(@1);
                    $$ = new cbl_refer_t( new_tempnumeric(none_e) );
  		  dialect_ok(@1, IbmLengthOf, "LENGTH OF");
! 		  parser_set_numeric($$->field, $val->data.capacity());
                  }
          |       LENGTH_OF name[val] subscripts[subs] {
                    location_set(@1);
*************** num_value:      scalar // might actually
*** 7441,7447 ****
  		    cbl_refer_t r1($val);
  		    subscript_dimension_error( @subs, $subs->refers.size(), &r1 );
                    }
! 		  parser_set_numeric($$->field, $val->data.capacity);
                  }
                  ;
  
--- 7528,7534 ----
  		    cbl_refer_t r1($val);
  		    subscript_dimension_error( @subs, $subs->refers.size(), &r1 );
                    }
! 		  parser_set_numeric($$->field, $val->data.capacity());
                  }
                  ;
  
*************** num_value:      scalar // might actually
*** 7472,7504 ****
  
  cce_expr:       cce_factor
          |       cce_expr '+' cce_expr {
!                   real_arithmetic (&$$, PLUS_EXPR, &$1, &$3);
!                   real_convert (&$$, TYPE_MODE (float128_type_node), &$$);
                  }
          |       cce_expr '-' cce_expr {
!                   real_arithmetic (&$$, MINUS_EXPR, &$1, &$3);
!                   real_convert (&$$, TYPE_MODE (float128_type_node), &$$);
                  }
          |       cce_expr '*' cce_expr {
!                   real_arithmetic (&$$, MULT_EXPR, &$1, &$3);
!                   real_convert (&$$, TYPE_MODE (float128_type_node), &$$);
                  }
          |       cce_expr '/' cce_expr {
!                   real_arithmetic (&$$, RDIV_EXPR, &$1, &$3);
!                   real_convert (&$$, TYPE_MODE (float128_type_node), &$$);
                  }
!         |                '+' cce_expr %prec NEG { $$ =  $2; }
!         |                '-' cce_expr %prec NEG { $$ = real_value_negate (&$2); }
!         |                '(' cce_expr ')'  { $$ = $2; }
          ;
  
  cce_factor:     NUMSTR {
                    /* real_from_string does not allow arbitrary radix.  */
                    // When DECIMAL IS COMMA, commas act as decimal points.
  		  gcc_assert($1.radix == decimal_e);
! 		  auto p = $1.string, pend = p + strlen(p);
! 		  std::replace(p, pend, ',', '.');
! 		  real_from_string3( &$$, $1.string,
  				     TYPE_MODE (float128_type_node) );
                  }
                  ;
--- 7559,7596 ----
  
  cce_expr:       cce_factor
          |       cce_expr '+' cce_expr {
!                   $$.s = nullptr;
!                   real_arithmetic (&$$.r, PLUS_EXPR, &$1.r, &$3.r);
!                   real_convert (&$$.r, TYPE_MODE (float128_type_node), &$$.r);
                  }
          |       cce_expr '-' cce_expr {
!                   $$.s = nullptr;
!                   real_arithmetic (&$$.r, MINUS_EXPR, &$1.r, &$3.r);
!                   real_convert (&$$.r, TYPE_MODE (float128_type_node), &$$.r);
                  }
          |       cce_expr '*' cce_expr {
!                   $$.s = nullptr;
!                   real_arithmetic (&$$.r, MULT_EXPR, &$1.r, &$3.r);
!                   real_convert (&$$.r, TYPE_MODE (float128_type_node), &$$.r);
                  }
          |       cce_expr '/' cce_expr {
!                   $$.s = nullptr;
!                   real_arithmetic (&$$.r, RDIV_EXPR, &$1.r, &$3.r);
!                   real_convert (&$$.r, TYPE_MODE (float128_type_node), &$$.r);
                  }
!         |                '+' cce_expr %prec NEG { $$.r =  $2.r; }
!         |                '-' cce_expr %prec NEG { $$.r = real_value_negate (&$2.r); }
!         |                '(' cce_expr ')'  { $$.r = $2.r; }
          ;
  
  cce_factor:     NUMSTR {
                    /* real_from_string does not allow arbitrary radix.  */
                    // When DECIMAL IS COMMA, commas act as decimal points.
  		  gcc_assert($1.radix == decimal_e);
!                   $$.s = $1.string;
!                   std::string numstr($1.string);
! 		  std::replace(numstr.begin(), numstr.end(), ',', '.');
! 		  real_from_string3( &$$.r, numstr.c_str(),
  				     TYPE_MODE (float128_type_node) );
                  }
                  ;
*************** stop:           STOP RUN exit_with
*** 7560,7566 ****
                  {
                    statement_begin(@1, STOP);
                    dialect_ok(@2, IbmStopNumber, "STOP <number>");
!                   cbl_refer_t status( new_literal($status.string, $status.radix) );
                    parser_see_stop_run( status, NULL );
                  }
          |       STOP LITERAL[name] // CCVS-85 && IBM syntax
--- 7652,7658 ----
                  {
                    statement_begin(@1, STOP);
                    dialect_ok(@2, IbmStopNumber, "STOP <number>");
!                   cbl_refer_t status( new_literal(@status, $status.string, $status.radix) );
                    parser_see_stop_run( status, NULL );
                  }
          |       STOP LITERAL[name] // CCVS-85 && IBM syntax
*************** stop:           STOP RUN exit_with
*** 7577,7583 ****
  stop_status:    status         { $$ = NULL; }
          |       status scalar  { $$ = $2; }
          |       status NUMSTR {
!                   $$ = new_reference(new_literal($2.string, $2.radix));
                  }
                  ;
  
--- 7669,7675 ----
  stop_status:    status         { $$ = NULL; }
          |       status scalar  { $$ = $2; }
          |       status NUMSTR {
!                   $$ = new_reference(new_literal(@2, $2.string, $2.radix));
                  }
                  ;
  
*************** arg_list:                any_arg { $$ =
*** 7625,7631 ****
          |       arg_list any_arg { $1->push_back($2); $$ = $1; }
                  ;
  any_arg:        expr
!         |       LITERAL {$$ = new_reference(new_literal($1, quoted_e)); }
                  ;
  
                  /*
--- 7717,7723 ----
          |       arg_list any_arg { $1->push_back($2); $$ = $1; }
                  ;
  any_arg:        expr
!         |       LITERAL {$$ = new_reference(new_literal(@1, $1, quoted_e)); }
                  ;
  
                  /*
*************** signed_literal:     num_literal
*** 7650,7656 ****
                    location_set(@1);
                    $$ = new_tempnumeric(none_e);
  		  dialect_ok(@1, IbmLengthOf, "LENGTH OF");
!                   parser_set_numeric($$, $val->data.capacity);
                  }
          |       LENGTH_OF name[val] subscripts[subs] {
                    location_set(@1);
--- 7742,7748 ----
                    location_set(@1);
                    $$ = new_tempnumeric(none_e);
  		  dialect_ok(@1, IbmLengthOf, "LENGTH OF");
!                   parser_set_numeric($$, $val->data.capacity());
                  }
          |       LENGTH_OF name[val] subscripts[subs] {
                    location_set(@1);
*************** signed_literal:     num_literal
*** 7660,7670 ****
  		    cbl_refer_t r1($val);
  		    subscript_dimension_error( @subs, $subs->refers.size(), &r1 );
                    }
!                   parser_set_numeric($$, $val->data.capacity);
                  }
                  ;
  
! num_literal:    NUMSTR { $$ = new_literal($1.string, $1.radix); }
          |       ZERO   { $$ = constant_of(constant_index(ZERO)); }
                  ;
  
--- 7752,7769 ----
  		    cbl_refer_t r1($val);
  		    subscript_dimension_error( @subs, $subs->refers.size(), &r1 );
                    }
!                   parser_set_numeric($$, $val->data.capacity());
                  }
                  ;
  
! num_constant:   NUMSTR {
!                   if( $1.is_float ) {
!                     $$ = new_literal_float(@1, $1.string);
!                   } else {
!                     $$ = new_literal(@1, $1.string, $1.radix); }
!                 }
!                 ;
! num_literal:    num_constant
          |       ZERO   { $$ = constant_of(constant_index(ZERO)); }
                  ;
  
*************** varg1a:         ADDRESS OF scalar {
*** 8222,8228 ****
  		    cbl_refer_t r1($val);
  		    subscript_dimension_error( @subs, $subs->refers.size(), &r1 );
                    }
! 		  parser_set_numeric($$->field, $val->data.capacity);
                  }
                  ;
  
--- 8321,8327 ----
  		    cbl_refer_t r1($val);
  		    subscript_dimension_error( @subs, $subs->refers.size(), &r1 );
                    }
! 		  parser_set_numeric($$->field, $val->data.capacity());
                  }
                  ;
  
*************** literal:        literalism
*** 8235,8246 ****
                    $$ = $1.isymbol()?
                      cbl_field_of(symbol_at($1.isymbol()))
                      :
!                     new_literal($1, quoted_e);
!                 }
!         |       NUMSTR
!                 {
!                   $$ = new_literal($1.string, $1.radix);
                  }
          |       DATETIME_FMT
                  {
                    $$ = new_literal(strlen($1), $1, quoted_e);
--- 8334,8342 ----
                    $$ = $1.isymbol()?
                      cbl_field_of(symbol_at($1.isymbol()))
                      :
!                     new_literal(@1, $1, quoted_e);
                  }
+         |       num_constant
          |       DATETIME_FMT
                  {
                    $$ = new_literal(strlen($1), $1, quoted_e);
*************** file_record:    NAME
*** 8546,8552 ****
  		  auto namelocs( name_queue.pop() );
  		  auto names( name_queue.namelist_of(namelocs) );
  		  auto inner = namelocs.back();
!                   if( ($$ = field_find(names)) == NULL ) {
                      error_msg(inner.loc, "no record name '%s'", inner.name);
                      YYERROR;
                    }
--- 8642,8648 ----
  		  auto namelocs( name_queue.pop() );
  		  auto names( name_queue.namelist_of(namelocs) );
  		  auto inner = namelocs.back();
!                   if( ($$ = field_find(@1, names)) == NULL ) {
                      error_msg(inner.loc, "no record name '%s'", inner.name);
                      YYERROR;
                    }
*************** advance_by:     scalar lines { $$ = $1;
*** 8583,8589 ****
                     * number of lines is negative.  So, we use the
                     * negative Number Of The Beast as a PAGE flag.
                     */
!                   $$ = new_reference( new_literal(xstrdup("-666")) );
                  }
          |       device_name { $$ = new_reference(literally_one); }
                  ;
--- 8679,8685 ----
                     * number of lines is negative.  So, we use the
                     * negative Number Of The Beast as a PAGE flag.
                     */
!                   $$ = new_reference( new_constant(xstrdup("-666")) );
                  }
          |       device_name { $$ = new_reference(literally_one); }
                  ;
*************** set:            SET set_tgts[tgts] TO se
*** 9007,9013 ****
                    auto literal = $src.isymbol()?
                      cbl_field_of(symbol_at($src.isymbol()))
                      :
!                     new_literal($src, quoted_e);
                    ast_set_pointers($tgts->targets, literal);
                  }
                  // Format 12 (save-locale):
--- 9103,9109 ----
                    auto literal = $src.isymbol()?
                      cbl_field_of(symbol_at($src.isymbol()))
                      :
!                     new_literal(@src, $src, quoted_e);
                    ast_set_pointers($tgts->targets, literal);
                  }
                  // Format 12 (save-locale):
*************** search_term:    scalar[key] EQ search_ex
*** 9296,9302 ****
                  }
                  ;
  search_expr:    expr
!         |       LITERAL { $$ = new_reference(new_literal($1, quoted_e)); }
                  ;
  
  sort:           sort_table
--- 9392,9398 ----
                  }
                  ;
  search_expr:    expr
!         |       LITERAL { $$ = new_reference(new_literal(@1, $1, quoted_e)); }
                  ;
  
  sort:           sort_table
*************** sort_table:     SORT tableref[table] sor
*** 9308,9313 ****
--- 9404,9410 ----
                    std::vector <cbl_key_t> keys($sort_keys->key_list.size());
  		  if( ! is_table($table->field) ) {
  		    error_msg(@1, "%s has no OCCURS clause", $table->field->name);
+                     YYERROR;
  		  }
                    // 23) If data-name-1 is omitted, the data item referenced by
                    // data-name-2 is the key data item.
*************** sort_table:     SORT tableref[table] sor
*** 9325,9330 ****
--- 9422,9428 ----
                    statement_begin(@1, SORT);
  		  if( ! is_table($table->field) ) {
  		    error_msg(@1, "%s has no OCCURS clause", $table->field->name);
+                     YYERROR;
  		  }
                    cbl_key_t
                      key = cbl_key_t($table->field->occurs.keys[0]),
*************** inspect:        INSPECT backward inspect
*** 9601,9610 ****
                  {
  		  if( $all ) {
  		    $replace_oper->all = true;
! 		    if( is_literal($replace_oper->field) ) {
! 		      if( $replace_oper->field->data.capacity != 1 ) {
  			error_msg(@all, "ALL %s must be a single character",
! 				 $replace_oper->field->data.initial);
  			YYERROR;
  		      }
  		    } else {
--- 9699,9709 ----
                  {
  		  if( $all ) {
  		    $replace_oper->all = true;
!                     cbl_field_t *field( $replace_oper->field );
! 		    if( is_literal(field) ) {
! 		      if( field->data.capacity() != field->codeset.stride() ) {
  			error_msg(@all, "ALL %s must be a single character",
!                                   field->data.initial);
  			YYERROR;
  		      }
  		    } else {
*************** inspect:        INSPECT backward inspect
*** 9616,9627 ****
  		                *replace = $replace_oper->field;
  		    if( is_literal(match) && is_literal(replace) ) {
  		      if( !$match->all && !$replace_oper->all) {
! 			if( match->data.capacity != replace->data.capacity ) {
  			  // Make a copy of replace, because nice_name returns a static
  			  char *replace_name = xstrdup(nice_name_of(replace));
  			  error_msg(@match, "%qs, size %u NOT EQUAL %qs, size %u",
! 				    nice_name_of(match), match->data.capacity, 
! 				    replace_name, replace->data.capacity);
  				    free(replace_name);
  			  YYERROR;
  			}
--- 9715,9726 ----
  		                *replace = $replace_oper->field;
  		    if( is_literal(match) && is_literal(replace) ) {
  		      if( !$match->all && !$replace_oper->all) {
! 			if( match->data.capacity() != replace->data.capacity() ) {
  			  // Make a copy of replace, because nice_name returns a static
  			  char *replace_name = xstrdup(nice_name_of(replace));
  			  error_msg(@match, "%qs, size %u NOT EQUAL %qs, size %u",
! 				    nice_name_of(match), match->char_capacity(), 
! 				    replace_name, replace->char_capacity());
  				    free(replace_name);
  			  YYERROR;
  			}
*************** first_leading:  FIRST      { $$ = bound_
*** 9856,9862 ****
  		}
                  ;
  
! alphaval:       LITERAL { $$ = new_reference(new_literal($1, quoted_e)); }
          |       reserved_value
                  {
                    $$ = new_reference( constant_of(constant_index($1)) );
--- 9955,9961 ----
  		}
                  ;
  
! alphaval:       LITERAL { $$ = new_reference(new_literal(@1, $1, quoted_e)); }
          |       reserved_value
                  {
                    $$ = new_reference( constant_of(constant_index($1)) );
*************** init_by:        init_category data BY in
*** 9966,9974 ****
                  }
                  ;
  init_data:      alpha_val
!         |       NUMSTR   {
!                   $$ = new_reference(new_literal($1.string, $1.radix));
!                 }
                  ;
  
  call:           call_impl end_call
--- 10065,10071 ----
                  }
                  ;
  init_data:      alpha_val
!         |       num_constant { $$ = new_reference($1); }
                  ;
  
  call:           call_impl end_call
*************** call_returning:	RETURNING
*** 10048,10059 ****
  
  entry:          ENTRY LITERAL
                  { statement_begin(@1, ENTRY);
!                   auto name = new_literal($2, quoted_e);
                    parser_entry( name );
                  }
          |       ENTRY LITERAL USING parameters
                  { statement_begin(@1, ENTRY);
!                   auto name = new_literal($2, quoted_e);
                    ffi_args_t *params = $parameters;
                    size_t narg = params? params->elems.size() : 0;
  		  cbl_ffi_arg_t *pargs = NULL;
--- 10145,10156 ----
  
  entry:          ENTRY LITERAL
                  { statement_begin(@1, ENTRY);
!                   auto name = new_literal(@2, $2, quoted_e);
                    parser_entry( name );
                  }
          |       ENTRY LITERAL USING parameters
                  { statement_begin(@1, ENTRY);
!                   auto name = new_literal(@2, $2, quoted_e);
                    ffi_args_t *params = $parameters;
                    size_t narg = params? params->elems.size() : 0;
  		  cbl_ffi_arg_t *pargs = NULL;
*************** ffi_name:       scalar
*** 10086,10092 ****
                  {
                    // Pretend hex-encoded because that means use verbatim.
                    auto attr = cbl_field_attr_t(quoted_e | hex_encoded_e);
!                   $$ = new_reference(new_literal($1, attr));
                  }
                  ;
  
--- 10183,10189 ----
                  {
                    // Pretend hex-encoded because that means use verbatim.
                    auto attr = cbl_field_attr_t(quoted_e | hex_encoded_e);
!                   $$ = new_reference(new_literal(@1, $1, attr));
                  }
                  ;
  
*************** ffi_by_ref:     scalar_arg[refer]
*** 10106,10111 ****
--- 10203,10215 ----
                  {
                    $$ = new cbl_ffi_arg_t(by_reference_e, $refer);
                  }
+         |       LITERAL
+                 {
+                   cbl_message(@1, MfCallLiteral,
+                               "cannot pass %qs BY REFERENCE", $1.data);
+                   cbl_refer_t *r = new_reference(new_literal(@1, $1, quoted_e));
+                   $$ = new cbl_ffi_arg_t(by_content_e, r);
+                 }
          |       ADDRESS OF scalar_arg[refer]
                  {
                    $$ = new cbl_ffi_arg_t(by_reference_e, $refer, address_of_e);
*************** ffi_by_con:     expr
*** 10124,10130 ****
                  }
          |       LITERAL
                  {
!                   cbl_refer_t *r = new_reference(new_literal($1, quoted_e));
                    $$ = new cbl_ffi_arg_t(by_content_e, r);
                  }
          |       OMITTED
--- 10228,10234 ----
                  }
          |       LITERAL
                  {
!                   cbl_refer_t *r = new_reference(new_literal(@1, $1, quoted_e));
                    $$ = new cbl_ffi_arg_t(by_content_e, r);
                  }
          |       OMITTED
*************** ffi_by_val:     by_value_arg
*** 10140,10146 ****
                  }
          |       cce_expr %prec NAME
                  {
!                   auto r = new_reference(new_literal(string_of($1)));
                    $$ = new cbl_ffi_arg_t(by_value_e, r);
                  }
          |       ADDRESS OF scalar
--- 10244,10251 ----
                  }
          |       cce_expr %prec NAME
                  {
!                   const char *s = $1.s? $1.s : string_of($1.r);
!                   auto r = new_reference(new_literal(@1, s));
                    $$ = new cbl_ffi_arg_t(by_value_e, r);
                  }
          |       ADDRESS OF scalar
*************** str_delimited:  str_input DELIMITED by s
*** 10405,10411 ****
                  ;
  
  str_input:      scalar
!         |       LITERAL { $$ = new_reference(new_literal($1, quoted_e)); }
          |       reserved_value
                  {
                    $$ = new_reference(constant_of(constant_index($1)));
--- 10510,10516 ----
                  ;
  
  str_input:      scalar
!         |       LITERAL { $$ = new_reference(new_literal(@1, $1, quoted_e)); }
          |       reserved_value
                  {
                    $$ = new_reference(constant_of(constant_index($1)));
*************** str_input:      scalar
*** 10414,10420 ****
                  ;
  
  str_size:       SIZE   { $$ = new_reference(NULL); }
!         |       LITERAL { $$ = new_reference(new_literal($1, quoted_e)); }
          |       scalar
          |       reserved_value
                  {
--- 10519,10525 ----
                  ;
  
  str_size:       SIZE   { $$ = new_reference(NULL); }
!         |       LITERAL { $$ = new_reference(new_literal(@1, $1, quoted_e)); }
          |       scalar
          |       reserved_value
                  {
*************** unstring_src:   scalar
*** 10520,10526 ****
          |       intrinsic_call
          |       LITERAL
                  {
!                   $$ = new_reference(new_literal($1, quoted_e));
                  }
                  ;
  
--- 10625,10631 ----
          |       intrinsic_call
          |       LITERAL
                  {
!                   $$ = new_reference(new_literal(@1, $1, quoted_e));
                  }
                  ;
  
*************** function_udf:   FUNCTION_UDF '(' arg_lis
*** 10656,10661 ****
--- 10761,10767 ----
                    // Pretend hex-encoded because that means use verbatim.
                    auto attr = cbl_field_attr_t(quoted_e | hex_encoded_e);
                    auto name = new_literal(strlen(L->name), L->name, attr);
+                   symbol_temporary_location(name, @1);
  		  ast_call( @1, name, $$, args.size(), args.data(), NULL, NULL, true );
                  }
          |       FUNCTION_UDF_0 {
*************** function_udf:   FUNCTION_UDF '(' arg_lis
*** 10670,10675 ****
--- 10776,10782 ----
                    // Pretend hex-encoded because that means use verbatim.
                    auto attr = cbl_field_attr_t(quoted_e | hex_encoded_e);
                    auto name = new_literal(strlen(L->name), L->name, attr);
+                   symbol_temporary_location(name, @1);
                    ast_call( @1, name, $$, narg, args, NULL, NULL, true );
                  }
                  ;
*************** intrinsic:      function_udf
*** 10749,10760 ****
                    $$ = new_alphanumeric(1,"CHAR");
                    if( ! intrinsic_call_1($$, CHAR, $r1, @r1)) YYERROR;
                  }
! 
! 	|       CONVERT  '(' varg[r1] convert_src[src] convert_dst[dst] ')' {
                    location_set(@1);
!                   $$ = new_alphanumeric(1,"CONVERT");
! 		  cbl_unimplemented("CONVERT");
!                   /* if( ! intrinsic_call_3($$, CONVERT, $r1, $src, $dst) ) YYERROR; */
                  }
  
          |       DISPLAY_OF  '(' varg[r1]  ')' {
--- 10856,10909 ----
                    $$ = new_alphanumeric(1,"CHAR");
                    if( ! intrinsic_call_1($$, CHAR, $r1, @r1)) YYERROR;
                  }
!                 /* convert formulations: 
!                  *  1. ANY to ALNUM HEX, or NAT HEX
!                  *  2. HEX to BYTE
!                  *  3. ALNUM to NAT, ALNUM HEX, or NAT HEX
!                  *  4. NAT to ALNUM, ALNUM HEX, or NAT HEX
!                  */
! 	|       CONVERT  '(' varg[r1] ANY convert_alpha[dst] convert_hex[hex]')' {
                    location_set(@1);
!                   $$ = new_alphanumeric("CONVERT");
!                   unsigned int dst = ($dst | $hex );
!                   parser_intrinsic_convert($$, *$r1, convert_any_e, dst);
!                 }
! 	|       CONVERT  '(' varg[r1] ANY convert_nat[dst] convert_hex[hex]')' {
!                   location_set(@1);
!                   $$ = new_alphanumeric("CONVERT", current_encoding('N'));
!                   unsigned int dst = ($dst | $hex );
!                   parser_intrinsic_convert($$, *$r1, convert_any_e, dst);
!                 }
! 	|       CONVERT  '(' varg[r1] HEX BYTE ')' {
!                   location_set(@1);
!                   $$ = new_alphanumeric("CONVERT");
!                   parser_intrinsic_convert($$, *$r1, convert_hex_e, convert_byte_e);
!                 }
! 	|       CONVERT  '(' varg[r1] convert_alpha[src] convert_nat[dst] ')' {
!                   location_set(@1);
!                   $$ = new_alphanumeric("CONVERT", current_encoding('N'));
!                   auto src = convert_type_t($src);
!                   parser_intrinsic_convert($$, *$r1, src, $dst);
!                 }
! 	|       CONVERT  '(' varg[r1] convert_alpha[src] convert_alpha[dst] convert_hex[hex] ')' {
!                   location_set(@1);
!                   $$ = new_alphanumeric("CONVERT");
!                   auto src = convert_type_t($src);
!                   unsigned int dst = ($dst | $hex );
!                   parser_intrinsic_convert($$, *$r1, src, dst);
!                 }
! 	|       CONVERT  '(' varg[r1] convert_nat[src] convert_alpha[dst] ')' {
!                   location_set(@1);
!                   $$ = new_alphanumeric("CONVERT");
!                   auto src = convert_type_t($src);
!                   parser_intrinsic_convert($$, *$r1, src, $dst);
!                 }
! 	|       CONVERT  '(' varg[r1] convert_nat[src] convert_nat[dst] convert_hex[hex] ')' {
!                   location_set(@1);
!                   $$ = new_alphanumeric("CONVERT", current_encoding('N'));
!                   auto src = convert_type_t($src);
!                   unsigned int dst = ($dst | $hex );
!                   parser_intrinsic_convert($$, *$r1, src, dst);
                  }
  
          |       DISPLAY_OF  '(' varg[r1]  ')' {
*************** intrinsic:      function_udf
*** 10774,10791 ****
                    parser_exception_file( $$, $filename );
                  }
  
!         |       FIND_STRING '(' varg[r1] last start_after anycase ')' {
                    location_set(@1);
!                   $$ = new_alphanumeric("FIND-STRING");
!                   /* auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e)); */
! 		  cbl_unimplemented("%<FIND_STRING%>");
!                   /* if( ! intrinsic_call_4($$, FIND_STRING, r1, $r2) ) YYERROR; */
                  }
  
          |       FORMATTED_DATE '(' DATE_FMT[r1] expr[r2] ')' {
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_DATE, "FORMATTED-DATE");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
                    if( ! intrinsic_call_2($$, FORMATTED_DATE, r1, $r2) ) YYERROR;
                  }
  
--- 10923,10945 ----
                    parser_exception_file( $$, $filename );
                  }
  
!                 /* FIND-STRING argument-1 argument-2 
!                  * [LAST] [[START AFTER] argument-3] [ANYCASE] */
!         |       FIND_STRING '(' varg[r1] varg[r2] last start_after[after] anycase ')' {
                    location_set(@1);
!                   $$ = new_tempnumeric("FIND-STRING");
!                   if( $after && ! is_numeric($after->field) ) {
!                     error_msg(@after, "START AFTER %qs must be numeric", $after->name());
!                     YYERROR;
!                   }
!                   parser_intrinsic_find_string($$, *$r1, *$r2, $after, $last, $anycase);
                  }
  
          |       FORMATTED_DATE '(' DATE_FMT[r1] expr[r2] ')' {
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_DATE, "FORMATTED-DATE");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_2($$, FORMATTED_DATE, r1, $r2) ) YYERROR;
                  }
  
*************** intrinsic:      function_udf
*** 10795,10800 ****
--- 10949,10955 ----
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_DATETIME, "FORMATTED-DATETIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    static cbl_refer_t r3(literally_zero);
                    if( ! intrinsic_call_4($$, FORMATTED_DATETIME,
                                           r1, $r2, $r3, &r3) ) YYERROR;
*************** intrinsic:      function_udf
*** 10804,10809 ****
--- 10959,10965 ----
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_DATETIME, "FORMATTED-DATETIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_4($$, FORMATTED_DATETIME,
                                               r1, $r2, $r3, $r4) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10815,10828 ****
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_TIME, "FORMATTED-DATETIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
                    if( ! intrinsic_call_3($$, FORMATTED_TIME,
                                               r1, $r2, $r3) ) YYERROR;
                  }
          |       FORMATTED_TIME '(' TIME_FMT[r1] expr[r2]  ')' {
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_TIME, "FORMATTED-TIME");
-                   auto r3 = new_reference(new_literal("0"));
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
                    if( ! intrinsic_call_3($$, FORMATTED_TIME,
                                               r1, $r2, r3) ) YYERROR;
                  }
--- 10971,10986 ----
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_TIME, "FORMATTED-DATETIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_3($$, FORMATTED_TIME,
                                               r1, $r2, $r3) ) YYERROR;
                  }
          |       FORMATTED_TIME '(' TIME_FMT[r1] expr[r2]  ')' {
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_TIME, "FORMATTED-TIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   auto r3 = new_reference(new_constant("0"));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_3($$, FORMATTED_TIME,
                                               r1, $r2, r3) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10830,10842 ****
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_DATETIME, "FORMATTED-CURRENT_DATE");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
                    if( ! intrinsic_call_1($$, FORMATTED_CURRENT_DATE, r1, @r1) )
                                           YYERROR;
                  }
          |       TEST_FORMATTED_DATETIME '(' DATE_FMT[r1] varg[r2] ')' {
!                 location_set(@1);
! 		$$ = new_tempnumeric("TEST-FORMATTED-DATETIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
                    if( ! intrinsic_call_2($$, TEST_FORMATTED_DATETIME,
                                                r1, $r2) ) YYERROR;
                  }
--- 10988,11002 ----
                    location_set(@1);
                    $$ = new_alphanumeric(MAXLENGTH_FORMATTED_DATETIME, "FORMATTED-CURRENT_DATE");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_1($$, FORMATTED_CURRENT_DATE, r1, @r1) )
                                           YYERROR;
                  }
          |       TEST_FORMATTED_DATETIME '(' DATE_FMT[r1] varg[r2] ')' {
!                   location_set(@1);
! 		  $$ = new_tempnumeric("TEST-FORMATTED-DATETIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_2($$, TEST_FORMATTED_DATETIME,
                                                r1, $r2) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10844,10849 ****
--- 11004,11010 ----
                  location_set(@1);
  		$$ = new_tempnumeric("TEST-FORMATTED-DATETIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_2($$, TEST_FORMATTED_DATETIME,
                                                r1, $r2) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10852,10857 ****
--- 11013,11019 ----
                  location_set(@1);
  		$$ = new_tempnumeric("TEST-FORMATTED-DATETIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_2($$, TEST_FORMATTED_DATETIME,
                                                r1, $r2) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10859,10864 ****
--- 11021,11027 ----
                  location_set(@1);
  		$$ = new_tempnumeric("INTEGER-OF-FORMATTED-DATE");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_2($$, INTEGER_OF_FORMATTED_DATE,
                                                r1, $r2) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10867,10872 ****
--- 11030,11036 ----
                  location_set(@1);
  		$$ = new_tempnumeric("INTEGER-OF-FORMATTED-DATE");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_2($$, INTEGER_OF_FORMATTED_DATE,
                                                r1, $r2) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10874,10879 ****
--- 11038,11044 ----
                  location_set(@1);
  		$$ = new_tempnumeric("SECONDS-FROM-FORMATTED-TIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_2($$, SECONDS_FROM_FORMATTED_TIME,
                                                r1, $r2) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10882,10887 ****
--- 11047,11053 ----
                  location_set(@1);
  		$$ = new_tempnumeric("SECONDS-FROM-FORMATTED-TIME");
                    auto r1 = new_reference(new_literal(strlen($r1), $r1, quoted_e));
+                   symbol_temporary_location(r1->field, @r1);
                    if( ! intrinsic_call_2($$, SECONDS_FROM_FORMATTED_TIME,
                                                r1, $r2) ) YYERROR;
                  }
*************** intrinsic:      function_udf
*** 10900,10911 ****
  	|	LENGTH '(' varg1a[val] ')' {
                    location_set(@1);
                    $$ = new_tempnumeric("LENGTH", none_e);
! 		  parser_set_numeric($$, $val->field->data.capacity);
  		  if( ! intrinsic_call_1($$, LENGTH, $val, @val)) YYERROR;
  		}
          |       lopper_case[func] '(' alpha_val[r1] ')' {
                    location_set(@1);
!                   $$ = new_alphanumeric($r1->field->data.capacity, "lopper_case[func]");
                    if( ! intrinsic_call_1($$, $func, $r1, @r1)) YYERROR;
                  }
  
--- 11066,11077 ----
  	|	LENGTH '(' varg1a[val] ')' {
                    location_set(@1);
                    $$ = new_tempnumeric("LENGTH", none_e);
! 		  parser_set_numeric($$, $val->field->data.capacity());
  		  if( ! intrinsic_call_1($$, LENGTH, $val, @val)) YYERROR;
  		}
          |       lopper_case[func] '(' alpha_val[r1] ')' {
                    location_set(@1);
!                   $$ = new_alphanumeric($r1->field->data.capacity(), "lopper_case[func]");
                    if( ! intrinsic_call_1($$, $func, $r1, @r1)) YYERROR;
                  }
  
*************** intrinsic:      function_udf
*** 11069,11076 ****
                  {
                    location_set(@1);
                    static auto r2 = new_reference(FldNumericDisplay, "50");
!                   static auto one = new cbl_refer_t( new_literal("1") );
!                   static auto four = new cbl_refer_t( new_literal("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
--- 11235,11242 ----
                  {
                    location_set(@1);
                    static auto r2 = new_reference(FldNumericDisplay, "50");
!                   static auto one = new cbl_refer_t( new_constant("1") );
!                   static auto four = new cbl_refer_t( new_constant("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
*************** intrinsic:      function_udf
*** 11085,11092 ****
          |       DATE_TO_YYYYMMDD '(' expr[r1] expr[r2] ')'
                  {
                    location_set(@1);
!                   static auto one = new cbl_refer_t( new_literal("1") );
!                   static auto four = new cbl_refer_t( new_literal("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
--- 11251,11258 ----
          |       DATE_TO_YYYYMMDD '(' expr[r1] expr[r2] ')'
                  {
                    location_set(@1);
!                   static auto one = new cbl_refer_t( new_constant("1") );
!                   static auto four = new cbl_refer_t( new_constant("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
*************** intrinsic:      function_udf
*** 11111,11118 ****
                  {
                    location_set(@1);
                    static auto r2 = new_reference(FldNumericDisplay, "50");
!                   static auto one = new cbl_refer_t( new_literal("1") );
!                   static auto four = new cbl_refer_t( new_literal("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
--- 11277,11284 ----
                  {
                    location_set(@1);
                    static auto r2 = new_reference(FldNumericDisplay, "50");
!                   static auto one = new cbl_refer_t( new_constant("1") );
!                   static auto four = new cbl_refer_t( new_constant("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
*************** intrinsic:      function_udf
*** 11127,11134 ****
          |       DAY_TO_YYYYDDD '(' expr[r1] expr[r2] ')'
                  {
                    location_set(@1);
!                   static auto one = new cbl_refer_t( new_literal("1") );
!                   static auto four = new cbl_refer_t( new_literal("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
--- 11293,11300 ----
          |       DAY_TO_YYYYDDD '(' expr[r1] expr[r2] ')'
                  {
                    location_set(@1);
!                   static auto one = new cbl_refer_t( new_constant("1") );
!                   static auto four = new cbl_refer_t( new_constant("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
*************** intrinsic:      function_udf
*** 11152,11160 ****
          |       YEAR_TO_YYYY '(' expr[r1] ')'
                  {
                    location_set(@1);
!                   static auto r2 = new_reference(new_literal("50", decimal_e));
!                   static auto one = new cbl_refer_t( new_literal("1") );
!                   static auto four = new cbl_refer_t( new_literal("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
--- 11318,11326 ----
          |       YEAR_TO_YYYY '(' expr[r1] ')'
                  {
                    location_set(@1);
!                   static auto r2 = new_reference(new_constant("50"));
!                   static auto one = new cbl_refer_t( new_constant("1") );
!                   static auto four = new cbl_refer_t( new_constant("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
*************** intrinsic:      function_udf
*** 11169,11176 ****
          |       YEAR_TO_YYYY '(' expr[r1] expr[r2] ')'
                  {
                    location_set(@1);
!                   static auto one = new cbl_refer_t( new_literal("1") );
!                   static auto four = new cbl_refer_t( new_literal("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
--- 11335,11342 ----
          |       YEAR_TO_YYYY '(' expr[r1] expr[r2] ')'
                  {
                    location_set(@1);
!                   static auto one = new cbl_refer_t( new_constant("1") );
!                   static auto four = new cbl_refer_t( new_constant("4") );
                    cbl_span_t year(one, four);
                    auto r3 = new_reference(new_alphanumeric(MAXLENGTH_CALENDAR_DATE));
                    r3->refmod = year;
*************** module_type:	ACTIVATING { $$ = module_ac
*** 11225,11242 ****
  	|	TOP_LEVEL  { $$ = module_toplevel_e; }
  		;
  
! convert_src:	ANY
! 	|	HEX
! 	|	convert_fmt
! 		;
! convert_dst:	convert_fmt HEX
! 	|	BYTE
  		;
! convert_fmt:	ALPHANUMERIC
! 	|	ANUM
! 	|	NAT
! 	|	NATIONAL
  		;
  
  numval_locale:  %empty {
                    $$.is_locale = false;
--- 11391,11409 ----
  	|	TOP_LEVEL  { $$ = module_toplevel_e; }
  		;
  
! //convert_fmt:	convert_alpha
! //        |       convert_nat
! //                ;
! convert_alpha:	ALPHANUMERIC { $$ = convert_alpha_e; }
! 	|	ANUM         { $$ = convert_alpha_e; }
  		;
! convert_nat:	NAT          { $$ = convert_nat_e; }
! 	|	NATIONAL     { $$ = convert_nat_e; }
  		;
+ convert_hex:    HEX                 { $$ = convert_hex_e; }
+         |       HEX JUSTIFIED       { $$ = convert_just_e; }
+         |       HEX JUSTIFIED RIGHT { $$ = convert_rjust_e; }
+         ;
  
  numval_locale:  %empty {
                    $$.is_locale = false;
*************** intrinsic_locale:
*** 11280,11286 ****
                  {
                    location_set(@1);
                    $$ = new_alphanumeric();
!                   cbl_refer_t locale(new_literal($locale_name));
                    if( ! intrinsic_call_3($$, LOCALE_COMPARE, $r1, $r2, &locale) ) YYERROR;
                  }
  
--- 11447,11453 ----
                  {
                    location_set(@1);
                    $$ = new_alphanumeric();
!                   cbl_refer_t locale(new_literal(@locale_name, $locale_name));
                    if( ! intrinsic_call_3($$, LOCALE_COMPARE, $r1, $r2, &locale) ) YYERROR;
                  }
  
*************** lopper_case:    LOWER_CASE      { $$ = L
*** 11329,11337 ****
          |       UPPER_CASE      { $$ = UPPER_CASE; }
                  ;
  
! trim_trailing:  %empty          { $$ = new_literal("0"); }  // Remove both
!         |       LEADING         { $$ = new_literal("1"); }  // Remove leading  spaces
!         |       TRAILING        { $$ = new_literal("2"); }  // Remove trailing spaces
          ;
  
  intrinsic0:     CURRENT_DATE {
--- 11496,11504 ----
          |       UPPER_CASE      { $$ = UPPER_CASE; }
                  ;
  
! trim_trailing:  %empty          { $$ = new_constant("0"); }  // Remove both
!         |       LEADING         { $$ = new_constant("1"); }  // Remove leading  spaces
!         |       TRAILING        { $$ = new_constant("2"); }  // Remove trailing spaces
          ;
  
  intrinsic0:     CURRENT_DATE {
*************** intrinsic0:     CURRENT_DATE {
*** 11396,11402 ****
                    location_set(@1);
  		  // Returns YYYYMMDDhhmmssss-0500)
                    $$ = new_alphanumeric(MAXLENGTH_CALENDAR_DATE, "WHEN-COMPILED"); 
!                  parser_intrinsic_call_0( $$, "__gg__when_compiled" );
                  }
                  ;
  
--- 11563,11569 ----
                    location_set(@1);
  		  // Returns YYYYMMDDhhmmssss-0500)
                    $$ = new_alphanumeric(MAXLENGTH_CALENDAR_DATE, "WHEN-COMPILED"); 
!                   parser_intrinsic_call_0( $$, "__gg__when_compiled" );
                  }
                  ;
  
*************** key:            %empty
*** 11558,11565 ****
          |       KEY
                  ;
  
! last:		%empty %prec LAST
! 	|	LAST
  		;
  
  lines:          %empty
--- 11725,11732 ----
          |       KEY
                  ;
  
! last:		%empty { $$ = false; } %prec LAST
! 	|	LAST   { $$ = true;  }
  		;
  
  lines:          %empty
*************** is_signed:	%empty      { $$ = true; }
*** 11612,11620 ****
  	|	UNSIGNED_kw { $$ = false; }
  		;
  
! start_after:	%empty %prec AFTER
! 	|	START AFTER varg
  		;
  
  status:         %empty
          |       STATUS
--- 11779,11791 ----
  	|	UNSIGNED_kw { $$ = false; }
  		;
  
! start_after:	%empty { $$ = nullptr; } %prec AFTER
! 	|	START AFTER start_pos { $$ = $start_pos; }
! 	|	start_pos             { $$ = $start_pos; }
  		;
+ start_pos:      num_constant { $$ = new_reference($1); }
+         |       scalar
+                 ;
  
  status:         %empty
          |       STATUS
*************** xmlgen_body:    XMLGENERATE name[id1] FR
*** 11835,11853 ****
                  xmlgen_nameof xmlgen_typeof xmlgen_suppress
                  ;
  
! xmlgen_count:   %empty
!         |       COUNT in name[id3]
                  ;
! xmlgen_decl:    %empty
!         |       with XML_DECLARATION with ATTRIBUTES
                  ;
  xmlgen_namespace:
!                 %empty
          |       NAMESPACE is name[id4] namespace_prefix
                  ;
  namespace_prefix:
!                 %empty
!         |       NAMESPACE_PREFIX is namestr[id5]
                  ;
  xmlgen_nameof:  %empty
          |       NAME of xmlgen_ids
--- 12006,12027 ----
                  xmlgen_nameof xmlgen_typeof xmlgen_suppress
                  ;
  
! xmlgen_count:   %empty { $$ = nullptr; }
!         |       COUNT in name[id3] { $$ = $id3; }
                  ;
! xmlgen_decl:    %empty { $$ = {}; }
!         |       with XML_DECLARATION with ATTRIBUTES { $$ = {true, true}; }
!         |       with XML_DECLARATION                 { $$ = {true, false}; }
!         |                            with ATTRIBUTES { $$ = {false, true}; }
                  ;
  xmlgen_namespace:
!                 %empty 
          |       NAMESPACE is name[id4] namespace_prefix
                  ;
  namespace_prefix:
!                 %empty 
!         |       NAMESPACE_PREFIX is name[id5] 
!         |       NAMESPACE_PREFIX is LITERAL[id5] 
                  ;
  xmlgen_nameof:  %empty
          |       NAME of xmlgen_ids
*************** numstr2i( const char input[], radix_t ra
*** 13089,13095 ****
  }
  
  static inline cbl_field_t *
! new_literal( const char initial[], enum radix_t radix ) {
    auto attr = constant_e;
  
    switch( radix ) {
--- 13263,13269 ----
  }
  
  static inline cbl_field_t *
! new_literal( const cbl_loc_t loc, const char initial[], enum radix_t radix ) {
    auto attr = constant_e;
  
    switch( radix ) {
*************** new_literal( const char initial[], enum
*** 13102,13109 ****
      attr = bool_encoded_e;
      break;
    }
!   return new_literal(strlen(initial), initial,
!                      cbl_field_attr_t(constant_e | attr));
  }
  
  class is_elementary_type { // for INITIALIZE purposes
--- 13276,13285 ----
      attr = bool_encoded_e;
      break;
    }
!   auto field =  new_literal(strlen(initial), initial,
!                             cbl_field_attr_t(constant_e | attr));
!   symbol_temporary_location(field, loc);
!   return field;
  }
  
  class is_elementary_type { // for INITIALIZE purposes
*************** struct expand_group : public std::list<c
*** 13170,13177 ****
  };
  
  
! static const uint32_t * initial_default_value;
!        const uint32_t * wsclear() { return initial_default_value; }
  
  void
  wsclear( uint32_t i ) {
--- 13346,13356 ----
  };
  
  
! static const uint32_t *initial_default_value;
! const uint32_t *
! wsclear() {
!   return initial_default_value;
! }
  
  void
  wsclear( uint32_t i ) {
*************** initialize_one( cbl_num_result_t target,
*** 13217,13223 ****
        char ach[5];
        int v = *s;
        sprintf(ach, "%d", v);
!       source.field = new_literal(ach);
        source.addr_of = true;
      }
  
--- 13396,13402 ----
        char ach[5];
        int v = *s;
        sprintf(ach, "%d", v);
!       source.field = new_constant(ach);
        source.addr_of = true;
      }
  
*************** initialize_one( cbl_num_result_t target,
*** 13236,13244 ****
    if( value_category == data_category_all ||
        value_category == data_category_of(tgt) ) {
      // apply any applicable VALUE
!     if( explicitly || tgt.field->data.initial ) {
        assert( with_filler || !tgt.field->has_attr(filler_e) );
!       if( tgt.field->data.initial ) {
          parser_initialize(tgt);
        }
      }
--- 13415,13423 ----
    if( value_category == data_category_all ||
        value_category == data_category_of(tgt) ) {
      // apply any applicable VALUE
!     if( explicitly || tgt.field->data.original() ) {
        assert( with_filler || !tgt.field->has_attr(filler_e) );
!       if( tgt.field->data.original() ) {
          parser_initialize(tgt);
        }
      }
*************** initialize_statement( const cbl_num_resu
*** 13392,13403 ****
  			    size_t first, second;
  			    first = second = group_offset(span.first);
  			    if( ! span.second ) {
! 			      second += std::max(span.first->data.capacity,
  						 span.first->data.memsize);
  			    } else {
  			      second = group_offset(span.second)
  				     - group_offset(span.first);
! 			      second += std::max(span.second->data.capacity,
  						 span.second->data.memsize);
  			    }
  			    return std::make_pair(first, second);
--- 13571,13582 ----
  			    size_t first, second;
  			    first = second = group_offset(span.first);
  			    if( ! span.second ) {
! 			      second += std::max(span.first->data.capacity(),
  						 span.first->data.memsize);
  			    } else {
  			      second = group_offset(span.second)
  				     - group_offset(span.first);
! 			      second += std::max(span.second->data.capacity(),
  						 span.second->data.memsize);
  			    }
  			    return std::make_pair(first, second);
*************** void parser_add_declaratives( size_t n,
*** 13565,13571 ****
  }
  
  cbl_field_t *
! new_literal( const literal_t& lit, enum cbl_field_attr_t attr ) {
    bool zstring = lit.prefix[0] == 'Z';
    if( !zstring && lit.data[lit.len] != '\0' ) {
      dbgmsg("%s:%d: line %d, no NUL terminator '%-*.*s'{"
--- 13744,13750 ----
  }
  
  cbl_field_t *
! new_literal( const cbl_loc_t loc, const literal_t& lit, enum cbl_field_attr_t attr ) {
    bool zstring = lit.prefix[0] == 'Z';
    if( !zstring && lit.data[lit.len] != '\0' ) {
      dbgmsg("%s:%d: line %d, no NUL terminator '%-*.*s'{"
*************** new_literal( const literal_t& lit, enum
*** 13580,13588 ****
    attrs |= constant_e;
    attrs |= literal_attr(lit.prefix);
  
!   return new_literal(lit.len, lit.data, cbl_field_attr_t(attrs), lit.encoding);
  }
  
  bool
  cbl_file_t::validate_forward( size_t isym ) const {
    if( isym > 0 && FldForward == symbol_field_forward(isym)->type ) {
--- 13759,13770 ----
    attrs |= constant_e;
    attrs |= literal_attr(lit.prefix);
  
!   auto field = new_literal(lit.len, lit.data, cbl_field_attr_t(attrs), lit.encoding);
!   symbol_temporary_location(field, loc);
!   return field;
  }
  
+ 
  bool
  cbl_file_t::validate_forward( size_t isym ) const {
    if( isym > 0 && FldForward == symbol_field_forward(isym)->type ) {
*************** literal_t::set( const cbl_field_t * fiel
*** 13690,13696 ****
    assert(is_literal(field));
  
    set_prefix( "", 0 );
!   set_data( field->data.capacity,
              const_cast<char*>(field->data.initial),
              field_index(field) );
    return *this;
--- 13872,13878 ----
    assert(is_literal(field));
  
    set_prefix( "", 0 );
!   set_data( field->data.capacity(),
              const_cast<char*>(field->data.initial),
              field_index(field) );
    return *this;
*************** const char *
*** 13773,13779 ****
  cbl_field_t::value_str() const {
      if( data.etc_type == cbl_field_data_t::value_e )
  	return string_of( data.value_of() );
!     return "???";
  }
  
  static const cbl_division_t not_syntax_only = cbl_division_t(-1);
--- 13955,13961 ----
  cbl_field_t::value_str() const {
      if( data.etc_type == cbl_field_data_t::value_e )
  	return string_of( data.value_of() );
!     return data.etc_type_str();
  }
  
  static const cbl_division_t not_syntax_only = cbl_division_t(-1);
*************** cobol_dialect_set( cbl_dialect_t dialect
*** 13814,13820 ****
  static bool internal_ebcdic_locked = false;
  
  void internal_ebcdic_lock() {
!   internal_ebcdic_locked = true;
  }
  void internal_ebcdic_unlock() {
    internal_ebcdic_locked = false;
--- 13996,14002 ----
  static bool internal_ebcdic_locked = false;
  
  void internal_ebcdic_lock() {
! ////  internal_ebcdic_locked = true;
  }
  void internal_ebcdic_unlock() {
    internal_ebcdic_locked = false;
*************** void internal_ebcdic_unlock() {
*** 13822,13832 ****
  
  bool
  cobol_gcobol_feature_set( cbl_gcobol_feature_t gcobol_feature, bool on ) {
-   if( gcobol_feature == feature_internal_ebcdic_e ) {
-     if( internal_ebcdic_locked ) return false;
-     if( ! on ) gcc_unreachable();
-     current.default_encoding.set(EBCDIC_e);
-   }
    if( on ) {
      cbl_gcobol_features |= gcobol_feature;
    } else {
--- 14004,14009 ----
*************** static bool
*** 13839,13844 ****
--- 14016,14023 ----
  literal_refmod_valid( YYLTYPE loc, const cbl_refer_t& r ) {
    if( r.field->has_attr(any_length_e) ) return true;
  
+   unsigned int nchar = r.field->char_capacity();
+ 
    const cbl_span_t& refmod(r.refmod);
  
    if( ! is_literal(refmod.from->field) ) {
*************** literal_refmod_valid( YYLTYPE loc, const
*** 13846,13852 ****
      if( ! is_literal(refmod.len->field) ) return true;
      auto edge = refmod.len->field->as_integer();
      if( 0 < edge ) {
!       if( edge-1 < r.field->data.capacity ) return true;
      }
      // len < 0 or not: 0 < from + len <= capacity
      error_msg(loc, "%s(%s:%zu) out of bounds, "
--- 14025,14031 ----
      if( ! is_literal(refmod.len->field) ) return true;
      auto edge = refmod.len->field->as_integer();
      if( 0 < edge ) {
!       if( edge-1 < nchar ) return true;
      }
      // len < 0 or not: 0 < from + len <= capacity
      error_msg(loc, "%s(%s:%zu) out of bounds, "
*************** literal_refmod_valid( YYLTYPE loc, const
*** 13854,13872 ****
  	      r.field->name,
  	      refmod.from->name(),
  	      size_t(edge),
! 	      static_cast<unsigned int>(r.field->data.capacity) );
      return false;
    }
  
    auto edge = refmod.from->field->as_integer();
    if( edge > 0 ) {
!     if( --edge < r.field->data.capacity ) {
        if( ! refmod.len ) return true;
        if( ! is_literal(refmod.len->field) ) return true;
        auto len = refmod.len->field->as_integer();
        if( len > 0 ) {
  	edge += len;
! 	if( --edge < r.field->data.capacity ) return true;
        }
        // len < 0 or not: 0 < from + len <= capacity
        loc = symbol_field_location(field_index(r.field));
--- 14033,14051 ----
  	      r.field->name,
  	      refmod.from->name(),
  	      size_t(edge),
! 	      nchar );
      return false;
    }
  
    auto edge = refmod.from->field->as_integer();
    if( edge > 0 ) {
!     if( --edge < nchar ) {
        if( ! refmod.len ) return true;
        if( ! is_literal(refmod.len->field) ) return true;
        auto len = refmod.len->field->as_integer();
        if( len > 0 ) {
  	edge += len;
! 	if( --edge < nchar ) return true;
        }
        // len < 0 or not: 0 < from + len <= capacity
        loc = symbol_field_location(field_index(r.field));
*************** literal_refmod_valid( YYLTYPE loc, const
*** 13875,13881 ****
  		r.field->name,
  		size_t(refmod.from->field->as_integer()),
  		size_t(len),
! 		static_cast<unsigned int>(r.field->data.capacity) );
        return false;
      }
    }
--- 14054,14060 ----
  		r.field->name,
  		size_t(refmod.from->field->as_integer()),
  		size_t(len),
! 		nchar );
        return false;
      }
    }
*************** literal_refmod_valid( YYLTYPE loc, const
*** 13883,13889 ****
    error_msg(loc,"%s(%zu) out of bounds, size is %u",
  	    r.field->name,
  	    size_t(refmod.from->field->as_integer()),
! 	    static_cast<unsigned int>(r.field->data.capacity) );
    return false;
  }
  
--- 14062,14068 ----
    error_msg(loc,"%s(%zu) out of bounds, size is %u",
  	    r.field->name,
  	    size_t(refmod.from->field->as_integer()),
! 	    nchar );
    return false;
  }
  
*************** eval_subject_t::compare( const cbl_refer
*** 14104,14106 ****
--- 14283,14373 ----
    return result;
  }
  
+ /*
+  * Define a binary field according to USAGE: attr, type, and capacity. 
+  * Return type. 
+  * Do not set initial value; that is up to PICTURE and VALUE.
+  */
+ static cbl_field_type_t
+ field_binary_usage( YYLTYPE loc, cbl_field_t *field,
+                     cbl_field_type_t type, uint32_t capacity,
+                     bool signable )
+ {
+   bool infer = true;
+   
+   // Some binary types have defined capacity;
+   switch(type) {
+     // COMPUTATIONAL and COMP-5 rely on PICTURE.
+   case FldNumericBinary:
+     field->attr |= big_endian_e;
+     __attribute__((fallthrough));
+   case FldNumericBin5:
+     // If no capacity yet, then no picture, infer $comp.capacity.
+     // If field has capacity, ensure USAGE is compatible.
+     if( field->data.capacity() > 0 ) { // PICTURE before USAGE
+       infer = false;
+       auto true_capacity = field->data.capacity();
+       
+       switch( field->type ) {
+       case FldAlphanumeric:   // PIC X COMP-5 or COMP-X
+         assert( field->data.digits == 0 );
+         assert( field->data.rdigits == 0 );
+         dialect_ok(loc, MfCompX, "alphanumeric PICTURE with numeric USAGE");
+         symbol_field_type_update(field, type, true);
+         field->clear_attr(signable_e);
+         // In case PIC X for UTF-16 (say), the X's represent digits.
+         true_capacity /= field->codeset.stride();
+         field->data.capacity(true_capacity);
+         break;
+       case FldNumericDisplay: // PIC 9 COMP-5 or COMP-X
+         if( capacity == 0xFF ) { // comp-x is a bit like comp-5
+           assert( field->data.digits == field->data.capacity() );
+           dialect_ok(loc, MfCompX, "alphanumeric PICTURE with numeric USAGE");
+         }
+         symbol_field_type_update(field, type, true);
+         capacity = type_capacity(field->type, field->data.digits);
+         field->data.capacity(capacity);
+         field->blank_initial(capacity / field->codeset.stride());
+         break;
+       case FldInvalid:
+         symbol_field_type_update(field, type, true);
+         field->data.capacity(capacity);
+         if( signable ) field->set_attr(signable_e);
+         gcc_assert(field->type == FldNumericBin5);
+         break;
+       default:
+         break;
+       }
+     }
+     break;
+   case FldPacked: // comp-6 is unsigned comp-3
+     assert(! signable);  // else PACKED_DECIMAL from scanner
+     field->set_attr(separate_e);
+     dialect_ok(loc, MfComp6, "COMP-6");
+     if( symbol_field_type_update(field, type, true) ) {
+       infer = false;
+       field->set_capacity(type_capacity(field->type, field->data.digits));
+     } else {
+       error_msg(loc, "USAGE PACKED DECIMAL conflicts with PICTURE");
+     }
+     break;
+   default:
+     break;
+   }
+ 
+   if( infer ) {
+     symbol_field_type_update(field, type, true);
+     if( capacity > 0 ) {
+       if( field->data.capacity() > 0 ) {
+         error_msg(loc, "%s is BINARY type, incompatible with PICTURE",
+                   field->name);
+       }
+       if( signable ) {
+         field->set_attr(signable_e);
+       }
+       field->set_capacity(capacity);
+     }
+   }
+ 
+   return field->type;
+ }
diff -Nrcpad gcc-16-20260111/gcc/cobol/parse_ante.h gcc-16-20260118/gcc/cobol/parse_ante.h
*** gcc-16-20260111/gcc/cobol/parse_ante.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/parse_ante.h	Sun Jan 18 22:32:06 2026
***************
*** 39,48 ****
  #include <stack>
  #include <string>
  
! #define MAXLENGTH_FORMATTED_DATE     10
! #define MAXLENGTH_FORMATTED_TIME     19
! #define MAXLENGTH_CALENDAR_DATE      21
! #define MAXLENGTH_FORMATTED_DATETIME 30
  
  #pragma GCC diagnostic push
  #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
--- 39,48 ----
  #include <stack>
  #include <string>
  
! #define MAXLENGTH_FORMATTED_DATE     (10*4)
! #define MAXLENGTH_FORMATTED_TIME     (19*4)
! #define MAXLENGTH_CALENDAR_DATE      (21*4)
! #define MAXLENGTH_FORMATTED_DATETIME (30*4)
  
  #pragma GCC diagnostic push
  #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
*************** extern int yydebug;
*** 116,141 ****
  static const std::set<std::string> compat_programs {
    "CBL_ALLOC_MEM", 
    "CBL_CHECK_FILE_EXIST", 
    "CBL_DELETE_FILE", 
    "CBL_FREE_MEM", 
  };
  
- const char *
- consistent_encoding_check( const YYLTYPE& loc, const char input[] ) {
-   cbl_field_t faux = {};
-   faux.type = FldAlphanumeric;
-   faux.data.capacity = capacity_cast(strlen(input));
-   faux.data.initial = input;
- 
-   auto s = faux.internalize();
-   if( !s ) {
-     error_msg(loc, "inconsistent string literal encoding for '%s'", input);
-   } else {
-     if( s != input ) return s;
-   }
-   return NULL;
- }
- 
  const char * original_picture();
        char * original_number( char input[] = NULL );
  
--- 116,130 ----
  static const std::set<std::string> compat_programs {
    "CBL_ALLOC_MEM", 
    "CBL_CHECK_FILE_EXIST", 
+   "CBL_CLOSE_FILE",
    "CBL_DELETE_FILE", 
    "CBL_FREE_MEM", 
+   "CBL_GET_PROGRAM_INFO",
+   "CBL_OPEN_FILE",
+   "CBL_READ_FILE",
+   "CBL_WRITE_FILE",
  };
  
  const char * original_picture();
        char * original_number( char input[] = NULL );
  
*************** enum data_clause_t {
*** 184,189 ****
--- 173,180 ----
    typedef_clause_e     = 0x8000,
  };
  
+ static std::map<data_clause_t,cbl_loc_t> data_clause_locations;
+ 
  static inline bool
  has_clause( int data_clauses, data_clause_t clause ) {
    return clause == (data_clauses & clause);
*************** namcpy(const YYLTYPE& loc, cbl_name_t tg
*** 235,245 ****
  
  cbl_field_t *
  new_alphanumeric( size_t capacity = MAXIMUM_ALPHA_LENGTH,
! 		  const cbl_name_t name = nullptr );
  
  static inline cbl_field_t *
! new_alphanumeric( const cbl_name_t name ) {
!   return new_alphanumeric(MAXIMUM_ALPHA_LENGTH, name);
  }
  
  static inline cbl_refer_t *
--- 226,237 ----
  
  cbl_field_t *
  new_alphanumeric( size_t capacity = MAXIMUM_ALPHA_LENGTH,
! 		  const cbl_name_t name = nullptr,
!                   cbl_encoding_t encoding = no_encoding_e );
  
  static inline cbl_field_t *
! new_alphanumeric( const cbl_name_t name, cbl_encoding_t encoding = no_encoding_e ) {
!   return new_alphanumeric(MAXIMUM_ALPHA_LENGTH, name, encoding);
  }
  
  static inline cbl_refer_t *
*************** static inline char * dequote( char input
*** 281,291 ****
  static const char *
  name_of( cbl_field_t *field ) {
    assert(field);
!   if( field->data.initial == nullptr ) {
!     return field->name;
    }
!   return field->name[0] == '_' && field->data.initial?
!     field->data.original() : field->name;
  }
  
  static const char *
--- 273,282 ----
  static const char *
  name_of( cbl_field_t *field ) {
    assert(field);
!   if( field->name[0] == '_' && field->data.initial ) {
!     return field->data.original()? field->data.original() : field->data.initial;
    }
!   return field->name;
  }
  
  static const char *
*************** class eval_subject_t {
*** 712,718 ****
    bool decide( relop_t op, const cbl_refer_t& object, bool invert ) {
      if( pcol == columns.end() ) return false;
      dbgmsg("%s() if not %s goto %s", __func__, result->name, when()->name);
!     
      if( compare(op, object, true) ) {
        if( invert ) {
          parser_logop( result, NULL, not_op, result );
--- 703,709 ----
    bool decide( relop_t op, const cbl_refer_t& object, bool invert ) {
      if( pcol == columns.end() ) return false;
      dbgmsg("%s() if not %s goto %s", __func__, result->name, when()->name);
! 
      if( compare(op, object, true) ) {
        if( invert ) {
          parser_logop( result, NULL, not_op, result );
*************** list_add( list<cbl_num_result_t>& list,
*** 915,922 ****
    list.push_back(arg);
  }
  
! static  list<cbl_domain_t> domains;
! typedef list<cbl_domain_t>::iterator domain_iter;
  
  /*
   * The name queue is a queue of lists of data-item names recognized by the
--- 906,931 ----
    list.push_back(arg);
  }
  
! struct domain_t : public cbl_domain_t {
!   cbl_encoding_t encoding;
!   domain_t( cbl_encoding_t encoding, const cbl_domain_t& domain )
!     : cbl_domain_t(domain)
!     , encoding(encoding)
!   {}
!   explicit domain_t( const cbl_domain_t& domain )
!     : cbl_domain_t(domain)
!     , encoding( current_encoding('A') )
!   {}
!   bool encoding_ok( cbl_encoding_t enc ) const {
!     return enc == encoding
!       ||   enc == no_encoding_e
!       ||   encoding == no_encoding_e
!       ||   first.is_numeric
!       ||    last.is_numeric;
!   }
! };
! 
! static  list<domain_t> domains;
  
  /*
   * The name queue is a queue of lists of data-item names recognized by the
*************** struct file_list_t {
*** 965,972 ****
      std::copy( that.files.begin(), that.files.end(), files.begin() );
    }
  
!   static size_t symbol_index( cbl_file_t* file ) {
!     return ::symbol_index( symbol_elem_of(file) );
    }
  };
  
--- 974,982 ----
      std::copy( that.files.begin(), that.files.end(), files.begin() );
    }
  
!   static uint64_t symbol_index( cbl_file_t* file ) {
!     uint64_t retval = symbol_unique_index(symbol_elem_of(file));
!     return retval;
    }
  };
  
*************** public:
*** 1325,1334 ****
    cbl_label_t *declaratives_eval, *paragraph, *section;
    const char *collating_sequence;
    struct encoding_t {
      struct encoding_base_t {
        size_t isym;
        cbl_encoding_t encoding;
!       encoding_base_t() : isym(0), encoding(CP1252_e) {}
        encoding_base_t(cbl_encoding_t encoding) : isym(0), encoding(encoding) {}
        void set( size_t isym, cbl_encoding_t encoding ) {
          this->isym = isym;
--- 1335,1346 ----
    cbl_label_t *declaratives_eval, *paragraph, *section;
    const char *collating_sequence;
    struct encoding_t {
+     friend bool cobol_gcobol_feature_set( cbl_gcobol_feature_t gcobol_feature,
+                                           bool on );
      struct encoding_base_t {
        size_t isym;
        cbl_encoding_t encoding;
!       encoding_base_t() : isym(0), encoding(custom_encoding_e) {}
        encoding_base_t(cbl_encoding_t encoding) : isym(0), encoding(encoding) {}
        void set( size_t isym, cbl_encoding_t encoding ) {
          this->isym = isym;
*************** public:
*** 1339,1356 ****
          this->isym = 0;
          this->encoding = encoding;
        }
- 
      } alpha, national;
!     encoding_t() : national(EBCDIC_e) {}
    } alphabet;
!   
    bool locale_add( const cbl_locale_t& locale ) {
      auto e = symbol_locale_add(program_index, &locale);
      assert(e);
      auto p = locales.insert(locale);
      return p.second;
    }
!       
    cbl_options_t options;
  
    explicit prog_descr_t( size_t isymbol )
--- 1351,1393 ----
          this->isym = 0;
          this->encoding = encoding;
        }
      } alpha, national;
! 
!     encoding_t() : alpha(alpha_default()), national(national_default()) {}
! 
!     bool sizes_ok() const {
!       charmap_t * alp = __gg__get_charmap(alpha.encoding);
!       charmap_t * nat = __gg__get_charmap(national.encoding);
!       return alp->stride() <= nat->stride();
!     }
! 
!   protected:
!     /*
!      * Use static default encodings
!      */
!     static cbl_encoding_t alpha_default() {
!       return cbl_field_t::codeset_t::default_encodings.alpha.type;
!     }
!     static cbl_encoding_t national_default() {
!       return cbl_field_t::codeset_t::default_encodings.national.type;
!     }
! 
!     // Set static default alpha encoding.
!     // Called only by above friend function in support of ebcdic.
!     static void alpha_default( cbl_encoding_t encoding) {
!       auto alpha = __gg__encoding_iconv_descr(encoding);
!       gcc_assert(alpha);
!       cbl_field_t::codeset_t::default_encodings.alpha = *alpha;
!     }
    } alphabet;
! 
    bool locale_add( const cbl_locale_t& locale ) {
      auto e = symbol_locale_add(program_index, &locale);
      assert(e);
      auto p = locales.insert(locale);
      return p.second;
    }
! 
    cbl_options_t options;
  
    explicit prog_descr_t( size_t isymbol )
*************** static class current_t {
*** 1629,1636 ****
    rel_part_t antecedent_cache;
  
   public:
-   static prog_descr_t::encoding_t::encoding_base_t default_encoding;
- 
    current_t()
      : first_statement(0)
      , in_declaratives(false)
--- 1666,1671 ----
*************** static class current_t {
*** 1726,1732 ****
        tree ena, dcl;
        runtime_t() : ena(nullptr), dcl(nullptr) {}
      } runtime;
!     
      bool empty() const {
        return declaratives_list_t::empty();
      }
--- 1761,1767 ----
        tree ena, dcl;
        runtime_t() : ena(nullptr), dcl(nullptr) {}
      } runtime;
! 
      bool empty() const {
        return declaratives_list_t::empty();
      }
*************** static class current_t {
*** 1774,1780 ****
                            } );
      }
  
!     std::vector<uint64_t> 
      encode() const {
        std::vector<uint64_t> encoded;
        auto p = std::back_inserter(encoded);
--- 1809,1815 ----
                            } );
      }
  
!     std::vector<uint64_t>
      encode() const {
        std::vector<uint64_t> encoded;
        auto p = std::back_inserter(encoded);
*************** static class current_t {
*** 1919,1924 ****
--- 1954,1964 ----
      return programs.top().locale_add(locale);
    }
  
+   static inline const char *
+   cbl_encoding_str( cbl_encoding_t encoding ) {
+     return __gg__encoding_iconv_name(encoding);
+   }
+ 
    bool new_program ( const YYLTYPE& loc, cbl_label_type_t type,
                       const char name[], const char os_name[],
                       bool common, bool initial )
*************** static class current_t {
*** 1936,1949 ****
      const cbl_label_t *L;
      if( (L = symbol_program_add(parent, &label)) == NULL ) return false;
      prog_descr_t program(symbol_index(symbol_elem_of(L)));
! #if 1 //EBCDIC  // enable when ready
!       auto alpha_encoding =
!         programs.empty()? default_encoding : programs.top().alphabet.alpha;
!       if( alpha_encoding.encoding == EBCDIC_e ) {
!         dbgmsg("%s:%d: We're in EBCDIC", __func__, __LINE__);
!       }
!       program.alphabet.alpha = alpha_encoding;
! #endif
      programs.push( program );
      programs.apply_pending();
  
--- 1976,1995 ----
      const cbl_label_t *L;
      if( (L = symbol_program_add(parent, &label)) == NULL ) return false;
      prog_descr_t program(symbol_index(symbol_elem_of(L)));
!     auto encoding = current_encoding('A');
!     if( encoding == EBCDIC_e ) {
!       dbgmsg("%s:%d: We're in EBCDIC", __func__, __LINE__);
!     }
!     program.alphabet.alpha = encoding;
!     program.alphabet.national = current_encoding('N');
! 
!     if( ! program.alphabet.sizes_ok() ) {
!       error_msg(loc, "Alphanumeric encoding %qs "
!                 "cannot be wider than National encoding %qs",
!                 cbl_encoding_str(encoding),
!                 cbl_encoding_str(program.alphabet.national.encoding));
!     }
! 
      programs.push( program );
      programs.apply_pending();
  
*************** static class current_t {
*** 2101,2107 ****
      // assembly language.
      static int eval_count = 1;
      char eval[32], lave[32];
!     
      sprintf(eval, "_DECLARATIVES_EVAL%d", eval_count);
      sprintf(lave, "_DECLARATIVES_LAVE%d", eval_count++);
  
--- 2147,2153 ----
      // assembly language.
      static int eval_count = 1;
      char eval[32], lave[32];
! 
      sprintf(eval, "_DECLARATIVES_EVAL%d", eval_count);
      sprintf(lave, "_DECLARATIVES_LAVE%d", eval_count++);
  
*************** static class current_t {
*** 2112,2120 ****
      ast_enter_section(eval_label);
  
      declarative_runtime_match(declaratives.as_list(), lave_label);
!     
      parser_label_label(lave_label);
!     
      return lave_label;
    }
  
--- 2158,2166 ----
      ast_enter_section(eval_label);
  
      declarative_runtime_match(declaratives.as_list(), lave_label);
! 
      parser_label_label(lave_label);
! 
      return lave_label;
    }
  
*************** static class current_t {
*** 2122,2132 ****
      std::swap( programs.top().section, section );
      return section;
    }
!   
    ec_type_t ec_type_of( file_status_t status ) {
      static std::vector<ec_type_t> ec_by_status {
        /* 0 */ ec_none_e, // ec_io_warning_e if low byte is nonzero
!       /* 1 */ ec_io_at_end_e, 
        /* 2 */ ec_io_invalid_key_e,
        /* 3 */ ec_io_permanent_error_e,
        /* 4 */ ec_io_logic_error_e,
--- 2168,2178 ----
      std::swap( programs.top().section, section );
      return section;
    }
! 
    ec_type_t ec_type_of( file_status_t status ) {
      static std::vector<ec_type_t> ec_by_status {
        /* 0 */ ec_none_e, // ec_io_warning_e if low byte is nonzero
!       /* 1 */ ec_io_at_end_e,
        /* 2 */ ec_io_invalid_key_e,
        /* 3 */ ec_io_permanent_error_e,
        /* 4 */ ec_io_logic_error_e,
*************** static class current_t {
*** 2186,2192 ****
     * To indicate to the runtime-match function that we want to evaluate
     * only the exception condition, unrelated to a file, we set the
     * file register to 0 and the handled-exception register to the
!    * handled exception condition. 
     *
     * declaratives_execute performs the "declarative ladder" produced
     * by declaratives_runtime_match.  That section CALLs the
--- 2232,2238 ----
     * To indicate to the runtime-match function that we want to evaluate
     * only the exception condition, unrelated to a file, we set the
     * file register to 0 and the handled-exception register to the
!    * handled exception condition.
     *
     * declaratives_execute performs the "declarative ladder" produced
     * by declaratives_runtime_match.  That section CALLs the
*************** static class current_t {
*** 2242,2249 ****
    cbl_label_t * compute_label() { return error_labels.compute_error; }
  } current;
  
- prog_descr_t::encoding_t::encoding_base_t current_t::default_encoding;
- 
  void current_enabled_ecs( tree ena ) {
    current.declaratives.runtime.ena = ena;
  }
--- 2288,2293 ----
*************** current_options() {
*** 2266,2284 ****
  
  cbl_encoding_t
  current_encoding( char a_or_n ) {
!   cbl_encoding_t retval;
    switch(a_or_n) {
    case 'A':
!     retval = current.alpha_encoding();
      break;
    case 'N':
!     retval = current.national_encoding();
      break;
    default:
      gcc_unreachable();
      break;
    }
!   return retval;
  }
  
  size_t
--- 2310,2332 ----
  
  cbl_encoding_t
  current_encoding( char a_or_n ) {
!   cbl_encoding_t encoding;
    switch(a_or_n) {
    case 'A':
!     encoding = cbl_field_t::codeset_t::default_encodings.alpha.type;
!     if( current.program() )
!       encoding = current.alpha_encoding();
      break;
    case 'N':
!     encoding = cbl_field_t::codeset_t::default_encodings.national.type;
!     if( current.program() )
!       encoding = current.national_encoding();
      break;
    default:
      gcc_unreachable();
      break;
    }
!   return encoding;
  }
  
  size_t
*************** normalize_picture( char picture[] );
*** 2340,2351 ****
  
  static inline cbl_field_t *
  new_tempnumeric(const cbl_name_t name = nullptr, cbl_field_attr_t attr = signable_e ) {
!   return new_temporary(FldNumericBin5, name, attr == signable_e);
  }
  
  static inline cbl_field_t *
  new_tempnumeric(const cbl_field_attr_t attr ) {
!   return new_temporary(FldNumericBin5, nullptr, attr == signable_e);
  }
  
  static inline cbl_field_t *
--- 2388,2399 ----
  
  static inline cbl_field_t *
  new_tempnumeric(const cbl_name_t name = nullptr, cbl_field_attr_t attr = signable_e ) {
!   return new_temporary(FldNumericBin5, name, attr);
  }
  
  static inline cbl_field_t *
  new_tempnumeric(const cbl_field_attr_t attr ) {
!   return new_temporary(FldNumericBin5, nullptr, attr);
  }
  
  static inline cbl_field_t *
*************** literal_refmod_valid( YYLTYPE loc, const
*** 2370,2382 ****
  static bool
  is_integer_literal( const cbl_field_t *field ) {
    if( field->type == FldLiteralN ) {
!     size_t nchar;
!     const char *initial = __gg__iconverter(field->codeset.encoding,
!                                            DEFAULT_SOURCE_ENCODING,
!                                            field->data.initial,
!                                            strlen(field->data.initial),
!                                            &nchar);
!     assert(strlen(initial) == nchar);
      switch( *initial ) {
      case '-': case '+': ++initial;
      }
--- 2418,2424 ----
  static bool
  is_integer_literal( const cbl_field_t *field ) {
    if( field->type == FldLiteralN ) {
!     const char *initial = field->data.original();
      switch( *initial ) {
      case '-': case '+': ++initial;
      }
*************** is_integer_literal( const cbl_field_t *f
*** 2384,2390 ****
      const char *eos = initial + strlen(initial);
      auto p = std::find_if_not( initial, eos, fisdigit );
      if( p == eos ) return true;
!     
      if( *p++ == symbol_decimal_point() ) {
        switch( *p++ ) {
        case 'E': case 'e':
--- 2426,2432 ----
      const char *eos = initial + strlen(initial);
      auto p = std::find_if_not( initial, eos, fisdigit );
      if( p == eos ) return true;
! 
      if( *p++ == symbol_decimal_point() ) {
        switch( *p++ ) {
        case 'E': case 'e':
*************** intrinsic_call_4( cbl_field_t *tgt, int
*** 2563,2571 ****
   */
  
  static inline cbl_field_t *
! new_literal( const char initial[] ) {
    return new_literal( strlen(initial), initial );
  }
  
  cbl_refer_t *
  negate( cbl_refer_t * refer, bool neg = true ) {
--- 2605,2619 ----
   */
  
  static inline cbl_field_t *
! new_constant( const char initial[] ) {
    return new_literal( strlen(initial), initial );
  }
+ static inline cbl_field_t *
+ new_literal( const cbl_loc_t loc, const char initial[] ) {
+   auto field = new_constant(initial);
+   symbol_temporary_location(field, loc);
+   return field;
+ }
  
  cbl_refer_t *
  negate( cbl_refer_t * refer, bool neg = true ) {
*************** negate( cbl_refer_t * refer, bool neg =
*** 2578,2584 ****
  
  cbl_field_t *
  conditional_set( cbl_field_t *tgt, bool tf ) {
!   static cbl_field_t *one = new_literal("1");
  
    enum relop_t op = tf? eq_op : ne_op;
    parser_relop( tgt, one, op, one );
--- 2626,2632 ----
  
  cbl_field_t *
  conditional_set( cbl_field_t *tgt, bool tf ) {
!   static cbl_field_t *one = new_constant("1");
  
    enum relop_t op = tf? eq_op : ne_op;
    parser_relop( tgt, one, op, one );
*************** symbol_find( const std::list<const char
*** 2615,2621 ****
  }
  
  static inline cbl_field_t *
! field_find( const std::list<const char *>& names ) {
    if( names.size() == 1 ) {
      auto value = cdf_value(names.front());
      if( value ) {
--- 2663,2669 ----
  }
  
  static inline cbl_field_t *
! field_find( cbl_loc_t loc, const std::list<const char *>& names ) {
    if( names.size() == 1 ) {
      auto value = cdf_value(names.front());
      if( value ) {
*************** field_find( const std::list<const char *
*** 2624,2630 ****
          field = new_tempnumeric();
          parser_set_numeric(field, value->as_number());
        } else {
!         field = new_literal(value->string);
        }
        return field;
      }
--- 2672,2678 ----
          field = new_tempnumeric();
          parser_set_numeric(field, value->as_number());
        } else {
!         field = new_literal(loc, value->string);
        }
        return field;
      }
*************** valid_redefine( const YYLTYPE& loc,
*** 2732,2740 ****
          dbgmsg( "size error redef: %s", field_str(field) );
          error_msg(loc, "%s (%s size %u) larger than REDEFINES %s (%s size %u)",
                    field->name,
!                   3 + cbl_field_type_str(field->type), field->size(),
                    orig->name,
!                   3 + cbl_field_type_str(orig->type), orig->size() );
        }
      }
    }
--- 2780,2790 ----
          dbgmsg( "size error redef: %s", field_str(field) );
          error_msg(loc, "%s (%s size %u) larger than REDEFINES %s (%s size %u)",
                    field->name,
!                   3 + cbl_field_type_str(field->type),
!                   field->size()/field->codeset.stride(),
                    orig->name,
!                   3 + cbl_field_type_str(orig->type),
!                   orig->size()/field->codeset.stride() );
        }
      }
    }
*************** valid_redefine( const YYLTYPE& loc,
*** 2764,2789 ****
    return true;
  }
  
  static void
  field_value_all(struct cbl_field_t * field ) {
    // Expand initial by repeating its contents until it is of length capacity:
    assert(field->data.initial != NULL);
    size_t initial_length = strlen(field->data.initial);
!   char *new_initial = static_cast<char*>(xmalloc(field->data.capacity + 1));
    size_t i = 0;
!   while(i < field->data.capacity) {
      new_initial[i] = field->data.initial[i%initial_length];
      i += 1;
    }
!   new_initial[field->data.capacity] = '\0';
    free(const_cast<char *>(field->data.initial));
    field->data.initial = new_initial;
  }
  
  static cbl_field_t *
  parent_has_value( cbl_field_t *field ) {
    while( (field = parent_of(field)) != NULL ) {
!     if( field->data.initial ) break;
    }
    return field;
  }
--- 2814,2854 ----
    return true;
  }
  
+ #if 0
  static void
  field_value_all(struct cbl_field_t * field ) {
    // Expand initial by repeating its contents until it is of length capacity:
    assert(field->data.initial != NULL);
    size_t initial_length = strlen(field->data.initial);
!   char *new_initial =
!           static_cast<char*>(xmalloc(field->data.capacity()/
!                                      field->codeset.stride() + 1));
    size_t i = 0;
! 
!   while(i < field->data.capacity()/field->codeset.stride()) {
      new_initial[i] = field->data.initial[i%initial_length];
      i += 1;
    }
!   new_initial[field->data.capacity()/field->codeset.stride()] = '\0';
    free(const_cast<char *>(field->data.initial));
    field->data.initial = new_initial;
  }
+ #endif
+ 
+ static cbl_field_t *
+ parent_has_picture( cbl_field_t *field ) {
+   while( (field = parent_of(field)) != NULL ) {
+     if( symbol_redefines(field) ) return nullptr;
+     if( field->data.initial ) break; // initial create by PICTURE clause, usually
+   }
+   return field;
+ }
  
  static cbl_field_t *
  parent_has_value( cbl_field_t *field ) {
    while( (field = parent_of(field)) != NULL ) {
!     if( symbol_redefines(field) ) return nullptr;
!     if( field->data.original() ) break;
    }
    return field;
  }
*************** field_capacity_error( const YYLTYPE& loc
*** 2922,2984 ****
    uint32_t parent_capacity = 0;
    if( field->parent ) {
      auto e = symbol_at(field->parent);
!     if( e->type == SymField ) parent_capacity = cbl_field_of(e)->data.capacity;
!   }
!   /*
!    * Field may become a table whose capacity was inherited from a parent with
!    * data. If so, the field's capacity will be overwritten by its
!    * PICTURE-defined size.
!    */
!   if( parent_capacity < field->data.capacity && !symbol_redefines(field) ) {
!     dbgmsg( "%s: %s", __func__, field_str(field) );
!     error_msg(loc,  "%s has USAGE incompatible with PICTURE",
!               field->name );
!     return true;
    }
    return false;
  }
  #define ERROR_IF_CAPACITY(L, F)                                 \
    do { if( field_capacity_error(L, F) ) YYERROR; } while(0)
  
! static const char *
! blank_pad_initial( const char initial[], size_t capacity, size_t new_size ) {
!   assert(capacity < new_size);
!   assert(initial != NULL);
! 
!   if( normal_value_e != cbl_figconst_of(initial) ) return initial;
  
!   auto p = reinterpret_cast<char *>( xmalloc(2 + new_size) );
!   memset(p, 0x20, new_size);
!   memcpy(p, initial, capacity);
!   p[new_size] = '\0'; // for debugging
!   p[++new_size] = '\0'; // for debugging
!   return p;
  }
  
  /*
!  * When cbl_field_t::internalize is called, its data.initial value has been
!  * set, but nothing has been done to it.  It is encoded according to the source
!  * code.  internalize() converts data.initial to the field's encoding. 
!  *
!  * If syntax used was was PIC VALUE, in that order, then PIC set the field's
!  * encoding, and the VALUE clause can verify that its encoding matches.  If the
!  * order was VALUE PIC, the value leaves the encoding uninitialized unless the
!  * value string bore an encoding prefix.  When PIC is processed, codeset_t::set
!  * allows it to set the encoding only if it's either uninitialized, or the PIC
!  * encoding matches the existing one set by VALUE.  In no event does one
!  * override the other; they must agree.
!  *
!  * internalize() fails if data.initial cannot be converted to the field's
!  * encoding.
   */
! static void
! value_encoding_check( const YYLTYPE& loc, cbl_field_t *field ) {
!   if( ! field->internalize() ) {
!     error_msg(loc, "inconsistent string literal encoding for '%s'",
!               field->data.initial);
    }
  }
  
  #pragma GCC diagnostic push
  #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
  
--- 2987,3085 ----
    uint32_t parent_capacity = 0;
    if( field->parent ) {
      auto e = symbol_at(field->parent);
!     if( e->type == SymField ) parent_capacity = cbl_field_of(e)->data.capacity();
!     /*
!      * Field may become a table whose capacity was inherited from a parent with
!      * data. If so, the field's capacity will be overwritten by its
!      * PICTURE-defined size.
!      */
!     if( parent_capacity < field->data.capacity() && !symbol_redefines(field) ) {
!       dbgmsg( "%s: %s", __func__, field_str(field) );
!       error_msg(loc,  "%s has USAGE incompatible with PICTURE",
!                 field->name );
!       return true;
!     }
    }
    return false;
  }
  #define ERROR_IF_CAPACITY(L, F)                                 \
    do { if( field_capacity_error(L, F) ) YYERROR; } while(0)
  
! template <typename T>
! static void
! blankit( T* beg, size_t n, T ch ) {
!   std::fill(beg, beg + n, ch);
! }
  
! /*
!  * Normally blank_initial takes just a length argument and initializes
!  * data.initial to all blanks according to the field's encoding.  Optionally it
!  * applies a figurative constant and uses that instead. 
!  */
! void
! cbl_field_t::blank_initial( size_t nchar, cbl_figconst_t figconst ) {
!   charmap_t *charmap = __gg__get_charmap(codeset.encoding);
!   cbl_char_t space_char = figconst == normal_value_e?
!     charmap->mapped_character(ascii_space)
!   : charmap->figconst_character(figconst);
!   
!   size_t nbyte = nchar * codeset.stride();
!   char *init = static_cast<char *>(xmalloc(nbyte+4));
!   char *enit = init + nbyte;
!   std::fill(enit, enit + 4, '\0'); // append for NULs
!   
!   switch(codeset.stride()) {
!   case 1: 
!     blankit( reinterpret_cast<uint8_t*>(init), nchar, uint8_t(space_char) );
!     break;
!   case 2:
!     blankit( reinterpret_cast<uint16_t*>(init), nchar, uint16_t(space_char) );
!     break;
!   case 4:
!     blankit( reinterpret_cast<uint32_t*>(init), nchar, uint32_t(space_char) );
!     break;
!   default:
!     gcc_unreachable();
!   }
!   data.initial = init;
  }
  
  /*
!  * When called, data.nbyte, if nonzero, holds the length of data.orig.data.
!  * Set data.capacity to its correct size, and create data.initial as all
!  * blanks, based on that size.  Then encode the original string into
!  * data.initial, preserving any trailing blanks.
   */
! void
! cbl_field_t::set_initial( size_t nchar, const cbl_loc_t& loc ) {
!   auto srclen = data.capacity(); 
!   set_capacity(nchar);
!   blank_initial( char_capacity() );
!   if( data.original() ) {
!     attr |= cbl_figconst_of(data.original());
!     if( has_attr(hex_encoded_e) ) {
!       // If initial value is too long, the caller should report it. 
!       auto len = std::min(srclen, data.capacity());
!       std::copy(data.original(), data.original() + len,
!                 const_cast<char*>(data.initial));
!     } else {
!       if( 0 < data.capacity() ) {
!         encode(srclen, loc);
!       }
!     }
    }
  }
  
+ /*
+  * When called without a length, set_initial determines the character count
+  * from the current size, established by the size of the VALUE string or
+  * literal.
+  */
+ void
+ cbl_field_t::set_initial( const cbl_loc_t& loc ) {
+   set_initial( data.capacity(), loc );
+ }
+ 
  #pragma GCC diagnostic push
  #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
  
*************** field_alloc( const YYLTYPE& loc, cbl_fie
*** 2987,2993 ****
    static const uint32_t level = 0;
    cbl_field_t *f, field = { type, 0, cbl_field_data_t(), level, name, yylineno };
    field.parent = parent;
!   
    f = field_add(loc, &field);
    assert(f);
    return f;
--- 3088,3094 ----
    static const uint32_t level = 0;
    cbl_field_t *f, field = { type, 0, cbl_field_data_t(), level, name, yylineno };
    field.parent = parent;
! 
    f = field_add(loc, &field);
    assert(f);
    return f;
*************** parser_move_carefully( const char */*F*/
*** 3111,3119 ****
  
      if( is_index ) {
        if( tgt.field->type != FldIndex && src.field->type != FldIndex) {
!         error_msg(src.loc, "invalid SET %s (%s) TO %s (%s): not a field index",
!                   tgt.field->name, cbl_field_type_str(tgt.field->type),
!                   src.field->name, cbl_field_type_str(src.field->type));
          delete tgt_list;
          return false;
        }
--- 3212,3220 ----
  
      if( is_index ) {
        if( tgt.field->type != FldIndex && src.field->type != FldIndex) {
!         error_msg(src.loc, "invalid SET %qs (%s) TO %qs (%s): not a field index",
!                   name_of(tgt.field), 3 + cbl_field_type_str(tgt.field->type),
!                   name_of(src.field), 3 + cbl_field_type_str(src.field->type));
          delete tgt_list;
          return false;
        }
*************** parser_move_carefully( const char */*F*/
*** 3122,3158 ****
          if( src.field->type == FldPointer &&
              tgt.field->type == FldPointer ) {
            dialect_ok(src.loc, MfMovePointer, "MOVE POINTER");
!         }
!         if( ! is_index ) {
!           char ach[16];
!           char stype[32];
!           char dtype[32];
!           strcpy(stype, cbl_field_type_str(src.field->type));
!           strcpy(dtype, cbl_field_type_str(tgt.field->type));
! 
!           if( src.field->attr & all_alpha_e )
!             {
!             strcpy(stype, "FldAlphabetic");
!             }
!           if( tgt.field->attr & all_alpha_e )
!             {
!             strcpy(dtype, "FldAlphabetic");
!             }
!           if( !(src.field->attr & scaled_e) && src.field->data.rdigits )
!             {
!             sprintf(ach, ".%d", src.field->data.rdigits);
!             strcat(stype, ach);
!             }
!           if( !(tgt.field->attr & scaled_e) && tgt.field->data.rdigits )
!             {
!             sprintf(ach, ".%d", tgt.field->data.rdigits);
!             strcat(dtype, ach);
!             }
!           error_msg(src.loc,  "cannot MOVE '%s' (%s) to '%s' (%s)",
!                     name_of(src.field), stype,
!                     name_of(tgt.field), dtype);
!           delete tgt_list;
!           return false;
          }
        }
      }
--- 3223,3232 ----
          if( src.field->type == FldPointer &&
              tgt.field->type == FldPointer ) {
            dialect_ok(src.loc, MfMovePointer, "MOVE POINTER");
!         } else {
!           error_msg(src.loc, "cannot MOVE %qs (%s) TO %qs (%s)",
!                     nice_name_of(src.field), 3 + cbl_field_type_str(src.field->type),
!                     nice_name_of(tgt.field), 3 + cbl_field_type_str(tgt.field->type));
          }
        }
      }
*************** data_division_ready() {
*** 3291,3298 ****
    if( (nsymbol = symbols_update(nsymbol, nparse_error == 0)) > 0 ) {
      if( ! literally_one ) {
        // Use strdup so cbl_field_t::internalize can free them if need be.
!       literally_one = new_literal(xstrdup("1"));
!       literally_zero = new_literal(xstrdup("0"));
      }
    }
  
--- 3365,3372 ----
    if( (nsymbol = symbols_update(nsymbol, nparse_error == 0)) > 0 ) {
      if( ! literally_one ) {
        // Use strdup so cbl_field_t::internalize can free them if need be.
!       literally_one = new_constant(xstrdup("1"));
!       literally_zero = new_constant(xstrdup("0"));
      }
    }
  
*************** anybody_redefines( const cbl_field_t *tr
*** 3318,3324 ****
        break;
        }
      // cppcheck-suppress [unreadVariable] obviously not true
!     tree = parent_of(tree);   
      }
    return retval;
    }
--- 3392,3398 ----
        break;
        }
      // cppcheck-suppress [unreadVariable] obviously not true
!     tree = parent_of(tree);
      }
    return retval;
    }
*************** procedure_division_ready( YYLTYPE loc, c
*** 3371,3377 ****
      apply_cdf_turn(exception_turn);
    }
    exception_turns.clear();
!   
    // Start the Procedure Division.
    size_t narg = ffi_args? ffi_args->elems.size() : 0;
    std::vector <cbl_ffi_arg_t> args(narg);
--- 3445,3451 ----
      apply_cdf_turn(exception_turn);
    }
    exception_turns.clear();
! 
    // Start the Procedure Division.
    size_t narg = ffi_args? ffi_args->elems.size() : 0;
    std::vector <cbl_ffi_arg_t> args(narg);
*************** file_section_parent_set( cbl_field_t *fi
*** 3534,3541 ****
      auto file = cbl_file_of(symbol_at(file_section_fd));
      auto record_area = cbl_field_of(symbol_at(file->default_record));
  
!     record_area->data.capacity = std::max(record_area->data.capacity,
!                                                 field->data.capacity);
  
      field->file = file_section_fd;
      const auto redefined = symbol_redefines(record_area);
--- 3608,3615 ----
      auto file = cbl_file_of(symbol_at(file_section_fd));
      auto record_area = cbl_field_of(symbol_at(file->default_record));
  
!     record_area->data.capacity( std::max(record_area->data.capacity(),
!                                          field->data.capacity()) );
  
      field->file = file_section_fd;
      const auto redefined = symbol_redefines(record_area);
*************** ast_file_status_between( file_status_t l
*** 3557,3562 ****
--- 3631,3641 ----
  void internal_ebcdic_lock();
  void internal_ebcdic_unlock();
  
+ static cbl_field_type_t
+ field_binary_usage( YYLTYPE loc, cbl_field_t *field,
+                     cbl_field_type_t type, uint32_t capacity,
+                     bool signable ); 
+ 
  void
  ast_end_program(const char name[]  ) {
    std::for_each( symbols_begin(), symbols_end(),
*************** goodnight_gracie() {
*** 3604,3610 ****
    return true;
  }
  
! // false after USE statement, to enter Declarative with EC intact. 
  static bool statement_cleanup = true;
  static YYLTYPE current_location;
  
--- 3683,3689 ----
    return true;
  }
  
! // false after USE statement, to enter Declarative with EC intact.
  static bool statement_cleanup = true;
  static YYLTYPE current_location;
  
diff -Nrcpad gcc-16-20260111/gcc/cobol/scan.l gcc-16-20260118/gcc/cobol/scan.l
*** gcc-16-20260111/gcc/cobol/scan.l	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/scan.l	Sun Jan 18 22:32:06 2026
*************** PICTURE   [^[:space:]]+
*** 94,99 ****
--- 94,107 ----
  DOTSEP    [.]+[[:space:]]
  DOTEOL    [[:blank:]]*[.]{BLANK_EOL}
  
+ 	  /*
+ 	   * "If the symbol ',' or the symbol '.' is the last symbol of
+ 	   *  character-string-1, the PICTURE clause shall be the last clause
+ 	   *  of the data description entry and shall be followed immediately
+ 	   *  (without an intervening separator space) by the separator period."
+ 	   */
+ NONPIC	  [,]{DOTSEP} 
+ 
  SKIP	  [[:blank:]]*SKIP[123][[:blank:]]*[.]?{BLANK_EOL}
  TITLE	  [[:blank:]]*TITLE($|[.]|[^\n]*)
  
*************** BACKGROUND-COLOR		{ return BACKGROUND_CO
*** 316,321 ****
--- 324,330 ----
  BELL				{ return BELL; }
  BINARY-ENCODING			{ return BINARY_ENCODING; }
  BLINK				{ return BLINK; }
+ BYTE				{ return BYTE; }
  CAPACITY			{ return CAPACITY; }
  
  CENTER		{
*************** USE({SPC}FOR)?		{ return USE; }
*** 1030,1037 ****
  
    INDEX				{ return INDEX; }
    MESSAGE-TAG			{ not_implemented("USAGE type: MESSAGE-TAG"); }
!   NATIONAL			{ not_implemented("USAGE type: NATIONAL");
! 				  return NATIONAL; }
    OBJECT{SPC}REFERENCE		{ not_implemented("USAGE type: OBJECT REFERENCE"); }
  
    PACKED-DECIMAL		{ return PACKED_DECIMAL; }
--- 1039,1045 ----
  
    INDEX				{ return INDEX; }
    MESSAGE-TAG			{ not_implemented("USAGE type: MESSAGE-TAG"); }
!   NATIONAL			{ return NATIONAL; }
    OBJECT{SPC}REFERENCE		{ not_implemented("USAGE type: OBJECT REFERENCE"); }
  
    PACKED-DECIMAL		{ return PACKED_DECIMAL; }
*************** USE({SPC}FOR)?		{ return USE; }
*** 1099,1104 ****
--- 1107,1113 ----
    LEADING		{ return LEADING; }
    LEFT    		{ return LEFT; }
    MODE			{ return MODE; }
+   NO			{ return NO; }
    OCCURS/{SPC}{NAME} 	{ return OCCURS; }
    OCCURS		{ yy_push_state(integer_count);  return OCCURS; }
    OF			{ return OF; }
*************** USE({SPC}FOR)?		{ return USE; }
*** 1130,1135 ****
--- 1139,1145 ----
    VARYING		{ return VARYING; }
    VOLATILE    		{ return VOLATILE; }
    WHEN    		{ return WHEN; }
+   WITH			{ return WITH; }
  
    COPY			{
                  	  yy_push_state(copy_state);
*************** USE({SPC}FOR)?		{ return USE; }
*** 1242,1248 ****
                           yylval.string = xstrdup(yytext); return picset(ALNUM); }
    {ALNUM}/[(]{NAME}[)] { yy_push_state(picture_count);
                           yylval.string = xstrdup(yytext); return picset(ALNUM); }
!   {ALNUM}              { yylval.string = xstrdup(yytext); return picset(ALNUM); }
  
    {ALPHED}             { yylval.string = xstrdup(yytext); return picset(ALPHED); }
    {NUMEDITED}          { yylval.string = xstrdup(yytext); return picset(NUMED); }
--- 1252,1258 ----
                           yylval.string = xstrdup(yytext); return picset(ALNUM); }
    {ALNUM}/[(]{NAME}[)] { yy_push_state(picture_count);
                           yylval.string = xstrdup(yytext); return picset(ALNUM); }
!   {ALNUM}/{NONPIC}?    { yylval.string = xstrdup(yytext); return picset(ALNUM); }
  
    {ALPHED}             { yylval.string = xstrdup(yytext); return picset(ALPHED); }
    {NUMEDITED}          { yylval.string = xstrdup(yytext); return picset(NUMED); }
*************** B-SHIFT-RC
*** 1830,1835 ****
--- 1840,1846 ----
    BIT-OF/{NONWORD}			{ pop_return BIT_OF; }
    BIT-TO-CHAR/{NONWORD}			{ pop_return BIT_TO_CHAR; }
    BOOLEAN-OF-INTEGER/{NONWORD}		{ pop_return BOOLEAN_OF_INTEGER; }
+   BYTE/{NONWORD}			{ pop_return BYTE; }
    BYTE-LENGTH/{NONWORD}			{ pop_return BYTE_LENGTH; }
    CHAR-NATIONAL/{NONWORD}		{ pop_return CHAR_NATIONAL; }
    CHAR/{NONWORD}			{ pop_return CHAR; }
diff -Nrcpad gcc-16-20260111/gcc/cobol/scan_ante.h gcc-16-20260118/gcc/cobol/scan_ante.h
*** gcc-16-20260111/gcc/cobol/scan_ante.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/scan_ante.h	Sun Jan 18 22:32:06 2026
*************** static bool nonspace( char ch ) { return
*** 120,125 ****
--- 120,126 ----
  
  static int
  numstr_of( const char string[], radix_t radix = decimal_e ) {
+   yylval.numstr.is_float = false;
    yylval.numstr.radix = radix;
    ydflval.string = yylval.numstr.string = xstrdup(string);
    char *comma = strchr(yylval.numstr.string, ',');
*************** numstr_of( const char string[], radix_t
*** 185,190 ****
--- 186,192 ----
          return NO_CONDITION;
        }
      }
+     yylval.numstr.is_float = true;
    }
    if( 1 < std::count(input, eoinput, symbol_decimal_point()) ) {
      error_msg(yylloc, "invalid numeric literal %qs", ++p);
*************** typed_name( const char name[] ) {
*** 1165,1177 ****
      {
        auto f = cbl_field_of(e);
        if( is_constant(f) ) {
! 	if(  f->data.initial ) {
! 	  int token = cbl_figconst_tok(f->data.initial);
  	  if( token ) return token;
  	}
!         int token = datetime_format_of(f->data.initial);
          if( token ) {
!           yylval.string = xstrdup(f->data.initial);
            return token;
          }
        }
--- 1167,1179 ----
      {
        auto f = cbl_field_of(e);
        if( is_constant(f) ) {
! 	if(  f->data.original() ) {
! 	  int token = cbl_figconst_tok(f->data.original());
  	  if( token ) return token;
  	}
!         int token = datetime_format_of(f->data.original());
          if( token ) {
!           yylval.string = xstrdup(f->data.original());
            return token;
          }
        }
*************** typed_name( const char name[] ) {
*** 1183,1189 ****
        if( type == FldLiteralN ) {
          yylval.numstr.radix =
            f->has_attr(hex_encoded_e)? hexadecimal_e : decimal_e;
!         yylval.numstr.string = xstrdup(f->data.initial);
          return NUMSTR;
        }
        if( !f->has_attr(record_key_e) ) { // not a key-name literal
--- 1185,1191 ----
        if( type == FldLiteralN ) {
          yylval.numstr.radix =
            f->has_attr(hex_encoded_e)? hexadecimal_e : decimal_e;
!         yylval.numstr.string = xstrdup(f->data.original());
          return NUMSTR;
        }
        if( !f->has_attr(record_key_e) ) { // not a key-name literal
diff -Nrcpad gcc-16-20260111/gcc/cobol/show_parse.h gcc-16-20260118/gcc/cobol/show_parse.h
*** gcc-16-20260111/gcc/cobol/show_parse.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/show_parse.h	Sun Jan 18 22:32:06 2026
*************** extern bool cursor_at_sol;
*** 117,123 ****
                  fprintf(stderr, "%s", (b)->name); \
                  if( (b)->type == FldLiteralA || (b)->type == FldLiteralN ) \
                      { \
!                     fprintf(stderr, " \"%s\"", (b)->data.initial); \
                      } \
                  else \
                      { \
--- 117,123 ----
                  fprintf(stderr, "%s", (b)->name); \
                  if( (b)->type == FldLiteralA || (b)->type == FldLiteralN ) \
                      { \
!                     fprintf(stderr, " \"%s\"", (b)->data.original()); \
                      } \
                  else \
                      { \
*************** extern bool cursor_at_sol;
*** 143,150 ****
                      size_t nbytes; \
                      const char *literal = __gg__iconverter((b).field->codeset.encoding, \
                                                             DEFAULT_SOURCE_ENCODING, \
!                                                            (b).field->data.initial, \
!                                                            strlen((b).field->data.initial), \
                                                             &nbytes); \
                      fprintf(stderr, " \"%s\"", literal); \
                      } \
--- 143,150 ----
                      size_t nbytes; \
                      const char *literal = __gg__iconverter((b).field->codeset.encoding, \
                                                             DEFAULT_SOURCE_ENCODING, \
!                                                            (b).field->data.original(), \
!                                                            strlen((b).field->data.original()), \
                                                             &nbytes); \
                      fprintf(stderr, " \"%s\"", literal); \
                      } \
*************** extern bool cursor_at_sol;
*** 334,340 ****
        else if( b->type == FldLiteralN ) \
          { \
          gg_fprintf(trace_handle, 1, " attr 0x%lx",  build_int_cst_type(SIZE_T, b->attr)); \
!         gg_fprintf(trace_handle, 1, " c:o:d:r %ld", build_int_cst_type(SIZE_T, b->data.capacity)); \
          gg_fprintf(trace_handle, 1, ":%ld",         build_int_cst_type(SIZE_T, b->offset)); \
          gg_fprintf(trace_handle, 1, ":%d",          build_int_cst_type(INT,    b->data.digits)); \
          gg_fprintf(trace_handle, 1, ":%d",         build_int_cst_type(INT,    b->data.rdigits)); \
--- 334,340 ----
        else if( b->type == FldLiteralN ) \
          { \
          gg_fprintf(trace_handle, 1, " attr 0x%lx",  build_int_cst_type(SIZE_T, b->attr)); \
!         gg_fprintf(trace_handle, 1, " c:o:d:r %ld", build_int_cst_type(SIZE_T, b->data.capacity())); \
          gg_fprintf(trace_handle, 1, ":%ld",         build_int_cst_type(SIZE_T, b->offset)); \
          gg_fprintf(trace_handle, 1, ":%d",          build_int_cst_type(INT,    b->data.digits)); \
          gg_fprintf(trace_handle, 1, ":%d",         build_int_cst_type(INT,    b->data.rdigits)); \
*************** extern bool cursor_at_sol;
*** 400,406 ****
        else if( (b).field->type == FldLiteralN ) \
          { \
          gg_fprintf(trace_handle, 1, " attr 0x%lx",  build_int_cst_type(SIZE_T, (b).field->attr)); \
!         gg_fprintf(trace_handle, 1, " c:o:d:r %ld", build_int_cst_type(SIZE_T, (b).field->data.capacity)); \
          gg_fprintf(trace_handle, 1, ":%ld",         build_int_cst_type(SIZE_T, (b).field->offset)); \
          gg_fprintf(trace_handle, 1, ":%d",          build_int_cst_type(INT,    (b).field->data.digits)); \
          gg_fprintf(trace_handle, 1, ":%d)",         build_int_cst_type(INT,    (b).field->data.rdigits)); \
--- 400,406 ----
        else if( (b).field->type == FldLiteralN ) \
          { \
          gg_fprintf(trace_handle, 1, " attr 0x%lx",  build_int_cst_type(SIZE_T, (b).field->attr)); \
!         gg_fprintf(trace_handle, 1, " c:o:d:r %ld", build_int_cst_type(SIZE_T, (b).field->data.capacity())); \
          gg_fprintf(trace_handle, 1, ":%ld",         build_int_cst_type(SIZE_T, (b).field->offset)); \
          gg_fprintf(trace_handle, 1, ":%d",          build_int_cst_type(INT,    (b).field->data.digits)); \
          gg_fprintf(trace_handle, 1, ":%d)",         build_int_cst_type(INT,    (b).field->data.rdigits)); \
diff -Nrcpad gcc-16-20260111/gcc/cobol/structs.cc gcc-16-20260118/gcc/cobol/structs.cc
*** gcc-16-20260111/gcc/cobol/structs.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/structs.cc	Sun Jan 18 22:32:06 2026
*************** create_cblc_file_t()
*** 216,230 ****
      // When doing FILE I/O, you need the cblc_file_t structure
  
      /*
! typedef struct cblc_file_t
      {
      char                *name;             // This is the name of the structure; might be the name of an environment variable
!     size_t               symbol_index;     // The symbol table index of the related cbl_file_t structure
      char                *filename;         // The name of the file to be opened
      FILE                *file_pointer;     // The FILE *pointer
      cblc_field_t        *default_record;   // The record_area
!     size_t               record_area_min;  // The size of the smallest 01 record in the FD
!     size_t               record_area_max;  // The size of the largest  01 record in the FD
      cblc_field_t       **keys;             // For relative and indexed files.  The first is the primary key. Null-terminated.
      int                 *key_numbers;      // One per key -- each key has a number. This table is key_number + 1
      int                 *uniques;          // One per key
--- 216,230 ----
      // When doing FILE I/O, you need the cblc_file_t structure
  
      /*
! typedef struct cblc_file_t*
      {
      char                *name;             // This is the name of the structure; might be the name of an environment variable
!     uint64_t             symbol_index;     // The symbol table index of the related cbl_file_t structure
      char                *filename;         // The name of the file to be opened
      FILE                *file_pointer;     // The FILE *pointer
      cblc_field_t        *default_record;   // The record_area
!     size_t               record_area_min;  // The size of the smallest 01 record in the FD, in characters
!     size_t               record_area_max;  // The size of the largest  01 record in the FD, in characters
      cblc_field_t       **keys;             // For relative and indexed files.  The first is the primary key. Null-terminated.
      int                 *key_numbers;      // One per key -- each key has a number. This table is key_number + 1
      int                 *uniques;          // One per key
*************** typedef struct cblc_file_t
*** 243,249 ****
      int                  errnum;           // most recent errno; can't reuse "errno" as the name
      file_status_t        io_status;        // See 2014 standard, section 9.1.12
      int                  padding;          // Actually a char
!     int                  delimiter;        // ends a record; defaults to '\n'.
      int                  flags;            // cblc_file_flags_t
      int                  recent_char;      // This is the most recent char sent to the file
      int                  recent_key;
--- 243,250 ----
      int                  errnum;           // most recent errno; can't reuse "errno" as the name
      file_status_t        io_status;        // See 2014 standard, section 9.1.12
      int                  padding;          // Actually a char
!     cbl_char_t           delimiter;        // ends a record; defaults to '\n'.
!     int                  stride();         // width of a character
      int                  flags;            // cblc_file_flags_t
      int                  recent_char;      // This is the most recent char sent to the file
      int                  recent_key;
*************** typedef struct cblc_file_t
*** 258,264 ****
      retval = gg_get_filelevel_struct_type_decl( "cblc_file_t",
                                              33,
                                              CHAR_P,    "name",
!                                             SIZE_T,    "symbol_table_index",
                                              CHAR_P,    "filename",
                                              FILE_P,    "file_pointer",
                                              cblc_field_p_type_node, "default_record",
--- 259,265 ----
      retval = gg_get_filelevel_struct_type_decl( "cblc_file_t",
                                              33,
                                              CHAR_P,    "name",
!                                             ULONGLONG, "symbol_table_index",
                                              CHAR_P,    "filename",
                                              FILE_P,    "file_pointer",
                                              cblc_field_p_type_node, "default_record",
*************** typedef struct cblc_file_t
*** 282,290 ****
                                              INT,       "errnum",
                                              INT,       "io_status",
                                              INT,       "padding",
!                                             INT,       "delimiter",
                                              INT,       "flags",
!                                             INT,       "recent_char",
                                              INT,       "recent_key",
                                              INT,       "prior_op",
                                              INT,       "encoding", // Actually cbl_encoding_t
--- 283,292 ----
                                              INT,       "errnum",
                                              INT,       "io_status",
                                              INT,       "padding",
!                                             UINT,      "delimiter",
!                                             INT,       "stride",
                                              INT,       "flags",
!                                             UINT,      "recent_char",
                                              INT,       "recent_key",
                                              INT,       "prior_op",
                                              INT,       "encoding", // Actually cbl_encoding_t
diff -Nrcpad gcc-16-20260111/gcc/cobol/symbols.cc gcc-16-20260118/gcc/cobol/symbols.cc
*** gcc-16-20260111/gcc/cobol/symbols.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/symbols.cc	Sun Jan 18 22:32:06 2026
*************** symbol_table_extend() {
*** 162,168 ****
  
    if( 0 != ftruncate(symbols.fd, len) ) {
      cbl_err( "%s:%d: could not extend symbol table to %lu elements",
! 	     __func__, __LINE__, gb4(symbols.capacity));
    }
  
    /*
--- 162,168 ----
  
    if( 0 != ftruncate(symbols.fd, len) ) {
      cbl_err( "%s:%d: could not extend symbol table to %lu elements",
!              __func__, __LINE__, gb4(symbols.capacity));
    }
  
    /*
*************** cbl_ffi_arg_t( cbl_ffi_crv_t crv,
*** 263,268 ****
--- 263,273 ----
    error_msg(loc, __VA_ARGS__);                                \
   } while(0)
  
+ #define WARNING_FIELD(F, ...)                                \
+  do{                                                        \
+   auto loc = symbol_field_location(field_index(F));        \
+   warn_msg(loc, __VA_ARGS__);                                \
+  } while(0)
  
  static const struct cbl_occurs_t nonarray = cbl_occurs_t();
  
*************** class group_size_t {
*** 278,299 ****
   public:
    group_size_t() : size(0) {}
    group_size_t& operator+( const cbl_field_t& field ) {
!     size += field.data.capacity;
      return *this;
    }
    size_t capacity() const { return size; }
  };
  
! enum  { constq = constant_e | quoted_e };
  
  static symbol_elem_t
  elementize( const cbl_field_t& field ) {
    symbol_elem_t sym (SymField);
    sym.elem.field = field;
-   // Dubner did the following because he didn't feel like creating yet another
-   // cbl_field_t constructor that included the hardcoded encoding for the
-   // global special registers.
-   sym.elem.field.codeset.set();
    return sym;
  }
  
--- 283,300 ----
   public:
    group_size_t() : size(0) {}
    group_size_t& operator+( const cbl_field_t& field ) {
!     size += field.data.capacity();
      return *this;
    }
    size_t capacity() const { return size; }
  };
  
! #define constq (constant_e | quoted_e)
  
  static symbol_elem_t
  elementize( const cbl_field_t& field ) {
    symbol_elem_t sym (SymField);
    sym.elem.field = field;
    return sym;
  }
  
*************** symbol_explicitly_redefines( const cbl_f
*** 747,753 ****
  static uint32_t
  field_size( const struct cbl_field_t *field ) {
    size_t n = field->occurs.ntimes();
!   return field->data.capacity * (n > 0? n : 1);
  }
  
  const char *
--- 748,754 ----
  static uint32_t
  field_size( const struct cbl_field_t *field ) {
    size_t n = field->occurs.ntimes();
!   return field->data.capacity() * (n > 0? n : 1);
  }
  
  const char *
*************** cbl_field_t::size() const {
*** 807,834 ****
  
  uint64_t
  cbl_field_t::set_attr( cbl_field_attr_t attr ) {
-   if( attr == signable_e ) {
-     if( ! has_attr(attr) && this->var_decl_node != NULL ) {
-       parser_field_attr_set(this, attr);
-     }
-   }
    return this->attr |= uint64_t(attr);
  }
  
  uint64_t
  cbl_field_t::clear_attr( cbl_field_attr_t attr ) {
-   if( attr == signable_e ) {
-     if( this->var_decl_node != nullptr && has_attr(attr) ) {
-       parser_field_attr_set(this, attr, false);
-     }
-   }
    return this->attr &= ~uint64_t(attr);
  }
  
  static uint32_t
  field_memsize( const struct cbl_field_t *field ) {
    uint32_t n = field->occurs.ntimes();
!   n = field->data.capacity * (n > 0? n : 1);
    return std::max(n, field->data.memsize);
  }
  
--- 808,825 ----
  
  uint64_t
  cbl_field_t::set_attr( cbl_field_attr_t attr ) {
    return this->attr |= uint64_t(attr);
  }
  
  uint64_t
  cbl_field_t::clear_attr( cbl_field_attr_t attr ) {
    return this->attr &= ~uint64_t(attr);
  }
  
  static uint32_t
  field_memsize( const struct cbl_field_t *field ) {
    uint32_t n = field->occurs.ntimes();
!   n = field->data.capacity() * (n > 0? n : 1);
    return std::max(n, field->data.memsize);
  }
  
*************** symbol_find_odo( const cbl_field_t * fie
*** 1032,1037 ****
--- 1023,1033 ----
  static inline bool
  is_index( const cbl_field_type_t type ) { return type == FldIndex; }
  
+ static inline const char *
+ cbl_encoding_str( cbl_encoding_t encoding ) {
+   return __gg__encoding_iconv_name(encoding);
+ }
+ 
  static size_t
  symbols_dump( size_t first, bool header ) {
    size_t ninvalid = 0;
*************** symbols_dump( size_t first, bool header
*** 1044,1050 ****
    }
  
    for( struct symbol_elem_t *e = symbols_begin(first); e < symbols_end(); e++ ) {
!     char *s;
  
      switch(e->type) {
      case SymFilename:
--- 1040,1046 ----
    }
  
    for( struct symbol_elem_t *e = symbols_begin(first); e < symbols_end(); e++ ) {
!     char *s = nullptr;
  
      switch(e->type) {
      case SymFilename:
*************** symbols_dump( size_t first, bool header
*** 1115,1121 ****
          free(part);
        }
        break;
!     default:
        dbgmsg("%s: cannot dump symbol type %d", __func__, e->type);
        continue;
      }
--- 1111,1125 ----
          free(part);
        }
        break;
!     case SymLocale:
!       s = xasprintf("%4" GCC_PRISZ "u %-18s %s %s collation %s", (fmt_size_t)e->program,
!                     "Locale",
!                     e->elem.locale.name,
!                     cbl_encoding_str(e->elem.locale.encoding),
!                     e->elem.locale.collation );
!       break;
!     }
!     if( ! s ) {
        dbgmsg("%s: cannot dump symbol type %d", __func__, e->type);
        continue;
      }
*************** static struct symbol_elem_t *
*** 1181,1189 ****
  
    if( is_elementary(group->type) ) { // "group" is in fact just a field
      if( is_record_area(group) ) {
!       if( group->data.capacity == 0 ) {
          const auto& file = *cbl_file_of(symbol_at(group->file));
!         group->data.capacity = file.varying_size.max;
        }
  
        // Find 01s for the file that is not a record area field.
--- 1185,1193 ----
  
    if( is_elementary(group->type) ) { // "group" is in fact just a field
      if( is_record_area(group) ) {
!       if( group->data.capacity() == 0 ) {
          const auto& file = *cbl_file_of(symbol_at(group->file));
!         group->data.capacity(  file.varying_size.max );
        }
  
        // Find 01s for the file that is not a record area field.
*************** static struct symbol_elem_t *
*** 1204,1211 ****
            assert(record->level == 1);
            e = calculate_capacity(p);
            auto record_size = std::max(record->data.memsize,
!                                       record->data.capacity);
!           group->data.capacity = std::max(group->data.capacity, record_size);
          }
        }
  
--- 1208,1215 ----
            assert(record->level == 1);
            e = calculate_capacity(p);
            auto record_size = std::max(record->data.memsize,
!                                       record->data.capacity());
!           group->data.capacity( std::max(group->data.capacity(), record_size) );
          }
        }
  
*************** static struct symbol_elem_t *
*** 1213,1220 ****
        // Reach back to that symbol to set its capacity, if need be.
        auto area = symbol_redefines(group);
        if( area ) {
!         area->data.capacity = std::max(area->data.capacity,
!                                       group->data.capacity);
        }
  
        return e; // no 01, return self
--- 1217,1224 ----
        // Reach back to that symbol to set its capacity, if need be.
        auto area = symbol_redefines(group);
        if( area ) {
!         area->data.capacity(  std::max(area->data.capacity(),
!                                        group->data.capacity()) );
        }
  
        return e; // no 01, return self
*************** static struct symbol_elem_t *
*** 1224,1230 ****
  
      if( redefined ) {
        redefined->data.memsize = std::max(field_memsize(redefined), field_size(group));
!       if( redefined->data.memsize == redefined->data.capacity ) {
          redefined->data.memsize = 0;
        }
      }
--- 1228,1234 ----
  
      if( redefined ) {
        redefined->data.memsize = std::max(field_memsize(redefined), field_size(group));
!       if( redefined->data.memsize == redefined->data.capacity() ) {
          redefined->data.memsize = 0;
        }
      }
*************** static struct symbol_elem_t *
*** 1240,1246 ****
  
    assert(group->type == FldGroup);
  
!   group->data.capacity = 0;
  
    std::list<cbl_field_t*> members;
  
--- 1244,1250 ----
  
    assert(group->type == FldGroup);
  
!   group->data.capacity(0);
  
    std::list<cbl_field_t*> members;
  
*************** static struct symbol_elem_t *
*** 1278,1297 ****
  
        field->data.memsize = 0;
  
!       if( redefined->data.memsize == redefined->data.capacity ) {
          redefined->data.memsize = 0;
        }
        continue;
      }
!     group->data.capacity += field_size(field);
      group->data.memsize += field_memsize(field);
  
      // If group has a parent that is a record area, expand it, too.
      if( 0 < group->parent ) {
        redefined = symbol_redefines(group);
        if( redefined && is_record_area(redefined) ) {
!         if( redefined->data.capacity < group->data.memsize ) {
!           redefined->data.capacity = group->data.memsize;
          }
        }
      }
--- 1282,1301 ----
  
        field->data.memsize = 0;
  
!       if( redefined->data.memsize == redefined->data.capacity() ) {
          redefined->data.memsize = 0;
        }
        continue;
      }
!     group->data.add_capacity( field_size(field) );
      group->data.memsize += field_memsize(field);
  
      // If group has a parent that is a record area, expand it, too.
      if( 0 < group->parent ) {
        redefined = symbol_redefines(group);
        if( redefined && is_record_area(redefined) ) {
!         if( redefined->data.capacity() < group->data.memsize ) {
!           redefined->data.capacity( group->data.memsize );
          }
        }
      }
*************** static struct symbol_elem_t *
*** 1303,1318 ****
    }
  
    group->data.memsize = std::max(max_memsize, group->data.memsize);
!   if( group->data.memsize == group->data.capacity ) group->data.memsize = 0;
  
!   if( 0 < group->data.memsize && group->data.memsize < group->data.capacity ) {
      if( yydebug ) {
        dbgmsg( "%s:%d: small capacity?\n\t%s", __func__, __LINE__, field_str(group) );
      }
!     group->data.memsize = group->data.capacity;
    }
  
!   if( group->data.capacity == 0 ) {
      dbgmsg( "%s:%d: zero capacity?\n\t%s", __func__, __LINE__, field_str(group) );
    }
  
--- 1307,1322 ----
    }
  
    group->data.memsize = std::max(max_memsize, group->data.memsize);
!   if( group->data.memsize == group->data.capacity() ) group->data.memsize = 0;
  
!   if( 0 < group->data.memsize && group->data.memsize < group->data.capacity() ) {
      if( yydebug ) {
        dbgmsg( "%s:%d: small capacity?\n\t%s", __func__, __LINE__, field_str(group) );
      }
!     group->data.memsize = group->data.capacity();
    }
  
!   if( group->data.capacity() == 0 ) {
      dbgmsg( "%s:%d: zero capacity?\n\t%s", __func__, __LINE__, field_str(group) );
    }
  
*************** is_variable_length( const cbl_field_t *f
*** 1372,1386 ****
    // RENAMES may be included in end_of_group.
    size_t isym = field_index(field),  esym = end_of_group(isym);
    bool odo = std::any_of( symbol_at(isym) + 1, symbol_at_impl(esym),
! 			  [field]( const auto& elem ) {
! 			    if( elem.type == SymField ) {
! 			      auto f = cbl_field_of(&elem);
! 			      if( field->level < f->level ) { // exclude RENAMES
! 				return 0 < f->occurs.depending_on;
! 			      }
! 			    }
! 			    return false;
! 			  } );
    return odo;
  }
  
--- 1376,1390 ----
    // RENAMES may be included in end_of_group.
    size_t isym = field_index(field),  esym = end_of_group(isym);
    bool odo = std::any_of( symbol_at(isym) + 1, symbol_at_impl(esym),
!                           [field]( const auto& elem ) {
!                             if( elem.type == SymField ) {
!                               auto f = cbl_field_of(&elem);
!                               if( field->level < f->level ) { // exclude RENAMES
!                                 return 0 < f->occurs.depending_on;
!                               }
!                             }
!                             return false;
!                           } );
    return odo;
  }
  
*************** field_str( const cbl_field_t *field ) {
*** 1511,1547 ****
    if( 'r' == parredef && field->level == 0 ) parredef = 'p';
    if( field->has_attr(typedef_e) ) parredef = 'T';
  
!   const char *init = field->data.initial? field->data.initial : NULL;
    if( init ) {
      auto fig = cbl_figconst_of(init);
      if( normal_value_e != fig ) {
        init = cbl_figconst_str(fig);
      } else {
- #if 0
-     // At this point, we might have to convert 'init' back to ASCII
-       char *false_init = static_cast<char *>(xmalloc(field->init.capacity+1));
-       memcpy(false_init, field->init.initial, field->data.capacity);
-       false_data[field->data.capacity] = '\0';
-       size_t charsout;
- 
-       cbl_encoding_t enc_from = field->codeset.encoding;
-       if( field->type == FldNumericDisplay )
-         {
-         // Apparently we need to trace back the meaning of data.literal for
-         // field::type == FldNumericDisplay
-         enc_from = DEFAULT_SOURCE_ENCODING;
-         }
- 
-       init = __gg__iconverter(enc_from,
-                               DEFAULT_SOURCE_ENCODING,
-                               false_data,
-                               field->data.capacity,
-                               &charsout);
- #endif
-       auto eoinit = init + strlen(init);
        char *s = xasprintf("'%s'", init);
  
        // No NUL within the initial data.
        auto ok = std::none_of( init, eoinit,
                                []( char ch ) { return ch == '\0'; } );
        assert(ok);
--- 1515,1530 ----
    if( 'r' == parredef && field->level == 0 ) parredef = 'p';
    if( field->has_attr(typedef_e) ) parredef = 'T';
  
!   const char *init = field->data.original();
    if( init ) {
      auto fig = cbl_figconst_of(init);
      if( normal_value_e != fig ) {
        init = cbl_figconst_str(fig);
      } else {
        char *s = xasprintf("'%s'", init);
  
        // No NUL within the initial data.
+       auto eoinit = init + strlen(init);
        auto ok = std::none_of( init, eoinit,
                                []( char ch ) { return ch == '\0'; } );
        assert(ok);
*************** field_str( const cbl_field_t *field ) {
*** 1549,1555 ****
        // If any of the init are unprintable, provide a hex version.
        if( ! std::all_of(init, eoinit, fisprint) ) {
          if( is_elementary(field->type) && field->type != FldPointer ) {
!           const size_t len = strlen(s) + 8 + 2 * field->data.capacity;
            s = reinterpret_cast<char*>(xrealloc(s, len));
            strcat( s, " (0x" );
            char *p = s + strlen(s);
--- 1532,1538 ----
        // If any of the init are unprintable, provide a hex version.
        if( ! std::all_of(init, eoinit, fisprint) ) {
          if( is_elementary(field->type) && field->type != FldPointer ) {
!           const size_t len = strlen(s) + 8 + 2 * strlen(init);
            s = reinterpret_cast<char*>(xrealloc(s, len));
            strcat( s, " (0x" );
            char *p = s + strlen(s);
*************** field_str( const cbl_field_t *field ) {
*** 1601,1607 ****
                     (field->attr & external_e)? 'E' : 0x20,
                     storage_type,
                     field->data.memsize,
!                    field->data.capacity, field->data.digits, field->data.rdigits,
                     init, field->attr_str(attrs), field->line );
    return string;
  }
--- 1584,1590 ----
                     (field->attr & external_e)? 'E' : 0x20,
                     storage_type,
                     field->data.memsize,
!                    field->data.capacity(), field->data.digits, field->data.rdigits,
                     init, field->attr_str(attrs), field->line );
    return string;
  }
*************** extend_66_capacity( cbl_field_t *alias )
*** 1647,1654 ****
    } else {
      ++e2;
    }
!   alias->data.capacity = std::for_each(e, e2, cap).capacity;
!   assert(alias->data.capacity > 0);
  }
  
  bool
--- 1630,1638 ----
    } else {
      ++e2;
    }
!   cap = std::for_each(e, e2, cap);
!   alias->data.capacity( cap.capacity );
!   assert(alias->data.capacity() > 0);
  }
  
  bool
*************** operator<<( std::ostream& os, const cbl_
*** 1721,1727 ****
  static std::ostream&
  operator<<( std::ostream& os, const cbl_field_data_t& field ) {
    return os << field.memsize << ','
!             << field.capacity << ','
              << field.digits << ','
              << field.rdigits << ','
              << (field.picture? field.picture : "");
--- 1705,1711 ----
  static std::ostream&
  operator<<( std::ostream& os, const cbl_field_data_t& field ) {
    return os << field.memsize << ','
!             << field.capacity() << ','
              << field.digits << ','
              << field.rdigits << ','
              << (field.picture? field.picture : "");
*************** symbols_update( size_t first, bool parse
*** 1857,1868 ****
                    field->line, field->level_str(), field->name);
  
          } else {
!           dbgmsg("%s: error: data item %s #" HOST_SIZE_T_PRINT_UNSIGNED
                   " '%s' capacity %u rejected",
                     __func__,
                     3 + cbl_field_type_str(field->type),
!                    (fmt_size_t)isym, field->name, field->data.capacity);
!           gcc_unreachable();
          }
        }
        return 0;
--- 1841,1851 ----
                    field->line, field->level_str(), field->name);
  
          } else {
!           cbl_internal_error("%s: data item %s #" HOST_SIZE_T_PRINT_UNSIGNED
                   " '%s' capacity %u rejected",
                     __func__,
                     3 + cbl_field_type_str(field->type),
!                    (fmt_size_t)isym, field->name, field->data.capacity());
          }
        }
        return 0;
*************** symbols_update( size_t first, bool parse
*** 1879,1885 ****
    // A shared record area has no 01 child because that child redefines its parent.
    for( auto sharer : shared_record_areas ) {
      auto redefined = cbl_field_of(symbol_at(sharer->parent));
!     sharer->data.capacity = redefined->data.capacity;
    }
  
    for( p = symbols_begin(first); p < symbols_end(); p++ ) {
--- 1862,1868 ----
    // A shared record area has no 01 child because that child redefines its parent.
    for( auto sharer : shared_record_areas ) {
      auto redefined = cbl_field_of(symbol_at(sharer->parent));
!     sharer->data.capacity( redefined->data.capacity() );
    }
  
    for( p = symbols_begin(first); p < symbols_end(); p++ ) {
*************** symbols_update( size_t first, bool parse
*** 1894,1901 ****
      if( field->level != 0 && field->has_attr(constant_e) ) {
        auto fig = cbl_figconst_field_of(field->data.initial);
        if( fig ) {
! 	field->var_decl_node = fig->var_decl_node;
! 	continue;
        }
      }
  
--- 1877,1884 ----
      if( field->level != 0 && field->has_attr(constant_e) ) {
        auto fig = cbl_figconst_field_of(field->data.initial);
        if( fig ) {
!         field->var_decl_node = fig->var_decl_node;
!         continue;
        }
      }
  
*************** symbols_update( size_t first, bool parse
*** 1920,1926 ****
        continue;
      }
      if( is_numeric(field) && ! field->has_attr(constant_e) ) {
!       if( field->data.capacity == 0 ) {
          ERROR_FIELD(field, "numeric %qs has USAGE that requires PICTURE %s",
                      field->name, field->data.initial);
        }
--- 1903,1909 ----
        continue;
      }
      if( is_numeric(field) && ! field->has_attr(constant_e) ) {
!       if( field->data.capacity() == 0 ) {
          ERROR_FIELD(field, "numeric %qs has USAGE that requires PICTURE %s",
                      field->name, field->data.initial);
        }
*************** symbols_update( size_t first, bool parse
*** 1934,1940 ****
            gcc_unreachable();
          case FldAlphaEdited:
          case FldAlphanumeric:
-         case FldClass:
          case FldDisplay:
          case FldGroup:
          case FldLiteralA:
--- 1917,1922 ----
*************** symbols_update( size_t first, bool parse
*** 1946,1951 ****
--- 1928,1934 ----
                        "internal: %qs encoding not defined", field->name);
            }
            break;
+         case FldClass:
          case FldConditional:
          case FldFloat:
          case FldIndex:
*************** symbol_field_parent_set( cbl_field_t *fi
*** 2191,2197 ****
          if( ! prior->codeset.set() ) { // needs attention
            dbgmsg("'%s' is already National", prior->name);
          }
!         field->attr |= numeric_group_attrs(prior);
        }
        // verify level 88 domain value
        if( is_numeric(prior) && field->level == 88 ) {
--- 2174,2180 ----
          if( ! prior->codeset.set() ) { // needs attention
            dbgmsg("'%s' is already National", prior->name);
          }
!         field->attr |= numeric_group_attrs(field);
        }
        // verify level 88 domain value
        if( is_numeric(prior) && field->level == 88 ) {
*************** const std::list<cbl_field_t> cdf_literal
*** 2256,2261 ****
--- 2239,2245 ----
   */
  void
  symbol_table_init(void) {
+   const static cbl_field_t::codeset_t cp1252(CP1252_e);
    assert(symbols.fd == -1);
    assert(symbols.nelem == 0);
  
*************** symbol_table_init(void) {
*** 2270,2302 ****
  
    // These should match the definitions in libgcobol/constants.cc
    static cbl_field_t constants[] = {
!     { FldAlphanumeric, space_value_e | int(constq) | register_e,
!       {1,1,0,0, " \0\xFF"}, 0, "SPACE" },
!     { FldAlphanumeric, space_value_e | int(constq) | register_e,
!       {1,1,0,0, " \0\xFF"}, 0, "SPACES" },
!     { FldAlphanumeric, low_value_e | int(constq) | register_e,
!       {1,1,0,0, "L\0\xFF"}, 0, "LOW_VALUES" },
!     { FldAlphanumeric, zero_value_e | int(constq) | register_e,
!       {1,1,0,0, "0"}, 0, "ZEROS" },
!     { FldAlphanumeric, high_value_e | int(constq) | register_e,
!       {1,1,0,0, "H\0\xFF"}, 0, "HIGH_VALUES" },
      // IBM standard: QUOTE is a double-quote unless APOST compiler option
!     { FldAlphanumeric, quote_value_e | int(constq) | register_e ,
!       {1,1,0,0, "\"\0\xFF"}, 0, "QUOTES" },
!     { FldPointer, int(constq) | register_e ,
!       {8,8,0,0, zeroes_for_null_pointer}, 0, "NULLS" },
      // IBM defines TALLY
      // 01  TALLY GLOBAL PICTURE 9(5) USAGE BINARY VALUE ZERO.
      { FldNumericBin5, signable_e | register_e,
!       {16, 16, MAX_FIXED_POINT_DIGITS, 0, NULL}, 0, "_TALLY" },
      // 01  ARGI is the current index into the argv array
      { FldNumericBin5, signable_e | register_e,
!       {16, 16, MAX_FIXED_POINT_DIGITS, 0, NULL}, 0, "_ARGI" },
  
      // These last two don't require actual storage; they get BOOL var_decl_node
      // in parser_symbol_add()
!     { FldConditional, constant_e | register_e , {1,1,0,0, ""}, 0, "_VERY_TRUE" },
!     { FldConditional, constant_e | register_e , {1,1,0,0, ""}, 0, "_VERY_FALSE" },
    };
    for( struct cbl_field_t *f = constants;
         f < constants + COUNT_OF(constants); f++ ) {
--- 2254,2286 ----
  
    // These should match the definitions in libgcobol/constants.cc
    static cbl_field_t constants[] = {
!     { FldAlphanumeric, SPACE_VALUE_E | constq | register_e,
!       {1,1,0,0, " \0\xFF"}, 0, "SPACE", cp1252 },
!     { FldAlphanumeric, SPACE_VALUE_E | constq | register_e,
!       {1,1,0,0, " \0\xFF"}, 0, "SPACES", cp1252 },
!     { FldAlphanumeric, LOW_VALUE_E | constq | register_e,
!       {1,1,0,0, "L\0\xFF"}, 0, "LOW_VALUES", cp1252 },
!     { FldAlphanumeric, ZERO_VALUE_E | constq | register_e,
!       {1,1,0,0, "0"}, 0, "ZEROS", cp1252 },
!     { FldAlphanumeric, HIGH_VALUE_E | constq | register_e,
!       {1,1,0,0, "H\0\xFF"}, 0, "HIGH_VALUES", cp1252 },
      // IBM standard: QUOTE is a double-quote unless APOST compiler option
!     { FldAlphanumeric, QUOTE_VALUE_E | constq | register_e ,
!       {1,1,0,0, "\"\0\xFF"}, 0, "QUOTES", cp1252 },
!     { FldPointer, constq | register_e ,
!       {8,8,0,0, zeroes_for_null_pointer}, 0, "NULLS", cp1252 },
      // IBM defines TALLY
      // 01  TALLY GLOBAL PICTURE 9(5) USAGE BINARY VALUE ZERO.
      { FldNumericBin5, signable_e | register_e,
!       {16, 16, MAX_FIXED_POINT_DIGITS, 0, NULL}, 0, "_TALLY", cp1252 },
      // 01  ARGI is the current index into the argv array
      { FldNumericBin5, signable_e | register_e,
!       {16, 16, MAX_FIXED_POINT_DIGITS, 0, NULL}, 0, "_ARGI", cp1252 },
  
      // These last two don't require actual storage; they get BOOL var_decl_node
      // in parser_symbol_add()
!     { FldConditional, constant_e | register_e , {1,1,0,0, ""}, 0, "_VERY_TRUE", cp1252 },
!     { FldConditional, constant_e | register_e , {1,1,0,0, ""}, 0, "_VERY_FALSE", cp1252 },
    };
    for( struct cbl_field_t *f = constants;
         f < constants + COUNT_OF(constants); f++ ) {
*************** symbol_table_init(void) {
*** 2373,2401 ****
  
    static cbl_field_t debug_registers[] = {
      { FldGroup, register_e,
!       {132,132,0,0, NULL}, 1, "DEBUG-ITEM" },
      { FldAlphanumeric, register_e,
!       {6,6,0,0, "      "}, 2, "DEBUG-LINE" },
      { FldAlphanumeric, register_e|filler_e,
!       {1,1,0,0, " "},      2, "FILLER" },
      { FldAlphanumeric, register_e,
!       {30,30,0,0, NULL},   2, "DEBUG-NAME" },
      { FldAlphanumeric, register_e|filler_e,
!       {1,1,0,0, " "},      2, "FILLER" },
      { FldNumericDisplay, signable_e | register_e | leading_e | separate_e,
!       {5,5,4,0, NULL},     2, "DEBUG-SUB-1" },
      { FldAlphanumeric, register_e|filler_e,
!       {1,1,0,0, " "},      2, "FILLER" },
      { FldNumericDisplay, signable_e | register_e | leading_e | separate_e,
!       {5,5,4,0, NULL},     2, "DEBUG-SUB-2" },
      { FldAlphanumeric, register_e|filler_e,
!       {1,1,0,0, " "},      2, "FILLER" },
      { FldNumericDisplay, signable_e | register_e | leading_e | separate_e,
!       {5,5,4,0, NULL},     2, "DEBUG-SUB-3" },
      { FldAlphanumeric, register_e | filler_e,
!       {1,1,0,0, " "},      2, "FILLER" },
      { FldAlphanumeric, signable_e | register_e,
!       {76,76,0,0, NULL},   2, "DEBUG-CONTENTS" },
    };
  
    // debug registers
--- 2357,2385 ----
  
    static cbl_field_t debug_registers[] = {
      { FldGroup, register_e,
!       {132,132,0,0, NULL}, 1, "DEBUG-ITEM", cp1252 },
      { FldAlphanumeric, register_e,
!       {6,6,0,0, "      "}, 2, "DEBUG-LINE", cp1252 },
      { FldAlphanumeric, register_e|filler_e,
!       {1,1,0,0, " "},      2, "FILLER", cp1252 },
      { FldAlphanumeric, register_e,
!       {30,30,0,0, NULL},   2, "DEBUG-NAME", cp1252 },
      { FldAlphanumeric, register_e|filler_e,
!       {1,1,0,0, " "},      2, "FILLER", cp1252 },
      { FldNumericDisplay, signable_e | register_e | leading_e | separate_e,
!       {5,5,4,0, NULL},     2, "DEBUG-SUB-1", cp1252 },
      { FldAlphanumeric, register_e|filler_e,
!       {1,1,0,0, " "},      2, "FILLER", cp1252 },
      { FldNumericDisplay, signable_e | register_e | leading_e | separate_e,
!       {5,5,4,0, NULL},     2, "DEBUG-SUB-2", cp1252 },
      { FldAlphanumeric, register_e|filler_e,
!       {1,1,0,0, " "},      2, "FILLER", cp1252 },
      { FldNumericDisplay, signable_e | register_e | leading_e | separate_e,
!       {5,5,4,0, NULL},     2, "DEBUG-SUB-3", cp1252 },
      { FldAlphanumeric, register_e | filler_e,
!       {1,1,0,0, " "},      2, "FILLER", cp1252 },
      { FldAlphanumeric, signable_e | register_e,
!       {76,76,0,0, NULL},   2, "DEBUG-CONTENTS", cp1252 },
    };
  
    // debug registers
*************** symbol_table_init(void) {
*** 2405,2411 ****
      std::accumulate(debug_registers,
                      debug_registers + COUNT_OF(debug_registers), group_size_t());
    debug_registers[0].data.memsize =
!   debug_registers[0].data.capacity = group_size.capacity();
  
    auto debug_start = p = table.elems + table.nelem;
    p = std::transform(debug_registers,
--- 2389,2395 ----
      std::accumulate(debug_registers,
                      debug_registers + COUNT_OF(debug_registers), group_size_t());
    debug_registers[0].data.memsize =
!   debug_registers[0].data.capacity( group_size.capacity() );
  
    auto debug_start = p = table.elems + table.nelem;
    p = std::transform(debug_registers,
*************** symbol_table_init(void) {
*** 2416,2429 ****
  
    // special registers
    static cbl_field_t special_registers[] = {
!     { FldNumericDisplay, register_e, {2,2,2,0, NULL}, 0, "_FILE_STATUS" },
!     { FldNumericBin5,    register_e, {2,2,4,0, NULL}, 0, "UPSI-0" },
!     { FldNumericBin5,    signable_e|register_e, {2,2,4,0, NULL}, 0, "RETURN-CODE" },
!     { FldNumericBin5,    register_e, {2,2,4,0, NULL}, 0, "LINAGE-COUNTER" },
!     { FldLiteralA,        register_e, {0,0,0,0, "/dev/stdin"}, 0, "_dev_stdin" },
!     { FldLiteralA, int(constq)|register_e, {0,0,0,0, "/dev/stdout"}, 0, "_dev_stdout" },
!     { FldLiteralA, int(constq)|register_e, {0,0,0,0, "/dev/stderr"}, 0, "_dev_stderr" },
!     { FldLiteralA, int(constq)|register_e, {0,0,0,0, "/dev/null"},   0, "_dev_null" },
    };
  
    assert(table.nelem + COUNT_OF(special_registers) < table.capacity);
--- 2400,2413 ----
  
    // special registers
    static cbl_field_t special_registers[] = {
!     { FldNumericDisplay, register_e, {2,2,2,0, NULL}, 0, "_FILE_STATUS", cp1252 },
!     { FldNumericBin5,    register_e, {2,2,4,0, NULL}, 0, "UPSI-0", cp1252 },
!     { FldNumericBin5,    signable_e|register_e, {2,2,4,0, NULL}, 0, "RETURN-CODE", cp1252 },
!     { FldNumericBin5,    register_e, {2,2,4,0, NULL}, 0, "LINAGE-COUNTER", cp1252 },
!     { FldLiteralA,        register_e, {0,0,0,0, "/dev/stdin"}, 0, "_dev_stdin", cp1252 },
!     { FldLiteralA, constq|register_e, {0,0,0,0, "/dev/stdout"}, 0, "_dev_stdout", cp1252 },
!     { FldLiteralA, constq|register_e, {0,0,0,0, "/dev/stderr"}, 0, "_dev_stderr", cp1252 },
!     { FldLiteralA, constq|register_e, {0,0,0,0, "/dev/null"},   0, "_dev_null", cp1252 },
    };
  
    assert(table.nelem + COUNT_OF(special_registers) < table.capacity);
*************** symbol_table_init(void) {
*** 2435,2451 ****
    table.nelem = p - table.elems;
    assert(table.nelem < table.capacity);
  
    // xml registers
    static cbl_field_t xml_registers[] = {
!     { FldNumericBin5,  register_e, {4,4,9,0, "0"}, 1, "XML-CODE" },
!     { FldAlphanumeric, register_e, {30,30,0,0, " "}, 1, "XML-EVENT" },
!     { FldNumericBin5,  register_e, {4,4,9,0, "0"}, 1, "XML-INFORMATION" },
!     { FldAlphanumeric, register_e | based_e | any_length_e, {1,1,0,0, nullptr}, 1, "XML-NAMESPACE" },
!     { FldAlphanumeric, register_e | based_e | any_length_e, {1,1,0,0, nullptr}, 1, "XML-NNAMESPACE" },
!     { FldAlphanumeric, register_e | based_e | any_length_e, {1,1,0,0, nullptr}, 1, "XML-NAMESPACE-PREFIX" },
!     { FldAlphanumeric, register_e | based_e | any_length_e, {1,1,0,0, nullptr}, 1, "XML-NNAMESPACE-PREFIX" },
!     { FldAlphanumeric, register_e | based_e | any_length_e, {1,1,0,0, nullptr}, 1, "XML-TEXT" },
!     { FldAlphanumeric, register_e | based_e | any_length_e, {1,1,0,0, nullptr}, 1, "XML-NTEXT" },
    }, * const eoxml = xml_registers + COUNT_OF(xml_registers);
  
    assert(table.nelem + COUNT_OF(xml_registers) < table.capacity);
--- 2419,2436 ----
    table.nelem = p - table.elems;
    assert(table.nelem < table.capacity);
  
+   const static auto reg_based_any = cbl_field_attr_t(register_e | based_e | any_length_e);
    // xml registers
    static cbl_field_t xml_registers[] = {
!     { FldNumericBin5,  register_e, {4,4,9,0, "0"}, 1, "XML-CODE", cp1252 },
!     { FldAlphanumeric, register_e, {30,30,0,0, " "}, 1, "XML-EVENT", cp1252 },
!     { FldNumericBin5,  register_e, {4,4,9,0, "0"}, 1, "XML-INFORMATION", cp1252 },
!     { FldAlphanumeric, reg_based_any, {1,1,0,0, nullptr}, 1, "XML-NAMESPACE", cp1252 },
!     { FldAlphanumeric, reg_based_any, {1,1,0,0, nullptr}, 1, "XML-NNAMESPACE", cp1252 },
!     { FldAlphanumeric, reg_based_any, {1,1,0,0, nullptr}, 1, "XML-NAMESPACE-PREFIX", cp1252 },
!     { FldAlphanumeric, reg_based_any, {1,1,0,0, nullptr}, 1, "XML-NNAMESPACE-PREFIX", cp1252 },
!     { FldAlphanumeric, reg_based_any, {1,1,0,0, nullptr}, 1, "XML-TEXT", cp1252 },
!     { FldAlphanumeric, reg_based_any, {1,1,0,0, nullptr}, 1, "XML-NTEXT", cp1252 },
    }, * const eoxml = xml_registers + COUNT_OF(xml_registers);
  
    assert(table.nelem + COUNT_OF(xml_registers) < table.capacity);
*************** symbol_table_init(void) {
*** 2455,2471 ****
    table.nelem = p - table.elems;
    assert(table.nelem < table.capacity);
  
!   // Add any CDF values already defined as literals.
!   // After symbols are ready, the CDF adds them directly. 
    const std::list<cbl_field_t> cdf_values = cdf_literalize();
    table.nelem += cdf_values.size();
    assert(table.nelem < table.capacity);
!   
    p = std::transform(cdf_values.begin(), cdf_values.end(), p, elementize);
!   
    // Initialize symbol table.
    symbols = table;
  
    for( auto e = symbols.elems; e < symbols.elems + symbols.nelem; e++ ) {
      if( e->type == SymField ) {
        update_symbol_map2(e);
--- 2440,2467 ----
    table.nelem = p - table.elems;
    assert(table.nelem < table.capacity);
  
!   // Add any CDF values defined on the command line. 
!   // After symbols are ready, the CDF adds them directly.
    const std::list<cbl_field_t> cdf_values = cdf_literalize();
+   auto icdf = table.nelem;
    table.nelem += cdf_values.size();
    assert(table.nelem < table.capacity);
!   auto ecdf = table.nelem;
! 
    p = std::transform(cdf_values.begin(), cdf_values.end(), p, elementize);
! 
    // Initialize symbol table.
    symbols = table;
  
+   // Encode CDF literals.  Could not be done previously because encoding checks
+   // against figurative constants in the symbol table.
+   for( auto i=icdf; i < ecdf; i++ ) {
+     auto& f = symbols.elems[i].elem.field;
+     if( f.type == FldLiteralA ) {
+       f.set_initial(cbl_loc_t());
+     }
+   }
+   
    for( auto e = symbols.elems; e < symbols.elems + symbols.nelem; e++ ) {
      if( e->type == SymField ) {
        update_symbol_map2(e);
*************** numeric_group_attrs( const cbl_field_t *
*** 2595,2606 ****
    static const uint64_t inherit = signable_e | leading_e | separate_e | big_endian_e;
    static_assert(sizeof(cbl_field_t::type) < sizeof(inherit), "need bigger type");
    assert(field);
!   if( field->type == FldNumericDisplay || field->type == FldGroup ) {
!     if( field->parent > 0 && symbol_at(field->parent)->type == SymField ) {
!       cbl_field_t *parent = parent_of(field);
!       assert(parent);
!       return inherit & parent->attr;
!     }
    }
    return 0;
  }
--- 2591,2600 ----
    static const uint64_t inherit = signable_e | leading_e | separate_e | big_endian_e;
    static_assert(sizeof(cbl_field_t::type) < sizeof(inherit), "need bigger type");
    assert(field);
!   if( field->parent > 0 && symbol_at(field->parent)->type == SymField ) {
!     cbl_field_t *parent = parent_of(field);
!     assert(parent);
!     return inherit & parent->attr;
    }
    return 0;
  }
*************** symbol_field_add( size_t program, struct
*** 2678,2684 ****
        field->codeset = parent->codeset;
      }
      // BINARY-LONG, for example, sets capacity.
!     if( is_numeric(parent->usage) && parent->data.capacity > 0 ) {
        field->type = parent->usage;
        field->data = parent->data;
        field->data = 0;  // cppcheck-suppress redundantAssignment
--- 2672,2678 ----
        field->codeset = parent->codeset;
      }
      // BINARY-LONG, for example, sets capacity.
!     if( is_numeric(parent->usage) && parent->data.capacity() > 0 ) {
        field->type = parent->usage;
        field->data = parent->data;
        field->data = 0;  // cppcheck-suppress redundantAssignment
*************** struct symbol_elem_t *
*** 2923,2929 ****
  symbol_field_alias( struct symbol_elem_t *e, const char name[] )
  {
    cbl_field_t alias = *cbl_field_of(e);
!   cbl_field_data_t data = { alias.data.memsize, alias.data.capacity };
    alias.data = data;
    alias.data.memsize = 0;
  
--- 2917,2923 ----
  symbol_field_alias( struct symbol_elem_t *e, const char name[] )
  {
    cbl_field_t alias = *cbl_field_of(e);
!   cbl_field_data_t data = { alias.data.memsize, alias.data.capacity() };
    alias.data = data;
    alias.data.memsize = 0;
  
*************** class is_section {
*** 3139,3145 ****
  
  
  static bool fd_record_size_cmp( const symbol_elem_t& a, const symbol_elem_t& b ) {
!   return cbl_field_of(&a)->data.capacity < cbl_field_of(&b)->data.capacity;
  }
  
  /*
--- 3133,3139 ----
  
  
  static bool fd_record_size_cmp( const symbol_elem_t& a, const symbol_elem_t& b ) {
!   return cbl_field_of(&a)->data.capacity() < cbl_field_of(&b)->data.capacity();
  }
  
  /*
*************** symbol_file_record_sizes( struct cbl_fil
*** 3195,3202 ****
    // Make a copy, update the sizes, and return it.
    cbl_file_t::varying_t output = file->varying_size;
  
!   output.min = cbl_field_of(&*p.first)->data.capacity;
!   output.max = cbl_field_of(&*p.second)->data.capacity;
  
    assert(output.min > 0 && "min record size is 0");
    assert(output.min <= output.max);
--- 3189,3196 ----
    // Make a copy, update the sizes, and return it.
    cbl_file_t::varying_t output = file->varying_size;
  
!   output.min = cbl_field_of(&*p.first)->data.capacity();
!   output.max = cbl_field_of(&*p.second)->data.capacity();
  
    assert(output.min > 0 && "min record size is 0");
    assert(output.min <= output.max);
*************** cbl_alphabet_t::reencode()  {
*** 3313,3318 ****
--- 3307,3316 ----
                __gg__encoding_iconv_name(current_encoding(display_encoding_e));
    iconv_t cd = iconv_open(tocode, fromcode);
  
+   const charmap_t *charmap_disp =
+               __gg__get_charmap(current_encoding(display_encoding_e));
+   size_t stride = charmap_disp->stride();
+ 
  #if optimal_reencode
    if( fromcode == tocode ) { // semantically
      tgt.resize(0);
*************** cbl_alphabet_t::reencode()  {
*** 3348,3354 ****
      }
      assert(outbytesleft < sizeof(pos));
      n = sizeof(pos) - outbytesleft;
!     if( 1 < n ) {
        error_msg(loc, "%s character '%c' (%x hex) requires %zu bytes as %s",
                  fromcode, ch, ch, n, tocode);
        continue;
--- 3346,3352 ----
      }
      assert(outbytesleft < sizeof(pos));
      n = sizeof(pos) - outbytesleft;
!     if( stride < n ) {
        error_msg(loc, "%s character '%c' (%x hex) requires %zu bytes as %s",
                  fromcode, ch, ch, n, tocode);
        continue;
*************** cbl_alphabet_t::also( const YYLTYPE& loc
*** 3426,3431 ****
--- 3424,3433 ----
  using std::deque;
  static deque<cbl_field_t*> stack;
  
+ /*
+  * Allocate a temporary field. Assign the type and name, if supplied.  Caller
+  * deals with encoding and initial value.
+  */
  static cbl_field_t *
  new_temporary_impl( enum cbl_field_type_t type, const cbl_name_t name = nullptr )
  {
*************** new_literal_add( const char initial[], u
*** 3531,3574 ****
      field = new_temporary_impl(FldLiteralA);
      field->attr |= attr;
  
!     if(len == 0)
!       {
!       // This will cover UTF-32, should that arise.
!       size_t nbytes = 4;
!       char *init = static_cast<char *>(xmalloc(nbytes));
!       memset(init, 0, nbytes);
!       field->data.initial = init;
!       }
!     if(len)
!       {
!       char *init = static_cast<char *>(xmalloc(len+4));
!       memcpy(init, initial, len);
!       memset(init+len, 0, 4);
!       field->data.initial = init;
!       }
!     field->data.capacity = len;
      }
  
    if( ! field->has_attr(hex_encoded_e) ) {
      // If the literal bore a prefix, set the encoding,
!     if( encoding != cbl_field_t::codeset_t::source_encoding->type ) {
        field->codeset.set(encoding);
      }
-     field->internalize();
    }
  
!   static size_t literal_count = 1;
!   sprintf(field->name,
!           "%s%c_" HOST_SIZE_T_PRINT_DEC,
!           "_literal",
!           field->type == FldLiteralA ? 'a' : 'n',
!           (fmt_size_t)literal_count++);
  
    return parser_symbol_add2(field);
  }
  
  static temporaries_t temporaries;
  
  cbl_field_t *
  temporaries_t::literal( uint32_t len, const char value[],
                          cbl_field_attr_t attr, cbl_encoding_t encoding ) {
--- 3533,3580 ----
      field = new_temporary_impl(FldLiteralA);
      field->attr |= attr;
  
!     char *orig = static_cast<char *>(xmalloc(len+4));
!     
!     auto p = initial? std::copy(initial, initial + len, orig) : orig;
!     std::fill(p, p+4, 0);
!     field->data.original(orig);
!     field->data.capacity(len); // in case of Z-string
      }
  
+   assert(field->name[0] != '\0'); // new_temporary_impl sets literal names
+ 
    if( ! field->has_attr(hex_encoded_e) ) {
      // If the literal bore a prefix, set the encoding,
!     if( encoding != cbl_field_t::codeset_t::default_encodings.source->type ) {
        field->codeset.set(encoding);
+     } else {
+       field->codeset.set();
      }
    }
  
!   if( field->type == FldLiteralN ) {
!     field->set_initial(cbl_loc_t());
!   } else {
!     field->set_initial(len);
!   }
  
    return parser_symbol_add2(field);
  }
  
  static temporaries_t temporaries;
  
+ void
+ symbol_temporary_location( const cbl_field_t *field, const cbl_loc_t& loc ) {
+   temporaries.locs[field] = loc;
+ }
+ 
+ cbl_loc_t
+ symbol_temporary_location( const cbl_field_t *field ) {
+   extern YYLTYPE yylloc;
+   auto p = temporaries.locs.find(field);
+   return p == temporaries.locs.end()? cbl_loc_t(yylloc) : p->second;
+ }
+ 
  cbl_field_t *
  temporaries_t::literal( uint32_t len, const char value[],
                          cbl_field_attr_t attr, cbl_encoding_t encoding ) {
*************** temporaries_t::literal( uint32_t len, co
*** 3587,3592 ****
--- 3593,3611 ----
  }
  
  cbl_field_t *
+ new_literal_2( uint32_t len, const char initial[],
+              cbl_field_attr_t attr, cbl_encoding_t encoding ) {
+   encoding = current_encoding('A');
+   const charmap_t *charmap = __gg__get_charmap(encoding);
+   cbl_field_t *retval = temporaries.literal(len*charmap->stride(),
+                                             initial,
+                                             attr,
+                                             encoding);
+   return retval;
+ }
+ 
+ 
+ cbl_field_t *
  new_literal( uint32_t len, const char initial[],
               cbl_field_attr_t attr, cbl_encoding_t encoding ) {
    return temporaries.literal(len, initial, attr, encoding);
*************** symbol_temporaries_free() {
*** 3681,3710 ****
  }
  
  cbl_field_t *
! new_alphanumeric( size_t capacity, const cbl_name_t name = nullptr ) {
    cbl_field_t * field = new_temporary_impl(FldAlphanumeric, name);
!   field->data.capacity = capacity;
    temporaries.add(field);
    return parser_symbol_add2(field);
  }
  
  extern os_locale_t os_locale;
  
- const encodings_t cbl_field_t::codeset_t::source_encodings[2] = {
-   { false, iconv_UTF_8_e, "UTF-8" },
-   { true,  iconv_CP1252_e, "CP1252" },
- };
- const encodings_t * cbl_field_t::codeset_t::source_encoding = {
-   cbl_field_t::codeset_t::source_encodings
- };
  
! const encodings_t cbl_field_t::codeset_t::standard_internal = {
!   true, iconv_CP1252_e, "CP1252"
! };
! #define standard_internal cbl_field_t::codeset_t::standard_internal
  
  cbl_field_t *
! new_temporary( enum cbl_field_type_t type, const char *initial, bool is_signed ) {
    const bool force_unsigned = type == FldNumericBin5 && ! is_signed;
  
    if( ! initial && ! force_unsigned ) {
--- 3700,3781 ----
  }
  
  cbl_field_t *
! new_alphanumeric( size_t capacity, const cbl_name_t name, cbl_encoding_t encoding ) {
    cbl_field_t * field = new_temporary_impl(FldAlphanumeric, name);
!   field->set_capacity( capacity );
!   if( encoding != no_encoding_e ) {
!     field->codeset.set(encoding);
!   }
!   //// Dubner hacking away:  If name is non-null, then assume this is a
!   //// function definition, and force the codeset, which otherwise will have
!   //// defaulted to current_encoding('A'), and the valid() test in codeset.set
!   //// will have prevented it from being changed.
!   if( name && encoding != no_encoding_e ) {
!     field->codeset.set_explicit(encoding);
!   }
    temporaries.add(field);
    return parser_symbol_add2(field);
  }
  
  extern os_locale_t os_locale;
  
  
! uint8_t
! cbl_field_t::codeset_t::stride() const {
!   const charmap_t *charmap = __gg__get_charmap(encoding);
!   return charmap->stride();
! }
! 
! cbl_field_t::codeset_t::default_encodings_t
! cbl_field_t::codeset_t::default_encodings
!   {
!   encodings_t {   true, iconv_CP1252_e, "CP1252" } ,  // encodings_t alpha & national
!     {
!       encodings_t{ false, iconv_UTF_8_e, "UTF-8" } ,
!       encodings_t { true,  iconv_CP1252_e, "CP1252" }    }
!   };
! 
! bool
! cobol_alpha_encoding( const char name[] ) {
!   auto encoding = __gg__encoding_iconv_descr(name);
!   if( encoding ) {
!     cbl_field_t::codeset_t::default_encodings.alpha = *encoding;
!     const charmap_t *charmap = __gg__get_charmap(encoding->type);
!     if( charmap->is_like_ebcdic() ) {
!       cobol_gcobol_feature_set(feature_internal_ebcdic_e);
!     } else {
!       // This handles multiple occurrences of -fexec-charset on a command line
!       cobol_gcobol_feature_set(feature_internal_ebcdic_e, false);
!     }
!     // Let's handle the ordinary situation of just setting alpha, and make
!     // sure national is at least as wide.  (We shouldn't have to set national
!     // first, just so we can set alpha.)
!     auto enc_n = cbl_field_t::codeset_t::default_encodings.national;
!     const charmap_t *charmap_n = __gg__get_charmap(enc_n.type);
!     if( charmap_n->stride() < charmap->stride() ) {
!       // Default national is narrower than *encoding, so boost default national
!       // up:
!       cobol_national_encoding(encoding->name);
!     }
!     return true;
!   }
!   return false;
! }
! 
! bool
! cobol_national_encoding( const char name[] ) {
!   auto encoding = __gg__encoding_iconv_descr(name);
!   if( encoding ) {
!     cbl_field_t::codeset_t::default_encodings.national = *encoding;
!     return true;
!   }
!   return false;
! }
! 
  
  cbl_field_t *
! new_temporary( enum cbl_field_type_t type, const char *initial, cbl_field_attr_t attr ) {
!   const bool is_signed = attr == signable_e;
    const bool force_unsigned = type == FldNumericBin5 && ! is_signed;
  
    if( ! initial && ! force_unsigned ) {
*************** new_temporary( enum cbl_field_type_t typ
*** 3712,3720 ****
      return temporaries.acquire(type, initial);
    }
    if( is_literal(type) ) {
      auto field = temporaries.literal(strlen(initial), initial,
                                       type == FldLiteralA? quoted_e : none_e,
!                                      standard_internal.type);
      return field;
    }
    cbl_field_t *field = new_temporary_impl(type, initial);
--- 3783,3792 ----
      return temporaries.acquire(type, initial);
    }
    if( is_literal(type) ) {
+     const auto& defaults( cbl_field_t::codeset_t::default_encodings );
      auto field = temporaries.literal(strlen(initial), initial,
                                       type == FldLiteralA? quoted_e : none_e,
!                                      defaults.source->type);
      return field;
    }
    cbl_field_t *field = new_temporary_impl(type, initial);
*************** new_temporary_clone( const cbl_field_t *
*** 3773,3781 ****
    return parser_symbol_add2(field);
  }
  
  /*
   *  This set of ASCII-like encodings is incomplete and possibly wrong.  A
!  *  complete definition would better supported with a Boolean in enccodings_t.
   *  If it returns false pessimistically, the only consequence is inefficiency:
   *  the string is processed by iconv(3).
   */
--- 3845,3865 ----
    return parser_symbol_add2(field);
  }
  
+ cbl_field_t *
+ new_literal_float( const cbl_loc_t& loc, const char initial[] ) {
+   auto field = new_temporary_impl(FldFloat);
+   field->attr = constant_e;
+   std::string init(initial);
+   std::replace( init.begin(), init.end(), ',', '.' );
+   field->encode_numeric(init.c_str(), loc);
+   field->data.original(initial);
+ 
+   return parser_symbol_add2(field);
+ }
+ 
  /*
   *  This set of ASCII-like encodings is incomplete and possibly wrong.  A
!  *  complete definition would better supported with a Boolean in encodings_t.
   *  If it returns false pessimistically, the only consequence is inefficiency:
   *  the string is processed by iconv(3).
   */
*************** cbl_field_t::holds_ascii() const {
*** 3799,3805 ****
  bool
  cbl_field_t::is_ascii() const {
    return std::all_of( data.initial,
!                       data.initial + data.capacity,
                        isascii );
  }
  
--- 3883,3889 ----
  bool
  cbl_field_t::is_ascii() const {
    return std::all_of( data.initial,
!                       data.initial + data.capacity(),
                        isascii );
  }
  
*************** cbl_field_t::is_ascii() const {
*** 3822,3995 ****
   * never reverts.
   */
  
! const char *
! cbl_field_t::internalize() {
!   /*  The purpose of this routine is to return a nul-terminated string which
!       is data.initial converted from the source-code characters to the
!       codeset.encoding characters.
!       
!       The contract between this routine and the routines that call it is that
!       for alphanumeric types, data.initial shall have the same number of
!       characters as will be needed to fill data.capacity.
! 
!       Be aware that for PIC X(32) Z"foo", there are the characters "foo",
!       followed by a NUL, and then 28 spaces to fill it out.  It turns out that
!       iconv, given a character count of 32, converts all 32, including the
!       embedded NUL.  So, that case works even through strlen(initial) is
!       smaller than the length of initial, which is the same as capacity.
!   */
  
!   static const char *fromcode = codeset.source_encodings[0].name;
!   static const size_t noconv = size_t(-1);
!   static std::unordered_map<std::string, iconv_t> tocodes;
  
!   if( ! codeset.valid() ) {
!     dbgmsg("%s:%d: not converting %s", __func__, __LINE__, data.initial);
!     return data.initial;
!   }
  
!   const char *tocode = __gg__encoding_iconv_name(codeset.encoding);
  
!   std::string toname(tocode);
!   auto p = tocodes.find(toname);
!   if( p == tocodes.end() ) {
!     tocodes[toname] = iconv_open(tocode, fromcode);
    }
-   iconv_t cd = tocodes[toname];
  
!   if (cd == (iconv_t)-1) {
!     cbl_message(ParIconvE,
!                 "failed %<iconv_open%> tocode = %qs fromcode = %qs",
!                 tocode, fromcode);
!   }
  
!   if( fromcode == tocode || has_attr(hex_encoded_e) ) {
!     return data.initial;
!   }
  
!   if( data.capacity == 0 ) {
!     assert(0 == strlen(data.initial));
!     return data.initial;
!   }
!   if( holds_ascii() && is_ascii() ) {
!     if( type != FldNumericEdited ) {
!       if( ! data.initial_within_capacity() ) {
!         ERROR_FIELD(this, "%s %s VALUE %qs of %zu exceeds size %u",
!                     cbl_field_t::level_str(level), name, data.initial,
!                     strlen(data.initial), data.capacity );
!       }
      }
!     return data.initial;
    }
-   assert(data.capacity > 0);
  
!   // The final 2 bytes of the output are "!\0".  It's a debugging sentinel.
!   size_t n;
!   size_t inbytesleft = data.capacity;
!   size_t outbytesleft = inbytesleft;
!   if( !is_literal(this) && inbytesleft < strlen(data.initial) ) {
!     inbytesleft = strlen(data.initial);
!   }
!   if( type == FldNumericEdited ) {
!     outbytesleft = inbytesleft;
!   }
!   const unsigned int in_len = inbytesleft;
  
!   char *in  = const_cast<char*>(data.initial);
!   char *out = static_cast<char*>( xcalloc(1, outbytesleft + 2) ), *output = out;
  
!   assert(fromcode != tocode);
  
    /*
!    * If we're currently assuming the source code is encoded according to the
!    * locale (the default), and there's an iconv failure, try once more using a
!    * different assumption, that the source code is encoded as CP1252.
!    *
!    * This heuristic means that some UTF-8 literals could be converted until a
!    * CP1252 byte is encountered.  We could be stricter about that.
!    *
!    * Also possible is a failure to avoid iconv with fromcode and tocode denote
!    * the same encoding but with different spellings, e.g. CP1252 and CP1252//.
     */
! 
!   do {
!     if( (n = iconv( cd, &in, &inbytesleft, &out, &outbytesleft)) == noconv ) {
!       if( fromcode == codeset.source_encodings[0].name ) {
!         codeset.source_encoding = &codeset.source_encodings[1];
!         fromcode = codeset.source_encoding->name;
!         tocodes.clear();
!         cd = tocodes[toname] = iconv_open(tocode, fromcode);
!         dbgmsg("%s: trying input encoding %s", __func__, fromcode);
!         if( fromcode == tocode ) return data.initial; // no conversion required.
!         n = noconv - 1; // try again
!       }
      }
!     if( n == 0 ) break;
!   } while( n != noconv );
! 
!   if( n == noconv ) {
!     size_t i = in_len - inbytesleft;
!     yyerror("failed to encode %s %qs as %s (%zu of %u bytes left)",
!            fromcode, data.initial + i, tocode, inbytesleft, in_len);
!     if( false ) return NULL;
!     return data.initial;
    }
! 
!   if( 0 < inbytesleft ) {
!     // data.capacity + inbytesleft is not correct if the remaining portion has
!     // multibyte characters.  But the fact remains that the VALUE is too big.
!     ERROR_FIELD(this, "%s %s VALUE '%s' requires %zu bytes for size %u",
!             cbl_field_t::level_str(level), name, data.initial,
!             data.capacity + inbytesleft, data.capacity );
    }
  
!   // Replace data.initial only if iconv output differs.
!   if( 0 != memcmp(data.initial, output, out - output) ) {
!     assert(out <= output + data.capacity || type == FldNumericEdited);
!     dbgmsg("%s: converted '%.*s' to %s",
!                         __func__, data.capacity, data.initial, tocode);
!     struct localspace_t {
!       char space[4];
!       size_t len, erc;
!       explicit localspace_t( iconv_t cd ) {
!         static char input[1] = { 0x20 };
!         size_t inbytesleft2 = sizeof(input), outbytesleft2 = sizeof(space);
!         char *in2 = input, *out2 = space;
  
!         erc = iconv(cd, &in2, &inbytesleft2, &out2, &outbytesleft2);
!         len = out2 - space;
        }
!       bool valid() const { return 0 < len && erc != size_t(-1); }
!     } spc(cd);
! 
!     if( ! spc.valid() ) {
!       dbgmsg("%s:%d: iconv failed for %s: %s", __func__, __LINE__,
!              tocode, xstrerror(errno));
!       ERROR_FIELD(this, "iconv failed: %s", xstrerror(errno));
!       return data.initial;
      }
-     assert( 0 < spc.len && spc.valid() );
  
!     if( is_literal(this) ) {
!       data.capacity = out - output; // trailing '!' will be overwritten
!     }
!     // Pad with trailing blanks, tacking a '!' on the end.
!     for( const char *eout = output + data.capacity;
!          out < eout;
!          out += spc.len ) {
!       memcpy(out, spc.space, spc.len);
      }
!     // Numeric literal strings may have leading zeros, making their length
!     // longer than their capacity.
!     out[0] = type == FldLiteralN? '\0' : '!';
!     assert(out[1] == '\0');
!     data.orig = data.initial;
!     data.initial = output;
!   } else {
!     free(output);
    }
  
!   return data.initial;
  }
  
  const char *
--- 3906,4170 ----
   * never reverts.
   */
  
! size_t
! cbl_field_t::source_code_check(const void *initial, size_t length)
!   {
!   size_t retval;
  
!   size_t iconv_retval;
  
!   try_again:
  
!   cbl_encoding_t fromcode = codeset.default_encodings.source->type;
!   cbl_encoding_t tocode   = codeset.encoding;
!   std::string toname      = __gg__encoding_iconv_name(tocode);
  
!   __gg__iconverter(fromcode,
!                    tocode,
!                    initial,
!                    length,
!                    &retval,
!                    &iconv_retval);
!   if( iconv_retval )
!     {
!     // something went wrong on conversion.
!     if( codeset.default_encodings.next_source_encoding() )
!       {
!       goto try_again;
!       }
!     // None of our valid "from" encodings worked
!     dbgmsg("%s:%d: iconv failed for %s: %s", __func__, __LINE__,
!            toname.c_str(), xstrerror(errno));
!     ERROR_FIELD(this, "iconv failed: %s", xstrerror(errno));
!     }
!   return retval;
    }
  
! /*
!  * Look up the encoding handle for a given target based on the current source
!  * encoding.
!  */
! static iconv_t
! iconv_cd( cbl_encoding_t tgt ) {
!   struct iconv_key_t {
!     cbl_encoding_t to, from;
!     iconv_key_t() : to(no_encoding_e), from(no_encoding_e) {}
!     iconv_key_t( cbl_encoding_t to, cbl_encoding_t from ) : to(to), from(from) {}
!     bool operator<( const iconv_key_t& that ) const {
!       if( this->from == that.from ) {
!         return this->to < that.to;
!       }
!       return this->from < that.from;
!     }
!   };
!   static std::map<iconv_key_t, iconv_t> cds;
  
!   auto src = cbl_field_t::codeset_t::default_encodings.current_source_encoding()->type;
!   assert(src);
  
!   iconv_key_t key(tgt, src);
!   auto p = cds.find(key);
!   iconv_t cd;
!     
!   if( p == cds.end() ) {
!     const char *fromcode = __gg__encoding_iconv_name(src);
!     const char *tocode   = __gg__encoding_iconv_name(tgt);    
!     gcc_assert(fromcode && tocode);
!     
!     if( (cd = iconv_open(tocode, fromcode)) == iconv_t(-1) ) {
!       return cd;
      }
!     cds[key] = cd;
!   } else {
!     cd = p->second;
    }
  
!   return cd;
! }
  
! /*
!  * Precondition: data.nbyte is the length of the output, and encoding is set.
!  * The caller supplies the input length because the string may include embedded
!  * NULs.  If conversion succeeds, return NULL.  If it fails, return a pointer
!  * to the failed character in data.orig.
!  */
! const char *
! cbl_field_t::encode( size_t srclen, cbl_loc_t loc ) {
!   gcc_assert(data.capacity());
!   gcc_assert(data.initial);
!   gcc_assert(data.original());
!   gcc_assert(codeset.valid());
  
!   if( this->type == FldLiteralN )
!     {
!     // DUBNER made this change; FldLiteralN doesn't get encoded.  This probably
!     // should have been nipped in the bud somewhere upstream.
!     return data.original();
!     }
! 
!   extern YYLTYPE yylloc;
!   const char *bad_boy = data.original();
!   if( 0 == loc.first_line )
!     loc = level == 0 ? yylloc : symbol_field_location(field_index(this));
  
    /*
!    * Hex-encoded means we don't convert.  data.initial should be long enough to
!    * hold the encoded string.
     */
!   if( has_attr(hex_encoded_e) ) {
!     if( data.capacity() < srclen ) {
!       const char *inbuf = data.original() + data.capacity();
!       error_msg( loc, "VALUE %qs is too long to initialize %qs, "
!                       "discarded %ld bytes at %qs",
!                  data.original(), name, long(srclen - data.capacity()), inbuf);
!       srclen = data.capacity();
      }
!     std::copy(data.original(), data.original() + srclen,
!               const_cast<char*>(data.initial));
!     return nullptr; // may return "truncated success" with error.
    }
!   
!   auto figconst = cbl_figconst_of(data.original());
!   if( normal_value_e != figconst ) {
!     blank_initial( char_capacity(), figconst ); 
!     return nullptr;
    }
+   
+   for( auto src = codeset.default_encodings.current_source_encoding();
+        src;
+        src = codeset.default_encodings.next_source_encoding() ) {
+     /*
+      * Get the iconv handle to convert the source-code encoding to the field's
+      * encoding.  If no such handle exists because iconv(3) can't do it
+      * (weird), try the next potential source-code encoding, which probably
+      * won't work either.
+      */
+     iconv_t cd = iconv_cd(codeset.encoding);
+     if( cd == iconv_t(-1) ) {
+       error_msg(loc, "cannot convert from %qs to %qs: %s",
+                 cbl_encoding_str(src->type),
+                 cbl_encoding_str(codeset.encoding),
+                 xstrerror(errno));
+       continue;
+     }
+     
+     /*
+      * If conversion succeeds, return NULL.  
+      * If it fails, try the next potential encoding.
+      */
+     size_t inbytesleft = srclen, outbytesleft = data.capacity();
+     char *inbuf = const_cast<char*>(data.original());
+     char *outbuf = const_cast<char*>(data.initial);
  
!     size_t erc = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
  
!     if( erc == size_t(-1) ) {
!       if( outbytesleft == 0 ) { // input doesn't fit
!         gcc_assert(0 < inbytesleft);
!         gcc_assert(0 < level);
!         if( loc.first_line == 0 )
!           loc = symbol_field_location(field_index(this));
!         if( type == FldNumericEdited ) {
!           // Tolerate trailing zeros for P-values
!           if( data.rdigits < 0 ) {
!             if( inbytesleft <= size_t(data.rdigits * -1) ) {
!              bool all_zeros = std::all_of(reinterpret_cast<const char*>(inbuf), 
!                                           data.original() + srclen,
!                                           [](char ch) {
!                                             return '0' == ch;
!                                           });
!               if( all_zeros ) return nullptr;
!             }
!           }
!         }
!         error_msg( loc, 
!                    "VALUE %qs is too long to initialize %qs, discarded %qs",
!                    data.original(), name, inbuf);
!         return nullptr; // success-ish
        }
!       dbgmsg("'%c' of '%s'[%lu] could not be converted from %s to %s: %s",
!              *inbuf, data.original(), inbuf - data.original(), 
!              cbl_encoding_str(
!                    codeset.default_encodings.current_source_encoding()->type),
!              cbl_encoding_str(codeset.encoding),
!              xstrerror(errno) );
!       bad_boy = inbuf;
!       continue;
      }
  
!     if( inbytesleft == 0 ) {
!       if( data.all() ) {
!         for( size_t len = outbuf - data.initial;
!              outbuf + len <= data.initial + data.capacity();
!              outbuf += len ) {
!           std::copy( data.initial, data.initial + len, outbuf );
!         }
!       }
!       if( is_literal(this) ) {
!         data.capacity( outbuf - const_cast<char*>(data.initial) );
!       }
!       return nullptr; // success
      }
!     // else try again
    }
+   if( 0 == loc.first_line )
+     loc = level == 0 ? yylloc : symbol_field_location(field_index(this));
+   error_msg( loc, "%<%c%> of %qs could not be converted from %s to %s: %s",
+              *bad_boy, data.original(),
+              cbl_encoding_str(
+                     codeset.default_encodings.current_source_encoding()->type),
+              cbl_encoding_str(codeset.encoding),
+              xstrerror(errno) );
+   return data.original();
+ }
  
! void
! cbl_field_t::set_capacity(size_t nchar) {
!   switch(this->type) {
!     case FldGroup:
!     case FldAlphanumeric:
!     case FldNumericDisplay:
!     case FldNumericEdited:
!     case FldAlphaEdited:
!     case FldLiteralA:
!     case FldInvalid:
!       if( codeset.valid() ) {
!         if( attr & hex_encoded_e ) {
!           data.capacity( capacity_cast(nchar) );
!         } else {
!           data.capacity( capacity_cast(nchar) * codeset.stride() );
!         }
!           
!       } else {
!         cbl_internal_error("%s: %s %s has invalid encoding",
!                            __func__, cbl_field_type_str(type), name);
!       }
!       break;
!     case FldNumericBinary:
!     case FldFloat:
!     case FldPacked:
!     case FldNumericBin5:
!     case FldLiteralN:
!     case FldClass:
!     case FldConditional:
!     case FldForward:
!     case FldIndex:
!     case FldSwitch:
!     case FldDisplay:
!     case FldPointer:
!       data.capacity( capacity_cast(nchar) );
!       break;
!   }
! }
! 
! void
! cbl_field_t::add_capacity(size_t nchar) {
!   data.add_capacity( nchar * codeset.stride() );
! }
! 
! uint32_t
! cbl_field_t::char_capacity() const {
!   return data.capacity() / codeset.stride();
  }
  
  const char *
*************** symbol_label_section_exists( size_t eval
*** 4153,4166 ****
    /*  cppcheck warns that the following statement depends on the order of
        evaluation of side effects.  Since this isn't my code, and since I don't
        think the warning can be eliminated without rewriting it, I am just
!       supprressing it.
        -- Bob Dubner, 2025-07-14 */
    // cppcheck-suppress unknownEvaluationOrder
    bool has_section = std::any_of( ++eval, symbols_end(),
                                 [program = eval->program]( const auto& sym ) {
                                   if( program == sym.program && sym.type == SymLabel ) {
                                     const auto& L(sym.elem.label);
! 				   // true if the symbol is an explicit label.
                                     return L.type == LblSection &&  L.name[0] != '_';
                                   }
                                   return false;
--- 4328,4341 ----
    /*  cppcheck warns that the following statement depends on the order of
        evaluation of side effects.  Since this isn't my code, and since I don't
        think the warning can be eliminated without rewriting it, I am just
!       suppressing it.
        -- Bob Dubner, 2025-07-14 */
    // cppcheck-suppress unknownEvaluationOrder
    bool has_section = std::any_of( ++eval, symbols_end(),
                                 [program = eval->program]( const auto& sym ) {
                                   if( program == sym.program && sym.type == SymLabel ) {
                                     const auto& L(sym.elem.label);
!                                    // true if the symbol is an explicit label.
                                     return L.type == LblSection &&  L.name[0] != '_';
                                   }
                                   return false;
*************** key_field_size( uint32_t sum, size_t ifi
*** 4869,4875 ****
  uint32_t cbl_file_key_t::
  size() {
    if( leftmost != 0 ) {
!     return cbl_field_of(symbol_at(leftmost))->data.capacity;
    }
    return std::accumulate(fields, fields + nfield, 0, key_field_size);
  }
--- 5044,5050 ----
  uint32_t cbl_file_key_t::
  size() {
    if( leftmost != 0 ) {
!     return cbl_field_of(symbol_at(leftmost))->data.capacity();
    }
    return std::accumulate(fields, fields + nfield, 0, key_field_size);
  }
*************** has_value( cbl_field_type_t type ) {
*** 5152,5154 ****
--- 5327,5466 ----
    dbgmsg( "%s:%d: invalid symbol_type_t %d", __func__, __LINE__, type );
    return false;
  }
+ 
+ bool
+ validate_numeric_edited(cbl_field_t *field)
+   {
+   // returns TRUE when data.initial is compatible with PICTURE
+   bool retval = true;
+   if( field->type == FldNumericEdited
+       && field->data.original()
+       && !(field->attr & quoted_e)
+       && !(field->attr & FIGCONST_MASK) )
+     {
+     char *expanded = expand_picture(field->data.picture);
+ 
+     unsigned int decimal_point_local = __gg__decimal_point;
+     const char *pleft   = expanded;
+     const char *pright  = pleft + strlen(pleft);
+     const char *pmiddle = strchr(pleft, decimal_point_local);
+     if( !pmiddle )
+       {
+       pmiddle = pright;
+       }
+ 
+     // Count up digit placeholders to the left of the the decimal point:
+     int currencies_local = 0;
+     int signs      = 0;
+     int pldigits   = 0;
+     while( pleft < pmiddle )
+       {
+       unsigned int ch = (unsigned char)*pleft++;
+       if( symbol_currency(ch) )
+         {
+         // The very first currency symbol is not a digit placeholder:
+         pldigits += currencies_local;
+         currencies_local = 1;
+         }
+       else if(   ch == (unsigned char)ascii_plus
+               || ch == (unsigned char)ascii_minus )
+         {
+         // The very first sign is not a digit placeholder
+         pldigits += signs;
+         signs = 1;
+         }
+       else if(   ch == (unsigned char)ascii_Z
+               || ch == (unsigned char)ascii_z
+               || ch == (unsigned char)ascii_P
+               || ch == (unsigned char)ascii_p
+               || ch == (unsigned char)ascii_9
+               || ch == (unsigned char)ascii_asterisk )
+         {
+         // 9 Z and * are digit placeholders:
+         pldigits += 1;
+         }
+       }
+ 
+     // Count up digit placeholders to the left of the the decimal point:
+     int prdigits   = 0;
+     while( pmiddle < pright )
+       {
+       unsigned int ch = (unsigned char)*pmiddle++;
+       if(   ch == (unsigned char)ascii_Z
+          || ch == (unsigned char)ascii_z
+          || ch == (unsigned char)ascii_P
+          || ch == (unsigned char)ascii_p
+          || ch == (unsigned char)ascii_9
+          || ch == (unsigned char)ascii_asterisk )
+         {
+         // 9 Z and * are digit placeholders:
+         prdigits += 1;
+         }
+       }
+ 
+     // We have established the number of left and right digit placeholders.
+     // We now need to do the same for the number that has to go into those
+     // placeholders.
+ 
+     const char *dleft   = field->data.original();
+     const char *dright  = dleft + strlen(dleft);
+     const char *dmiddle = strchr(dleft, decimal_point);
+     if( !dmiddle )
+       {
+       dmiddle = dright;
+       }
+ 
+     // Skip over leading zeros
+     int dldigits = 0;
+     int nonzero  = 0;
+     while(dleft < dmiddle)
+       {
+       unsigned int ch = (unsigned char)*dleft++;
+       if( ch == (unsigned char)ascii_0 )
+         {
+         // We are looking at a zero.  Ignore leading zeroes if we haven't
+         // already seen a digit
+         dldigits += nonzero;
+         }
+       else if(ch >= (unsigned char)ascii_1 && ch <= (unsigned char)ascii_9 )
+         {
+         nonzero = 1;
+         dldigits += nonzero;
+         }
+       }
+ 
+     // Now count up the digits to the right of the decimal point:
+     int drdigits = 0;
+     // Adjust dright to skip trailing spaces
+     while( dright > dmiddle )
+       {
+       if( (unsigned char)*(dright-1) != (unsigned char)ascii_space )
+         break;
+       dright -= 1;
+       }
+     // Adjust dright to skip trailing zeroes
+     while( dright > dmiddle )
+       {
+       if( (unsigned char)*(dright-1) != (unsigned char)ascii_0 )
+         break;
+       dright -= 1;
+       }
+     // And count up the remaining characters:
+     while( dmiddle < dright )
+       {
+       unsigned int ch = (unsigned char)*dmiddle++;
+       if(ch >= (unsigned char)ascii_0 && ch <= (unsigned char)ascii_9 )
+         {
+         drdigits += 1;
+         }
+       }
+ 
+     // After all that, the acceptance test is disturbingly simple:
+     if( dldigits > pldigits || drdigits > prdigits )
+       {
+       retval = false;
+       }
+     free(expanded);
+     }
+   return retval;
+   }
diff -Nrcpad gcc-16-20260111/gcc/cobol/symbols.h gcc-16-20260118/gcc/cobol/symbols.h
*** gcc-16-20260111/gcc/cobol/symbols.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/symbols.h	Sun Jan 18 22:32:06 2026
*************** static inline bool gcobol_feature_embigg
*** 121,126 ****
--- 121,129 ----
      (cbl_gcobol_features & feature_embiggen_e);
  }
  
+ bool cobol_alpha_encoding( const char name[] );
+ bool cobol_national_encoding( const char name[] );
+ 
  enum cbl_division_t {
    identification_div_e,
    environment_div_e,
*************** int cbl_figconst_tok( const char *value
*** 175,182 ****
  enum cbl_figconst_t cbl_figconst_of( const char *value );
  const char * cbl_figconst_str( cbl_figconst_t fig );
  
- const char * consistent_encoding_check( const YYLTYPE& loc, const char input[] );
- 
  class cbl_domain_elem_t {
    uint32_t length;
    const char *value;
--- 178,183 ----
*************** class cbl_domain_elem_t {
*** 186,201 ****
    cbl_domain_elem_t()
      : length(0), value(NULL), is_numeric(false), all(false)
    {}
!   cbl_domain_elem_t( const YYLTYPE& loc,
!                      bool all,
                       uint32_t length,
                       const char *value,
                       bool is_numeric = false )
      : length(length), value(value), is_numeric(is_numeric), all(all)
    {
      if( value && ! is_numeric ) {
!       auto s = consistent_encoding_check(loc, value);
!       if( s ) this->value = s;
      }
    }
    const char *name() const { return value; }
--- 187,200 ----
    cbl_domain_elem_t()
      : length(0), value(NULL), is_numeric(false), all(false)
    {}
!   cbl_domain_elem_t( bool all,
                       uint32_t length,
                       const char *value,
                       bool is_numeric = false )
      : length(length), value(value), is_numeric(is_numeric), all(all)
    {
      if( value && ! is_numeric ) {
!       this->value = value;
      }
    }
    const char *name() const { return value; }
*************** struct cbl_domain_t {
*** 206,217 ****
    cbl_domain_elem_t first, last;
    cbl_domain_t() : first(), last(first)
    {}
!   cbl_domain_t( const YYLTYPE& loc,
!                 bool all,
                  uint32_t length,
                  const char * value,
                  bool is_numeric = false )
!     : first(loc, all, length, value, is_numeric), last(first)
    {}
    cbl_domain_t( const cbl_domain_elem_t& a, const cbl_domain_elem_t& z )
      : first(a)
--- 205,215 ----
    cbl_domain_elem_t first, last;
    cbl_domain_t() : first(), last(first)
    {}
!   cbl_domain_t( bool all,
                  uint32_t length,
                  const char * value,
                  bool is_numeric = false )
!     : first(all, length, value, is_numeric), last(first)
    {}
    cbl_domain_t( const cbl_domain_elem_t& a, const cbl_domain_elem_t& z )
      : first(a)
*************** enum symbol_type_t {
*** 256,279 ****
  // the same.
  #define MAXIMUM_ALPHA_LENGTH 8192
  
! struct cbl_field_data_t {
    uint32_t memsize;             // nonzero if larger subsequent redefining field
!   uint32_t capacity,            // allocated space
!            digits;              // magnitude: total digits (or characters)
    int32_t  rdigits;             // digits to the right
!   const char *orig, *initial, *picture;
! 
!   enum etc_type_t { val88_e, upsi_e, value_e } etc_type;
    const char *
    etc_type_str() const {
      switch(etc_type) {
      case val88_e: return "val88_e";
      case upsi_e: return "upsi_e";
!     case value_e: return "value_e";
      }
      return "???";
    }
!   
    union etc_t {
      // "Domain" is an array representing the VALUE of CLASS or 88 type.
      struct val88_t {
--- 254,291 ----
  // the same.
  #define MAXIMUM_ALPHA_LENGTH 8192
  
! class cbl_field_data_t {
!   uint32_t nbyte;            // allocated space
!   struct orig_t {
!     bool all;
!     const char *data;
!     REAL_VALUE_TYPE value;
!     orig_t() : all(false), data(nullptr), value{} {}
!     explicit orig_t( const char *data, bool all = false )
!       : all(all), data(data), value{}
!     {}
!     explicit orig_t( REAL_VALUE_TYPE value )
!       : all(false), data(nullptr), value(value)
!     {}
!   } orig;
! public:
    uint32_t memsize;             // nonzero if larger subsequent redefining field
!   uint32_t digits;              // magnitude: total digits (or characters)
    int32_t  rdigits;             // digits to the right
!   const char *initial, *picture;
!   enum etc_type_t { no_value_e, val88_e, upsi_e, value_e } etc_type;
    const char *
    etc_type_str() const {
      switch(etc_type) {
      case val88_e: return "val88_e";
      case upsi_e: return "upsi_e";
!     case no_value_e: return "no value";
!     case  value_e: return  "value_e";
      }
      return "???";
    }
!   bool etc_ok() const { return etc_type != no_value_e; }
! 
    union etc_t {
      // "Domain" is an array representing the VALUE of CLASS or 88 type.
      struct val88_t {
*************** struct cbl_field_data_t {
*** 288,331 ****
    } etc;
  
    cbl_field_data_t()
!     : memsize(0)
!     , capacity(0)
      , digits(0)
      , rdigits(0)
-     , orig(0)
      , initial(0)
      , picture(0)
!     , etc_type(value_e)
      , etc()
    {}
  
!   cbl_field_data_t( uint32_t memsize,  uint32_t capacity )
!     : memsize(memsize)
!     , capacity(capacity)
      , digits(0)
      , rdigits(0)
-     , orig(0)
      , initial(0)
      , picture(0)
!     , etc_type(value_e)
      , etc()
    {}
  
!   cbl_field_data_t( uint32_t memsize,  uint32_t capacity,
                      uint32_t digits,  uint32_t rdigits,
                      const char *initial,
                      const char *picture = NULL ) 
!     : memsize(memsize)
!     , capacity(capacity)
      , digits(digits)
      , rdigits(rdigits)
!     , orig(0)
!     , initial(initial)
      , picture(picture)
!     , etc_type(value_e)
      , etc()
    {}
  
    cbl_field_data_t( const cbl_field_data_t& that ) {
      copy_self(that);
    }
--- 300,346 ----
    } etc;
  
    cbl_field_data_t()
!     : nbyte(0)
!     , memsize(0)
      , digits(0)
      , rdigits(0)
      , initial(0)
      , picture(0)
!     , etc_type(no_value_e)
      , etc()
    {}
  
!   cbl_field_data_t( uint32_t memsize,  uint32_t nbyte )
!     : nbyte(nbyte)
!     , memsize(memsize)
      , digits(0)
      , rdigits(0)
      , initial(0)
      , picture(0)
!     , etc_type(no_value_e)
      , etc()
    {}
  
!   cbl_field_data_t( uint32_t memsize,  uint32_t nbyte,
                      uint32_t digits,  uint32_t rdigits,
                      const char *initial,
                      const char *picture = NULL ) 
!     : nbyte(nbyte)
!     , orig(initial)
!     , memsize(memsize)
      , digits(digits)
      , rdigits(rdigits)
!     , initial(initial) // initial == data.orig.data
      , picture(picture)
!     , etc_type(no_value_e)
      , etc()
    {}
  
+   inline uint32_t capacity( uint32_t size ) { return nbyte = size; }
+   inline uint32_t capacity() const          { return nbyte; }
+   
+   inline uint32_t add_capacity( uint32_t size ) { return nbyte += size; }
+ 
    cbl_field_data_t( const cbl_field_data_t& that ) {
      copy_self(that);
    }
*************** struct cbl_field_data_t {
*** 369,376 ****
      return etc.value = build_int_cst_type(integer_type_node, i);
    } 
  
    void set_real_from_capacity( REAL_VALUE_TYPE *r ) const {
!     real_from_integer (r, VOIDmode, capacity, SIGNED);
    }
  
    time_now_f time_func;
--- 384,433 ----
      return etc.value = build_int_cst_type(integer_type_node, i);
    } 
  
+   tree_code value_type() const {
+     gcc_assert(etc_type == value_e);
+     tree_node *node = TREE_TYPE(etc.value);
+     tree_code  code = TREE_CODE(node);
+     return code;
+   }
+   bool value_is_float() const {
+     gcc_assert(etc_type == value_e);
+     tree_node *node = TREE_TYPE(etc.value);
+     return SCALAR_FLOAT_TYPE_P(node);
+   }
+   bool value_is_fixed() const {
+     gcc_assert(etc_type == value_e);
+     tree_node *node = TREE_TYPE(etc.value);
+     return FIXED_POINT_TYPE_P(node);
+   }
+   bool value_is_integer() const {
+     gcc_assert(etc_type == value_e);
+     tree_node *node = TREE_TYPE(etc.value);
+     return INTEGRAL_TYPE_P(node);
+   }
+ 
+   // verify is numeric and zero fraction 
+   std::pair<int64_t, bool> int64_of() const {
+     if( etc_type == value_e ) {
+       auto r = TREE_REAL_CST_PTR( value_of() );
+       auto n = real_to_integer(r);
+       REAL_VALUE_TYPE r2;
+       real_from_integer (&r2, VOIDmode, n, SIGNED);
+       // If the orginal value r is equal to r2, derived from its integer
+       // part n, then the fractional component is zero.
+       if( real_identical (r, &r2) ) {
+         return std::make_pair( int64_t(n), true );
+       }
+     }
+     return std::make_pair(int64_t(0), false);
+   }
+ 
+   bool has_initial_value() const {
+     return orig.data || etc_type != no_value_e;
+   }
+ 
    void set_real_from_capacity( REAL_VALUE_TYPE *r ) const {
!     real_from_integer (r, VOIDmode, nbyte, SIGNED);
    }
  
    time_now_f time_func;
*************** struct cbl_field_data_t {
*** 386,393 ****
    int32_t ldigits() const { return std::max(int(digits), int(digits - rdigits)); }
  
    cbl_field_data_t& valify() {
!     assert(initial);
!     std::string input(initial);
      if( decimal_is_comma() ) {
        std::replace(input.begin(), input.end(), ',', '.');
      }
--- 443,450 ----
    int32_t ldigits() const { return std::max(int(digits), int(digits - rdigits)); }
  
    cbl_field_data_t& valify() {
!     assert(orig.data);
!     std::string input(orig.data);
      if( decimal_is_comma() ) {
        std::replace(input.begin(), input.end(), ',', '.');
      }
*************** struct cbl_field_data_t {
*** 409,456 ****
    }
    cbl_field_data_t& valify( const char *input ) {
      assert(input);
!     initial = input;
!     capacity = strlen(initial);
      return valify();
    }
  
!   // If initial (of Numeric Edited) has any length but capacity, adjust it.  
!   bool manhandle_initial() {
!     assert(capacity > 0);
!     assert(initial != nullptr);
!     if( capacity < strlen(initial) ) {
!       char *p = const_cast<char*>(initial);
!       p[capacity] = '\0';
!       return true;
!     }
!     if( strlen(initial) < capacity ) {
!       auto tgt = reinterpret_cast<char *>( xmalloc(capacity + 1) );
!       auto pend = tgt + capacity;
!       auto p = std::copy(initial, initial + strlen(initial), tgt);
!       std::fill(p, pend, 0x20);
!       p = pend - 1;
!       *p = '\0';
!       initial = tgt;
!     }
!     return false;
    }
!   bool initial_within_capacity() const {
!     return initial[capacity] == '\0'
!       ||   initial[capacity] == '!';
    }
-   const char *original() const { return orig? orig : initial; }
- 
   protected:
    cbl_field_data_t& copy_self( const cbl_field_data_t& that ) {
      memsize = that.memsize;
!     capacity = that.capacity;
      digits = that.digits;
      rdigits = that.rdigits;
      initial = that.initial;
      picture = that.picture;
      etc_type = that.etc_type;
  
      switch(etc_type) {
        case value_e:
          etc.value = that.etc.value;
          break;
--- 466,505 ----
    }
    cbl_field_data_t& valify( const char *input ) {
      assert(input);
!     original(input);
      return valify();
    }
  
!   bool all() const { return orig.data? orig.all : false; }
!   bool is_alpha_edited() const;
!   const char *original() const { return orig.data? orig.data : nullptr; }
!   const REAL_VALUE_TYPE& original_numeric() const { return orig.value; }
! 
!   // Set the original string, and set the capacity to its length if nothing
!   // else already did.  This function is used only for VALUE numeric literal,
!   // to preserve the VALUE clause until the field is fully defined.
!   const char *original( const char *orig, bool all = false) {
!     if( nbyte == 0 ) nbyte = strlen(orig);
!     this->orig = orig_t( orig, all );
!     return this->orig.data;
    }
!   // Set the computed cce value.  Do not impute capacity. 
!   void original( REAL_VALUE_TYPE value ) {
!     orig = orig_t(value);
    }
   protected:
    cbl_field_data_t& copy_self( const cbl_field_data_t& that ) {
      memsize = that.memsize;
!     nbyte = that.nbyte;
      digits = that.digits;
      rdigits = that.rdigits;
+     orig = that.orig;
      initial = that.initial;
      picture = that.picture;
      etc_type = that.etc_type;
  
      switch(etc_type) {
+       case no_value_e:
        case value_e:
          etc.value = that.etc.value;
          break;
*************** struct cbl_subtable_t {
*** 552,557 ****
--- 601,610 ----
    size_t offset, isym;
  };
  
+ const encodings_t *
+              __gg__encoding_iconv_descr( cbl_encoding_t encoding );
+ const encodings_t *
+              __gg__encoding_iconv_descr( const char name[] );
  const char * __gg__encoding_iconv_name( cbl_encoding_t encoding );
  bool         __gg__encoding_iconv_valid( cbl_encoding_t encoding );
  
*************** struct cbl_field_t {
*** 584,590 ****
    uint32_t level;
    cbl_occurs_t occurs;
    struct codeset_t {
!     static const encodings_t standard_internal, source_encodings[2], *source_encoding;
      cbl_encoding_t encoding;
      size_t alphabet;  // unlikely
      explicit codeset_t(cbl_encoding_t encoding = custom_encoding_e,
--- 637,673 ----
    uint32_t level;
    cbl_occurs_t occurs;
    struct codeset_t {
!     struct default_encodings_t {
!       friend bool cobol_alpha_encoding( const char name[] );
!       friend bool cobol_national_encoding( const char name[] );
!       encodings_t alpha, national;
!       const encodings_t possible_sources[2] = {}, *source = 0;
!       
!       default_encodings_t( const encodings_t& alpha,
!                            const std::vector<encodings_t>& possible_sources )
!         : alpha(alpha)
!         , national(alpha)
!       {
!         std::copy(possible_sources.begin(),
!                   possible_sources.end(),
!                   const_cast<encodings_t*>(this->possible_sources));
!         source = this->possible_sources;
!       }
!       const encodings_t *next_source_encoding() {
!         if( ++source < possible_sources + COUNT_OF(possible_sources) ) {
!           return source;
!         }
!         return nullptr;
!       }
!       const encodings_t *current_source_encoding() const {
!         return
!           source < possible_sources + COUNT_OF(possible_sources) ?
!           source : nullptr;
!       }
! 
!     };
!     static default_encodings_t default_encodings;
! 
      cbl_encoding_t encoding;
      size_t alphabet;  // unlikely
      explicit codeset_t(cbl_encoding_t encoding = custom_encoding_e,
*************** struct cbl_field_t {
*** 592,601 ****
        : encoding(encoding), alphabet(alphabet)
      {}
      bool valid() const {
!       return
!         (alphabet == 0 && encoding != custom_encoding_e)
!         ||
!         (alphabet != 0 && encoding == custom_encoding_e);
      }
      bool consistent() const {
        return valid() && ( encoding == current_encoding('A')
--- 675,689 ----
        : encoding(encoding), alphabet(alphabet)
      {}
      bool valid() const {
!       switch(encoding) {
!       case no_encoding_e:
!         return false;
!       case custom_encoding_e:
!         return alphabet != 0;
!       default:
!         break;
!       }
!       return alphabet == 0;
      }
      bool consistent() const {
        return valid() && ( encoding == current_encoding('A')
*************** struct cbl_field_t {
*** 604,615 ****
                            ||
                            encoding == UTF8_e );
      }
      bool set( cbl_encoding_t encoding, size_t alphabet = 0 ) {
        assert(valid_encoding(encoding));
        if( ! valid() ) { // setting first time
!         this->encoding = encoding;
!         this->alphabet = alphabet;
!         return valid();
        }
        return this->encoding == encoding && this->alphabet == alphabet;
      }
--- 692,711 ----
                            ||
                            encoding == UTF8_e );
      }
+     // set_explicit overrides an encoding inferred via e.g. PIC 999.
+     bool set_explicit( cbl_encoding_t encoding ) {
+       assert(valid_encoding(encoding));
+       this->encoding = encoding;
+       this->alphabet = 0;
+       return valid();
+     }
+     bool set_per_source() {
+       return set_explicit( default_encodings.source->type );
+     }
      bool set( cbl_encoding_t encoding, size_t alphabet = 0 ) {
        assert(valid_encoding(encoding));
        if( ! valid() ) { // setting first time
!         return set_explicit(encoding);
        }
        return this->encoding == encoding && this->alphabet == alphabet;
      }
*************** struct cbl_field_t {
*** 643,649 ****
      cbl_encoding_t set() const {
        return valid()? encoding : cbl_encoding_t(-1);
      }
!     const char *name() const {
        return valid()? __gg__encoding_iconv_name(encoding) : "nocoding";
      }
    } codeset;
--- 739,746 ----
      cbl_encoding_t set() const {
        return valid()? encoding : cbl_encoding_t(-1);
      }
!     uint8_t stride() const;
!     inline const char *name() const {
        return valid()? __gg__encoding_iconv_name(encoding) : "nocoding";
      }
    } codeset;
*************** struct cbl_field_t {
*** 680,685 ****
--- 777,795 ----
      strcpy(this->name, name);
    }
  
+   cbl_field_t( cbl_field_type_t type, uint64_t attr,
+                const cbl_field_data_t& data,
+                uint32_t level, const cbl_name_t name, 
+                const cbl_field_t::codeset_t& codeset )
+     : offset(0), type(type), usage(FldInvalid), attr(attr)
+     , parent(0), our_index(0), level(level), codeset(codeset)
+     , line(0), name(""), file(0), data(data)
+     , var_decl_node(nullptr), data_decl_node(nullptr)
+   {
+     gcc_assert(strlen(name) < sizeof this->name);
+     strcpy(this->name, name);
+   }
+ 
    cbl_field_t( cbl_field_type_t type, uint32_t level, int line, uint64_t attr = 0 )
      : offset(0), type(type), usage(FldInvalid), attr(attr)
      , parent(0), our_index(0), level(level)
*************** struct cbl_field_t {
*** 702,708 ****
    }
  
    bool is_valid() const {
!     return data.capacity > 0
        || level == 88
        || level == 66
        || type == FldClass
--- 812,818 ----
    }
  
    bool is_valid() const {
!     return data.capacity() > 0
        || level == 88
        || level == 66
        || type == FldClass
*************** struct cbl_field_t {
*** 728,734 ****
    }
  
    bool reasonable_capacity() const {
!     return data.capacity <= MAX_FIXED_POINT_DIGITS;
    }
  
    cbl_field_t& same_as( const cbl_field_t& that, bool is_typedef ) {
--- 838,844 ----
    }
  
    bool reasonable_capacity() const {
!     return data.capacity() <= MAX_FIXED_POINT_DIGITS * codeset.stride();
    }
  
    cbl_field_t& same_as( const cbl_field_t& that, bool is_typedef ) {
*************** struct cbl_field_t {
*** 746,752 ****
      return *this;
    }
  
!   void report_invalid_initial_value(const YYLTYPE& loc) const;
  
    bool is_ascii() const;
    bool is_integer() const { return is_numeric(type) && data.rdigits == 0; }
--- 856,862 ----
      return *this;
    }
  
!   bool report_invalid_initial_value(const YYLTYPE& loc) const;
  
    bool is_ascii() const;
    bool is_integer() const { return is_numeric(type) && data.rdigits == 0; }
*************** struct cbl_field_t {
*** 755,760 ****
--- 865,875 ----
      return type == FldNumericBinary || type == FldNumericBin5;
    }
  
+   bool is_numeric_constant() const {
+     return type == FldLiteralN
+       || (type == FldFloat && has_attr(constant_e));
+   }
+ 
    HOST_WIDE_INT as_integer() const {
      return real_to_integer( TREE_REAL_CST_PTR (data.value_of()) );
    }
*************** struct cbl_field_t {
*** 764,770 ****
  
      type = FldNumericBin5;
      attr |= embiggened_e;
!     data.capacity = eight;
      data.digits = 0;
    }
  
--- 879,885 ----
  
      type = FldNumericBin5;
      attr |= embiggened_e;
!     data.capacity(eight);
      data.digits = 0;
    }
  
*************** struct cbl_field_t {
*** 783,789 ****
  
    bool has_subordinate( const cbl_field_t *that ) const;
  
!   const char * internalize();
    const char *value_str() const;
  
    bool is_key_name() const { return has_attr(record_key_e); }
--- 898,912 ----
  
    bool has_subordinate( const cbl_field_t *that ) const;
  
!   uint32_t char_capacity() const;
!   void set_capacity(size_t cap);
!   void add_capacity(size_t cap);
!   void set_initial( const cbl_loc_t& loc );
!   void set_initial( size_t nchar, const cbl_loc_t& loc = cbl_loc_t() );
!   size_t source_code_check(const void *initial, size_t length);
!   const char * encode( size_t, cbl_loc_t loc = cbl_loc_t());
!   void encode_numeric( const char input[], cbl_loc_t loc,
!                        const REAL_VALUE_TYPE& rvt = {});
    const char *value_str() const;
  
    bool is_key_name() const { return has_attr(record_key_e); }
*************** struct cbl_field_t {
*** 792,798 ****
      return data.digits?
        long(data.digits) - data.rdigits
        :
!       data.capacity;
    }
    uint32_t size() const; // table capacity or capacity
  
--- 915,921 ----
      return data.digits?
        long(data.digits) - data.rdigits
        :
!       data.capacity();
    }
    uint32_t size() const; // table capacity or capacity
  
*************** struct cbl_field_t {
*** 804,809 ****
--- 927,933 ----
    inline const char * level_str() const {
      return level_str(level);
    }
+   void blank_initial( size_t len, cbl_figconst_t figconst = normal_value_e );
  };
  
  const cbl_field_t * cbl_figconst_field_of( const char *value );
*************** struct label_cmp_lessthan {
*** 1374,1386 ****
  
  size_t field_index( const cbl_field_t *f );
  
  cbl_field_t * new_temporary( enum cbl_field_type_t type,
                               const char initial[] = NULL,
!                              bool attr = false );
  cbl_field_t * new_temporary_like( cbl_field_t skel );
  cbl_field_t * new_temporary_clone( const cbl_field_t *orig);
  cbl_field_t * keep_temporary( cbl_field_type_t type );
  
  cbl_field_t * new_literal( uint32_t len, const char initial[],
                             cbl_field_attr_t attr,
                             cbl_encoding_t encoding = ASCII_e );
--- 1498,1516 ----
  
  size_t field_index( const cbl_field_t *f );
  
+ cbl_field_t * new_literal_float( const cbl_loc_t& loc, const char initial[] );
+ 
  cbl_field_t * new_temporary( enum cbl_field_type_t type,
                               const char initial[] = NULL,
!                              cbl_field_attr_t = none_e );
  cbl_field_t * new_temporary_like( cbl_field_t skel );
  cbl_field_t * new_temporary_clone( const cbl_field_t *orig);
  cbl_field_t * keep_temporary( cbl_field_type_t type );
  
+ cbl_field_t * new_literal_2( uint32_t len, const char initial[],
+                              cbl_field_attr_t attr,
+                              cbl_encoding_t encoding = ASCII_e );
+ 
  cbl_field_t * new_literal( uint32_t len, const char initial[],
                             cbl_field_attr_t attr,
                             cbl_encoding_t encoding = ASCII_e );
*************** new_literal( uint32_t len, const char in
*** 1391,1409 ****
  }
  
  void symbol_temporaries_free();
  
  class temporaries_t {
!   friend void symbol_temporaries_free();
!   struct literal_an {
      bool is_quoted, is_verbatim; // verbatim: don't use codeset
      std::string value;
      literal_an() : is_quoted(false), is_verbatim(false), value("???") {}
      literal_an( const char value[], bool is_quoted, bool is_verbatim = false )
        : is_quoted(is_quoted), is_verbatim(is_verbatim), value(value) {}
      literal_an( const literal_an& that )
!       : is_quoted(that.is_quoted),
!         is_verbatim(that.is_verbatim),
!         value(that.value)
      {}
      literal_an& operator=( const literal_an& that ) {
        is_quoted = that.is_quoted;
--- 1521,1554 ----
  }
  
  void symbol_temporaries_free();
+ void symbol_temporary_location( const cbl_field_t *field,
+                                 const cbl_loc_t& loc);
+ cbl_loc_t symbol_temporary_location( const cbl_field_t *field );
  
  class temporaries_t {
!   friend void symbol_temporaries_free();    
!   friend void symbol_temporary_location( const cbl_field_t *field,
!                                          const cbl_loc_t& loc);
!   friend cbl_loc_t symbol_temporary_location( const cbl_field_t *field );
! 
!   class literal_an {
      bool is_quoted, is_verbatim; // verbatim: don't use codeset
+    public:
      std::string value;
      literal_an() : is_quoted(false), is_verbatim(false), value("???") {}
      literal_an( const char value[], bool is_quoted, bool is_verbatim = false )
        : is_quoted(is_quoted), is_verbatim(is_verbatim), value(value) {}
+     literal_an( size_t len, const char value[] )
+       : is_quoted(true), is_verbatim(false), value(value, len)
+     {
+       gcc_assert(0 < len);
+       gcc_assert(value[len-1] == '\0');
+       gcc_assert(this->value.back() == '\0');
+     }
      literal_an( const literal_an& that )
!       : is_quoted(that.is_quoted)
!       , is_verbatim(that.is_verbatim)
!       , value(that.value)
      {}
      literal_an& operator=( const literal_an& that ) {
        is_quoted = that.is_quoted;
*************** class temporaries_t {
*** 1413,1428 ****
      }
      bool operator<( const literal_an& that ) const {
        if( value == that.value ) { // alpha before numeric
!         if( is_quoted == that.is_quoted ) { // verbatim before not
!           return (is_verbatim? 0 : 1)  < (that.is_verbatim? 0 : 1);
          }
!         return (is_quoted? 0 : 1)  < (that.is_quoted? 0 : 1);
        }
        return value < that.value;
      }
    };
  
    std::map<literal_an, cbl_field_t *> literals;
    typedef std::set<cbl_field_t *> fieldset_t;
    typedef std::map<cbl_field_type_t, fieldset_t> fieldmap_t;
    fieldmap_t used, freed;
--- 1558,1578 ----
      }
      bool operator<( const literal_an& that ) const {
        if( value == that.value ) { // alpha before numeric
!         if( is_quoted == that.is_quoted ) { // non-verbatim first
!           return that.is_verbatim;
          }
!         return that.is_quoted; // unquoted first
        }
        return value < that.value;
      }
+     bool terminated() const {
+       // Z strings include the NUL terminator.   
+       return !is_verbatim && is_quoted && !value.empty() && '\0' == value.back();
+     }
    };
  
    std::map<literal_an, cbl_field_t *> literals;
+   std::map<const cbl_field_t*, cbl_loc_t> locs;
    typedef std::set<cbl_field_t *> fieldset_t;
    typedef std::map<cbl_field_type_t, fieldset_t> fieldmap_t;
    fieldmap_t used, freed;
*************** struct symbol_elem_t {
*** 2039,2044 ****
--- 2189,2196 ----
    }
  };
  
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Winvalid-offsetof"
  # define offsetof(TYPE, MEMBER)  __builtin_offsetof (TYPE, MEMBER)
  
  static inline symbol_elem_t *
*************** symbol_elem_of( const cbl_field_t *field
*** 2110,2115 ****
--- 2262,2268 ----
      // cppcheck-suppress cstyleCast
      reinterpret_cast<const symbol_elem_t *>((const char*)field - n);
  }
+ #pragma GCC diagnostic pop
  
  symbol_elem_t * symbols_begin( size_t first = 0 );
  symbol_elem_t * symbols_end(void);
*************** struct cbl_until_addresses_t {
*** 2307,2313 ****
  
  size_t symbol_index(); // nth after first program symbol
  size_t symbol_index( const symbol_elem_t *e );
! size_t symbol_unique_index( const struct symbol_elem_t *e );
  
  struct symbol_elem_t * symbol_at( size_t index );
  
--- 2460,2466 ----
  
  size_t symbol_index(); // nth after first program symbol
  size_t symbol_index( const symbol_elem_t *e );
! uint64_t symbol_unique_index( const struct symbol_elem_t *e );
  
  struct symbol_elem_t * symbol_at( size_t index );
  
*************** const char * symbol_type_str( enum symbo
*** 2899,2904 ****
--- 3052,3059 ----
  const char * cbl_field_type_str( enum cbl_field_type_t type );
  const char * cbl_logop_str( enum logop_t op );
  
+ const char * cbl_field_type_name( enum cbl_field_type_t type ); // for messages
+ 
  static inline const char *
  refer_type_str( const cbl_refer_t *r ) {
    return r && r->field? cbl_field_type_str(r->field->type) : "(none)";
*************** size_t count_characters(const char *in,
*** 2923,2926 ****
--- 3078,3083 ----
  
  void current_enabled_ecs( tree ena );
  
+ bool validate_numeric_edited(cbl_field_t *field);
+ 
  #endif
diff -Nrcpad gcc-16-20260111/gcc/cobol/token_names.h gcc-16-20260118/gcc/cobol/token_names.h
*** gcc-16-20260111/gcc/cobol/token_names.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/token_names.h	Sun Jan 18 22:32:06 2026
***************
*** 1,5 ****
  // generated by /home/jklowden/projects/3rd/gcc/parser/gcc/cobol/token_names.h.gen cobol/parse.h
! // Wed Nov 26 11:57:23 EST 2025
  tokens = {
  	{ "identification", IDENTIFICATION_DIV }, // 258
  	{ "environment", ENVIRONMENT_DIV }, // 259
--- 1,5 ----
  // generated by /home/jklowden/projects/3rd/gcc/parser/gcc/cobol/token_names.h.gen cobol/parse.h
! // Sun Jan 11 18:01:04 EST 2026
  tokens = {
  	{ "identification", IDENTIFICATION_DIV }, // 258
  	{ "environment", ENVIRONMENT_DIV }, // 259
diff -Nrcpad gcc-16-20260111/gcc/cobol/util.cc gcc-16-20260118/gcc/cobol/util.cc
*** gcc-16-20260111/gcc/cobol/util.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cobol/util.cc	Sun Jan 18 22:32:06 2026
***************
*** 34,42 ****
   * header files.
   */
  
! #include <cobol-system.h>
  #include <coretypes.h>
  #include <tree.h>
  #undef yy_flex_debug
  
  #include <langinfo.h>
--- 34,43 ----
   * header files.
   */
  
! #include "cobol-system.h"
  #include <coretypes.h>
  #include <tree.h>
+ #include <fold-const.h>
  #undef yy_flex_debug
  
  #include <langinfo.h>
***************
*** 48,55 ****
  #include <backtrace.h>
  #include <diagnostic.h>
  #include <opts.h>
- #include "util.h"
  
  #include "cbldiag.h"
  #include "cdfval.h"
  #include "lexio.h"
--- 49,56 ----
  #include <backtrace.h>
  #include <diagnostic.h>
  #include <opts.h>
  
+ #include "util.h"
  #include "cbldiag.h"
  #include "cdfval.h"
  #include "lexio.h"
***************
*** 62,67 ****
--- 63,69 ----
  #include "genapi.h"
  #include "genutil.h"
  #include "../../libgcobol/charmaps.h"
+ #include "../../libgcobol/valconv.h"
  
  #pragma GCC diagnostic ignored "-Wunused-result"
  #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
*************** cdf_literalize( const std::string& name,
*** 269,300 ****
      if( value.is_numeric() ) {
        auto initial = xasprintf("%ld", (long)value.as_number());
        auto len = strlen(initial);
!       cbl_field_data_t data(len, len);
!       data.initial = initial;
        data.valify();
        field = cbl_field_t{ FldLiteralN, constant_e, data, 0, name.c_str()};
      } else {
        auto len = strlen(value.string);
        cbl_field_data_t data(len, len);
!       data.initial = xstrdup(value.string);
        field = cbl_field_t{ FldLiteralA, constant_e, data, 0, name.c_str() };
        field.set_attr(quoted_e);
      }
-     field.codeset.set();
  
      return field;
  }
  
! const std::list<cbl_field_t> 
  cdf_literalize() {
    std::list<cbl_field_t> fields;
    auto dict = cdf_dictionary();
!   
    for( auto elem : dict ) {
      std::string name(elem.first);
      const cdfval_t& value(elem.second);
!     
!     fields.push_back(cdf_literalize(name, value));    
    }
    return fields;
  }
--- 271,301 ----
      if( value.is_numeric() ) {
        auto initial = xasprintf("%ld", (long)value.as_number());
        auto len = strlen(initial);
!       cbl_field_data_t data(len, len, len,0, initial); // digits == len, no rdigits
        data.valify();
        field = cbl_field_t{ FldLiteralN, constant_e, data, 0, name.c_str()};
      } else {
        auto len = strlen(value.string);
        cbl_field_data_t data(len, len);
!       data.original(xstrdup(value.string));
        field = cbl_field_t{ FldLiteralA, constant_e, data, 0, name.c_str() };
        field.set_attr(quoted_e);
      }
  
+     field.codeset.set();
      return field;
  }
  
! const std::list<cbl_field_t>
  cdf_literalize() {
    std::list<cbl_field_t> fields;
    auto dict = cdf_dictionary();
! 
    for( auto elem : dict ) {
      std::string name(elem.first);
      const cdfval_t& value(elem.second);
! 
!     fields.push_back(cdf_literalize(name, value));
    }
    return fields;
  }
*************** cbl_field_type_str( enum cbl_field_type_
*** 372,377 ****
--- 373,425 ----
  }
  
  const char *
+ cbl_field_type_name( enum cbl_field_type_t type )
+ {
+   switch(type) {
+   case FldDisplay:
+     return "DISPLAY";
+   case FldInvalid:
+     return ""; // Invalid";
+   case FldGroup:
+     return "GROUP";
+   case FldAlphanumeric:
+     return "ALPHANUMERIC";
+   case FldNumericBinary:
+     return "NUMERIC-BINARY";
+   case FldFloat:
+     return "FLOAT";
+   case FldNumericBin5:
+     return "COMPUTATIONAL-5";
+   case FldPacked:
+     return "PACKED-DECIMAL";
+   case FldNumericDisplay:
+     return "NUMERIC-DISPLAY";
+   case FldNumericEdited:
+     return "NUMERIC-EDITED";
+   case FldAlphaEdited:
+     return "ALPHANUMERIC-EDITED";
+   case FldLiteralA:
+     return "ALPHANUMERIC LITERAL";
+   case FldLiteralN:
+     return "NUMERIC LITERAL";
+   case FldClass:
+     return "CLASS";
+   case FldConditional:
+     return "CONDITIONAL";
+   case FldForward:
+     return "FORWARD";
+   case FldIndex:
+     return "INDEX";
+   case FldSwitch:
+     return "SWITCH";
+   case FldPointer:
+     return "POINTER";
+  }
+   cbl_internal_error("%s:%d: invalid %<symbol_type_t%> %d", __func__, __LINE__, type);
+   return "???";
+ }
+ 
+ const char *
  cbl_logop_str( enum logop_t op )
  {
    switch(op) {
*************** determine_intermediate_type( const cbl_r
*** 404,410 ****
    if( aref.field->type == FldFloat || bref.field->type == FldFloat )
      {
      output.type = FldFloat;
!     output.data.capacity = 16;
      output.attr = (intermediate_e );
      }
    else if(   op == '*'
--- 452,458 ----
    if( aref.field->type == FldFloat || bref.field->type == FldFloat )
      {
      output.type = FldFloat;
!     output.data.capacity(16);
      output.attr = (intermediate_e );
      }
    else if(   op == '*'
*************** determine_intermediate_type( const cbl_r
*** 412,424 ****
                                                        > MAX_FIXED_POINT_DIGITS)
      {
      output.type = FldFloat;
!     output.data.capacity = 16;
      output.attr = (intermediate_e );
      }
    else
      {
      output.type = FldNumericBin5;
!     output.data.capacity = 16;
      output.data.digits   = MAX_FIXED_POINT_DIGITS;
      output.attr = (intermediate_e | signable_e );
      }
--- 460,472 ----
                                                        > MAX_FIXED_POINT_DIGITS)
      {
      output.type = FldFloat;
!     output.data.capacity(16);
      output.attr = (intermediate_e );
      }
    else
      {
      output.type = FldNumericBin5;
!     output.data.capacity(16);
      output.data.digits   = MAX_FIXED_POINT_DIGITS;
      output.attr = (intermediate_e | signable_e );
      }
*************** const char *numed_message;
*** 449,468 ****
  extern int yydebug, yy_flex_debug;
  
  bool
! is_alpha_edited( const char picture[] ) {
    static const char valid[] = "abxABX90/(),.";
    assert(picture);
  
!   for( const char *p = picture; *p != '\0'; p++ ) {
!     if( strchr(valid, *p) ) continue;
!     if( ISDIGIT(*p) ) continue;
!     if( symbol_decimal_point() == *p ) continue;
!     if( symbol_currency(*p) ) continue;
! 
!     if( yydebug ) {
!       dbgmsg( "%s: bad character '%c' at %.*s<-- in '%s'",
!              __func__, *p, int(p - picture) + 1, picture, picture );
!     }
      return false;
    }
    return true;
--- 497,519 ----
  extern int yydebug, yy_flex_debug;
  
  bool
! cbl_field_data_t::is_alpha_edited() const {
    static const char valid[] = "abxABX90/(),.";
    assert(picture);
+   auto ep = picture + strlen(picture);
  
!   // Find first character that is not part of an alpha-edited PICTURE.
!   auto p = std::find_if( picture, ep,
!                          []( char ch ) {
!                            if( strchr(valid, ch) ) return false;
!                            if( ISDIGIT(ch) ) return false;
!                            if( symbol_decimal_point() == ch ) return false;
!                            if( symbol_currency(ch) ) return false;
!                            return true;
!                          } );
!   if( p != ep ) {
!     dbgmsg( "%s: bad character '%c' at %.*s<-- in '%s'",
!             __func__, *p, int(p - picture) + 1, picture, picture );
      return false;
    }
    return true;
*************** symbol_field_type_update( cbl_field_t *f
*** 820,826 ****
      case FldPointer:
        // set the type
        field->type = candidate;
!       if( field->data.capacity == 0 ) {
          static const cbl_field_data_t data = {0, 8, 0, 0, NULL};
          field->data = data;
          field->attr &= ~size_t(signable_e);
--- 871,877 ----
      case FldPointer:
        // set the type
        field->type = candidate;
!       if( field->data.capacity() == 0 ) {
          static const cbl_field_data_t data = {0, 8, 0, 0, NULL};
          field->data = data;
          field->attr &= ~size_t(signable_e);
*************** symbol_field_type_update( cbl_field_t *f
*** 927,936 ****
      case FldNumericDisplay:
      case FldAlphaEdited:
      case FldNumericEdited:
!       {
!       bool retval = field->codeset.set();
!       return retval;
!       }
      default:
        break;
      }
--- 978,984 ----
      case FldNumericDisplay:
      case FldAlphaEdited:
      case FldNumericEdited:
!       return field->codeset.set();
      default:
        break;
      }
*************** redefine_field( cbl_field_t *field ) {
*** 1002,1008 ****
      field->data.initial = NULL;
    }
  
!   if( field->data.capacity == 0 ) field->data = primary->data;
  
    if( is_numeric(field->type) && field->usage == FldDisplay ) {
      fOK = symbol_field_type_update(field, FldNumericDisplay, false);
--- 1050,1056 ----
      field->data.initial = NULL;
    }
  
!   if( field->data.capacity() == 0 ) field->data = primary->data;
  
    if( is_numeric(field->type) && field->usage == FldDisplay ) {
      fOK = symbol_field_type_update(field, FldNumericDisplay, false);
*************** redefine_field( cbl_field_t *field ) {
*** 1011,1034 ****
    return fOK;
  }
  
  void
  cbl_field_t::report_invalid_initial_value(const YYLTYPE& loc) const {
  
!   if( ! data.initial ) return;
  
!   auto fig = cbl_figconst_of(data.initial);
  
!   // numeric initial value
    if( is_numeric(type) ) {
      if( has_attr(quoted_e) ) {
        error_msg(loc, "numeric type %s VALUE '%s' requires numeric VALUE",
!                name, data.initial);
!       return;
      }
      if( ! (fig == normal_value_e || fig == zero_value_e)  ) {
          error_msg(loc, "numeric type %s VALUE '%s' requires numeric VALUE",
                   name, cbl_figconst_str(fig));
!         return;
        }
  
      switch( type ) {
--- 1059,1878 ----
    return fOK;
  }
  
+ static
+ FIXED_WIDE_INT(128)
+ dirty_to_binary(const char  *instring,
+                 uint32_t    &capacity,
+                 uint32_t    &digits,
+                 int32_t     &rdigits,
+                 uint64_t    &attr)
+   {
+   digits = 0;
+   rdigits = 0;
+   attr = 0;
+ 
+   FIXED_WIDE_INT(128) value = 0;
+ 
+   // We need to convert data.initial to an FIXED_WIDE_INT(128) value
+   const char *p = instring;
+   int sign = 1;
+   bool ignore_zeroes = true;
+   if( *p == '-' )
+     {
+     attr |= signable_e;
+     sign = -1;
+     p += 1;
+     }
+   else if( *p == '+' )
+     {
+     // We set it signable so that the instruction DISPLAY +1
+     // actually outputs "+1"
+     attr |= signable_e;
+     p += 1;
+     }
+ 
+   //  We need to be able to handle
+   //  123
+   //  123.456
+   //  123E<exp>
+   //  123.456E<exp>
+   //  where <exp> can be N, +N and -N
+   //
+ 
+   int rdigit_delta = 0;
+   int exponent = 0;
+   const char *exp = strchr(p, 'E');
+   if( !exp )
+     {
+     exp = strchr(p, 'e');
+     }
+   if(exp)
+     {
+     exponent = atoi(exp+1);
+     }
+ 
+   // We can now calculate the value, and the number of digits and rdigits.
+ 
+   // We trim off leading zeroes before the decimal point, and trailing zeroes
+   // after a decimal point.
+ 
+   const char *pend = exp;
+   if( !exp )
+     {
+     pend = instring + strlen(instring);
+     }
+ 
+   const char *pdecimal = strchr(instring, symbol_decimal_point());
+   if( pdecimal )
+     {
+     while( pend > instring && *(pend-1) == '0' )
+       {
+       pend -= 1;
+       }
+     }
+ 
+   while(p < pend)
+     {
+     char ch = *p++;
+     if( ch == symbol_decimal_point() )
+       {
+       rdigit_delta = 1;
+       ignore_zeroes = false;
+       continue;
+       }
+     if( ignore_zeroes && ch == '0' )
+       {
+       continue;
+       }
+     ignore_zeroes = false;
+     if( ch < '0' || ch > '9' )
+       {
+       break;
+       }
+     digits += 1;
+     rdigits += rdigit_delta;
+     value *= 10;
+     value += ch - '0';
+     }
+ 
+   if( exponent < 0 )
+     {
+     rdigits += -exponent;
+     }
+   else
+     {
+     while(exponent--)
+       {
+       if(rdigits)
+         {
+         rdigits -= 1;
+         }
+       else
+         {
+         digits += 1;
+         value *= 10;
+         }
+       }
+     }
+ 
+   if( (int32_t)digits < rdigits )
+     {
+     digits = rdigits;
+     }
+ 
+   // We now need to calculate the capacity.
+ 
+   unsigned int min_prec = wi::min_precision(value, UNSIGNED);
+   if( min_prec > 64 )
+     {
+     // Bytes 15 through 8 are non-zero
+     capacity = 16;
+     }
+   else if( min_prec > 32 )
+     {
+     // Bytes 7 through 4 are non-zero
+     capacity = 8;
+     }
+   else if( min_prec > 16 )
+     {
+     // Bytes 3 and 2
+     capacity = 4;
+     }
+   else if( min_prec > 8 )
+     {
+     // Byte 1 is non-zero
+     capacity = 2;
+     }
+   else
+     {
+     // The value is zero through 0xFF
+     capacity = 1;
+     }
+ 
+   value *= sign;
+ 
+   // One last adjustment.  The number is signable, so the binary value
+   // is going to be treated as twos complement.  That means that the highest
+   // bit has to be 1 for negative signable numbers, and 0 for positive.  If
+   // necessary, adjust capacity up by one byte so that the variable fits:
+ 
+   if( capacity < 16 && (attr & signable_e) )
+     {
+     FIXED_WIDE_INT(128) mask
+       = wi::set_bit_in_zero<FIXED_WIDE_INT(128)>(capacity * 8 - 1);
+     if( wi::neg_p (value) && (value & mask) == 0 )
+       {
+       capacity *= 2;
+       }
+     else if( !wi::neg_p (value) && (value & mask) != 0 )
+       {
+       capacity *= 2;
+       }
+     }
+ 
+   return value;
+   }
+ 
+ static void
+ digits_from_int128( char                *ach,
+                     cbl_field_t         *field,
+                     uint32_t             desired_digits,
+                     FIXED_WIDE_INT(128)  value128, // cppcheck-suppress unknownMacro
+                     int32_t              rdigits)
+   {
+   if( value128 < 0 )
+     {
+     value128 = -value128;
+     }
+ 
+   // 'rdigits' are the number of rdigits in value128.
+ 
+   int scaled_rdigits = get_scaled_rdigits(field);
+ 
+   int i = field->data.rdigits;
+   while( i<0 )
+     {
+     value128 = value128/10;
+     i += 1;
+     }
+ 
+   // We take the digits of value128, and put them into ach.  We line up
+   // the rdigits, and we truncate the string after desired_digits
+   while(rdigits < scaled_rdigits)
+     {
+     value128 *= 10;
+     rdigits += 1;
+     }
+   while(rdigits > scaled_rdigits)
+     {
+     value128 = value128 / 10;
+     rdigits -= 1;
+     }
+   char conv[128];
+   print_dec (value128, conv, SIGNED);
+   size_t len = strlen(conv);
+ 
+   if( len<desired_digits )
+     {
+     memset(ach, ascii_0, desired_digits - len);
+     strcpy(ach+desired_digits - len, conv);
+     }
+   else
+     {
+     strcpy(ach, conv + len-desired_digits);
+     }
+   }
+ 
+ static
+ void
+ binary_initial( char *retval,
+                 cbl_field_t *field,
+                 FIXED_WIDE_INT(128) value,
+                 int drdigits)
+   {
+   // This routine returns an xmalloced buffer designed to replace the
+   // data.initial member of the incoming field
+ 
+   int scaled_rdigits = get_scaled_rdigits(field);
+ 
+   int i = field->data.rdigits;
+   while( i<0 )
+     {
+     value = value/10;
+     i += 1;
+     }
+ 
+   // We take the digits of value, and put them into ach.  We line up
+   // the rdigits, and we truncate the string after desired_digits
+   while(drdigits < scaled_rdigits)
+     {
+     value *= 10;
+     drdigits += 1;
+     }
+   while(drdigits > scaled_rdigits)
+     {
+     value = value / 10;
+     drdigits -= 1;
+     }
+ 
+   switch(field->data.capacity())
+     {
+     tree type;
+     case 1:
+     case 2:
+     case 4:
+     case 8:
+     case 16:
+       type = build_nonstandard_integer_type ( field->data.capacity()
+                                               * BITS_PER_UNIT, 0);
+       native_encode_wide_int (type, value, PTRCAST(unsigned char, retval),
+                               field->data.capacity());
+       break;
+     default:
+       fprintf(stderr,
+               "Trouble in binary_initial at %s() %s:%d\n",
+               __func__,
+               __FILE__,
+               __LINE__);
+       abort();
+       break;
+     }
+   }
+ 
+ /*
+  * Preconditions:
+  *  1.  input is not NULL
+  *  2.  type is numeric
+  *  3.  input conforms to type (will fit, allows sign, etc.)
+  *  4.  capacity set per PICTURE and USAGE, or
+  *      type == FldLiteralN and data.capacity == 0
+  *  5.  data_initial has been established with data.capacity() bytes, unless
+  *      FldLiteralN, in which case we will malloc data.initial.
+  *
+  * Process:
+  *  Convert input string to binary Host representation:
+  *    FldFloat: as tree
+  *    other (fixed point): as FIXED_WIDE_INT(128)
+  *  Set etc union via assignment, cbl_field_data_t::operator=().
+  *  That sets the correct member in the union and etc_type.
+  *
+  *  As of Mon Jan 5 13:32:32 2026, use gcc_assert for preconditions. A location
+  *  is provided so diagnositics can be issued.  We may remove precondition
+  *  verification from the caller and move error handling here.
+  *
+  *  Post condition:
+  *    etc union holds Host numeric value.
+  *    data.initial is NULL for error, else points to data.etc.
+  */
+ 
  void
+ cbl_field_t::encode_numeric( const char input[], cbl_loc_t loc,
+                              const REAL_VALUE_TYPE& /*rvt*/ ) {
+   gcc_assert(input);
+   gcc_assert(is_numeric(this) || type == FldNumericEdited);
+ 
+   // The following are intended to test the preconditions....
+   if( type == FldLiteralN ) {
+     if( 0 < data.capacity() ) {
+       error_msg(loc, "unexpected nonzero numeric literal capacity");
+     }
+     if( data.initial != nullptr ) {
+       error_msg(loc, "unexpected initial value for numeric literal");
+     }
+   } else {
+     if( 0 == data.capacity() ) {
+       error_msg(loc, "unexpected zero capacity numeric nonliteral");
+     }
+   }
+ 
+   gcc_assert(0 < data.capacity() || type == FldLiteralN);
+   gcc_assert( data.initial == nullptr
+               || type == FldLiteralN
+               || data.capacity() <= strlen(data.initial)
+               || 1 < codeset.stride() );
+ 
+   if( type == FldFloat )
+     {
+     double d;
+     int n;
+     int erc = sscanf(input, "%lf%n", &d, &n);
+     if( erc < 0 || size_t(n) != strlen(input) )
+       {
+       dbgmsg("%s: error: could not interpret '%s' of '%s' as a number",
+              __func__, input + n, input);
+       gcc_assert(false);
+       }
+     REAL_VALUE_TYPE value;
+     real_from_string (&value, input);
+     value = real_value_truncate (TYPE_MODE (float128_type_node), value);
+     data = build_real(float128_type_node, value);
+     // Turn that back into a REAL_VALUE_TYPE with
+     // REAL_VALUE_TYPE readback_value = TREE_REAL_CST(data.etc.value);
+ 
+ #define FOR_JIM 0
+ #if FOR_JIM
+     {
+     // When you know data.etc.value was created with build_real()
+     enum tree_code code = TREE_CODE(TREE_TYPE(data.etc.value));
+     // code will be REAL_TYPE
+ 
+     REAL_VALUE_TYPE readback_value = TREE_REAL_CST(data.etc.value);
+     char ach[48];
+     size_t number_of_digits = 33;
+     bool crop_trailing_zeroes = true;
+     real_to_decimal(ach,
+                     &readback_value,
+                     sizeof(ach),
+                     number_of_digits,
+                     crop_trailing_zeroes);
+     fprintf(stderr, "FOR_JIM: %s real_value: %s\n", get_tree_code_name(code), ach);
+     }
+ #endif
+ 
+     unsigned char *retval =
+                         static_cast<unsigned char *>(xmalloc(data.capacity()));
+     assert(retval);
+     switch( data.capacity() )
+       {
+       case 4:
+         value = real_value_truncate (TYPE_MODE (float32_type_node), value);
+         native_encode_real(SCALAR_FLOAT_TYPE_MODE (float32_type_node), &value,
+                             retval, 4, 0);
+         break;
+       case 8:
+         value = real_value_truncate (TYPE_MODE (float64_type_node), value);
+         native_encode_real(SCALAR_FLOAT_TYPE_MODE (float64_type_node), &value,
+                             retval, 8, 0);
+         break;
+       case 16:
+         // 'value' is already a truncated float128
+         native_encode_real(SCALAR_FLOAT_TYPE_MODE (float128_type_node), &value,
+                             retval, 16, 0);
+         break;
+       default:
+         gcc_assert(false);
+         break;
+       }
+     data.initial = reinterpret_cast<char *>(retval);
+     }
+   else
+     {
+     uint32_t l_capacity;
+     uint32_t l_digits;
+     int32_t  l_rdigits;
+     uint64_t l_attr;
+     // The following returned capacity is 1, 2, 4, 8, or 16, for the binary
+     // value.
+     FIXED_WIDE_INT(128)value = dirty_to_binary(input,
+                                                l_capacity,
+                                                l_digits,
+                                                l_rdigits,
+                                                l_attr);
+     data = wide_int_to_tree(intTI_type_node, value);
+     // turn that back into a FIXED_WIDE_INT with
+     // wi::tree_to_wide_ref iii = wi::to_wide( data.etc.value );
+ 
+ #if FOR_JIM
+     {
+     // When you know data.etc.value was created with wide_int_to_tree.
+     enum tree_code code = TREE_CODE(TREE_TYPE(data.etc.value));
+     // code will be INTEGER_TYPE
+ 
+     wi::tree_to_wide_ref iii = wi::to_wide( data.etc.value );
+     char ach[60];
+     print_dec(iii, ach, SIGNED);
+     fprintf(stderr, "FOR_JIM: %s fixed_value: %s\n", get_tree_code_name(code), ach);
+     }
+ #endif
+ 
+     if( data.capacity() == 0 )
+       {
+       // It falls to us to establish these parameters:
+       data.capacity(  l_capacity );
+       data.digits   = l_digits;
+       data.rdigits  = l_rdigits;
+       attr         |= l_attr;
+       data.initial = static_cast<char *>(xmalloc(data.capacity()));
+       gcc_assert(data.initial);
+       }
+     else if( !(attr & quoted_e) )
+       {
+       // quoted_e at this point means numeric edited, which gets the initial
+       // value verbatim.
+       if( l_attr & signable_e && !(attr & signable_e) && value < 0)
+         {
+           if( type != FldNumericEdited || (data.picture && data.picture[0] != '-')) {
+           error_msg(loc, "%qs has unsigned PICTURE but signed VALUE %qs",
+                     this->name, data.original());
+           }
+         }
+ 
+       if( data.digits && value != 0)
+         {
+         // We were supplied with parameters.  We now make sure they are
+         // consistent.
+         if( attr & scaled_e )
+           {
+           if( data.rdigits > 0 )
+             {
+             // This is like PIC PPP9999, with digits=4 and rdigits=3
+             if( l_digits != static_cast<uint32_t>(l_rdigits) )
+               {
+               error_msg(loc, "The magnitude is too large");
+               }
+             else
+               {
+               // This is like PIC PP999, with digits=3 and rdigits=2
+               if( data.digits + data.rdigits < l_digits )
+                 {
+                 error_msg(loc, "Too many significant digits");
+                 }
+               else
+                 {
+                 // We know the abs(value) is less than 1, and we know that the
+                 // fractional part fits into (data.digits + data.rdigits) to
+                 // the right of the decimal point.  We need to make sure that
+                 // the top rdigits of value are zero.
+ 
+                 FIXED_WIDE_INT(128)tester = value;
+                 if( tester < 0 )
+                   {
+                   tester = - tester;
+                   }
+                 // The final value will have data.digits + l_rdigits decimal
+                 // places.  Let's scale rvalue to that range, taking into
+                 // account that we already have l_rdigits of those places.
+                 tester *= 
+                      get_power_of_ten(data.digits + data.rdigits - l_rdigits);
+ 
+                 // In the case of PPP9999, tester needs to be between 1 and
+                 // 9999.  data.digits is 4, so....
+                 if( tester >= get_power_of_ten(data.digits) )
+                   {
+                   error_msg(loc, "The fractional part is too large");
+                   }
+                 }
+               }
+             }
+           else
+             {
+             // This is like PIC 999PP, with digits=3 and rdigits=-2
+             if( data.digits-data.rdigits < l_digits )
+               {
+               error_msg(loc, "Too many leading digits");
+               }
+             // We need to make sure the bottom -rdigits places are zero:
+             FIXED_WIDE_INT(128)v = value;
+             for(int32_t i=0; i < -data.rdigits; i++)
+               {
+               if( v % 10 != 0)
+                 {
+                 error_msg(loc, "P-scaled digits are nonzero");
+                 break;
+                 }
+               v = v / 10;
+               }
+             }
+           }
+         else if( !(attr & quoted_e) )
+           {
+           if( data.rdigits == 0 && l_rdigits > 0)
+             {
+             // This is a condition that the parser finds before we can:
+             }
+           if( data.rdigits && data.rdigits < l_rdigits )
+             {
+             // This is a condition that the parser finds before we can:
+             }
+           if( l_digits - l_rdigits > data.digits - data.rdigits )
+             {
+             error_msg(loc, "VALUE has too many integer digits");
+             }
+           }
+         }
+       }
+ 
+     char *retval;
+     if( data.initial )
+       {
+       retval = const_cast<char *>(data.initial);
+       }
+     else
+       {
+       retval = static_cast<char *>(xmalloc(data.capacity()));
+       data.initial = retval;
+       }
+ 
+     switch(type)
+       {
+       case FldNumericBin5:
+       case FldLiteralN:
+         {
+         binary_initial(retval, this, value, l_rdigits);
+         break;
+         }
+       case FldNumericBinary:
+         {
+         binary_initial(retval, this, value, l_rdigits);
+         if( attr & big_endian_e )
+           {
+           // This is a big-endian value, so swap retval end-for-end:
+           size_t left = 0;
+           size_t right = data.capacity() - 1;
+           while(left < right)
+             {
+             std::swap(retval[left++], retval[right--]);
+             }
+           }
+         break;
+         }
+       case FldPacked:
+         {
+         char *pretval = retval;
+         char ach[128];
+ 
+         bool negative;
+         if( value < 0 )
+           {
+           negative = true;
+           value = -value;
+           }
+         else
+           {
+           negative = false;
+           }
+ 
+         // For COMP-6 (flagged by packed_no_sign_e), the number of required
+         // digits is twice the capacity.
+ 
+         // For COMP-3, the number of digits is 2*capacity minus 1, because the
+         // the final "digit" is a sign nybble.
+ 
+         size_t ndigits =   (attr & packed_no_sign_e)
+                          ? data.capacity() * 2
+                          : data.capacity() * 2 - 1;
+ 
+         digits_from_int128(ach, this, ndigits, value, l_rdigits);
+ 
+         const char *digits = ach;
+         for(size_t i=0; i<ndigits; i++)
+           {
+           if( !(i & 0x01) )
+             {
+             *pretval    = ((*digits++) & 0x0F)<<4;;
+             }
+           else
+             {
+             *pretval++ += (*digits++) & 0x0F;
+             }
+           }
+         if( !(attr & packed_no_sign_e) )
+           {
+           // This is COMP-3, so put in a sign nybble
+           if( attr & signable_e )
+             {
+             if( negative )
+               {
+               *pretval++ += 0x0D;   // Means signable and negative
+               }
+             else
+               {
+               *pretval++ += 0x0C;   // Means signable and non-negative
+               }
+             }
+           else
+             {
+             *pretval++ += 0x0F;     // Means not signable
+             }
+           }
+         break;
+         }
+ 
+       case FldNumericDisplay:
+         {
+         // We are going to take the numerical value and convert it to the form
+         // specified by the attributes, digits, and rdigits.
+ 
+         char *pretval = retval;
+         char ach[128];
+ 
+         bool negative;
+         if( value < 0 )
+           {
+           negative = true;
+           value = - value;
+           }
+         else
+           {
+           negative = false;
+           }
+         digits_from_int128(ach, this, data.digits, value, l_rdigits);
+         const char *digits = ach;
+         if(    (attr & signable_e)
+             && (attr & separate_e)
+             && (attr & leading_e ) )
+           {
+           // This zoned decimal value is signable, separate, and leading.
+           if( negative )
+             {
+             *pretval++ = ascii_minus;
+             }
+           else
+             {
+             *pretval++ = ascii_plus;
+             }
+           }
+         for(size_t i=0; i<data.digits; i++)
+           {
+           // Start by assuming it's an value that can't be signed
+           *pretval++ = ascii_0 + ((*digits++) & 0x0F);
+           }
+         if(     (attr & signable_e)
+             &&  (attr & separate_e)
+             && !(attr & leading_e ) )
+           {
+           // The value is signable, separate, and trailing
+           if( negative )
+             {
+             *pretval++ = ascii_minus;
+             }
+           else
+             {
+             *pretval++ = ascii_plus;
+             }
+           }
+ 
+         // It's at this point we convert to the target encoding:
+         charmap_t *charmap = __gg__get_charmap(codeset.encoding);
+         size_t retval_length = pretval - retval;
+         if( retval_length != char_capacity() ) {
+           cbl_errx( "%s: %s %lu %s %lu",
+                     name,
+                     "retval_length",
+                     (unsigned long)retval_length,
+                     "!= char_capacity()",
+                     (unsigned long)char_capacity());
+         }
+         gcc_assert(retval_length == char_capacity());
+         size_t nbytes;
+         const char *converted = __gg__iconverter(DEFAULT_SOURCE_ENCODING,
+                                                  codeset.encoding,
+                                                  retval,
+                                                  retval_length,
+                                                  &nbytes);
+         if( nbytes != data.capacity() ) {
+           cbl_errx( "%s: nbytes %lu %s %lu",
+                     name,
+                     (unsigned long)nbytes,
+                     "!= data.capacity()",
+                     (unsigned long)data.capacity());
+         }
+         gcc_assert(nbytes == data.capacity());
+         memcpy(retval, converted, data.capacity());
+         if(     (attr & signable_e)
+             && !(attr & separate_e) )
+           {
+           // This value is signable, and not separate.  So, the sign
+           // information goes into the first or last byte:
+           char *sign_location = attr & leading_e
+                         ? retval
+                         : retval + (data.digits-1) * charmap->stride() ;
+           cbl_char_t schar = charmap->set_digit_negative(*sign_location,
+                                                           negative);
+           memcpy(sign_location, &schar, charmap->stride());
+           }
+         break;
+         }
+ 
+       case FldNumericEdited:
+         {
+         if( attr & quoted_e )
+           {
+           // What the programmer says the value is, the value stays, no
+           // matter how weird it might be.
+           }
+         else
+           {
+           // It's not a quoted string, so we use data.value:
+           bool negative;
+           if( value < 0 )
+             {
+             negative = true;
+             value = -value;
+             }
+           else
+             {
+             negative = false;
+             }
+ 
+           char ach[128];
+           memset(ach, 0, sizeof(ach));
+           memset(retval, 0, data.capacity());
+ 
+           if( (attr & blank_zero_e) && value == 0 )
+             {
+             memset( retval,
+                     ascii_space,
+                     data.capacity());
+             }
+           else
+             {
+             digits_from_int128(ach, this, char_capacity(), value, l_rdigits);
+ 
+             // __gg__string_to_numeric_edited operates in ASCII space:
+             __gg__string_to_numeric_edited( reinterpret_cast<char *>(retval),
+                                             ach,
+                                             data.rdigits,
+                                             negative,
+                                             data.picture);
+             // So now we convert it to the target encoding:
+             size_t nbytes;
+             const char *converted = __gg__iconverter(DEFAULT_SOURCE_ENCODING,
+                                                      codeset.encoding,
+                                                      retval,
+                                                      char_capacity(),
+                                                      &nbytes);
+             memcpy(retval, converted, nbytes);
+             }
+           }
+         break;
+         }
+ 
+       default:
+         cbl_errx( "%s:%d: type %s, who woulda thunk?",
+                   __func__, __LINE__, cbl_field_type_str(type) );
+         gcc_assert(false);
+         break;
+       }
+     }
+   gcc_assert(data.etc_type != cbl_field_data_t::no_value_e);
+ }
+ 
+ size_t parse_error_inc();
+ size_t parse_error_count();
+ 
+ bool // true if error reported
  cbl_field_t::report_invalid_initial_value(const YYLTYPE& loc) const {
  
!   if( ! data.original() ) return false;
  
!   const auto nerr = parse_error_count();
  
!   auto orig = data.original();
! 
!   auto fig = cbl_figconst_of(orig);
! 
!   // numeric orig value
    if( is_numeric(type) ) {
      if( has_attr(quoted_e) ) {
        error_msg(loc, "numeric type %s VALUE '%s' requires numeric VALUE",
!                name, orig);
!       return true;
      }
      if( ! (fig == normal_value_e || fig == zero_value_e)  ) {
          error_msg(loc, "numeric type %s VALUE '%s' requires numeric VALUE",
                   name, cbl_figconst_str(fig));
!         return true;
        }
  
      switch( type ) {
*************** cbl_field_t::report_invalid_initial_valu
*** 1038,1055 ****
          // We are dealing with a pure binary type.  If the capacity is
          // 8 or more, we need do no further testing because we assume
          // everything fits.
!         if( data.capacity < 8 ) {
!           const char *p = strchr(data.initial, symbol_decimal_point());
            if( p && atoll(p+1) != 0 ) {
              error_msg(loc, "integer type %s VALUE '%s' "
                       "requires integer VALUE",
!                      name, data.initial);
            } else {
              // Calculate the maximum possible value that a binary with this
              // many bytes can hold
              size_t max_possible_value;
              max_possible_value = 1;
!             max_possible_value <<= data.capacity*8;
              max_possible_value -= 1;
              if( attr & signable_e )
                {
--- 1882,1899 ----
          // We are dealing with a pure binary type.  If the capacity is
          // 8 or more, we need do no further testing because we assume
          // everything fits.
!         if( data.capacity() < 8 ) {
!           const char *p = strchr(orig, symbol_decimal_point());
            if( p && atoll(p+1) != 0 ) {
              error_msg(loc, "integer type %s VALUE '%s' "
                       "requires integer VALUE",
!                      name, orig);
            } else {
              // Calculate the maximum possible value that a binary with this
              // many bytes can hold
              size_t max_possible_value;
              max_possible_value = 1;
!             max_possible_value <<= data.capacity()*8;
              max_possible_value -= 1;
              if( attr & signable_e )
                {
*************** cbl_field_t::report_invalid_initial_valu
*** 1059,1080 ****
                }
              // Pick up the given VALUE
              size_t candidate;
!             if( *data.initial == '-' ) {
                // We care about the magnitude, not the sign
                if( !(attr & signable_e) ){
                  error_msg(loc, "integer type %s VALUE '%s' "
                           "requires a non-negative integer",
!                          name, data.initial);
                }
!               candidate = atoll(data.initial+1);
              }
              else {
!               candidate = (size_t)atoll(data.initial);
              }
              if( candidate > max_possible_value ) {
                error_msg(loc, "integer type %s VALUE '%s' "
                         "requires an integer of magnitude no greater than %zu",
!                        name, data.initial, max_possible_value);
              }
            }
          }
--- 1903,1924 ----
                }
              // Pick up the given VALUE
              size_t candidate;
!             if( *orig == '-' ) {
                // We care about the magnitude, not the sign
                if( !(attr & signable_e) ){
                  error_msg(loc, "integer type %s VALUE '%s' "
                           "requires a non-negative integer",
!                          name, orig);
                }
!               candidate = atoll(orig+1);
              }
              else {
!               candidate = (size_t)atoll(orig);
              }
              if( candidate > max_possible_value ) {
                error_msg(loc, "integer type %s VALUE '%s' "
                         "requires an integer of magnitude no greater than %zu",
!                        name, orig, max_possible_value);
              }
            }
          }
*************** cbl_field_t::report_invalid_initial_valu
*** 1087,1093 ****
          /*
           * Check fraction for excess precision
           */
!         const char *p = strchr(data.initial, symbol_decimal_point());
          if( p ) {
            auto pend = std::find(p, p + strlen(p), 0x20);
            int n = std::count_if( ++p, pend, isdigit );
--- 1931,1937 ----
          /*
           * Check fraction for excess precision
           */
!         const char *p = strchr(orig, symbol_decimal_point());
          if( p ) {
            auto pend = std::find(p, p + strlen(p), 0x20);
            int n = std::count_if( ++p, pend, isdigit );
*************** cbl_field_t::report_invalid_initial_valu
*** 1095,1101 ****
            if( data.precision() < n) {
              if( 0 == data.rdigits ) {
                error_msg(loc, "integer type %s VALUE '%s' requires integer VALUE",
!                        name, data.initial);
              } else {
                auto has_exponent = std::any_of( p, pend,
                                                 []( char ch ) {
--- 1939,1945 ----
            if( data.precision() < n) {
              if( 0 == data.rdigits ) {
                error_msg(loc, "integer type %s VALUE '%s' requires integer VALUE",
!                        name, orig);
              } else {
                auto has_exponent = std::any_of( p, pend,
                                                 []( char ch ) {
*************** cbl_field_t::report_invalid_initial_valu
*** 1103,1157 ****
                                                 } );
                if( !has_exponent && data.precision() < pend - p ) {
                  error_msg(loc, "%s cannot represent VALUE %qs exactly (max %c%ld)",
!                           name, data.initial, '.', (long)(pend - p));
                }
              }
            }
          } else {
!           p = data.initial + strlen(data.initial);
          }
  
          /*
           * Check magnitude, whether or not there's a decimal point.
           */
          // skip leading zeros
!         auto first_digit = std::find_if( data.initial, p,
                                           []( char ch ) {
                                             return ch != '0'; } );
          // count remaining digits, up to the decimal point
          auto n = std::count_if( first_digit, p, isdigit );
          if( data.ldigits() < n ) {
            error_msg(loc, "numeric %s VALUE '%s' holds only %u digits",
!                    name, data.initial,
                     data.digits);
          }
        }
        break;
!     } // end type switch for normal string initial value
!     return;
    } // end numeric
    assert( ! is_numeric(type) );
  
    // consider all-alphabetic
    if( has_attr(all_alpha_e) ) {
!     bool alpha_value = fig != zero_value_e;
!     
!     if( fig == normal_value_e ) {
!       alpha_value = std::none_of( data.initial,
!                                   data.initial +
!                                   data.capacity,
!                                   []( char ch ) {
!                                     return 
!                                       ISPUNCT(ch) ||
!                                       ISDIGIT(ch); } );
      }
!     if( ! alpha_value ) {
        error_msg(loc, "alpha-only %s VALUE '%s' contains non-alphabetic data",
!                name, fig == zero_value_e? cbl_figconst_str(fig) : data.initial);
      }
    }
  
!   return;
  }
  
  // Return the field representing the subscript whose literal value
--- 1947,2034 ----
                                                 } );
                if( !has_exponent && data.precision() < pend - p ) {
                  error_msg(loc, "%s cannot represent VALUE %qs exactly (max %c%ld)",
!                           name, orig, '.', (long)(pend - p));
                }
              }
            }
          } else {
!           p = orig + strlen(orig);
          }
  
          /*
           * Check magnitude, whether or not there's a decimal point.
           */
          // skip leading zeros
!         auto first_digit = std::find_if( orig, p,
                                           []( char ch ) {
                                             return ch != '0'; } );
          // count remaining digits, up to the decimal point
          auto n = std::count_if( first_digit, p, isdigit );
          if( data.ldigits() < n ) {
            error_msg(loc, "numeric %s VALUE '%s' holds only %u digits",
!                    name, orig,
                     data.digits);
          }
        }
        break;
!     } // end type switch for normal string orig value
!     return nerr < parse_error_count();
    } // end numeric
    assert( ! is_numeric(type) );
  
    // consider all-alphabetic
    if( has_attr(all_alpha_e) ) {
!     bool is_alpha_only = fig != zero_value_e;
! 
!     if( fig == normal_value_e && ! has_attr(hex_encoded_e)) {
!       // Test the input, not the converted initial value
!       is_alpha_only = std::none_of( orig, orig + strlen(orig),
!                                     []( char ch ) {
!                                       return
!                                         ISPUNCT(ch) ||
!                                         ISDIGIT(ch); } );
      }
!     /*
!      * This is overspecific: It catches numeric literal VALUE for all_alpha_e\
!      *  only.
!      * The general error is: 
!      * - alphanumeric type
!      * - data.initial is all spaces (based on PICTURE)
!      * - data.original() is numeric or data.etc_type == value_e
!      * - quoted_e clear, of course
!      * 
!      * This happens because VALUE was captured as a cce and stored in
!      * data.original for encode_numeric.  But encode_numeric was never called
!      * because it's not a numeric field.
!      *
!      * It is also insufficient.  It does not deal with VALUE LENGTH OF.  
!      */
!     if( is_alpha_only ) {
!       charmap_t *charmap = __gg__get_charmap(codeset.encoding);
!       auto spc = charmap->mapped_character(ascii_space);
!       bool spacey = std::all_of( data.initial,
!                                  data.initial + char_capacity(),
!              [spc]( char ch ) { return static_cast<cbl_char_t>(ch) == spc; } );
!       if( spacey ) {
!         if( ISDIGIT(orig[0]) || orig[0] == '-' || orig[0] == '+' ) {
!           gcc_assert( ! has_attr(quoted_e) );
!           is_alpha_only = false; // alpha field supplied with VALUE numeric
!         }
!       }
!     }
!     
!     if( ! is_alpha_only ) {
        error_msg(loc, "alpha-only %s VALUE '%s' contains non-alphabetic data",
!                name, fig == zero_value_e? cbl_figconst_str(fig) : orig);
!       
!       auto pend = orig + strlen(orig);
!       auto p = std::find_if( orig, pend, 
!                              []( char ch ) { return ! ISALPHA(ch); } );
!       dbgmsg("%zu nonalpha '%.*s'", pend - p, int(pend - p), p);
      }
    }
  
!   return nerr < parse_error_count();
  }
  
  // Return the field representing the subscript whose literal value
*************** valid_move( const struct cbl_field_t *tg
*** 1344,1358 ****
      case 0:
        if( src->type == FldLiteralA && is_numericish(tgt) && !is_literal(tgt) ) {
          // Allow if input string is an integer.
!         size_t outcount;
!         char *in_ascii = static_cast<char *>(xmalloc(4 * src->data.capacity));
!         const char *in_asciip = __gg__iconverter( src->codeset.encoding,
!                                                   DEFAULT_SOURCE_ENCODING,
!                                                   src->data.initial,
!                                                   src->data.capacity,
!                                                   &outcount );
!         memcpy(in_ascii, in_asciip, outcount);
!         const char *p = in_ascii, *pend = p + src->data.capacity;
          if( (p[0] == ascii_plus) || (p[0] == ascii_minus) ) p++;
          retval = std::all_of( p, pend, isdigit );
          if( yydebug && ! retval ) {
--- 2221,2227 ----
      case 0:
        if( src->type == FldLiteralA && is_numericish(tgt) && !is_literal(tgt) ) {
          // Allow if input string is an integer.
!         const char *p = src->data.original(), *pend = p + strlen(src->data.original());
          if( (p[0] == ascii_plus) || (p[0] == ascii_minus) ) p++;
          retval = std::all_of( p, pend, isdigit );
          if( yydebug && ! retval ) {
*************** valid_move( const struct cbl_field_t *tg
*** 1362,1368 ****
                   HOST_SIZE_T_PRINT_UNSIGNED,
                   __func__, __LINE__, *bad, (fmt_size_t)(bad - p));
          }
-       free(in_ascii);
        }
        break;
      case 1:
--- 2231,2236 ----
*************** valid_move( const struct cbl_field_t *tg
*** 1388,1394 ****
      }
  
    if( retval && src->has_attr(embiggened_e) ) {
!     if( is_numeric(tgt) && tgt->data.capacity < src->data.capacity ) {
        dbgmsg("error: source no longer fits in target");
        return false;
      }
--- 2256,2262 ----
      }
  
    if( retval && src->has_attr(embiggened_e) ) {
!     if( is_numeric(tgt) && tgt->data.capacity() < src->data.capacity() ) {
        dbgmsg("error: source no longer fits in target");
        return false;
      }
*************** type_capacity( enum cbl_field_type_t typ
*** 1484,1490 ****
  
      auto psize = std::find_if( sizes, esizes,
  			  [digits]( sizes_t sizes ) {
! 			    return sizes.bounds.first <= digits && digits <= sizes.bounds.second;
  			  } );
      if( psize != esizes ) return psize->size;
  
--- 2352,2359 ----
  
      auto psize = std::find_if( sizes, esizes,
  			  [digits]( sizes_t sizes ) {
! 			    return sizes.bounds.first <= digits
!                                                       && digits <= sizes.bounds.second;
  			  } );
      if( psize != esizes ) return psize->size;
  
*************** cobol_filename_restore() {
*** 2129,2144 ****
    linemap_add(line_table, LC_LEAVE, sysp, NULL, 0);
  }
  
! size_t
  symbol_unique_index( const struct symbol_elem_t *e ) {
    assert(e);
!   size_t usym = symbol_index(e);
! #if READY_FOR_INODE
    if( ! input_filenames.empty() ) {
!     size_t inode = input_filenames.top().inode;
!     usym = usym ^ inode;
    }
- #endif
    return usym;
  }
  
--- 2998,3013 ----
    linemap_add(line_table, LC_LEAVE, sysp, NULL, 0);
  }
  
! uint64_t
  symbol_unique_index( const struct symbol_elem_t *e ) {
    assert(e);
!   uint64_t usym = symbol_index(e);
    if( ! input_filenames.empty() ) {
!     uint64_t inode = input_filenames.top().inode;
!     static const int half_bits = sizeof(uint64_t)*4;
!     usym ^= inode>>half_bits;
!     usym ^= inode<<half_bits;
    }
    return usym;
  }
  
*************** verify_format( const char gmsgid[] ) {
*** 2227,2233 ****
  #endif
  
  static const diagnostics::option_id option_zero;
- size_t parse_error_inc();
  
  void gcc_location_dump() {
      linemap_dump_location( line_table, token_location, stderr );
--- 3096,3101 ----
*************** cbl_unimplementedw(cbl_diag_id_t id, con
*** 2567,2573 ****
      msg = xasprintf("%s [%s]", gmsgid, option);
      gmsgid = msg;
    }
!  
    va_list ap;
  
    va_start(ap, gmsgid);
--- 3435,3441 ----
      msg = xasprintf("%s [%s]", gmsgid, option);
      gmsgid = msg;
    }
! 
    va_list ap;
  
    va_start(ap, gmsgid);
diff -Nrcpad gcc-16-20260111/gcc/combine.cc gcc-16-20260118/gcc/combine.cc
*** gcc-16-20260111/gcc/combine.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/combine.cc	Sun Jan 18 22:32:06 2026
*************** recog_for_combine (rtx *pnewpat, rtx_ins
*** 11759,11765 ****
        rtx src = SET_SRC (pat);
        if (CONSTANT_P (src)
  	  && !CONST_INT_P (src)
! 	  && crtl->uses_const_pool)
  	{
  	  machine_mode mode = GET_MODE (src);
  	  if (mode == VOIDmode)
--- 11759,11766 ----
        rtx src = SET_SRC (pat);
        if (CONSTANT_P (src)
  	  && !CONST_INT_P (src)
! 	  && crtl->uses_const_pool
! 	  && SET_DEST (pat) != pc_rtx)
  	{
  	  machine_mode mode = GET_MODE (src);
  	  if (mode == VOIDmode)
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64-simd.md gcc-16-20260118/gcc/config/aarch64/aarch64-simd.md
*** gcc-16-20260111/gcc/config/aarch64/aarch64-simd.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64-simd.md	Sun Jan 18 22:32:06 2026
***************
*** 18,23 ****
--- 18,41 ----
  ;; along with GCC; see the file COPYING3.  If not see
  ;; <http://www.gnu.org/licenses/>.
  
+ ;; Code organisation:
+ ;
+ ;; The lines of is an instruction is aarch64, simd, sve, sve2, or sme are
+ ;; a little blurry.
+ ;;
+ ;; Therefore code is organised by the following rough principles:
+ ;;
+ ;; - aarch64.md: For shared parts of the architecture (such as defining
+ ;;     registers and constants) and for instructions that operate on non-SIMD
+ ;;     registers.
+ ;; - aarch64-simd.md: For instructions that operate on non-scaling SIMD
+ ;;     registers.
+ ;; - aarch64-sve.md for SVE instructions that are pre SVE2.
+ ;; - aarch64-sme.md for any scalable SIMD instruction that is incompatible with
+ ;;     non-streaming mode. This usually means it uses the ZA or ZT register.
+ ;; - aarch64-sve2.md for any scalable SIMD instruction that either is
+ ;;     streaming compatible, or theoretically could be later.
+ 
  ;; The following define_subst rules are used to produce patterns representing
  ;; the implicit zeroing effect of 64-bit Advanced SIMD operations, in effect
  ;; a vec_concat with zeroes.  The order of the vec_concat operands differs
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64-sme.md gcc-16-20260118/gcc/config/aarch64/aarch64-sme.md
*** gcc-16-20260111/gcc/config/aarch64/aarch64-sme.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64-sme.md	Sun Jan 18 22:32:06 2026
***************
*** 17,22 ****
--- 17,40 ----
  ;; along with GCC; see the file COPYING3.  If not see
  ;; <http://www.gnu.org/licenses/>.
  
+ ;; Code organisation:
+ ;
+ ;; The lines of is an instruction is aarch64, simd, sve, sve2, or sme are
+ ;; a little blurry.
+ ;;
+ ;; Therefore code is organised by the following rough principles:
+ ;;
+ ;; - aarch64.md: For shared parts of the architecture (such as defining
+ ;;     registers and constants) and for instructions that operate on non-SIMD
+ ;;     registers.
+ ;; - aarch64-simd.md: For instructions that operate on non-scaling SIMD
+ ;;     registers.
+ ;; - aarch64-sve.md for SVE instructions that are pre SVE2.
+ ;; - aarch64-sme.md for any scalable SIMD instruction that is incompatible with
+ ;;     non-streaming mode. This usually means it uses the ZA or ZT register.
+ ;; - aarch64-sve2.md for any scalable SIMD instruction that either is
+ ;;     streaming compatible, or theoretically could be later.
+ 
  ;; The file is organised into the following sections (search for the full
  ;; line):
  ;;
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64-sve-builtins-base.def gcc-16-20260118/gcc/config/aarch64/aarch64-sve-builtins-base.def
*** gcc-16-20260111/gcc/config/aarch64/aarch64-sve-builtins-base.def	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64-sve-builtins-base.def	Sun Jan 18 22:32:06 2026
***************
*** 17,22 ****
--- 17,39 ----
     along with GCC; see the file COPYING3.  If not see
     <http://www.gnu.org/licenses/>.  */
  
+ /* Code organisation:
+ 
+    The lines defining if an intrinsic is for sve, sve2, sme, and sme2 can get
+    a little blurry.
+ 
+    Therefore code is organised by the following rough principles:
+ 
+    - aarch64-sve-builtins-sme.def for any intrinsic that is fundamentally
+      incompatible with non-streaming mode. This usually means it uses the ZA
+      or ZT register.
+    - aarch64-sve-builtins-sve2.def for any intrinsic that that is a streaming mode
+      intrinsic, but either is non-streaming compatible, or theoretically could
+      be later.
+    - aarch64-sve-builtins-base.def for SVE intrinsics that are pre SVE2.
+    - aarch64-sve-builtins.def for common data types and group definitions used
+      across all files.  */
+ 
  #define REQUIRED_EXTENSIONS ssve (0)
  DEF_SVE_FUNCTION (svabd, binary_opt_n, all_arith, mxz)
  DEF_SVE_FUNCTION (svabs, unary, all_float_and_signed, mxz)
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64-sve-builtins-sme.def gcc-16-20260118/gcc/config/aarch64/aarch64-sve-builtins-sme.def
*** gcc-16-20260111/gcc/config/aarch64/aarch64-sve-builtins-sme.def	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64-sve-builtins-sme.def	Sun Jan 18 22:32:06 2026
***************
*** 17,22 ****
--- 17,38 ----
     along with GCC; see the file COPYING3.  If not see
     <http://www.gnu.org/licenses/>.  */
  
+ /* Code organisation:
+ 
+    The lines defining if an intrinsic is for sve, sve2, sme, and sme2 can get
+    a little blurry.
+ 
+    Therefore code is organised by the following rough principles:
+ 
+    - aarch64-sve-builtins-sme.def for any intrinsic that is fundamentally
+      incompatible with non-streaming mode. This usually means it uses the ZA
+      or ZT register.
+    - aarch64-sve-builtins-sve2.def for any intrinsic that that is a streaming mode
+      intrinsic, but either is non-streaming compatible, or theoretically could
+      be later.
+    - aarch64-sve-builtins-base.def for SVE intrinsics that are pre SVE2.
+    - aarch64-sve-builtins.def for common data types and group definitions used
+      across all files.  */
  
  #ifndef DEF_SME_FUNCTION_GS
  #define DEF_SME_FUNCTION_GS(NAME, SHAPE, TYPES, GROUPS, PREDS) \
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64-sve-builtins-sve2.def gcc-16-20260118/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
*** gcc-16-20260111/gcc/config/aarch64/aarch64-sve-builtins-sve2.def	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64-sve-builtins-sve2.def	Sun Jan 18 22:32:06 2026
***************
*** 17,22 ****
--- 17,39 ----
     along with GCC; see the file COPYING3.  If not see
     <http://www.gnu.org/licenses/>.  */
  
+ /* Code organisation:
+ 
+    The lines defining if an intrinsic is for sve, sve2, sme, and sme2 can get
+    a little blurry.
+ 
+    Therefore code is organised by the following rough principles:
+ 
+    - aarch64-sve-builtins-sme.def for any intrinsic that is fundamentally
+      incompatible with non-streaming mode. This usually means it uses the ZA
+      or ZT register.
+    - aarch64-sve-builtins-sve2.def for any intrinsic that that is a streaming mode
+      intrinsic, but either is non-streaming compatible, or theoretically could
+      be later.
+    - aarch64-sve-builtins-base.def for SVE intrinsics that are pre SVE2.
+    - aarch64-sve-builtins.def for common data types and group definitions used
+      across all files.  */
+ 
  #define REQUIRED_EXTENSIONS sve_and_sme (AARCH64_FL_SVE2, 0)
  DEF_SVE_FUNCTION (svaba, ternary_opt_n, all_integer, none)
  DEF_SVE_FUNCTION (svabalb, ternary_long_opt_n, hsd_integer, none)
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64-sve-builtins.def gcc-16-20260118/gcc/config/aarch64/aarch64-sve-builtins.def
*** gcc-16-20260111/gcc/config/aarch64/aarch64-sve-builtins.def	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64-sve-builtins.def	Sun Jan 18 22:32:06 2026
***************
*** 17,22 ****
--- 17,39 ----
     along with GCC; see the file COPYING3.  If not see
     <http://www.gnu.org/licenses/>.  */
  
+ /* Code organisation:
+ 
+    The lines defining if an intrinsic is for sve, sve2, sme, and sme2 can get
+    a little blurry.
+ 
+    Therefore code is organised by the following rough principles:
+ 
+    - aarch64-sve-builtins-sme.def for any intrinsic that is fundamentally
+      incompatible with non-streaming mode. This usually means it uses the ZA
+      or ZT register.
+    - aarch64-sve-builtins-sve2.def for any intrinsic that that is a streaming mode
+      intrinsic, but either is non-streaming compatible, or theoretically could
+      be later.
+    - aarch64-sve-builtins-base.def for SVE intrinsics that are pre SVE2.
+    - aarch64-sve-builtins.def for common data types and group definitions used
+      across all files.  */
+ 
  #ifndef DEF_SVE_MODE
  #define DEF_SVE_MODE(A, B, C, D)
  #endif
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64-sve.md gcc-16-20260118/gcc/config/aarch64/aarch64-sve.md
*** gcc-16-20260111/gcc/config/aarch64/aarch64-sve.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64-sve.md	Sun Jan 18 22:32:06 2026
***************
*** 18,23 ****
--- 18,41 ----
  ;; along with GCC; see the file COPYING3.  If not see
  ;; <http://www.gnu.org/licenses/>.
  
+ ;; Code organisation:
+ ;
+ ;; The lines of is an instruction is aarch64, simd, sve, sve2, or sme are
+ ;; a little blurry.
+ ;;
+ ;; Therefore code is organised by the following rough principles:
+ ;;
+ ;; - aarch64.md: For shared parts of the architecture (such as defining
+ ;;     registers and constants) and for instructions that operate on non-SIMD
+ ;;     registers.
+ ;; - aarch64-simd.md: For instructions that operate on non-scaling SIMD
+ ;;     registers.
+ ;; - aarch64-sve.md for SVE instructions that are pre SVE2.
+ ;; - aarch64-sme.md for any scalable SIMD instruction that is incompatible with
+ ;;     non-streaming mode. This usually means it uses the ZA or ZT register.
+ ;; - aarch64-sve2.md for any scalable SIMD instruction that either is
+ ;;     streaming compatible, or theoretically could be later.
+ 
  ;; The file is organised into the following sections (search for the full
  ;; line):
  ;;
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64-sve2.md gcc-16-20260118/gcc/config/aarch64/aarch64-sve2.md
*** gcc-16-20260111/gcc/config/aarch64/aarch64-sve2.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64-sve2.md	Sun Jan 18 22:32:06 2026
***************
*** 17,22 ****
--- 17,40 ----
  ;; You should have received a copy of the GNU General Public License
  ;; along with GCC; see the file COPYING3.  If not see
  ;; <http://www.gnu.org/licenses/>.
+ ; 
+ ;; Code organisation:
+ ;
+ ;; The lines of is an instruction is aarch64, simd, sve, sve2, or sme are
+ ;; a little blurry.
+ ;;
+ ;; Therefore code is organised by the following rough principles:
+ ;;
+ ;; - aarch64.md: For shared parts of the architecture (such as defining
+ ;;     registers and constants) and for instructions that operate on non-SIMD
+ ;;     registers.
+ ;; - aarch64-simd.md: For instructions that operate on non-scaling SIMD
+ ;;     registers.
+ ;; - aarch64-sve.md for SVE instructions that are pre SVE2.
+ ;; - aarch64-sme.md for any scalable SIMD instruction that is incompatible with
+ ;;     non-streaming mode. This usually means it uses the ZA or ZT register.
+ ;; - aarch64-sve2.md for any scalable SIMD instruction that either is
+ ;;     streaming compatible, or theoretically could be later.
  
  ;; The file is organised into the following sections (search for the full
  ;; line):
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64.cc gcc-16-20260118/gcc/config/aarch64/aarch64.cc
*** gcc-16-20260111/gcc/config/aarch64/aarch64.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64.cc	Sun Jan 18 22:32:06 2026
*************** aarch64_move_imm (unsigned HOST_WIDE_INT
*** 4915,4920 ****
--- 4915,4940 ----
  }
  
  
+ /* Return true is VAL is a move immediate that can be created by add/sub of the
+    12-bit shifted immediate VAL2.  If GENERATE is true, emit the sequence.  */
+ static inline bool
+ aarch64_check_mov_add_imm12 (rtx dest, unsigned HOST_WIDE_INT val,
+ 			     unsigned HOST_WIDE_INT val2, bool generate)
+ {
+   if (!aarch64_move_imm (val - val2, DImode))
+     {
+       val2 = val2 < 0x1000000 ? val2 - 0x1000000 : val2 + 0x1000000;
+       if (!aarch64_move_imm (val - val2, DImode))
+ 	return false;
+     }
+   if (generate)
+     {
+       emit_insn (gen_rtx_SET (dest, GEN_INT (val - val2)));
+       emit_insn (gen_adddi3 (dest, dest, GEN_INT (val2)));
+     }
+   return true;
+ }
+ 
  static int
  aarch64_internal_mov_immediate (rtx dest, rtx imm, bool generate,
  				machine_mode mode)
*************** aarch64_internal_mov_immediate (rtx dest
*** 5003,5008 ****
--- 5023,5036 ----
  	    }
  	  return 2;
  	}
+ 
+       /* Try a mov/bitmask immediate with a shifted add/sub.  */
+       val2 = val & 0xfff000;
+       val3 = val2 - ((val >> 32) & 0xfff000);
+       if (aarch64_check_mov_add_imm12 (dest, val, val2, generate)
+ 	  || aarch64_check_mov_add_imm12 (dest, val, val2 - 0xfff000, generate)
+ 	  || aarch64_check_mov_add_imm12 (dest, val, val3, generate))
+ 	return 2;
      }
  
    /* Try a bitmask plus 2 movk to generate the immediate in 3 instructions.  */
*************** aarch64_internal_mov_immediate (rtx dest
*** 5073,5079 ****
        if (generate)
  	emit_insn (gen_insv_immdi (dest, GEN_INT (i),
  				   GEN_INT ((val >> i) & 0xffff)));
!       num_insns ++;
      }
  
    return num_insns;
--- 5101,5107 ----
        if (generate)
  	emit_insn (gen_insv_immdi (dest, GEN_INT (i),
  				   GEN_INT ((val >> i) & 0xffff)));
!       num_insns++;
      }
  
    return num_insns;
*************** aarch64_select_rtx_section (machine_mode
*** 14287,14292 ****
--- 14315,14324 ----
    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);
  }
  
*************** aarch64_rtx_costs (rtx x, machine_mode m
*** 15241,15251 ****
  	    *cost += extra_cost->fp[mode == DFmode || mode == DDmode].fpconst;
  	  else if (!aarch64_float_const_zero_rtx_p (x))
  	    {
! 	      /* This will be a load from memory.  */
  	      if (mode == DFmode || mode == DDmode)
! 		*cost += extra_cost->ldst.loadd;
  	      else
! 		*cost += extra_cost->ldst.loadf;
  	    }
  	  else
  	    /* Otherwise this is +0.0.  We get this using MOVI d0, #0
--- 15273,15285 ----
  	    *cost += extra_cost->fp[mode == DFmode || mode == DDmode].fpconst;
  	  else if (!aarch64_float_const_zero_rtx_p (x))
  	    {
! 	      /* Load from constdata - the cost of CONST_DOUBLE should be
! 		 higher than the cost of a MEM so that later optimizations
! 		 won't deoptimize an anchor load into a non-anchor load.  */
  	      if (mode == DFmode || mode == DDmode)
! 		*cost += extra_cost->ldst.loadd + 1;
  	      else
! 		*cost += extra_cost->ldst.loadf + 1;
  	    }
  	  else
  	    /* Otherwise this is +0.0.  We get this using MOVI d0, #0
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/aarch64.md gcc-16-20260118/gcc/config/aarch64/aarch64.md
*** gcc-16-20260111/gcc/config/aarch64/aarch64.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/aarch64.md	Sun Jan 18 22:32:06 2026
***************
*** 18,23 ****
--- 18,41 ----
  ;; along with GCC; see the file COPYING3.  If not see
  ;; <http://www.gnu.org/licenses/>.
  
+ ;; Code organisation:
+ ;
+ ;; The lines of is an instruction is aarch64, simd, sve, sve2, or sme are
+ ;; a little blurry.
+ ;;
+ ;; Therefore code is organised by the following rough principles:
+ ;;
+ ;; - aarch64.md: For shared parts of the architecture (such as defining
+ ;;     registers and constants) and for instructions that operate on non-SIMD
+ ;;     registers.
+ ;; - aarch64-simd.md: For instructions that operate on non-scaling SIMD
+ ;;     registers.
+ ;; - aarch64-sve.md for SVE instructions that are pre SVE2.
+ ;; - aarch64-sme.md for any scalable SIMD instruction that is incompatible with
+ ;;     non-streaming mode. This usually means it uses the ZA or ZT register.
+ ;; - aarch64-sve2.md for any scalable SIMD instruction that either is
+ ;;     streaming compatible, or theoretically could be later.
+ 
  ;; Register numbers
  (define_constants
    [
***************
*** 1960,1965 ****
--- 1978,1995 ----
  	emit_move_insn (operands[0], gen_lowpart (<MODE>mode, tmp));
  	DONE;
        }
+ 
+     /* Expand into a literal load using anchors.  */
+     if (GET_CODE (operands[1]) == CONST_DOUBLE
+ 	&& !aarch64_can_const_movi_rtx_p (operands[1], <MODE>mode)
+ 	&& !aarch64_float_const_representable_p (operands[1])
+ 	&& !aarch64_float_const_zero_rtx_p (operands[1])
+ 	&& !aarch64_float_const_rtx_p (operands[1]))
+       {
+ 	operands[1] = force_const_mem (<MODE>mode, operands[1]);
+ 	emit_move_insn (operands[0], operands[1]);
+ 	DONE;
+       }
    }
  )
  
diff -Nrcpad gcc-16-20260111/gcc/config/aarch64/cygming.h gcc-16-20260118/gcc/config/aarch64/cygming.h
*** gcc-16-20260111/gcc/config/aarch64/cygming.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/aarch64/cygming.h	Sun Jan 18 22:32:06 2026
*************** still needed for compilation.  */
*** 261,271 ****
     "%{!E:%{!M:%{!MM:windres -J rc -O coff -F pe-aarch64 \
        %{I*:-I%*} %{D*:-D%*} %{U*:-U%*} \
        %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
!    0, 0, 0}, \
    {".res", "@windres-res", 0, 0, 0}, \
    {"@windres-res", \
     "%{!E:%{!M:%{!MM:windres -J res -O coff -F pe-aarch64 \
        %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
!    0, 0, 0},
  
  #endif
--- 261,275 ----
     "%{!E:%{!M:%{!MM:windres -J rc -O coff -F pe-aarch64 \
        %{I*:-I%*} %{D*:-D%*} %{U*:-U%*} \
        %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
!    0, 0, 0}, /*
    {".res", "@windres-res", 0, 0, 0}, \
    {"@windres-res", \
     "%{!E:%{!M:%{!MM:windres -J res -O coff -F pe-aarch64 \
        %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
!    0, 0, 0}, */
! 
! /* For now, do not handle .res because some packages pass
! COFF files named .res to gcc directly, expecting them to
! be passed to the linker, not windres. See PR123504.  */
  
  #endif
diff -Nrcpad gcc-16-20260111/gcc/config/darwin.opt.urls gcc-16-20260118/gcc/config/darwin.opt.urls
*** gcc-16-20260111/gcc/config/darwin.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/darwin.opt.urls	Sun Jan 18 22:32:06 2026
*************** UrlSuffix(gcc/Darwin-Options.html#index-
*** 153,158 ****
--- 153,159 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
  rdynamic
  UrlSuffix(gcc/Link-Options.html#index-rdynamic)
diff -Nrcpad gcc-16-20260111/gcc/config/dragonfly.opt.urls gcc-16-20260118/gcc/config/dragonfly.opt.urls
*** gcc-16-20260111/gcc/config/dragonfly.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/dragonfly.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/Instrumentation-Options.ht
*** 6,11 ****
--- 6,12 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
  rdynamic
  UrlSuffix(gcc/Link-Options.html#index-rdynamic)
diff -Nrcpad gcc-16-20260111/gcc/config/freebsd.opt.urls gcc-16-20260118/gcc/config/freebsd.opt.urls
*** gcc-16-20260111/gcc/config/freebsd.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/freebsd.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/Instrumentation-Options.ht
*** 6,11 ****
--- 6,12 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
  rdynamic
  UrlSuffix(gcc/Link-Options.html#index-rdynamic)
diff -Nrcpad gcc-16-20260111/gcc/config/gnu-user.opt.urls gcc-16-20260118/gcc/config/gnu-user.opt.urls
*** gcc-16-20260111/gcc/config/gnu-user.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/gnu-user.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/Instrumentation-Options.ht
*** 6,11 ****
--- 6,12 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
  rdynamic
  UrlSuffix(gcc/Link-Options.html#index-rdynamic)
diff -Nrcpad gcc-16-20260111/gcc/config/host-freebsd.cc gcc-16-20260118/gcc/config/host-freebsd.cc
*** gcc-16-20260111/gcc/config/host-freebsd.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/config/host-freebsd.cc	Sun Jan 18 22:32:07 2026
***************
*** 0 ****
--- 1,95 ----
+ /* FreeBSD host-specific hook definitions.
+    Copyright (C) 2004-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.
+ 
+    You should have received a copy of the GNU General Public License
+    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 "hosthooks.h"
+ #include "hosthooks-def.h"
+ 
+ 
+ #undef HOST_HOOKS_GT_PCH_GET_ADDRESS
+ #define HOST_HOOKS_GT_PCH_GET_ADDRESS freebsd_gt_pch_get_address
+ #undef HOST_HOOKS_GT_PCH_USE_ADDRESS
+ #define HOST_HOOKS_GT_PCH_USE_ADDRESS freebsd_gt_pch_use_address
+ 
+ /* For various ports, try to guess a fixed spot in the vm space
+    that's probably free.  */
+ #if defined(__amd64__)
+ # define TRY_EMPTY_VM_SPACE	0x400000000000
+ #else
+ # define TRY_EMPTY_VM_SPACE	0
+ #endif
+ 
+ /* Determine a location where we might be able to reliably allocate
+    SIZE bytes.  FD is the PCH file, though we should return with the
+    file unmapped.  */
+ 
+ static void *
+ freebsd_gt_pch_get_address (size_t size, int fd)
+ {
+   void *addr;
+ 
+   addr = mmap ((void *) TRY_EMPTY_VM_SPACE, size, PROT_READ | PROT_WRITE,
+ 	       MAP_PRIVATE, fd, 0);
+ 
+   /* If we failed the map, that means there's *no* free space.  */
+   if (addr == (void *) MAP_FAILED)
+     return NULL;
+   /* Unmap the area before returning.  */
+   munmap (addr, size);
+ 
+   return addr;
+ }
+ 
+ /* Map SIZE bytes of FD+OFFSET at BASE.  Return 1 if we succeeded at
+    mapping the data at BASE, -1 if we couldn't.  */
+ 
+ static int
+ freebsd_gt_pch_use_address (void *&base, size_t size, int fd, size_t offset)
+ {
+   void *addr;
+ 
+   /* We're called with size == 0 if we're not planning to load a PCH
+      file at all.  This allows the hook to free any static space that
+      we might have allocated at link time.  */
+   if (size == 0)
+     return -1;
+ 
+   addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset);
+ 
+   if (addr == base)
+     return 1;
+ 
+   if (addr != (void *) MAP_FAILED)
+     munmap(addr, size);
+ 
+   addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ 
+   if (addr == (void *) MAP_FAILED)
+     return -1;
+ 
+   /* Signal to the caller that whilst memory has been allocated, it
+      must read the PCH data */
+   base = addr;
+   return 0;
+ }
+ 
+ 
+ const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;
diff -Nrcpad gcc-16-20260111/gcc/config/hpux11.opt.urls gcc-16-20260118/gcc/config/hpux11.opt.urls
*** gcc-16-20260111/gcc/config/hpux11.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/hpux11.opt.urls	Sun Jan 18 22:32:07 2026
***************
*** 3,6 ****
--- 3,7 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
diff -Nrcpad gcc-16-20260111/gcc/config/i386/cygming.h gcc-16-20260118/gcc/config/i386/cygming.h
*** gcc-16-20260111/gcc/config/i386/cygming.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/cygming.h	Sun Jan 18 22:32:07 2026
*************** do {						\
*** 491,500 ****
        WINDRES_FORMAT_SPEC \
        "%{I*:-I%*} %{D*:-D%*} %{U*:-U%*} \
        %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
!    0, 0, 0}, \
    {".res", "@windres-res", 0, 0, 0}, \
    {"@windres-res", \
     "%{!E:%{!M:%{!MM:windres -J res -O coff " \
        WINDRES_FORMAT_SPEC \
        "%{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
!    0, 0, 0},
--- 491,504 ----
        WINDRES_FORMAT_SPEC \
        "%{I*:-I%*} %{D*:-D%*} %{U*:-U%*} \
        %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
!    0, 0, 0}, /* \
    {".res", "@windres-res", 0, 0, 0}, \
    {"@windres-res", \
     "%{!E:%{!M:%{!MM:windres -J res -O coff " \
        WINDRES_FORMAT_SPEC \
        "%{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} %i}}}", \
!    0, 0, 0}, */
! 
! /* For now, do not handle .res because some packages pass
! COFF files named .res to gcc directly, expecting them to
! be passed to the linker, not windres. See PR123504.  */
diff -Nrcpad gcc-16-20260111/gcc/config/i386/cygwin.opt.urls gcc-16-20260118/gcc/config/i386/cygwin.opt.urls
*** gcc-16-20260111/gcc/config/i386/cygwin.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/cygwin.opt.urls	Sun Jan 18 22:32:07 2026
***************
*** 3,6 ****
--- 3,7 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
diff -Nrcpad gcc-16-20260111/gcc/config/i386/i386.md gcc-16-20260118/gcc/config/i386/i386.md
*** gcc-16-20260111/gcc/config/i386/i386.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/i386.md	Sun Jan 18 22:32:07 2026
***************
*** 26998,27004 ****
    [(set (match_operand:HF 0 "nonimmediate_operand" "=v,m,v")
  	(unspec:HF
  	  [(match_operand:HF 1 "nonimmediate_operand" "m,v,v")
! 	   (match_operand:HF 2 "nonimm_or_0_operand" "0C,0C,0C")
  	   (match_operand:QI 3 "register_operand" "Yk,Yk,Yk")]
  	  UNSPEC_MOVCC_MASK))]
    "TARGET_AVX512FP16"
--- 26998,27004 ----
    [(set (match_operand:HF 0 "nonimmediate_operand" "=v,m,v")
  	(unspec:HF
  	  [(match_operand:HF 1 "nonimmediate_operand" "m,v,v")
! 	   (match_operand:HF 2 "nonimm_or_0_operand" "0C,0,0C")
  	   (match_operand:QI 3 "register_operand" "Yk,Yk,Yk")]
  	  UNSPEC_MOVCC_MASK))]
    "TARGET_AVX512FP16"
diff -Nrcpad gcc-16-20260111/gcc/config/i386/i386.opt gcc-16-20260118/gcc/config/i386/i386.opt
*** gcc-16-20260111/gcc/config/i386/i386.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/i386.opt	Sun Jan 18 22:32:07 2026
*************** malign-double
*** 225,240 ****
  Target Mask(ALIGN_DOUBLE) Save
  Align some doubles on dword boundary.
  
  malign-functions=
! Target RejectNegative Joined UInteger
  Function starts are aligned to this power of 2.
  
  malign-jumps=
! Target RejectNegative Joined UInteger
  Jump targets are aligned to this power of 2.
  
  malign-loops=
! Target RejectNegative Joined UInteger
  Loop code aligned to this power of 2.
  
  malign-stringops
--- 225,243 ----
  Target Mask(ALIGN_DOUBLE) Save
  Align some doubles on dword boundary.
  
+ ; Does nothing.
  malign-functions=
! Target Undocumented RejectNegative Joined UInteger
  Function starts are aligned to this power of 2.
  
+ ; Does nothing.
  malign-jumps=
! Target Undocumented RejectNegative Joined UInteger
  Jump targets are aligned to this power of 2.
  
+ ; Does nothing.
  malign-loops=
! Target Undocumented RejectNegative Joined UInteger
  Loop code aligned to this power of 2.
  
  malign-stringops
*************** EnumValue
*** 277,283 ****
  Enum(asm_dialect) String(att) Value(ASM_ATT)
  
  mbranch-cost=
! Target RejectNegative Joined UInteger Var(ix86_branch_cost) IntegerRange(0, 5)
  Branches are this expensive (arbitrary units).
  
  mlarge-data-threshold=
--- 280,286 ----
  Enum(asm_dialect) String(att) Value(ASM_ATT)
  
  mbranch-cost=
! Target Undocumented RejectNegative Joined UInteger Var(ix86_branch_cost) IntegerRange(0, 5)
  Branches are this expensive (arbitrary units).
  
  mlarge-data-threshold=
*************** mfancy-math-387
*** 328,335 ****
  Target RejectNegative InverseMask(NO_FANCY_MATH_387, USE_FANCY_MATH_387) Save
  Generate sin, cos, sqrt for FPU.
  
  mforce-drap
! Target Var(ix86_force_drap)
  Always use Dynamic Realigned Argument Pointer (DRAP) to realign stack.
  
  mfp-ret-in-387
--- 331,343 ----
  Target RejectNegative InverseMask(NO_FANCY_MATH_387, USE_FANCY_MATH_387) Save
  Generate sin, cos, sqrt for FPU.
  
+ ; This option seems deliberately undocumented as other options added in
+ ; the same commit were properly documented in the manual.
+ ; DRAP is usually used only in functions that do dynamic stack
+ ; allocation (e.g. alloca), this makes it happen everywhere.  Maybe it
+ ; was intended for debugging?
  mforce-drap
! Target Undocumented Var(ix86_force_drap)
  Always use Dynamic Realigned Argument Pointer (DRAP) to realign stack.
  
  mfp-ret-in-387
*************** the function.
*** 599,606 ****
  
  mstv
  Target Mask(STV) Save
! Disable Scalar to Vector optimization pass transforming 64-bit integer
! computations into a vector ones.
  
  -param=x86-stv-max-visits=
  Target Joined UInteger Var(x86_stv_max_visits) Init(10000) IntegerRange(1, 1000000) Param
--- 607,614 ----
  
  mstv
  Target Mask(STV) Save
! Enable Scalar to Vector optimization pass transforming 64-bit integer
! computations into vector ones.
  
  -param=x86-stv-max-visits=
  Target Joined UInteger Var(x86_stv_max_visits) Init(10000) IntegerRange(1, 1000000) Param
*************** Support MMX, SSE, SSE2, SSE3, SSSE3, SSE
*** 726,752 ****
  
  mavx512cd
  Target Mask(ISA_AVX512CD) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512CD built-in functions and code generation.
  
  mavx512dq
  Target Mask(ISA_AVX512DQ) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512DQ built-in functions and code generation.
  
  mavx512bw
  Target Mask(ISA_AVX512BW) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512BW built-in functions and code generation.
  
  mavx512vl
  Target Mask(ISA_AVX512VL) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512VL built-in functions and code generation.
  
  mavx512ifma
  Target Mask(ISA_AVX512IFMA) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512IFMA built-in functions and code generation.
  
  mavx512vbmi
  Target Mask(ISA_AVX512VBMI) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX512F and AVX512VBMI built-in functions and code generation.
  
  mavx512vpopcntdq
  Target Mask(ISA_AVX512VPOPCNTDQ) Var(ix86_isa_flags) Save
--- 734,760 ----
  
  mavx512cd
  Target Mask(ISA_AVX512CD) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512CD built-in functions and code generation.
  
  mavx512dq
  Target Mask(ISA_AVX512DQ) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512DQ built-in functions and code generation.
  
  mavx512bw
  Target Mask(ISA_AVX512BW) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512BW built-in functions and code generation.
  
  mavx512vl
  Target Mask(ISA_AVX512VL) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512VL built-in functions and code generation.
  
  mavx512ifma
  Target Mask(ISA_AVX512IFMA) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512IFMA built-in functions and code generation.
  
  mavx512vbmi
  Target Mask(ISA_AVX512VBMI) Var(ix86_isa_flags) Save
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and AVX512VBMI built-in functions and code generation.
  
  mavx512vpopcntdq
  Target Mask(ISA_AVX512VPOPCNTDQ) Var(ix86_isa_flags) Save
diff -Nrcpad gcc-16-20260111/gcc/config/i386/i386.opt.urls gcc-16-20260118/gcc/config/i386/i386.opt.urls
*** gcc-16-20260111/gcc/config/i386/i386.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/i386.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/x86-Options.html#index-mac
*** 24,29 ****
--- 24,31 ----
  malign-double
  UrlSuffix(gcc/x86-Options.html#index-malign-double)
  
+ ; skipping UrlSuffix for 'malign-functions=' due to finding no URLs
+ 
  ; skipping UrlSuffix for 'malign-loops=' due to finding no URLs
  
  malign-stringops
*************** malign-data=
*** 33,39 ****
  UrlSuffix(gcc/x86-Options.html#index-malign-data-1)
  
  march=
! UrlSuffix(gcc/x86-Options.html#index-march-14)
  
  ; skipping UrlSuffix for 'mbranch-cost=' due to finding no URLs
  
--- 35,41 ----
  UrlSuffix(gcc/x86-Options.html#index-malign-data-1)
  
  march=
! UrlSuffix(gcc/x86-Options.html#index-march-13)
  
  ; skipping UrlSuffix for 'mbranch-cost=' due to finding no URLs
  
*************** UrlSuffix(gcc/x86-Options.html#index-mla
*** 43,50 ****
  mcmodel=
  UrlSuffix(gcc/x86-Options.html#index-mcmodel_003d-7)
  
! mcpu=
! UrlSuffix(gcc/x86-Options.html#index-mcpu-14)
  
  mfancy-math-387
  UrlSuffix(gcc/x86-Options.html#index-mfancy-math-387)
--- 45,51 ----
  mcmodel=
  UrlSuffix(gcc/x86-Options.html#index-mcmodel_003d-7)
  
! ; skipping UrlSuffix for 'mcpu=' due to finding no URLs
  
  mfancy-math-387
  UrlSuffix(gcc/x86-Options.html#index-mfancy-math-387)
*************** UrlSuffix(gcc/x86-Options.html#index-mss
*** 128,133 ****
--- 129,137 ----
  mstackrealign
  UrlSuffix(gcc/x86-Options.html#index-mstackrealign)
  
+ mstack-arg-probe
+ UrlSuffix(gcc/x86-Options.html#index-mstack-arg-probe)
+ 
  ; skipping UrlSuffix for 'mstringop-strategy=' due to finding no URLs
  
  mtls-dialect=
*************** miamcu
*** 149,155 ****
  UrlSuffix(gcc/x86-Options.html#index-miamcu)
  
  mabi=
! UrlSuffix(gcc/x86-Options.html#index-mabi-7)
  
  mcall-ms2sysv-xlogues
  UrlSuffix(gcc/x86-Options.html#index-mcall-ms2sysv-xlogues)
--- 153,159 ----
  UrlSuffix(gcc/x86-Options.html#index-miamcu)
  
  mabi=
! UrlSuffix(gcc/x86-Options.html#index-mabi-8)
  
  mcall-ms2sysv-xlogues
  UrlSuffix(gcc/x86-Options.html#index-mcall-ms2sysv-xlogues)
*************** UrlSuffix(gcc/x86-Options.html#index-mcl
*** 172,177 ****
--- 176,187 ----
  mvzeroupper
  UrlSuffix(gcc/x86-Options.html#index-mvzeroupper)
  
+ mstv
+ UrlSuffix(gcc/x86-Options.html#index-mstv)
+ 
+ mdispatch-scheduler
+ UrlSuffix(gcc/x86-Options.html#index-mdispatch-scheduler)
+ 
  mprefer-avx128
  UrlSuffix(gcc/x86-Options.html#index-mprefer-avx128)
  
*************** mf16c
*** 401,413 ****
  UrlSuffix(gcc/x86-Options.html#index-mf16c)
  
  mfentry
! UrlSuffix(gcc/x86-Options.html#index-mfentry)
  
  mrecord-mcount
! UrlSuffix(gcc/x86-Options.html#index-mrecord-mcount)
  
  mnop-mcount
! UrlSuffix(gcc/x86-Options.html#index-mnop-mcount)
  
  mfentry-name=
  UrlSuffix(gcc/x86-Options.html#index-mfentry-name)
--- 411,423 ----
  UrlSuffix(gcc/x86-Options.html#index-mf16c)
  
  mfentry
! UrlSuffix(gcc/x86-Options.html#index-mfentry-1)
  
  mrecord-mcount
! UrlSuffix(gcc/x86-Options.html#index-mrecord-mcount-1)
  
  mnop-mcount
! UrlSuffix(gcc/x86-Options.html#index-mnop-mcount-1)
  
  mfentry-name=
  UrlSuffix(gcc/x86-Options.html#index-mfentry-name)
*************** mforce-indirect-call
*** 467,476 ****
  UrlSuffix(gcc/x86-Options.html#index-mforce-indirect-call)
  
  mindirect-branch=
! UrlSuffix(gcc/x86-Options.html#index-mindirect-branch)
  
  mfunction-return=
! UrlSuffix(gcc/x86-Options.html#index-mfunction-return)
  
  mindirect-branch-cs-prefix
  UrlSuffix(gcc/x86-Options.html#index-mindirect-branch-cs-prefix)
--- 477,486 ----
  UrlSuffix(gcc/x86-Options.html#index-mforce-indirect-call)
  
  mindirect-branch=
! UrlSuffix(gcc/x86-Options.html#index-mindirect-branch-1)
  
  mfunction-return=
! UrlSuffix(gcc/x86-Options.html#index-mfunction-return-1)
  
  mindirect-branch-cs-prefix
  UrlSuffix(gcc/x86-Options.html#index-mindirect-branch-cs-prefix)
*************** UrlSuffix(gcc/x86-Options.html#index-msh
*** 586,591 ****
--- 596,607 ----
  msm4
  UrlSuffix(gcc/x86-Options.html#index-msm4)
  
+ mgather
+ UrlSuffix(gcc/x86-Options.html#index-mgather)
+ 
+ mscatter
+ UrlSuffix(gcc/x86-Options.html#index-mscatter)
+ 
  mapxf
  UrlSuffix(gcc/x86-Options.html#index-mapxf)
  
diff -Nrcpad gcc-16-20260111/gcc/config/i386/mmx.md gcc-16-20260118/gcc/config/i386/mmx.md
*** gcc-16-20260111/gcc/config/i386/mmx.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/mmx.md	Sun Jan 18 22:32:07 2026
***************
*** 2061,2067 ****
  	(div:V4HF
  	  (match_operand:V4HF 1 "nonimmediate_operand")
  	  (match_operand:V4HF 2 "register_operand")))]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math"
  {
    rtx op2 = gen_reg_rtx (V8HFmode);
    rtx op1 = gen_reg_rtx (V8HFmode);
--- 2061,2068 ----
  	(div:V4HF
  	  (match_operand:V4HF 1 "nonimmediate_operand")
  	  (match_operand:V4HF 2 "register_operand")))]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL && ix86_partial_vec_fp_math
!   && TARGET_MMX_WITH_SSE"
  {
    rtx op2 = gen_reg_rtx (V8HFmode);
    rtx op1 = gen_reg_rtx (V8HFmode);
***************
*** 2896,2902 ****
     (match_operand:V4HF 1 "vector_operand")
     (match_operand:V4HF 2 "vector_operand")
     (match_operand:V4HF 3 "vector_operand")]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL"
  {
    rtx op3 = gen_reg_rtx (V8HFmode);
    rtx op2 = gen_reg_rtx (V8HFmode);
--- 2897,2904 ----
     (match_operand:V4HF 1 "vector_operand")
     (match_operand:V4HF 2 "vector_operand")
     (match_operand:V4HF 3 "vector_operand")]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL
!   && TARGET_MMX_WITH_SSE"
  {
    rtx op3 = gen_reg_rtx (V8HFmode);
    rtx op2 = gen_reg_rtx (V8HFmode);
***************
*** 2918,2924 ****
     (match_operand:V4HF 1 "vector_operand")
     (match_operand:V4HF 2 "vector_operand")
     (match_operand:V4HF 3 "vector_operand")]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL"
  {
    rtx op3 = gen_reg_rtx (V8HFmode);
    rtx op2 = gen_reg_rtx (V8HFmode);
--- 2920,2927 ----
     (match_operand:V4HF 1 "vector_operand")
     (match_operand:V4HF 2 "vector_operand")
     (match_operand:V4HF 3 "vector_operand")]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL
!   && TARGET_MMX_WITH_SSE"
  {
    rtx op3 = gen_reg_rtx (V8HFmode);
    rtx op2 = gen_reg_rtx (V8HFmode);
***************
*** 2939,2945 ****
    [(match_operand:V4HF 0 "register_operand")
     (match_operand:V4HF 1 "vector_operand")
     (match_operand:V4HF 2 "vector_operand")]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL"
  {
    rtx op2 = gen_reg_rtx (V8HFmode);
    rtx op1 = gen_reg_rtx (V8HFmode);
--- 2942,2949 ----
    [(match_operand:V4HF 0 "register_operand")
     (match_operand:V4HF 1 "vector_operand")
     (match_operand:V4HF 2 "vector_operand")]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL
!   && TARGET_MMX_WITH_SSE"
  {
    rtx op2 = gen_reg_rtx (V8HFmode);
    rtx op1 = gen_reg_rtx (V8HFmode);
***************
*** 2957,2963 ****
    [(match_operand:V4HF 0 "register_operand")
     (match_operand:V4HF 1 "vector_operand")
     (match_operand:V4HF 2 "vector_operand")]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL"
  {
    rtx op2 = gen_reg_rtx (V8HFmode);
    rtx op1 = gen_reg_rtx (V8HFmode);
--- 2961,2968 ----
    [(match_operand:V4HF 0 "register_operand")
     (match_operand:V4HF 1 "vector_operand")
     (match_operand:V4HF 2 "vector_operand")]
!   "TARGET_AVX512FP16 && TARGET_AVX512VL
!   && TARGET_MMX_WITH_SSE"
  {
    rtx op2 = gen_reg_rtx (V8HFmode);
    rtx op1 = gen_reg_rtx (V8HFmode);
diff -Nrcpad gcc-16-20260111/gcc/config/i386/sol2.h gcc-16-20260118/gcc/config/i386/sol2.h
*** gcc-16-20260111/gcc/config/i386/sol2.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/sol2.h	Sun Jan 18 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 59,71 ****
    " %{mx32:%e-mx32 is not supported on Solaris}"
  
  /* GNU as understands --32 and --64, but the native Solaris
!    assembler requires -xarch=generic or -xarch=generic64 instead.  */
  #if HAVE_GNU_AS
  #define ASM_CPU32_DEFAULT_SPEC "--32"
  #define ASM_CPU64_DEFAULT_SPEC "--64"
  #else
! #define ASM_CPU32_DEFAULT_SPEC "-xarch=generic"
! #define ASM_CPU64_DEFAULT_SPEC "-xarch=generic64"
  #endif
  
  #if !HAVE_GNU_AS
--- 59,71 ----
    " %{mx32:%e-mx32 is not supported on Solaris}"
  
  /* GNU as understands --32 and --64, but the native Solaris
!    assembler requires -m32 or -m64 instead.  */
  #if HAVE_GNU_AS
  #define ASM_CPU32_DEFAULT_SPEC "--32"
  #define ASM_CPU64_DEFAULT_SPEC "--64"
  #else
! #define ASM_CPU32_DEFAULT_SPEC "-m32"
! #define ASM_CPU64_DEFAULT_SPEC "-m64"
  #endif
  
  #if !HAVE_GNU_AS
diff -Nrcpad gcc-16-20260111/gcc/config/i386/winnt-utf8.manifest gcc-16-20260118/gcc/config/i386/winnt-utf8.manifest
*** gcc-16-20260111/gcc/config/i386/winnt-utf8.manifest	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/winnt-utf8.manifest	Sun Jan 18 22:32:07 2026
***************
*** 1,8 ****
  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
! <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
!   <application>
!     <windowsSettings>
!       <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
!     </windowsSettings>
!   </application>
  </assembly>
--- 1,11 ----
  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
! <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
!   <asmv3:application>
!     <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
!       <longPathAware>true</longPathAware>
!     </asmv3:windowsSettings>
!     <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">
!       <activeCodePage>UTF-8</activeCodePage>
!     </asmv3:windowsSettings>
!   </asmv3:application>
  </assembly>
diff -Nrcpad gcc-16-20260111/gcc/config/i386/x86-tune.def gcc-16-20260118/gcc/config/i386/x86-tune.def
*** gcc-16-20260111/gcc/config/i386/x86-tune.def	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/i386/x86-tune.def	Sun Jan 18 22:32:07 2026
*************** DEF_TUNE (X86_TUNE_FOUR_JUMP_LIMIT, "fou
*** 253,259 ****
  
  /* X86_TUNE_ALIGN_TIGHT_LOOPS: if false, tight loops are not aligned. */
  DEF_TUNE (X86_TUNE_ALIGN_TIGHT_LOOPS, "align_tight_loops",
! 	 ~(m_ZHAOXIN | m_CASCADELAKE | m_SKYLAKE_AVX512))
  
  /*****************************************************************************/
  /* Integer instruction selection tuning                                      */
--- 253,260 ----
  
  /* X86_TUNE_ALIGN_TIGHT_LOOPS: if false, tight loops are not aligned. */
  DEF_TUNE (X86_TUNE_ALIGN_TIGHT_LOOPS, "align_tight_loops",
! 	 ~(m_ZHAOXIN | m_CASCADELAKE | m_SKYLAKE_AVX512
! 	   | m_CORE_ATOM))
  
  /*****************************************************************************/
  /* Integer instruction selection tuning                                      */
diff -Nrcpad gcc-16-20260111/gcc/config/loongarch/loongarch.cc gcc-16-20260118/gcc/config/loongarch/loongarch.cc
*** gcc-16-20260111/gcc/config/loongarch/loongarch.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/loongarch/loongarch.cc	Sun Jan 18 22:32:07 2026
*************** loongarch_expand_vector_init_same (rtx t
*** 10436,10467 ****
  	}
      }
  
!   if (imode == GET_MODE (same))
!     temp = same;
!   else if (GET_MODE_SIZE (imode) >= UNITS_PER_WORD)
!     {
!       if (GET_CODE (same) == MEM)
! 	{
! 	  rtx reg_tmp = gen_reg_rtx (GET_MODE (same));
! 	  loongarch_emit_move (reg_tmp, same);
! 	  temp = simplify_gen_subreg (imode, reg_tmp, GET_MODE (reg_tmp), 0);
! 	}
!       else
! 	temp = simplify_gen_subreg (imode, same, GET_MODE (same), 0);
!     }
!   else
!     {
!       if (GET_CODE (same) == MEM)
! 	{
! 	  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 = lowpart_subreg (imode, same, GET_MODE (same));
!     }
! 
!   temp = force_reg (imode, temp);
  
    switch (vmode)
      {
--- 10436,10442 ----
  	}
      }
  
!   temp = force_reg (imode, same);
  
    switch (vmode)
      {
diff -Nrcpad gcc-16-20260111/gcc/config/loongarch/loongarch.md gcc-16-20260118/gcc/config/loongarch/loongarch.md
*** gcc-16-20260111/gcc/config/loongarch/loongarch.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/loongarch/loongarch.md	Sun Jan 18 22:32:07 2026
***************
*** 2382,2388 ****
    (unspec:DI [(const_int 0)]
      UNSPEC_LOAD_SYMBOL_OFFSET64)
    (clobber (match_operand:DI 2 "register_operand" "=&r,r"))]
!  "TARGET_64BIT && TARGET_CMODEL_EXTREME"
  {
    if (which_alternative == 1)
      return "#";
--- 2382,2388 ----
    (unspec:DI [(const_int 0)]
      UNSPEC_LOAD_SYMBOL_OFFSET64)
    (clobber (match_operand:DI 2 "register_operand" "=&r,r"))]
!  "TARGET_64BIT"
  {
    if (which_alternative == 1)
      return "#";
diff -Nrcpad gcc-16-20260111/gcc/config/mingw/mingw.opt.urls gcc-16-20260118/gcc/config/mingw/mingw.opt.urls
*** gcc-16-20260111/gcc/config/mingw/mingw.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/mingw/mingw.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/Cygwin-and-MinGW-Options.h
*** 6,11 ****
--- 6,12 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
  Wpedantic-ms-format
  UrlSuffix(gcc/Warning-Options.html#index-Wno-pedantic-ms-format)
diff -Nrcpad gcc-16-20260111/gcc/config/mips/mips.h gcc-16-20260118/gcc/config/mips/mips.h
*** gcc-16-20260111/gcc/config/mips/mips.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/mips/mips.h	Sun Jan 18 22:32:07 2026
*************** struct mips_cpu_info {
*** 1278,1284 ****
  #define ISA_HAS_9BIT_DISPLACEMENT	(mips_isa_rev >= 6		\
  					 || ISA_HAS_MIPS16E2)
  
! #define ISA_HAS_FMIN_FMAX	(mips_isa_rev >= 6)
  
  #define ISA_HAS_FRINT		(mips_isa_rev >= 6)
  
--- 1278,1285 ----
  #define ISA_HAS_9BIT_DISPLACEMENT	(mips_isa_rev >= 6		\
  					 || ISA_HAS_MIPS16E2)
  
! #define ISA_HAS_FMIN_FMAX	(mips_isa_rev >= 6			\
! 				 || TARGET_MIPS5900)
  
  #define ISA_HAS_FRINT		(mips_isa_rev >= 6)
  
diff -Nrcpad gcc-16-20260111/gcc/config/nds32/nds32.opt gcc-16-20260118/gcc/config/nds32/nds32.opt
*** gcc-16-20260111/gcc/config/nds32/nds32.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/nds32/nds32.opt	Sun Jan 18 22:32:07 2026
*************** Enum(abi_type) String(2fp+) Value(NDS32_
*** 58,68 ****
  
  mfloat-abi=soft
  Target RejectNegative Alias(mabi=, 2)
! Specify use soft floating point ABI which mean alias to -mabi=2.
  
  mfloat-abi=hard
  Target RejectNegative Alias(mabi=, 2fp+)
! Specify use soft floating point ABI which mean alias to -mabi=2fp+.
  
  ; ---------------------------------------------------------------
  
--- 58,68 ----
  
  mfloat-abi=soft
  Target RejectNegative Alias(mabi=, 2)
! Specify the soft floating-point ABI, aliased to -mabi=2.
  
  mfloat-abi=hard
  Target RejectNegative Alias(mabi=, 2fp+)
! Specify the hard floating-point ABI, aliased to -mabi=2fp+.
  
  ; ---------------------------------------------------------------
  
*************** Always align function entry, jump target
*** 82,95 ****
  
  malign-functions
  Target Mask(ALIGN_FUNCTION)
! Align function entry to 4 byte.
  
  mbig-endian
! Target Undocumented RejectNegative Negative(mlittle-endian) Mask(BIG_ENDIAN)
  Generate code in big-endian mode.
  
  mlittle-endian
! Target Undocumented RejectNegative Negative(mbig-endian) InverseMask(BIG_ENDIAN)
  Generate code in little-endian mode.
  
  mforce-fp-as-gp
--- 82,95 ----
  
  malign-functions
  Target Mask(ALIGN_FUNCTION)
! Align function entry to 4 bytes.
  
  mbig-endian
! Target RejectNegative Negative(mlittle-endian) Mask(BIG_ENDIAN)
  Generate code in big-endian mode.
  
  mlittle-endian
! Target RejectNegative Negative(mbig-endian) InverseMask(BIG_ENDIAN)
  Generate code in little-endian mode.
  
  mforce-fp-as-gp
*************** Enum(nds32_cpu_type) String(simple) Valu
*** 358,364 ****
  
  mconfig-fpu=
  Target RejectNegative Joined Enum(float_reg_number) Var(nds32_fp_regnum) Init(TARGET_CONFIG_FPU_DEFAULT)
! Specify a fpu configuration value from 0 to 7; 0-3 is as FPU spec says, and 4-7 is corresponding to 0-3.
  
  Enum
  Name(float_reg_number) Type(enum float_reg_number)
--- 358,364 ----
  
  mconfig-fpu=
  Target RejectNegative Joined Enum(float_reg_number) Var(nds32_fp_regnum) Init(TARGET_CONFIG_FPU_DEFAULT)
! Specify a FPU configuration value from 0 to 7; 0-3 is as FPU spec says, and 4-7 correspond to 0-3.
  
  Enum
  Name(float_reg_number) Type(enum float_reg_number)
diff -Nrcpad gcc-16-20260111/gcc/config/nds32/nds32.opt.urls gcc-16-20260118/gcc/config/nds32/nds32.opt.urls
*** gcc-16-20260111/gcc/config/nds32/nds32.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/nds32/nds32.opt.urls	Sun Jan 18 22:32:07 2026
***************
*** 1,10 ****
  ; Autogenerated by regenerate-opt-urls.py from gcc/config/nds32/nds32.opt and generated HTML
  
! ; skipping UrlSuffix for 'EB' due to finding no URLs
  
! ; skipping UrlSuffix for 'EL' due to finding no URLs
  
! ; skipping UrlSuffix for 'mabi=' due to finding no URLs
  
  mreduced-regs
  UrlSuffix(gcc/NDS32-Options.html#index-mreduced-regs)
--- 1,19 ----
  ; Autogenerated by regenerate-opt-urls.py from gcc/config/nds32/nds32.opt and generated HTML
  
! EB
! UrlSuffix(gcc/NDS32-Options.html#index-EB-1)
  
! EL
! UrlSuffix(gcc/NDS32-Options.html#index-EL-1)
  
! mfp-as-gp
! UrlSuffix(gcc/NDS32-Options.html#index-mfp-as-gp)
! 
! mno-fp-as-gp
! UrlSuffix(gcc/NDS32-Options.html#index-mno-fp-as-gp)
! 
! mabi=
! UrlSuffix(gcc/NDS32-Options.html#index-mabi-4)
  
  mreduced-regs
  UrlSuffix(gcc/NDS32-Options.html#index-mreduced-regs)
*************** UrlSuffix(gcc/NDS32-Options.html#index-m
*** 12,17 ****
--- 21,32 ----
  mfull-regs
  UrlSuffix(gcc/NDS32-Options.html#index-mfull-regs)
  
+ malways-align
+ UrlSuffix(gcc/NDS32-Options.html#index-malways-align)
+ 
+ malign-functions
+ UrlSuffix(gcc/NDS32-Options.html#index-malign-functions)
+ 
  mbig-endian
  UrlSuffix(gcc/NDS32-Options.html#index-mbig-endian-8)
  
*************** UrlSuffix(gcc/NDS32-Options.html#index-m
*** 21,26 ****
--- 36,44 ----
  mcmov
  UrlSuffix(gcc/NDS32-Options.html#index-mcmov)
  
+ mhw-abs
+ UrlSuffix(gcc/NDS32-Options.html#index-mhw-abs)
+ 
  mext-perf
  UrlSuffix(gcc/NDS32-Options.html#index-mext-perf)
  
*************** UrlSuffix(gcc/NDS32-Options.html#index-m
*** 30,51 ****
  mext-string
  UrlSuffix(gcc/NDS32-Options.html#index-mext-string)
  
  mv3push
  UrlSuffix(gcc/NDS32-Options.html#index-mv3push)
  
  m16-bit
  UrlSuffix(gcc/NDS32-Options.html#index-m16-bit-1)
  
  misr-vector-size=
  UrlSuffix(gcc/NDS32-Options.html#index-misr-vector-size)
  
  mcache-block-size=
  UrlSuffix(gcc/NDS32-Options.html#index-mcache-block-size)
  
  march=
! UrlSuffix(gcc/NDS32-Options.html#index-march-10)
  
! ; skipping UrlSuffix for 'mcpu=' due to finding no URLs
  
  mctor-dtor
  UrlSuffix(gcc/NDS32-Options.html#index-mctor-dtor)
--- 48,91 ----
  mext-string
  UrlSuffix(gcc/NDS32-Options.html#index-mext-string)
  
+ mext-dsp
+ UrlSuffix(gcc/NDS32-Options.html#index-mext-dsp)
+ 
  mv3push
  UrlSuffix(gcc/NDS32-Options.html#index-mv3push)
  
  m16-bit
  UrlSuffix(gcc/NDS32-Options.html#index-m16-bit-1)
  
+ mrelax-hint
+ UrlSuffix(gcc/NDS32-Options.html#index-mrelax-hint)
+ 
+ mvh
+ UrlSuffix(gcc/NDS32-Options.html#index-mvh)
+ 
  misr-vector-size=
  UrlSuffix(gcc/NDS32-Options.html#index-misr-vector-size)
  
+ misr-secure=
+ UrlSuffix(gcc/NDS32-Options.html#index-misr-secure)
+ 
  mcache-block-size=
  UrlSuffix(gcc/NDS32-Options.html#index-mcache-block-size)
  
  march=
! UrlSuffix(gcc/NDS32-Options.html#index-march_003d-1)
  
! mcpu=
! UrlSuffix(gcc/NDS32-Options.html#index-mcpu_003d-4)
! 
! mconfig-fpu=
! UrlSuffix(gcc/NDS32-Options.html#index-mconfig-fpu_003d)
! 
! mconfig-mul=
! UrlSuffix(gcc/NDS32-Options.html#index-mconfig-mul_003d)
! 
! mconfig-register-ports=
! UrlSuffix(gcc/NDS32-Options.html#index-mconfig-register-ports_003d)
  
  mctor-dtor
  UrlSuffix(gcc/NDS32-Options.html#index-mctor-dtor)
*************** UrlSuffix(gcc/NDS32-Options.html#index-m
*** 53,57 ****
  mrelax
  UrlSuffix(gcc/NDS32-Options.html#index-mrelax-5)
  
! ; skipping UrlSuffix for 'munaligned-access' due to finding no URLs
  
--- 93,119 ----
  mrelax
  UrlSuffix(gcc/NDS32-Options.html#index-mrelax-5)
  
! mext-fpu-fma
! UrlSuffix(gcc/NDS32-Options.html#index-mext-fpu-fma)
! 
! mext-fpu-sp
! UrlSuffix(gcc/NDS32-Options.html#index-mext-fpu-sp)
! 
! mext-fpu-dp
! UrlSuffix(gcc/NDS32-Options.html#index-mext-fpu-dp)
! 
! msched-prolog-epilog
! UrlSuffix(gcc/NDS32-Options.html#index-msched-prolog-epilog)
! 
! mret-in-naked-func
! UrlSuffix(gcc/NDS32-Options.html#index-mret-in-naked-func)
! 
! malways-save-lp
! UrlSuffix(gcc/NDS32-Options.html#index-malways-save-lp)
! 
! munaligned-access
! UrlSuffix(gcc/NDS32-Options.html#index-munaligned-access-2)
! 
! minline-asm-r15
! UrlSuffix(gcc/NDS32-Options.html#index-minline-asm-r15)
  
diff -Nrcpad gcc-16-20260111/gcc/config/netbsd.opt.urls gcc-16-20260118/gcc/config/netbsd.opt.urls
*** gcc-16-20260111/gcc/config/netbsd.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/netbsd.opt.urls	Sun Jan 18 22:32:07 2026
***************
*** 3,6 ****
--- 3,7 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
diff -Nrcpad gcc-16-20260111/gcc/config/nvptx/nvptx.opt.urls gcc-16-20260118/gcc/config/nvptx/nvptx.opt.urls
*** gcc-16-20260111/gcc/config/nvptx/nvptx.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/nvptx/nvptx.opt.urls	Sun Jan 18 22:32:07 2026
*************** misa=
*** 22,28 ****
  UrlSuffix(gcc/Nvidia-PTX-Options.html#index-misa)
  
  march=
! UrlSuffix(gcc/Nvidia-PTX-Options.html#index-march-11)
  
  mptx=
  UrlSuffix(gcc/Nvidia-PTX-Options.html#index-mptx)
--- 22,28 ----
  UrlSuffix(gcc/Nvidia-PTX-Options.html#index-misa)
  
  march=
! UrlSuffix(gcc/Nvidia-PTX-Options.html#index-march-10)
  
  mptx=
  UrlSuffix(gcc/Nvidia-PTX-Options.html#index-mptx)
diff -Nrcpad gcc-16-20260111/gcc/config/openbsd.opt.urls gcc-16-20260118/gcc/config/openbsd.opt.urls
*** gcc-16-20260111/gcc/config/openbsd.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/openbsd.opt.urls	Sun Jan 18 22:32:07 2026
***************
*** 3,6 ****
--- 3,7 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
diff -Nrcpad gcc-16-20260111/gcc/config/pru/pru.opt.urls gcc-16-20260118/gcc/config/pru/pru.opt.urls
*** gcc-16-20260111/gcc/config/pru/pru.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/pru/pru.opt.urls	Sun Jan 18 22:32:07 2026
*************** mfillzero
*** 19,23 ****
  UrlSuffix(gcc/PRU-Options.html#index-mfillzero)
  
  mabi=
! UrlSuffix(gcc/PRU-Options.html#index-mabi-4)
  
--- 19,23 ----
  UrlSuffix(gcc/PRU-Options.html#index-mfillzero)
  
  mabi=
! UrlSuffix(gcc/PRU-Options.html#index-mabi-5)
  
diff -Nrcpad gcc-16-20260111/gcc/config/riscv/constraints.md gcc-16-20260118/gcc/config/riscv/constraints.md
*** gcc-16-20260111/gcc/config/riscv/constraints.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/riscv/constraints.md	Sun Jan 18 22:32:07 2026
***************
*** 333,339 ****
  
  (define_address_constraint "ZD"
    "An address operand that is valid for a mips prefetch instruction"
!   (match_test "riscv_prefetch_offset_address_p (op, mode)"))
  
  (define_constraint "Ou07"
    "A 7-bit unsigned immediate."
--- 333,339 ----
  
  (define_address_constraint "ZD"
    "An address operand that is valid for a mips prefetch instruction"
!   (match_test "TARGET_XMIPSCBOP && riscv_prefetch_offset_address_p (op, mode)"))
  
  (define_constraint "Ou07"
    "A 7-bit unsigned immediate."
diff -Nrcpad gcc-16-20260111/gcc/config/riscv/riscv.cc gcc-16-20260118/gcc/config/riscv/riscv.cc
*** gcc-16-20260111/gcc/config/riscv/riscv.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/riscv/riscv.cc	Sun Jan 18 22:32:07 2026
*************** riscv_c_mode_for_floating_type (enum tre
*** 14786,14791 ****
--- 14786,14822 ----
    return default_mode_for_floating_type (ti);
  }
  
+ /* Implement TARGET_C_BITINT_TYPE_INFO.
+    Return true if _BitInt(N) is supported and fill its details into *INFO.  */
+ bool
+ riscv_bitint_type_info (int n, struct bitint_info *info)
+ {
+   if (n <= 8)
+     info->limb_mode = QImode;
+   else if (n <= 16)
+     info->limb_mode = HImode;
+   else if (n <= 32)
+     info->limb_mode = SImode;
+   else if (n <= 64)
+     info->limb_mode = DImode;
+   else if (n <= 128 && TARGET_64BIT)
+     info->limb_mode = TImode;
+   else
+     info->limb_mode = TARGET_64BIT ? DImode : SImode;
+ 
+   info->abi_limb_mode = info->limb_mode;
+ 
+   if (n > 64 && TARGET_64BIT)
+     info->abi_limb_mode = TImode;
+ 
+   if (n > 32 && !TARGET_64BIT)
+     info->abi_limb_mode = DImode;
+ 
+   info->big_endian = TARGET_BIG_ENDIAN;
+   info->extended = true;
+   return true;
+ }
+ 
  /* This parses the version string STR and modifies the feature mask and
     priority required to select those targets.
     If LOC is nonnull, report diagnostics against *LOC, otherwise
*************** riscv_prefetch_offset_address_p (rtx x,
*** 16773,16778 ****
--- 16804,16812 ----
  #undef TARGET_C_MODE_FOR_FLOATING_TYPE
  #define TARGET_C_MODE_FOR_FLOATING_TYPE riscv_c_mode_for_floating_type
  
+ #undef TARGET_C_BITINT_TYPE_INFO
+ #define TARGET_C_BITINT_TYPE_INFO riscv_bitint_type_info
+ 
  #undef TARGET_USE_BY_PIECES_INFRASTRUCTURE_P
  #define TARGET_USE_BY_PIECES_INFRASTRUCTURE_P riscv_use_by_pieces_infrastructure_p
  
diff -Nrcpad gcc-16-20260111/gcc/config/riscv/riscv.opt.urls gcc-16-20260118/gcc/config/riscv/riscv.opt.urls
*** gcc-16-20260111/gcc/config/riscv/riscv.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/riscv/riscv.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/RISC-V-Options.html#index-
*** 12,18 ****
  ; skipping UrlSuffix for 'mplt' due to finding no URLs
  
  mabi=
! UrlSuffix(gcc/RISC-V-Options.html#index-mabi-5)
  
  mpreferred-stack-boundary=
  UrlSuffix(gcc/RISC-V-Options.html#index-mpreferred-stack-boundary)
--- 12,18 ----
  ; skipping UrlSuffix for 'mplt' due to finding no URLs
  
  mabi=
! UrlSuffix(gcc/RISC-V-Options.html#index-mabi-6)
  
  mpreferred-stack-boundary=
  UrlSuffix(gcc/RISC-V-Options.html#index-mpreferred-stack-boundary)
*************** mdiv
*** 24,30 ****
  UrlSuffix(gcc/RISC-V-Options.html#index-mdiv-3)
  
  march=
! UrlSuffix(gcc/RISC-V-Options.html#index-march-12)
  
  mtune=
  UrlSuffix(gcc/RISC-V-Options.html#index-mtune-11)
--- 24,30 ----
  UrlSuffix(gcc/RISC-V-Options.html#index-mdiv-3)
  
  march=
! UrlSuffix(gcc/RISC-V-Options.html#index-march-11)
  
  mtune=
  UrlSuffix(gcc/RISC-V-Options.html#index-mtune-11)
diff -Nrcpad gcc-16-20260111/gcc/config/rl78/rl78.opt.urls gcc-16-20260118/gcc/config/rl78/rl78.opt.urls
*** gcc-16-20260111/gcc/config/rl78/rl78.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rl78/rl78.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/RL78-Options.html#index-mm
*** 9,15 ****
  mallregs
  UrlSuffix(gcc/RL78-Options.html#index-mallregs)
  
! ; skipping UrlSuffix for 'mrelax' due to finding no URLs
  
  mcpu=
  UrlSuffix(gcc/RL78-Options.html#index-mcpu-9)
--- 9,16 ----
  mallregs
  UrlSuffix(gcc/RL78-Options.html#index-mallregs)
  
! mrelax
! UrlSuffix(gcc/RL78-Options.html#index-mrelax-7)
  
  mcpu=
  UrlSuffix(gcc/RL78-Options.html#index-mcpu-9)
*************** UrlSuffix(gcc/RL78-Options.html#index-mg
*** 26,31 ****
--- 27,35 ----
  mrl78
  UrlSuffix(gcc/RL78-Options.html#index-mrl78)
  
+ mes0
+ UrlSuffix(gcc/RL78-Options.html#index-mes0)
+ 
  msave-mduc-in-interrupts
  UrlSuffix(gcc/RL78-Options.html#index-msave-mduc-in-interrupts)
  
diff -Nrcpad gcc-16-20260111/gcc/config/rs6000/aix64.opt.urls gcc-16-20260118/gcc/config/rs6000/aix64.opt.urls
*** gcc-16-20260111/gcc/config/rs6000/aix64.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rs6000/aix64.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/RS_002f6000-and-PowerPC-Op
*** 15,20 ****
--- 15,21 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
  m64
  UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-m64-1)
diff -Nrcpad gcc-16-20260111/gcc/config/rs6000/darwin.opt gcc-16-20260118/gcc/config/rs6000/darwin.opt
*** gcc-16-20260111/gcc/config/rs6000/darwin.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rs6000/darwin.opt	Sun Jan 18 22:32:07 2026
***************
*** 20,37 ****
  ; <http://www.gnu.org/licenses/>.
  
  Waltivec-long-deprecated
! Driver Alias(mwarn-altivec-long)
  
  faltivec
! Driver
  
  ; -ffix-and-continue and -findirect-data are for compatibility for old
  ; compilers.
  ffix-and-continue
! Driver RejectNegative Alias(mfix-and-continue)
  
  findirect-data
! Driver RejectNegative Alias(mfix-and-continue)
  
  m64
  Target RejectNegative Negative(m32) Mask(64BIT) Var(rs6000_isa_flags)
--- 20,37 ----
  ; <http://www.gnu.org/licenses/>.
  
  Waltivec-long-deprecated
! Driver Undocumented Alias(mwarn-altivec-long)
  
  faltivec
! Driver Undocumented
  
  ; -ffix-and-continue and -findirect-data are for compatibility for old
  ; compilers.
  ffix-and-continue
! Driver Undocumented RejectNegative Alias(mfix-and-continue)
  
  findirect-data
! Driver Undocumented RejectNegative Alias(mfix-and-continue)
  
  m64
  Target RejectNegative Negative(m32) Mask(64BIT) Var(rs6000_isa_flags)
diff -Nrcpad gcc-16-20260111/gcc/config/rs6000/rs6000.opt gcc-16-20260118/gcc/config/rs6000/rs6000.opt
*** gcc-16-20260111/gcc/config/rs6000/rs6000.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rs6000/rs6000.opt	Sun Jan 18 22:32:07 2026
*************** Target Var(TARGET_ALTIVEC_VRSAVE) Save
*** 309,319 ****
  Generate VRSAVE instructions when generating AltiVec code.
  
  mvrsave=no
! Target RejectNegative Alias(mvrsave) NegativeAlias Warn(%<-mvrsave=no%> is deprecated; use %<-mno-vrsave%> instead)
  Deprecated option.  Use -mno-vrsave instead.
  
  mvrsave=yes
! Target RejectNegative Alias(mvrsave) Warn(%<-mvrsave=yes%> is deprecated; use %<-mvrsave%> instead)
  Deprecated option.  Use -mvrsave instead.
  
  mblock-move-inline-limit=
--- 309,319 ----
  Generate VRSAVE instructions when generating AltiVec code.
  
  mvrsave=no
! Target Undocumented RejectNegative Alias(mvrsave) NegativeAlias Warn(%<-mvrsave=no%> is deprecated; use %<-mno-vrsave%> instead)
  Deprecated option.  Use -mno-vrsave instead.
  
  mvrsave=yes
! Target Undocumented RejectNegative Alias(mvrsave) Warn(%<-mvrsave=yes%> is deprecated; use %<-mvrsave%> instead)
  Deprecated option.  Use -mvrsave instead.
  
  mblock-move-inline-limit=
diff -Nrcpad gcc-16-20260111/gcc/config/rs6000/rs6000.opt.urls gcc-16-20260118/gcc/config/rs6000/rs6000.opt.urls
*** gcc-16-20260111/gcc/config/rs6000/rs6000.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rs6000/rs6000.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/RS_002f6000-and-PowerPC-Op
*** 89,97 ****
--- 89,103 ----
  mno-fp-in-toc
  UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-fp-in-toc)
  
+ mfp-in-toc
+ UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mfp-in-toc)
+ 
  mno-sum-in-toc
  UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-sum-in-toc)
  
+ msum-in-toc
+ UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-msum-in-toc)
+ 
  mminimal-toc
  UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mminimal-toc)
  
*************** UrlSuffix(gcc/RS_002f6000-and-PowerPC-Op
*** 107,112 ****
--- 113,121 ----
  mblock-move-inline-limit=
  UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mblock-move-inline-limit)
  
+ mblock-ops-unaligned-vsx
+ UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mblock-ops-unaligned-vsx)
+ 
  mblock-compare-inline-limit=
  UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mblock-compare-inline-limit)
  
diff -Nrcpad gcc-16-20260111/gcc/config/rs6000/sysv4.opt gcc-16-20260118/gcc/config/rs6000/sysv4.opt
*** gcc-16-20260111/gcc/config/rs6000/sysv4.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rs6000/sysv4.opt	Sun Jan 18 22:32:07 2026
*************** Produce big endian code.
*** 82,92 ****
  
  ;; FIXME: This does nothing.  What should be done?
  mno-toc
! Target RejectNegative
  No description yet.
  
  mtoc
! Target RejectNegative
  No description yet.
  
  mprototype
--- 82,92 ----
  
  ;; FIXME: This does nothing.  What should be done?
  mno-toc
! Target RejectNegative Undocumented
  No description yet.
  
  mtoc
! Target RejectNegative Undocumented
  No description yet.
  
  mprototype
*************** Assume all variable arg functions are pr
*** 95,101 ****
  
  ;; FIXME: Does nothing.
  mno-traceback
! Target RejectNegative
  No description yet.
  
  meabi
--- 95,101 ----
  
  ;; FIXME: Does nothing.
  mno-traceback
! Target RejectNegative Undocumented
  No description yet.
  
  meabi
*************** memb
*** 136,143 ****
  Target RejectNegative
  Set the PPC_EMB bit in the ELF flags header.
  
  mshlib
! Target RejectNegative
  No description yet.
  
  m64
--- 136,144 ----
  Target RejectNegative
  Set the PPC_EMB bit in the ELF flags header.
  
+ ; Used in specs.
  mshlib
! Target Undocumented RejectNegative
  No description yet.
  
  m64
*************** m32
*** 148,155 ****
  Target RejectNegative Negative(m64) InverseMask(64BIT) Var(rs6000_isa_flags)
  Generate 32-bit code.
  
  mnewlib
! Target RejectNegative
  No description yet.
  
  msecure-plt
--- 149,157 ----
  Target RejectNegative Negative(m64) InverseMask(64BIT) Var(rs6000_isa_flags)
  Generate 32-bit code.
  
+ ; Used in specs.
  mnewlib
! Target Undocumented RejectNegative
  No description yet.
  
  msecure-plt
diff -Nrcpad gcc-16-20260111/gcc/config/rs6000/sysv4.opt.urls gcc-16-20260118/gcc/config/rs6000/sysv4.opt.urls
*** gcc-16-20260111/gcc/config/rs6000/sysv4.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rs6000/sysv4.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/RS_002f6000-and-PowerPC-Op
*** 32,43 ****
  mbig
  UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mbig)
  
- mno-toc
- UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mno-toc)
- 
- mtoc
- UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mtoc)
- 
  mprototype
  UrlSuffix(gcc/RS_002f6000-and-PowerPC-Options.html#index-mprototype)
  
--- 32,37 ----
diff -Nrcpad gcc-16-20260111/gcc/config/rtems.opt.urls gcc-16-20260118/gcc/config/rtems.opt.urls
*** gcc-16-20260111/gcc/config/rtems.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rtems.opt.urls	Sun Jan 18 22:32:07 2026
***************
*** 3,6 ****
--- 3,7 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
diff -Nrcpad gcc-16-20260111/gcc/config/rx/rx.opt gcc-16-20260118/gcc/config/rx/rx.opt
*** gcc-16-20260111/gcc/config/rx/rx.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rx/rx.opt	Sun Jan 18 22:32:07 2026
*************** Warn when multiple, different, fast inte
*** 119,129 ****
  ;---------------------------------------------------
  
  mgcc-abi
! Target RejectNegative Mask(GCC_ABI)
  Enable the use of the old, broken, ABI where all stacked function arguments are aligned to 32-bits.
  
  mrx-abi
! Target RejectNegative InverseMask(GCC_ABI)
  Enable the use the standard RX ABI where all stacked function arguments are naturally aligned.  This is the default.
  
  ;---------------------------------------------------
--- 119,129 ----
  ;---------------------------------------------------
  
  mgcc-abi
! Target Undocumented RejectNegative Mask(GCC_ABI)
  Enable the use of the old, broken, ABI where all stacked function arguments are aligned to 32-bits.
  
  mrx-abi
! Target Undocumented RejectNegative InverseMask(GCC_ABI)
  Enable the use the standard RX ABI where all stacked function arguments are naturally aligned.  This is the default.
  
  ;---------------------------------------------------
diff -Nrcpad gcc-16-20260111/gcc/config/rx/rx.opt.urls gcc-16-20260118/gcc/config/rx/rx.opt.urls
*** gcc-16-20260111/gcc/config/rx/rx.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/rx/rx.opt.urls	Sun Jan 18 22:32:07 2026
***************
*** 1,10 ****
  ; Autogenerated by regenerate-opt-urls.py from gcc/config/rx/rx.opt and generated HTML
  
  m64bit-doubles
! UrlSuffix(gcc/RX-Options.html#index-m64bit-doubles-1)
  
  m32bit-doubles
! UrlSuffix(gcc/RX-Options.html#index-m32bit-doubles-1)
  
  nofpu
  UrlSuffix(gcc/RX-Options.html#index-nofpu)
--- 1,10 ----
  ; Autogenerated by regenerate-opt-urls.py from gcc/config/rx/rx.opt and generated HTML
  
  m64bit-doubles
! UrlSuffix(gcc/RX-Options.html#index-m64bit-doubles)
  
  m32bit-doubles
! UrlSuffix(gcc/RX-Options.html#index-m32bit-doubles)
  
  nofpu
  UrlSuffix(gcc/RX-Options.html#index-nofpu)
*************** msmall-data-limit=
*** 25,31 ****
  UrlSuffix(gcc/RX-Options.html#index-msmall-data-limit-1)
  
  mrelax
! UrlSuffix(gcc/RX-Options.html#index-mrelax-7)
  
  mmax-constant-size=
  UrlSuffix(gcc/RX-Options.html#index-mmax-constant-size)
--- 25,31 ----
  UrlSuffix(gcc/RX-Options.html#index-msmall-data-limit-1)
  
  mrelax
! UrlSuffix(gcc/RX-Options.html#index-mrelax-8)
  
  mmax-constant-size=
  UrlSuffix(gcc/RX-Options.html#index-mmax-constant-size)
*************** UrlSuffix(gcc/RX-Options.html#index-mwar
*** 44,50 ****
  
  ; skipping UrlSuffix for 'mgcc-abi' due to finding no URLs
  
! ; skipping UrlSuffix for 'mlra' due to finding no URLs
  
  mallow-string-insns
  UrlSuffix(gcc/RX-Options.html#index-mallow-string-insns)
--- 44,51 ----
  
  ; skipping UrlSuffix for 'mgcc-abi' due to finding no URLs
  
! mlra
! UrlSuffix(gcc/RX-Options.html#index-mlra-1)
  
  mallow-string-insns
  UrlSuffix(gcc/RX-Options.html#index-mallow-string-insns)
diff -Nrcpad gcc-16-20260111/gcc/config/s390/s390.opt gcc-16-20260118/gcc/config/s390/s390.opt
*** gcc-16-20260111/gcc/config/s390/s390.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/s390/s390.opt	Sun Jan 18 22:32:07 2026
*************** mzarch
*** 247,254 ****
  Target RejectNegative Negative(mesa) Mask(ZARCH)
  z/Architecture.
  
  mbranch-cost=
! Target Joined RejectNegative UInteger Var(s390_branch_cost) Init(1) Save
  Set the branch costs for conditional branch instructions.  Reasonable
  values are small, non-negative integers.  The default branch cost is
  1.
--- 247,255 ----
  Target RejectNegative Negative(mesa) Mask(ZARCH)
  z/Architecture.
  
+ ; This option was added to fix some testsuite failures.
  mbranch-cost=
! Target Undocumented Joined RejectNegative UInteger Var(s390_branch_cost) Init(1) Save
  Set the branch costs for conditional branch instructions.  Reasonable
  values are small, non-negative integers.  The default branch cost is
  1.
diff -Nrcpad gcc-16-20260111/gcc/config/s390/s390.opt.urls gcc-16-20260118/gcc/config/s390/s390.opt.urls
*** gcc-16-20260111/gcc/config/s390/s390.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/s390/s390.opt.urls	Sun Jan 18 22:32:07 2026
*************** m64
*** 7,13 ****
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-m64-2)
  
  march=
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-march-13)
  
  mbackchain
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mbackchain)
--- 7,13 ----
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-m64-2)
  
  march=
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-march-12)
  
  mbackchain
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mbackchain)
*************** UrlSuffix(gcc/S_002f390-and-zSeries-Opti
*** 51,56 ****
--- 51,59 ----
  mstack-guard=
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mstack-guard)
  
+ mno-stack-guard
+ UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mno-stack-guard)
+ 
  mstack-protector-guard=
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mstack-protector-guard-4)
  
*************** UrlSuffix(gcc/S_002f390-and-zSeries-Opti
*** 60,66 ****
  mstack-size=
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mstack-size-1)
  
! ; skipping UrlSuffix for 'mno-stack-size' due to finding no URLs
  
  mtune=
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mtune-13)
--- 63,70 ----
  mstack-size=
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mstack-size-1)
  
! mno-stack-size
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mno-stack-size-1)
  
  mtune=
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mtune-13)
*************** UrlSuffix(gcc/S_002f390-and-zSeries-Opti
*** 82,98 ****
  
  ; skipping UrlSuffix for 'mbranch-cost=' due to finding no URLs
  
! ; skipping UrlSuffix for 'mpic-data-is-text-relative' due to finding no URLs
  
! ; skipping UrlSuffix for 'mindirect-branch=' due to finding no URLs
  
! ; skipping UrlSuffix for 'mfunction-return=' due to finding no URLs
  
! ; skipping UrlSuffix for 'mfentry' due to finding no URLs
  
! ; skipping UrlSuffix for 'mrecord-mcount' due to finding no URLs
  
! ; skipping UrlSuffix for 'mnop-mcount' due to finding no URLs
  
  ; skipping UrlSuffix for 'munroll-only-small-loops' due to finding no URLs
  
--- 86,129 ----
  
  ; skipping UrlSuffix for 'mbranch-cost=' due to finding no URLs
  
! mpic-data-is-text-relative
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mpic-data-is-text-relative-2)
  
! mindirect-branch=
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mindirect-branch)
  
! mindirect-branch-jump=
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mindirect-branch-jump)
  
! mindirect-branch-call=
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mindirect-branch-call)
  
! mfunction-return=
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mfunction-return)
  
! mfunction-return-mem=
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mfunction-return-mem)
! 
! mfunction-return-reg=
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mfunction-return-reg)
! 
! mindirect-branch-table
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mindirect-branch-table)
! 
! mfentry
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mfentry)
! 
! mrecord-mcount
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mrecord-mcount)
! 
! mnop-mcount
! UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mnop-mcount)
  
  ; skipping UrlSuffix for 'munroll-only-small-loops' due to finding no URLs
  
+ mpreserve-args
+ UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mpreserve-args)
+ 
+ munaligned-symbols
+ UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-munaligned-symbols)
+ 
diff -Nrcpad gcc-16-20260111/gcc/config/s390/tpf.opt gcc-16-20260118/gcc/config/s390/tpf.opt
*** gcc-16-20260111/gcc/config/s390/tpf.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/s390/tpf.opt	Sun Jan 18 22:32:07 2026
*************** mtpf-trace
*** 22,41 ****
  Target Mask(TPF_PROFILING)
  Enable TPF-OS tracing code.
  
  mtpf-trace-hook-prologue-check=
! Target RejectNegative Joined UInteger Var(s390_tpf_trace_hook_prologue_check) Init(TPF_TRACE_PROLOGUE_CHECK)
  Set the trace check address for prologue tpf hook
  
  mtpf-trace-hook-prologue-target=
! Target RejectNegative Joined UInteger Var(s390_tpf_trace_hook_prologue_target) Init(TPF_TRACE_PROLOGUE_TARGET)
  Set the trace jump address for prologue tpf hook
  
  mtpf-trace-hook-epilogue-check=
! Target RejectNegative Joined UInteger Var(s390_tpf_trace_hook_epilogue_check) Init(TPF_TRACE_EPILOGUE_CHECK)
  Set the trace check address for epilogue tpf hook
  
  mtpf-trace-hook-epilogue-target=
! Target RejectNegative Joined UInteger Var(s390_tpf_trace_hook_epilogue_target) Init(TPF_TRACE_EPILOGUE_TARGET)
  Set the trace jump address for epilogue tpf hook
  
  mtpf-trace-skip
--- 22,43 ----
  Target Mask(TPF_PROFILING)
  Enable TPF-OS tracing code.
  
+ ; Except for -mtpf-trace-skip, the other mtpf-trace-hook-* options are
+ ; for debugging purposes and are explicitly undocumented.
  mtpf-trace-hook-prologue-check=
! Target Undocumented RejectNegative Joined UInteger Var(s390_tpf_trace_hook_prologue_check) Init(TPF_TRACE_PROLOGUE_CHECK)
  Set the trace check address for prologue tpf hook
  
  mtpf-trace-hook-prologue-target=
! Target Undocumented RejectNegative Joined UInteger Var(s390_tpf_trace_hook_prologue_target) Init(TPF_TRACE_PROLOGUE_TARGET)
  Set the trace jump address for prologue tpf hook
  
  mtpf-trace-hook-epilogue-check=
! Target Undocumented RejectNegative Joined UInteger Var(s390_tpf_trace_hook_epilogue_check) Init(TPF_TRACE_EPILOGUE_CHECK)
  Set the trace check address for epilogue tpf hook
  
  mtpf-trace-hook-epilogue-target=
! Target Undocumented RejectNegative Joined UInteger Var(s390_tpf_trace_hook_epilogue_target) Init(TPF_TRACE_EPILOGUE_TARGET)
  Set the trace jump address for epilogue tpf hook
  
  mtpf-trace-skip
diff -Nrcpad gcc-16-20260111/gcc/config/s390/tpf.opt.urls gcc-16-20260118/gcc/config/s390/tpf.opt.urls
*** gcc-16-20260111/gcc/config/s390/tpf.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/s390/tpf.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/S_002f390-and-zSeries-Opti
*** 6,8 ****
--- 6,11 ----
  mtpf-trace-skip
  UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mtpf-trace-skip)
  
+ mmain
+ UrlSuffix(gcc/S_002f390-and-zSeries-Options.html#index-mmain)
+ 
diff -Nrcpad gcc-16-20260111/gcc/config/sh/sh.opt gcc-16-20260118/gcc/config/sh/sh.opt
*** gcc-16-20260111/gcc/config/sh/sh.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sh/sh.opt	Sun Jan 18 22:32:07 2026
*************** Target RejectNegative Joined Var(sh_fixe
*** 227,233 ****
  Specify range of registers to make fixed.
  
  mhitachi
! Target RejectNegative Mask(HITACHI)
  Follow Renesas (formerly Hitachi) / SuperH calling conventions.
  
  mieee
--- 227,233 ----
  Specify range of registers to make fixed.
  
  mhitachi
! Target Undocumented RejectNegative Mask(HITACHI)
  Follow Renesas (formerly Hitachi) / SuperH calling conventions.
  
  mieee
*************** Mark MAC register as call-clobbered.
*** 253,259 ****
  ;; ??? This option is not useful, but is retained in case there are people
  ;; who are still relying on it.  It may be deleted in the future.
  mpadstruct
! Target RejectNegative Mask(PADSTRUCT)
  Make structs a multiple of 4 bytes (warning: ABI altered).
  
  mprefergot
--- 253,259 ----
  ;; ??? This option is not useful, but is retained in case there are people
  ;; who are still relying on it.  It may be deleted in the future.
  mpadstruct
! Target Undocumented RejectNegative Mask(PADSTRUCT)
  Make structs a multiple of 4 bytes (warning: ABI altered).
  
  mprefergot
diff -Nrcpad gcc-16-20260111/gcc/config/sh/sh.opt.urls gcc-16-20260118/gcc/config/sh/sh.opt.urls
*** gcc-16-20260111/gcc/config/sh/sh.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sh/sh.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/SH-Options.html#index-mdal
*** 118,124 ****
  
  ; skipping UrlSuffix for 'mdiv=' due to finding no URLs
  
! ; skipping UrlSuffix for 'mfdpic' due to finding no URLs
  
  mfmovd
  UrlSuffix(gcc/SH-Options.html#index-mfmovd)
--- 118,125 ----
  
  ; skipping UrlSuffix for 'mdiv=' due to finding no URLs
  
! mfdpic
! UrlSuffix(gcc/SH-Options.html#index-mfdpic-2)
  
  mfmovd
  UrlSuffix(gcc/SH-Options.html#index-mfmovd)
*************** UrlSuffix(gcc/SH-Options.html#index-ml)
*** 141,154 ****
  mnomacsave
  UrlSuffix(gcc/SH-Options.html#index-mnomacsave)
  
- mpadstruct
- UrlSuffix(gcc/SH-Options.html#index-mpadstruct)
- 
  mprefergot
  UrlSuffix(gcc/SH-Options.html#index-mprefergot)
  
  mrelax
! UrlSuffix(gcc/SH-Options.html#index-mrelax-8)
  
  mrenesas
  UrlSuffix(gcc/SH-Options.html#index-mrenesas)
--- 142,152 ----
  mnomacsave
  UrlSuffix(gcc/SH-Options.html#index-mnomacsave)
  
  mprefergot
  UrlSuffix(gcc/SH-Options.html#index-mprefergot)
  
  mrelax
! UrlSuffix(gcc/SH-Options.html#index-mrelax-9)
  
  mrenesas
  UrlSuffix(gcc/SH-Options.html#index-mrenesas)
*************** UrlSuffix(gcc/SH-Options.html#index-mfsc
*** 168,172 ****
  mfsrra
  UrlSuffix(gcc/SH-Options.html#index-mfsrra)
  
! ; skipping UrlSuffix for 'mlra' due to finding no URLs
  
--- 166,171 ----
  mfsrra
  UrlSuffix(gcc/SH-Options.html#index-mfsrra)
  
! mlra
! UrlSuffix(gcc/SH-Options.html#index-mlra-2)
  
diff -Nrcpad gcc-16-20260111/gcc/config/sol2.opt.urls gcc-16-20260118/gcc/config/sol2.opt.urls
*** gcc-16-20260111/gcc/config/sol2.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sol2.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/Solaris-2-Options.html#ind
*** 15,20 ****
--- 15,21 ----
  ; skipping UrlSuffix for 'pthread' due to multiple URLs:
  ;   duplicate: 'gcc/Link-Options.html#index-pthread-1'
  ;   duplicate: 'gcc/Preprocessor-Options.html#index-pthread'
+ ;   duplicate: 'gcc/Solaris-2-Options.html#index-pthread-2'
  
  pthreads
  UrlSuffix(gcc/Solaris-2-Options.html#index-pthreads)
diff -Nrcpad gcc-16-20260111/gcc/config/sparc/freebsd.h gcc-16-20260118/gcc/config/sparc/freebsd.h
*** gcc-16-20260111/gcc/config/sparc/freebsd.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sparc/freebsd.h	Sun Jan 18 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 118,130 ****
  
  /* #define DWARF_OFFSET_SIZE PTR_SIZE */
  
- #ifdef HAVE_AS_TLS
- #undef TARGET_SUN_TLS
- #undef TARGET_GNU_TLS
- #define TARGET_SUN_TLS 0
- #define TARGET_GNU_TLS 1
- #endif
- 
  #undef ENDFILE_SPEC
  #define ENDFILE_SPEC						\
    "%{Ofast|ffast-math|funsafe-math-optimizations:%{!shared:crtfastmath.o%s}} "	\
--- 118,123 ----
diff -Nrcpad gcc-16-20260111/gcc/config/sparc/linux.h gcc-16-20260118/gcc/config/sparc/linux.h
*** gcc-16-20260111/gcc/config/sparc/linux.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sparc/linux.h	Sun Jan 18 22:32:07 2026
*************** do {									\
*** 120,132 ****
  #undef DITF_CONVERSION_LIBFUNCS
  #define DITF_CONVERSION_LIBFUNCS 1
  
- #ifdef HAVE_AS_TLS
- #undef TARGET_SUN_TLS
- #undef TARGET_GNU_TLS
- #define TARGET_SUN_TLS 0
- #define TARGET_GNU_TLS 1
- #endif
- 
  /* We use GNU ld so undefine this so that attribute((init_priority)) works.  */
  #undef CTORS_SECTION_ASM_OP
  #undef DTORS_SECTION_ASM_OP
--- 120,125 ----
diff -Nrcpad gcc-16-20260111/gcc/config/sparc/linux64.h gcc-16-20260118/gcc/config/sparc/linux64.h
*** gcc-16-20260111/gcc/config/sparc/linux64.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sparc/linux64.h	Sun Jan 18 22:32:07 2026
*************** do {									\
*** 264,276 ****
  #undef DITF_CONVERSION_LIBFUNCS
  #define DITF_CONVERSION_LIBFUNCS 1
  
- #ifdef HAVE_AS_TLS
- #undef TARGET_SUN_TLS
- #undef TARGET_GNU_TLS
- #define TARGET_SUN_TLS 0
- #define TARGET_GNU_TLS 1
- #endif
- 
  /* We use GNU ld so undefine this so that attribute((init_priority)) works.  */
  #undef CTORS_SECTION_ASM_OP
  #undef DTORS_SECTION_ASM_OP
--- 264,269 ----
diff -Nrcpad gcc-16-20260111/gcc/config/sparc/sol2.h gcc-16-20260118/gcc/config/sparc/sol2.h
*** gcc-16-20260111/gcc/config/sparc/sol2.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sparc/sol2.h	Sun Jan 18 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 41,57 ****
  /* Redue ggc-page.cc's chunk size to account for mmap red-zone pages.  */
  #define GGC_QUIRE_SIZE 510
  
- /* Select a format to encode pointers in exception handling data.  CODE
-    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
-    true if the symbol may be affected by dynamic relocations.
- 
-    Some Solaris dynamic linkers don't handle unaligned section relative
-    relocs properly, so force them to be aligned.  */
- #ifndef HAVE_AS_SPARC_UA_PCREL
- #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)		\
-   ((flag_pic || GLOBAL) ? DW_EH_PE_aligned : DW_EH_PE_absptr)
- #endif
- 
  
  
  /* Supposedly the same as vanilla sparc svr4, except for the stuff below: */
--- 41,46 ----
*************** extern const char *host_detect_local_cpu
*** 326,339 ****
  /* Register the Solaris-specific #pragma directives.  */
  #define REGISTER_TARGET_PRAGMAS() solaris_register_pragmas ()
  
- #if HAVE_GNU_AS && defined(HAVE_AS_TLS)
- /* Use GNU extensions to TLS support.  */
- #undef TARGET_SUN_TLS
- #undef TARGET_GNU_TLS
- #define TARGET_SUN_TLS 0
- #define TARGET_GNU_TLS 1
- #endif
- 
  #undef  LOCAL_LABEL_PREFIX
  #define LOCAL_LABEL_PREFIX  "."
  
--- 315,320 ----
*************** extern const char *host_detect_local_cpu
*** 388,410 ****
      }									\
    while (0)
  
- /* Solaris as has a bug: a .common directive in .tbss or .tdata section
-    behaves as .tls_common rather than normal non-TLS .common.  */
- #undef  ASM_OUTPUT_ALIGNED_COMMON
- #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)		\
-   do									\
-     {									\
-       if (TARGET_SUN_TLS						\
- 	  && in_section							\
- 	  && ((in_section->common.flags & SECTION_TLS) == SECTION_TLS))	\
- 	switch_to_section (bss_section);				\
-       fprintf ((FILE), "%s", COMMON_ASM_OP);				\
-       assemble_name ((FILE), (NAME));					\
-       fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",		\
- 	       (SIZE), (ALIGN) / BITS_PER_UNIT);			\
-     }									\
-   while (0)
- 
  #if !HAVE_GNU_AS
  /* This is how to output an assembler line that says to advance
     the location counter to a multiple of 2**LOG bytes using the
--- 369,374 ----
diff -Nrcpad gcc-16-20260111/gcc/config/sparc/sparc.cc gcc-16-20260118/gcc/config/sparc/sparc.cc
*** gcc-16-20260111/gcc/config/sparc/sparc.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sparc/sparc.cc	Sun Jan 18 22:32:07 2026
*************** char sparc_hard_reg_printed[8];
*** 877,883 ****
  #define TARGET_STACK_PROTECT_GUARD hook_tree_void_null
  #endif
  
! #if TARGET_GNU_TLS && defined(HAVE_AS_SPARC_UA_PCREL)
  #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
  #define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
  #endif
--- 877,883 ----
  #define TARGET_STACK_PROTECT_GUARD hook_tree_void_null
  #endif
  
! #if HAVE_GNU_AS
  #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
  #define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
  #endif
*************** sparc_tls_got (void)
*** 4701,4707 ****
  
    /* In non-PIC mode, Sun as (unlike GNU as) emits PC-relative relocations for
       the GOT symbol with the 32-bit ABI, so we reload the GOT register.  */
!   if (TARGET_SUN_TLS && TARGET_ARCH32)
      {
        load_got_register ();
        return got_register_rtx;
--- 4701,4707 ----
  
    /* In non-PIC mode, Sun as (unlike GNU as) emits PC-relative relocations for
       the GOT symbol with the 32-bit ABI, so we reload the GOT register.  */
!   if (!HAVE_GNU_AS && TARGET_ARCH32)
      {
        load_got_register ();
        return got_register_rtx;
*************** sparc_legitimize_tls_address (rtx addr)
*** 4805,4811 ****
  	  emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
  	else
  	  emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
!         if (TARGET_SUN_TLS)
  	  {
  	    ret = gen_reg_rtx (Pmode);
  	    emit_insn (gen_tie_add (Pmode, ret, gen_rtx_REG (Pmode, 7),
--- 4805,4811 ----
  	  emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
  	else
  	  emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
! 	if (!HAVE_GNU_AS)
  	  {
  	    ret = gen_reg_rtx (Pmode);
  	    emit_insn (gen_tie_add (Pmode, ret, gen_rtx_REG (Pmode, 7),
diff -Nrcpad gcc-16-20260111/gcc/config/sparc/sparc.h gcc-16-20260118/gcc/config/sparc/sparc.h
*** gcc-16-20260111/gcc/config/sparc/sparc.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sparc/sparc.h	Sun Jan 18 22:32:07 2026
*************** do {									\
*** 1279,1310 ****
  
  /* Select a format to encode pointers in exception handling data.  CODE
     is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
!    true if the symbol may be affected by dynamic relocations.
! 
!    If assembler and linker properly support .uaword %r_disp32(foo),
!    then use PC relative 32-bit relocations instead of absolute relocs
!    for shared libraries.  On sparc64, use pc relative 32-bit relocs even
!    for binaries, to save memory.
! 
!    binutils 2.12 would emit a R_SPARC_DISP32 dynamic relocation if the
!    symbol %r_disp32() is against was not local, but .hidden.  In that
!    case, we have to use DW_EH_PE_absptr for pic personality.  */
! #ifdef HAVE_AS_SPARC_UA_PCREL
! #ifdef HAVE_AS_SPARC_UA_PCREL_HIDDEN
  #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)			\
    (flag_pic								\
     ? (GLOBAL ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4\
     : ((TARGET_ARCH64 && ! GLOBAL)					\
        ? (DW_EH_PE_pcrel | DW_EH_PE_sdata4)				\
        : DW_EH_PE_absptr))
- #else
- #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)			\
-   (flag_pic								\
-    ? (GLOBAL ? DW_EH_PE_absptr : (DW_EH_PE_pcrel | DW_EH_PE_sdata4))	\
-    : ((TARGET_ARCH64 && ! GLOBAL)					\
-       ? (DW_EH_PE_pcrel | DW_EH_PE_sdata4)				\
-       : DW_EH_PE_absptr))
- #endif
  
  /* Emit a PC-relative relocation.  */
  #define ASM_OUTPUT_DWARF_PCREL(FILE, SIZE, LABEL)	\
--- 1279,1291 ----
  
  /* Select a format to encode pointers in exception handling data.  CODE
     is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
!    true if the symbol may be affected by dynamic relocations.  */
  #define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)			\
    (flag_pic								\
     ? (GLOBAL ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_sdata4\
     : ((TARGET_ARCH64 && ! GLOBAL)					\
        ? (DW_EH_PE_pcrel | DW_EH_PE_sdata4)				\
        : DW_EH_PE_absptr))
  
  /* Emit a PC-relative relocation.  */
  #define ASM_OUTPUT_DWARF_PCREL(FILE, SIZE, LABEL)	\
*************** do {									\
*** 1314,1320 ****
      assemble_name (FILE, LABEL);			\
      fputc (')', FILE);					\
    } while (0)
- #endif
  
  /* Addressing modes, and classification of registers for them.  */
  
--- 1295,1300 ----
*************** extern int sparc_indent_opcode;
*** 1640,1655 ****
        }					\
    } while (0)
  
! /* TLS support defaulting to original Sun flavor.  GNU extensions
!    must be activated in separate configuration files.  */
! #ifdef HAVE_AS_TLS
! #define TARGET_TLS 1
! #else
! #define TARGET_TLS 0
! #endif
! 
! #define TARGET_SUN_TLS TARGET_TLS
! #define TARGET_GNU_TLS 0
  
  #ifdef HAVE_AS_FMAF_HPC_VIS3
  #define AS_NIAGARA3_FLAG "d"
--- 1620,1628 ----
        }					\
    } while (0)
  
! /* TLS support defaults to GNU extensions.  The original Sun flavor must be
!    activated in separate configuration files.  */
! #define TARGET_TLS HAVE_AS_TLS
  
  #ifdef HAVE_AS_FMAF_HPC_VIS3
  #define AS_NIAGARA3_FLAG "d"
diff -Nrcpad gcc-16-20260111/gcc/config/sparc/sparc.md gcc-16-20260118/gcc/config/sparc/sparc.md
*** gcc-16-20260111/gcc/config/sparc/sparc.md	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sparc/sparc.md	Sun Jan 18 22:32:07 2026
***************
*** 557,563 ****
  
  ;; Attributes for branch scheduling
  (define_attr "tls_delay_slot" "false,true"
!   (symbol_ref "((TARGET_GNU_TLS && HAVE_GNU_LD) != 0
  		? TLS_DELAY_SLOT_TRUE : TLS_DELAY_SLOT_FALSE)"))
  
  (define_attr "in_sibcall_delay" "false,true"
--- 557,563 ----
  
  ;; Attributes for branch scheduling
  (define_attr "tls_delay_slot" "false,true"
!   (symbol_ref "((HAVE_GNU_AS && HAVE_GNU_LD) != 0
  		? TLS_DELAY_SLOT_TRUE : TLS_DELAY_SLOT_FALSE)"))
  
  (define_attr "in_sibcall_delay" "false,true"
***************
*** 8070,8076 ****
  		(unspec:P [(match_operand:P 2 "register_operand" "r")
  			   (match_operand 3 "tie_symbolic_operand" "")]
  			  UNSPEC_TLSIE)))]
!   "TARGET_SUN_TLS"
    "add\\t%1, %2, %0, %%tie_add(%a3)")
  
  (define_insn "@tle_hix22<P:mode>"
--- 8070,8076 ----
  		(unspec:P [(match_operand:P 2 "register_operand" "r")
  			   (match_operand 3 "tie_symbolic_operand" "")]
  			  UNSPEC_TLSIE)))]
!   "!HAVE_GNU_AS"
    "add\\t%1, %2, %0, %%tie_add(%a3)")
  
  (define_insn "@tle_hix22<P:mode>"
diff -Nrcpad gcc-16-20260111/gcc/config/sparc/sparc.opt.urls gcc-16-20260118/gcc/config/sparc/sparc.opt.urls
*** gcc-16-20260111/gcc/config/sparc/sparc.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/sparc/sparc.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/SPARC-Options.html#index-m
*** 60,65 ****
--- 60,71 ----
  msubxc
  UrlSuffix(gcc/SPARC-Options.html#index-msubxc)
  
+ mptr64
+ UrlSuffix(gcc/SPARC-Options.html#index-mptr64)
+ 
+ mptr32
+ UrlSuffix(gcc/SPARC-Options.html#index-mptr32)
+ 
  m64
  UrlSuffix(gcc/SPARC-Options.html#index-m64-3)
  
diff -Nrcpad gcc-16-20260111/gcc/config/v850/v850.opt gcc-16-20260118/gcc/config/v850/v850.opt
*** gcc-16-20260111/gcc/config/v850/v850.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/v850/v850.opt	Sun Jan 18 22:32:07 2026
*************** Target Mask(BIG_SWITCH)
*** 33,39 ****
  Use 4 byte entries in switch tables.
  
  mdebug
! Target Mask(DEBUG)
  Enable backend debugging.
  
  mdisable-callt
--- 33,39 ----
  Use 4 byte entries in switch tables.
  
  mdebug
! Target Undocumented Mask(DEBUG)
  Enable backend debugging.
  
  mdisable-callt
*************** Do not use the callt instruction (defaul
*** 42,55 ****
  
  mep
  Target Mask(EP)
! Reuse r30 on a per function basis.
  
  mghs
  Target RejectNegative InverseMask(GCC_ABI) MaskExists
  
  mlong-calls
  Target Mask(LONG_CALLS)
! Prohibit PC relative function calls.
  
  mprolog-function
  Target Mask(PROLOG_FUNCTION)
--- 42,56 ----
  
  mep
  Target Mask(EP)
! Reuse r30 on a per-function basis.
  
  mghs
  Target RejectNegative InverseMask(GCC_ABI) MaskExists
+ Alias for -mrh850-abi.
  
  mlong-calls
  Target Mask(LONG_CALLS)
! Prohibit PC-relative function calls.
  
  mprolog-function
  Target Mask(PROLOG_FUNCTION)
*************** mtda-
*** 78,92 ****
  Target RejectNegative Joined Undocumented Alias(mtda=)
  
  mno-strict-align
! Target Mask(NO_STRICT_ALIGN)
  Do not enforce strict alignment.
  
  mjump-tables-in-data-section
  Target Mask(JUMP_TABLES_IN_DATA_SECTION)
  Put jump tables for switch statements into the .data section rather than the .code section.
  
  mUS-bit-set
! Target Mask(US_BIT_SET)
  
  mv850
  Target RejectNegative Mask(V850)
--- 79,94 ----
  Target RejectNegative Joined Undocumented Alias(mtda=)
  
  mno-strict-align
! Target RejectNegative Mask(NO_STRICT_ALIGN)
  Do not enforce strict alignment.
  
  mjump-tables-in-data-section
  Target Mask(JUMP_TABLES_IN_DATA_SECTION)
  Put jump tables for switch statements into the .data section rather than the .code section.
  
+ ; Not used or documented anywhere.
  mUS-bit-set
! Target Undocumented Mask(US_BIT_SET)
  
  mv850
  Target RejectNegative Mask(V850)
diff -Nrcpad gcc-16-20260111/gcc/config/v850/v850.opt.urls gcc-16-20260118/gcc/config/v850/v850.opt.urls
*** gcc-16-20260111/gcc/config/v850/v850.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/v850/v850.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/V850-Options.html#index-mp
*** 26,38 ****
  msda=
  UrlSuffix(gcc/V850-Options.html#index-msda)
  
  mspace
  UrlSuffix(gcc/V850-Options.html#index-mspace)
  
  mtda=
  UrlSuffix(gcc/V850-Options.html#index-mtda)
  
! ; skipping UrlSuffix for 'mno-strict-align' due to finding no URLs
  
  mv850
  UrlSuffix(gcc/V850-Options.html#index-mv850)
--- 26,45 ----
  msda=
  UrlSuffix(gcc/V850-Options.html#index-msda)
  
+ msmall-sld
+ UrlSuffix(gcc/V850-Options.html#index-msmall-sld)
+ 
  mspace
  UrlSuffix(gcc/V850-Options.html#index-mspace)
  
  mtda=
  UrlSuffix(gcc/V850-Options.html#index-mtda)
  
! mno-strict-align
! UrlSuffix(gcc/V850-Options.html#index-mno-strict-align-6)
! 
! mjump-tables-in-data-section
! UrlSuffix(gcc/V850-Options.html#index-mjump-tables-in-data-section)
  
  mv850
  UrlSuffix(gcc/V850-Options.html#index-mv850)
*************** mzda=
*** 65,71 ****
  UrlSuffix(gcc/V850-Options.html#index-mzda)
  
  mrelax
! UrlSuffix(gcc/V850-Options.html#index-mrelax-9)
  
  mlong-jumps
  UrlSuffix(gcc/V850-Options.html#index-mlong-jumps)
--- 72,78 ----
  UrlSuffix(gcc/V850-Options.html#index-mzda)
  
  mrelax
! UrlSuffix(gcc/V850-Options.html#index-mrelax-10)
  
  mlong-jumps
  UrlSuffix(gcc/V850-Options.html#index-mlong-jumps)
diff -Nrcpad gcc-16-20260111/gcc/config/vax/elf.opt gcc-16-20260118/gcc/config/vax/elf.opt
*** gcc-16-20260111/gcc/config/vax/elf.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/vax/elf.opt	Sun Jan 18 22:32:07 2026
***************
*** 24,29 ****
  ; Please try to keep this file in ASCII collating order.
  
  mno-asm-pic
! Target RejectNegative
  
  ; This comment is to ensure we retain the blank line above.
--- 24,29 ----
  ; Please try to keep this file in ASCII collating order.
  
  mno-asm-pic
! Target RejectNegative Undocumented
  
  ; This comment is to ensure we retain the blank line above.
diff -Nrcpad gcc-16-20260111/gcc/config/vax/vax.opt.urls gcc-16-20260118/gcc/config/vax/vax.opt.urls
*** gcc-16-20260111/gcc/config/vax/vax.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/vax/vax.opt.urls	Sun Jan 18 22:32:07 2026
*************** munix
*** 19,23 ****
  UrlSuffix(gcc/VAX-Options.html#index-munix)
  
  mlra
! UrlSuffix(gcc/VAX-Options.html#index-mlra-1)
  
--- 19,29 ----
  UrlSuffix(gcc/VAX-Options.html#index-munix)
  
  mlra
! UrlSuffix(gcc/VAX-Options.html#index-mlra-3)
! 
! mvaxc-alignment
! UrlSuffix(gcc/VAX-Options.html#index-mvaxc-alignment)
! 
! mqmath
! UrlSuffix(gcc/VAX-Options.html#index-mqmath)
  
diff -Nrcpad gcc-16-20260111/gcc/config/visium/visium.opt gcc-16-20260118/gcc/config/visium/visium.opt
*** gcc-16-20260111/gcc/config/visium/visium.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/visium/visium.opt	Sun Jan 18 22:32:07 2026
*************** Target RejectNegative InverseMask(SV_MOD
*** 69,75 ****
  Generate code for the user mode.
  
  menable-trampolines
! Target RejectNegative
  Only retained for backward compatibility.
  
  Mask(MCM)
--- 69,75 ----
  Generate code for the user mode.
  
  menable-trampolines
! Target Undocumented RejectNegative
  Only retained for backward compatibility.
  
  Mask(MCM)
diff -Nrcpad gcc-16-20260111/gcc/config/vms/vms.opt gcc-16-20260118/gcc/config/vms/vms.opt
*** gcc-16-20260111/gcc/config/vms/vms.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/vms/vms.opt	Sun Jan 18 22:32:07 2026
*************** HeaderInclude
*** 20,26 ****
  config/vms/vms-opts.h
  
  map
! Target RejectNegative
  
  mmalloc64
  Target Var(flag_vms_malloc64) Init(1)
--- 20,26 ----
  config/vms/vms-opts.h
  
  map
! Target Undocumented RejectNegative
  
  mmalloc64
  Target Var(flag_vms_malloc64) Init(1)
diff -Nrcpad gcc-16-20260111/gcc/config/vxworks.opt.urls gcc-16-20260118/gcc/config/vxworks.opt.urls
*** gcc-16-20260111/gcc/config/vxworks.opt.urls	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/vxworks.opt.urls	Sun Jan 18 22:32:07 2026
*************** UrlSuffix(gcc/VxWorks-Options.html#index
*** 15,20 ****
--- 15,23 ----
  mrtp
  UrlSuffix(gcc/VxWorks-Options.html#index-mrtp)
  
+ mvthreads
+ UrlSuffix(gcc/VxWorks-Options.html#index-mvthreads)
+ 
  non-static
  UrlSuffix(gcc/VxWorks-Options.html#index-non-static)
  
diff -Nrcpad gcc-16-20260111/gcc/config/x-freebsd gcc-16-20260118/gcc/config/x-freebsd
*** gcc-16-20260111/gcc/config/x-freebsd	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/config/x-freebsd	Sun Jan 18 22:32:07 2026
***************
*** 0 ****
--- 1,4 ----
+ host-freebsd.o : $(srcdir)/config/host-freebsd.cc $(CONFIG_H) $(SYSTEM_H) \
+   coretypes.h hosthooks.h hosthooks-def.h $(HOOKS_H)
+ 	$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ 		$(srcdir)/config/host-freebsd.cc
diff -Nrcpad gcc-16-20260111/gcc/config/xtensa/uclinux.opt gcc-16-20260118/gcc/config/xtensa/uclinux.opt
*** gcc-16-20260111/gcc/config/xtensa/uclinux.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/xtensa/uclinux.opt	Sun Jan 18 22:32:07 2026
***************
*** 24,32 ****
  ; Please try to keep this file in ASCII collating order.
  
  elf2flt
! Driver
  
  elf2flt=
! Driver JoinedOrMissing
  
  ; This comment is to ensure we retain the blank line above.
--- 24,32 ----
  ; Please try to keep this file in ASCII collating order.
  
  elf2flt
! Driver Undocumented
  
  elf2flt=
! Driver Undocumented JoinedOrMissing
  
  ; This comment is to ensure we retain the blank line above.
diff -Nrcpad gcc-16-20260111/gcc/config/xtensa/xtensa.opt gcc-16-20260118/gcc/config/xtensa/xtensa.opt
*** gcc-16-20260111/gcc/config/xtensa/xtensa.opt	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config/xtensa/xtensa.opt	Sun Jan 18 22:32:07 2026
*************** Target RejectNegative Joined UInteger Va
*** 38,44 ****
  Set extra memory access cost for L32R instruction, in clock-cycle units.
  
  mlra
! Target Ignore
  Does nothing.  Preserved for backward compatibility.
  
  mtarget-align
--- 38,44 ----
  Set extra memory access cost for L32R instruction, in clock-cycle units.
  
  mlra
! Target Undocumented Ignore
  Does nothing.  Preserved for backward compatibility.
  
  mtarget-align
diff -Nrcpad gcc-16-20260111/gcc/config.gcc gcc-16-20260118/gcc/config.gcc
*** gcc-16-20260111/gcc/config.gcc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config.gcc	Sun Jan 18 22:32:06 2026
*************** case "${target}" in
*** 4394,4400 ****
  				  echo "Unknown extension used in --with-$which=$val" 1>&2
  				  exit 1
  				fi
! 				ext_val=`echo $ext_val | sed -E -e 's/[a-z0-9]+//'`
  			  done
  
  			  true
--- 4394,4400 ----
  				  echo "Unknown extension used in --with-$which=$val" 1>&2
  				  exit 1
  				fi
! 				ext_val=`echo $ext_val | sed -E -e 's/[a-z0-9-]+//'`
  			  done
  
  			  true
diff -Nrcpad gcc-16-20260111/gcc/config.host gcc-16-20260118/gcc/config.host
*** gcc-16-20260111/gcc/config.host	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/config.host	Sun Jan 18 22:32:06 2026
*************** case ${host} in
*** 271,276 ****
--- 271,280 ----
      out_host_hook_obj=host-linux.o
      host_xmake_file="${host_xmake_file} x-linux"
      ;;
+   *-*-freebsd*)
+     out_host_hook_obj=host-freebsd.o
+     host_xmake_file="${host_xmake_file} x-freebsd"
+     ;;
    *-*-openbsd*)
      out_host_hook_obj=host-openbsd.o
      host_xmake_file="${host_xmake_file} x-openbsd"
diff -Nrcpad gcc-16-20260111/gcc/config.in gcc-16-20260118/gcc/config.in
*** gcc-16-20260111/gcc/config.in	Sun Jan 11 22:32:19 2026
--- gcc-16-20260118/gcc/config.in	Sun Jan 18 22:32:19 2026
***************
*** 804,823 ****
  #endif
  
  
- /* Define if your assembler and linker support unaligned PC relative relocs.
-    */
- #ifndef USED_FOR_TARGET
- #undef HAVE_AS_SPARC_UA_PCREL
- #endif
- 
- 
- /* Define if your assembler and linker support unaligned PC relative relocs
-    against hidden symbols. */
- #ifndef USED_FOR_TARGET
- #undef HAVE_AS_SPARC_UA_PCREL_HIDDEN
- #endif
- 
- 
  /* Define if your assembler supports call36 relocation. */
  #ifndef USED_FOR_TARGET
  #undef HAVE_AS_SUPPORT_CALL36
--- 804,809 ----
***************
*** 2658,2663 ****
--- 2644,2655 ----
  #endif
  
  
+ /* Define if your linker supports AS_NEEDED in linker scripts. */
+ #ifndef USED_FOR_TARGET
+ #undef USE_LD_AS_NEEDED_LDSCRIPT
+ #endif
+ 
+ 
  /* Define to 1 if the 'long long' type is wider than 'long' but still
     efficiently supported by the host hardware. */
  #ifndef USED_FOR_TARGET
diff -Nrcpad gcc-16-20260111/gcc/configure gcc-16-20260118/gcc/configure
*** gcc-16-20260111/gcc/configure	Sun Jan 11 22:32:19 2026
--- gcc-16-20260118/gcc/configure	Sun Jan 18 22:32:19 2026
*************** $as_echo "#define HAVE_AS_SPARC_GOTDATA_
*** 29221,29320 ****
  fi
  
  
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for unaligned pcrel relocs" >&5
- $as_echo_n "checking assembler for unaligned pcrel relocs... " >&6; }
- if ${gcc_cv_as_sparc_ua_pcrel+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   gcc_cv_as_sparc_ua_pcrel=no
-   if test x"$gcc_cv_as" != x; then
-     $as_echo '.text
- foo:
- 	nop
- .data
- .align 4
- .byte 0
- .uaword %r_disp32(foo)' > conftest.s
-     if { ac_try='$gcc_cv_as $gcc_cv_as_flags -K PIC -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 "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-   test $ac_status = 0; }; }
-     then
- 	if test x$gcc_cv_ld != x \
-        && $gcc_cv_ld -o conftest conftest.o -G > /dev/null 2>&1; then
- 	 gcc_cv_as_sparc_ua_pcrel=yes
-        fi
-        rm -f conftest
-     else
-       echo "configure: failed program was" >&5
-       cat conftest.s >&5
-     fi
-     rm -f conftest.o conftest.s
-   fi
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_sparc_ua_pcrel" >&5
- $as_echo "$gcc_cv_as_sparc_ua_pcrel" >&6; }
- if test $gcc_cv_as_sparc_ua_pcrel = yes; then
- 
- $as_echo "#define HAVE_AS_SPARC_UA_PCREL 1" >>confdefs.h
- 
- 
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for unaligned pcrel relocs against hidden symbols" >&5
- $as_echo_n "checking assembler for unaligned pcrel relocs against hidden symbols... " >&6; }
- if ${gcc_cv_as_sparc_ua_pcrel_hidden+:} false; then :
-   $as_echo_n "(cached) " >&6
- else
-   gcc_cv_as_sparc_ua_pcrel_hidden=no
-   if test x"$gcc_cv_as" != x; then
-     $as_echo '.data
- .align 4
- .byte 0x31
- .uaword %r_disp32(foo)
- .byte 0x32, 0x33, 0x34
- .global foo
- .hidden foo
- foo:
- .skip 4' > conftest.s
-     if { ac_try='$gcc_cv_as $gcc_cv_as_flags -K PIC -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 "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-   test $ac_status = 0; }; }
-     then
- 	if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
- 	 && $gcc_cv_ld -o conftest conftest.o -G > /dev/null 2>&1 \
- 	 && $gcc_cv_objdump -s -j .data conftest 2> /dev/null \
- 	    | grep ' 31000000 07323334' > /dev/null 2>&1; then
- 	    if $gcc_cv_objdump -R conftest 2> /dev/null \
- 	       | grep 'DISP32' > /dev/null 2>&1; then
- 		:
- 	    else
- 		gcc_cv_as_sparc_ua_pcrel_hidden=yes
- 	    fi
- 	 fi
- 	 rm -f conftest
-     else
-       echo "configure: failed program was" >&5
-       cat conftest.s >&5
-     fi
-     rm -f conftest.o conftest.s
-   fi
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_sparc_ua_pcrel_hidden" >&5
- $as_echo "$gcc_cv_as_sparc_ua_pcrel_hidden" >&6; }
- if test $gcc_cv_as_sparc_ua_pcrel_hidden = yes; then
- 
- $as_echo "#define HAVE_AS_SPARC_UA_PCREL_HIDDEN 1" >>confdefs.h
- 
- fi
- 
- 
- fi
-  # unaligned pcrel relocs
- 
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for offsetable %lo()" >&5
  $as_echo_n "checking assembler for offsetable %lo()... " >&6; }
  if ${gcc_cv_as_sparc_offsetable_lo10+:} false; then :
--- 29221,29226 ----
*************** else
*** 33445,33454 ****
--- 33351,33362 ----
    gcc_cv_ld_as_needed=no
  gcc_cv_ld_as_needed_option='--as-needed'
  gcc_cv_ld_no_as_needed_option='--no-as-needed'
+ gcc_cv_ld_use_as_needed_ldscript=no
  if test $in_tree_ld = yes ; then
    if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 \
       && test $in_tree_ld_is_elf = yes; then
      gcc_cv_ld_as_needed=yes
+     gcc_cv_ld_use_as_needed_ldscript=yes
      if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 28; then
        gcc_cv_ld_as_needed_option='--push-state --as-needed'
        gcc_cv_ld_no_as_needed_option='--pop-state'
*************** elif test x$gcc_cv_ld != x; then
*** 33458,33463 ****
--- 33366,33372 ----
    # Check if linker supports --as-needed and --no-as-needed options
    if $gcc_cv_ld --help 2>&1 | grep as-needed > /dev/null; then
      gcc_cv_ld_as_needed=yes
+     gcc_cv_ld_use_as_needed_ldscript=yes
      if $gcc_cv_ld --help 2>&1 | grep push-state > /dev/null \
         && $gcc_cv_ld --help 2>&1 | grep pop-state > /dev/null \
         && echo "$ld_ver" | grep GNU > /dev/null \
*************** elif test x$gcc_cv_ld != x; then
*** 33476,33481 ****
--- 33385,33391 ----
        gcc_cv_ld_as_needed=yes
        gcc_cv_ld_as_needed_option="-z ignore"
        gcc_cv_ld_no_as_needed_option="-z record"
+       gcc_cv_ld_use_as_needed_ldscript=no
        ;;
    esac
  fi
*************** case "$target" in
*** 33484,33489 ****
--- 33394,33400 ----
      if echo "$ld_ver" | grep GNU > /dev/null; then
        # Doesn't work with gld on Solaris/x86 due to PR ld/12320.
        gcc_cv_ld_as_needed=no
+       gcc_cv_ld_use_as_needed_ldscript=no
      fi
      ;;
  esac
*************** cat >>confdefs.h <<_ACEOF
*** 33506,33511 ****
--- 33417,33427 ----
  _ACEOF
  
  fi
+ if test x"$gcc_cv_ld_use_as_needed_ldscript" = xyes; then
+ 
+ $as_echo "#define USE_LD_AS_NEEDED_LDSCRIPT 1" >>confdefs.h
+ 
+ fi
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker mapfile support for clearing hardware capabilities" >&5
  $as_echo_n "checking linker mapfile support for clearing hardware capabilities... " >&6; }
diff -Nrcpad gcc-16-20260111/gcc/configure.ac gcc-16-20260118/gcc/configure.ac
*** gcc-16-20260111/gcc/configure.ac	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/configure.ac	Sun Jan 18 22:32:07 2026
*************** bar:
*** 4754,4805 ****
        [AC_DEFINE(HAVE_AS_SPARC_GOTDATA_OP, 1,
  		[Define if your assembler and linker support GOTDATA_OP relocs.])])
  
-     gcc_GAS_CHECK_FEATURE([unaligned pcrel relocs],
-       gcc_cv_as_sparc_ua_pcrel,
-       [-K PIC],
- [.text
- foo:
- 	nop
- .data
- .align 4
- .byte 0
- .uaword %r_disp32(foo)],
-       [if test x$gcc_cv_ld != x \
-        && $gcc_cv_ld -o conftest conftest.o -G > /dev/null 2>&1; then
- 	 gcc_cv_as_sparc_ua_pcrel=yes
-        fi
-        rm -f conftest],
-       [AC_DEFINE(HAVE_AS_SPARC_UA_PCREL, 1,
- 		[Define if your assembler and linker support unaligned PC relative relocs.])
- 
-       gcc_GAS_CHECK_FEATURE([unaligned pcrel relocs against hidden symbols],
- 	gcc_cv_as_sparc_ua_pcrel_hidden,
- 	[-K PIC],
- [.data
- .align 4
- .byte 0x31
- .uaword %r_disp32(foo)
- .byte 0x32, 0x33, 0x34
- .global foo
- .hidden foo
- foo:
- .skip 4],
- 	[if test x$gcc_cv_ld != x && test x$gcc_cv_objdump != x \
- 	 && $gcc_cv_ld -o conftest conftest.o -G > /dev/null 2>&1 \
- 	 && $gcc_cv_objdump -s -j .data conftest 2> /dev/null \
- 	    | grep ' 31000000 07323334' > /dev/null 2>&1; then
- 	    if $gcc_cv_objdump -R conftest 2> /dev/null \
- 	       | grep 'DISP32' > /dev/null 2>&1; then
- 		:
- 	    else
- 		gcc_cv_as_sparc_ua_pcrel_hidden=yes
- 	    fi
- 	 fi
- 	 rm -f conftest],
- 	 [AC_DEFINE(HAVE_AS_SPARC_UA_PCREL_HIDDEN, 1,
- 		   [Define if your assembler and linker support unaligned PC relative relocs against hidden symbols.])])
-     ]) # unaligned pcrel relocs
- 
      gcc_GAS_CHECK_FEATURE([offsetable %lo()],
        gcc_cv_as_sparc_offsetable_lo10,
        [-xarch=v9],
--- 4754,4759 ----
*************** gcc_cv_ld_as_needed,
*** 6652,6661 ****
--- 6606,6617 ----
  [gcc_cv_ld_as_needed=no
  gcc_cv_ld_as_needed_option='--as-needed'
  gcc_cv_ld_no_as_needed_option='--no-as-needed'
+ gcc_cv_ld_use_as_needed_ldscript=no
  if test $in_tree_ld = yes ; then
    if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 16 -o "$gcc_cv_gld_major_version" -gt 2 \
       && test $in_tree_ld_is_elf = yes; then
      gcc_cv_ld_as_needed=yes
+     gcc_cv_ld_use_as_needed_ldscript=yes
      if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 28; then
        gcc_cv_ld_as_needed_option='--push-state --as-needed'
        gcc_cv_ld_no_as_needed_option='--pop-state'
*************** elif test x$gcc_cv_ld != x; then
*** 6665,6670 ****
--- 6621,6627 ----
    # Check if linker supports --as-needed and --no-as-needed options
    if $gcc_cv_ld --help 2>&1 | grep as-needed > /dev/null; then
      gcc_cv_ld_as_needed=yes
+     gcc_cv_ld_use_as_needed_ldscript=yes
      if $gcc_cv_ld --help 2>&1 | grep push-state > /dev/null \
         && $gcc_cv_ld --help 2>&1 | grep pop-state > /dev/null \
         && echo "$ld_ver" | grep GNU > /dev/null \
*************** elif test x$gcc_cv_ld != x; then
*** 6683,6688 ****
--- 6640,6646 ----
        gcc_cv_ld_as_needed=yes
        gcc_cv_ld_as_needed_option="-z ignore"
        gcc_cv_ld_no_as_needed_option="-z record"
+       gcc_cv_ld_use_as_needed_ldscript=no
        ;;
    esac
  fi
*************** case "$target" in
*** 6691,6696 ****
--- 6649,6655 ----
      if echo "$ld_ver" | grep GNU > /dev/null; then
        # Doesn't work with gld on Solaris/x86 due to PR ld/12320.
        gcc_cv_ld_as_needed=no
+       gcc_cv_ld_use_as_needed_ldscript=no
      fi
      ;;
  esac
*************** if test x"$gcc_cv_ld_as_needed" = xyes;
*** 6703,6708 ****
--- 6662,6671 ----
  	AC_DEFINE_UNQUOTED(LD_NO_AS_NEEDED_OPTION, "$gcc_cv_ld_no_as_needed_option",
  [Define to the linker option to keep unused dependencies.])
  fi
+ if test x"$gcc_cv_ld_use_as_needed_ldscript" = xyes; then
+ 	AC_DEFINE(USE_LD_AS_NEEDED_LDSCRIPT, 1,
+ [Define if your linker supports AS_NEEDED in linker scripts.])
+ fi
  
  AC_MSG_CHECKING(linker mapfile support for clearing hardware capabilities)
  saved_LDFLAGS="$LDFLAGS"
diff -Nrcpad gcc-16-20260111/gcc/cp/ChangeLog gcc-16-20260118/gcc/cp/ChangeLog
*** gcc-16-20260111/gcc/cp/ChangeLog	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/ChangeLog	Sun Jan 18 22:32:07 2026
***************
*** 1,3 ****
--- 1,432 ----
+ 2026-01-17  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/123627
+ 	* class.cc (finish_struct): Maybe key function-local types.
+ 	* module.cc (trees_out::get_merge_kind): Choose whether to use
+ 	MK_local_type or MK_keyed for a local type based on if the
+ 	immediate context's definition will be streamed.
+ 	(trees_in::key_mergeable): Allow key decls on FUNCTION_DECL.
+ 	(adjust_key_scope): New function.
+ 	(maybe_key_decl): Handle key decls on FUNCTION_DECL; check that
+ 	we only key a given decl to a context at most once.
+ 	(get_keyed_decl_scope): Support non-lambda decls.
+ 
+ 2026-01-16  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* reflect.cc (eval_variable_of): Update comment.
+ 
+ 2026-01-16  Jakub Jelinek  <jakub@redhat.com>
+ 	    Peter Damianov  <peter0x44@disroot.org>
+ 
+ 	PR c/123437
+ 	* typeck.cc (cp_build_binary_op): Don't use RDIV_EXPR
+ 	resultcode if both types are integral, _BitInt or
+ 	newly VECTOR_TYPE of ENUMERAL_TYPE.
+ 
+ 2026-01-15  Marek Polacek  <polacek@redhat.com>
+ 	    Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120775
+ 	PR c++/123081
+ 	PR c++/122634
+ 	* Make-lang.in: Add cp/reflect.o.  Add a rule for cp/metafns.h.
+ 	* config-lang.in: Add reflect.cc.
+ 	* constexpr.cc (constexpr_global_ctx): Add consteval_block and
+ 	metafns_called members.  Initialize them.
+ 	(cxx_constexpr_quiet_p): New.
+ 	(cxx_constexpr_manifestly_const_eval): New.
+ 	(cxx_constexpr_caller): New.
+ 	(cxx_constexpr_consteval_block): New.
+ 	(enum value_cat): Move into cp-tree.h.
+ 	(cxx_eval_constant_expression): Move the declaration into cp-tree.h.
+ 	No longer static.  Handle REFLECT_EXPR.  Handle conversion of
+ 	a reflection to the meta::info type.
+ 	(cxx_eval_cxa_builtin_fn): Override current_function_decl.
+ 	(cxx_eval_builtin_function_call): Handle __builtin_is_string_literal.
+ 	(is_std_allocator): Also check __new_allocator.
+ 	(is_std_allocator_allocate): No longer static.
+ 	(cxa_allocate_and_throw_exception): New.
+ 	(cxx_eval_call_expression): Handle metafunctions.  Maybe set
+ 	metafns_called.
+ 	(reduced_constant_expression_p): Handle REFLECT_EXPR.
+ 	(cxx_eval_binary_expression): Use compare_reflections for comparing
+ 	reflections.
+ 	(find_immediate_fndecl): Don't walk REFLECT_EXPR_P.
+ 	(cxx_eval_outermost_constant_expr): Set global_ctx.consteval_block.
+ 	Detect consteval-only smuggling.
+ 	(potential_constant_expression_1): Return true for REFLECT_EXPR
+ 	and SPLICE_EXPR.
+ 	* constraint.cc (diagnose_trait_expr): Add CPTK_IS_CONSTEVAL_ONLY case.
+ 	* cp-gimplify.cc (immediate_escalating_function_p): No longer static.
+ 	(promote_function_to_consteval): Likewise.
+ 	(cp_gimplify_expr) <case CALL_EXPR>: Detect any surviving consteval-only
+ 	expressions.
+ 	<case CP_BUILT_IN_IS_STRING_LITERAL>: Handle.
+ 	(wipe_consteval_only_r): New.
+ 	(cp_fold_immediate_r): Detect invalid uses of consteval-only types.
+ 	Clear consteval-only DECL_EXPRs.
+ 	(cp_genericize_r): Wipe consteval-only vars from BIND_EXPR_VARS and
+ 	BLOCK_VARS.
+ 	* cp-objcp-common.cc (cp_common_init_ts): Mark META_TYPE, SPLICE_SCOPE,
+ 	SPLICE_EXPR, and REFLECT_EXPR.
+ 	* cp-trait.def (IS_CONSTEVAL_ONLY): New trait.
+ 	* cp-tree.def (REFLECT_EXPR, META_TYPE, SPLICE_EXPR, SPLICE_SCOPE): New
+ 	trees.
+ 	* cp-tree.h (enum cp_tree_index): Add CPTI_ANNOTATION_IDENTIFIER,
+ 	CPTI_STD_META, and CPTI_META_INFO_TYPE.
+ 	(std_meta_node): Define.
+ 	(meta_info_type_node): Define.
+ 	(annotation_identifier): Define.
+ 	(REFLECTION_TYPE_P): Define.
+ 	(REFLECT_EXPR_P): Define.
+ 	(REFLECT_EXPR_HANDLE): Define.
+ 	(enum reflect_kind): New.
+ 	(REFLECT_EXPR_KIND): Define.
+ 	(SET_REFLECT_EXPR_KIND): Define.
+ 	(SPLICE_EXPR_EXPRESSION_P): Define.
+ 	(SET_SPLICE_EXPR_EXPRESSION_P): Define.
+ 	(SPLICE_EXPR_MEMBER_ACCESS_P): Define.
+ 	(SET_SPLICE_EXPR_MEMBER_ACCESS_P): Define.
+ 	(SPLICE_EXPR_ADDRESS_P): Define.
+ 	(SET_SPLICE_EXPR_ADDRESS_P): Define.
+ 	(SPLICE_SCOPE_EXPR): Define.
+ 	(SPLICE_SCOPE_TYPE_P): Define.
+ 	(WILDCARD_TYPE_P): Include SPLICE_SCOPE.
+ 	(COMPONENT_REF_SPLICE_P): Define.
+ 	(SCALAR_TYPE_P): Include REFLECTION_TYPE_P.
+ 	(ENUM_BEING_DEFINED_P): Define.
+ 	(OLD_PARM_DECL_P): Define.
+ 	(MULTIPLE_NAMES_PARM_P): Define.
+ 	(cp_preserve_using_decl): Declare.
+ 	(DEF_OPERATOR, DEF_ASSN_OPERATOR): Include META.
+ 	(struct ovl_op_info_t): Add meta_name member.
+ 	(enum cp_built_in_function): Add CP_BUILT_IN_IS_STRING_LITERAL.
+ 	(build_stub_type): Declare.
+ 	(current_function_decl_without_access_scope): Declare.
+ 	(dependent_namespace_p): Declare.
+ 	(convert_reflect_constant_arg): Declare.
+ 	(finish_base_specifier): Adjust declaration.
+ 	(parsing_lambda_declarator): Declare.
+ 	(fold_builtin_is_string_literal): Declare.
+ 	(annotation_p): Declare.
+ 	(finish_class_member_access_expr): Adjust declaration.
+ 	(immediate_escalating_function_p): Declare.
+ 	(promote_function_to_consteval): Declare.
+ 	(is_std_allocator_allocate): Declare.
+ 	(cxa_allocate_and_throw_exception): Declare.
+ 	(enum value_cat): Define.
+ 	(cxx_eval_constant_expression): Declare.
+ 	(cxx_constexpr_quiet_p): Declare.
+ 	(cxx_constexpr_manifestly_const_eval): Declare.
+ 	(cxx_constexpr_caller): Declare.
+ 	(cxx_constexpr_consteval_block): Declare.
+ 	(init_reflection): Declare.
+ 	(metafunction_p): Declare.
+ 	(direct_base_parent): Declare.
+ 	(process_metafunction): Declare.
+ 	(get_reflection): Declare.
+ 	(get_null_reflection): Declare.
+ 	(splice): Declare.
+ 	(check_out_of_consteval_use): Declare.
+ 	(consteval_only_p): Declare.
+ 	(compare_reflections): Declare.
+ 	(valid_splice_type_p): Declare.
+ 	(valid_splice_scope_p): Declare.
+ 	(check_splice_expr): Declare.
+ 	(make_splice_scope): Declare.
+ 	(dependent_splice_p): Declare.
+ 	(reflection_mangle_prefix): Declare.
+ 	(check_consteval_only_fn): Declare.
+ 	* cvt.cc (convert_to_void): Call check_out_of_consteval_use.
+ 	* cxx-pretty-print.cc (cxx_pretty_printer::unary_expression): New
+ 	REFLECT_EXPR case.
+ 	(cxx_pretty_printer::expression): Likewise.
+ 	(cxx_pretty_printer::simple_type_specifier): New META_TYPE case.
+ 	(cxx_pretty_printer::type_id): Likewise.
+ 	* decl.cc (duplicate_decls): Merge parameter names for Reflection.
+ 	Maybe set OLD_PARM_DECL_P.
+ 	(initialize_predefined_identifiers): Add "annotation ".
+ 	(cxx_init_decl_processing): Add __builtin_is_string_literal.  Call
+ 	init_reflection.
+ 	(maybe_commonize_var): Do nothing for consteval_only_p.
+ 	(check_initializer): Default-initialize std::meta::info.
+ 	(make_rtl_for_nonlocal_decl): For consteval_only_p vars, set
+ 	DECL_EXTERNAL and return early.
+ 	(cp_finish_decl): Call check_out_of_consteval_use.  Don't go
+ 	creating a varpool node for consteval_only_p.
+ 	(get_tuple_size): Check the instantiation instead of the type.
+ 	(grokfndecl): Call check_consteval_only_fn.
+ 	(xref_basetypes): Stitch annotations onto BINFO_BASE_ACCESSES.
+ 	(finish_enum_value_list): Clear ENUM_BEING_DEFINED_P.
+ 	* decl2.cc (is_late_template_attribute): Handle all annotations as
+ 	late.
+ 	(cp_check_const_attributes): Don't handle annotations here.
+ 	(maybe_make_one_only): Do nothing for consteval_only_p.
+ 	(mark_needed): Likewise.
+ 	(min_vis_expr_r): Handle reflections.
+ 	(prune_vars_needing_no_initialization): Skip consteval_only_p.
+ 	(no_linkage_error): Return early for metafunctions.
+ 	(c_parse_final_cleanups): Don't write out consteval_only_p vars.  Avoid
+ 	complaining about metafunctions.
+ 	* error.cc (dump_type): New cases for CONST_DECL, META_TYPE, and
+ 	SPLICE_SCOPE.
+ 	(dump_type_prefix): New cases for META_TYPE and SPLICE_SCOPE.
+ 	(dump_type_suffix): Likewise.
+ 	(dump_decl): Dump SPLICE_EXPR.
+ 	(dump_expr): Dump REFLECT_EXPR and SPLICE_EXPR.
+ 	* init.cc (build_zero_init_1): Build a null reflection value.
+ 	(perform_member_init): Call check_out_of_consteval_use.
+ 	* lex.cc (DEF_OPERATOR, OPERATOR_TRANSITION): Update defines.
+ 	* mangle.cc (write_type): Mangle META_TYPE.
+ 	(write_expression): Handle REFLECT_EXPR.
+ 	(write_reflection): New.
+ 	(write_template_arg_literal): New REFLECT_EXPR case.
+ 	(write_template_arg): Handle REFLECT_EXPR.
+ 	* method.cc (build_stub_type): No longer static.
+ 	* module.cc (trees_out::type_node): Handle META_TYPE.
+ 	(trees_in::tree_node): Likewise.
+ 	* name-lookup.cc (name_lookup::adl_type): std::meta is an associated
+ 	namespace of std::meta::info.
+ 	(strip_using_decl): Don't strip when cp_preserve_using_decl.
+ 	(handle_namespace_attrs): Handle annotations.
+ 	(do_namespace_alias): Handle SPLICE_EXPR.
+ 	(lookup_qualified_name): When cp_preserve_using_decl, don't do
+ 	OVL_FUNCTION.
+ 	(finish_using_directive): Detect annotations on using directive.
+ 	* operators.def: Update for META_NAME.
+ 	* parser.cc: New cp_preserve_using_decl global.
+ 	(enum required_token): Add RT_CLOSE_SPLICE.
+ 	(get_required_cpp_ttype): Return CPP_CLOSE_SPLICE for RT_CLOSE_SPLICE.
+ 	(cp_parser_next_tokens_start_splice_type_spec_p): New.
+ 	(cp_parser_next_tokens_can_start_splice_scope_spec_p): New.
+ 	(cp_parser_splice_specifier): New.
+ 	(cp_parser_splice_type_specifier): New.
+ 	(cp_parser_splice_expression): New.
+ 	(cp_parser_splice_scope_specifier): New.
+ 	(cp_parser_splice_spec_is_nns_p): New.
+ 	(cp_parser_nth_token_starts_splice_without_nns_p): New.
+ 	(cp_parser_primary_expression): Handle CPP_OPEN_SPLICE.  Give an
+ 	error for ^^ outside reflection.
+ 	(cp_parser_unqualified_id): Allow r.~typename [:R:].
+ 	(cp_parser_nested_name_specifier_opt): Cope with splice-scope-specifier.
+ 	(cp_parser_qualifying_entity): Parse splice-scope-specifier.
+ 	(cp_parser_postfix_expression): Deal with [: :] after a typename.
+ 	(cp_parser_postfix_dot_deref_expression): Parse & handle splices
+ 	in a class member access.  Pass splice_p to
+ 	finish_class_member_access_expr.
+ 	(cp_parser_reflection_name): New.
+ 	(cp_parser_reflect_expression): New.
+ 	(cp_parser_unary_expression): Parse reflect-expression.
+ 	(cp_parser_declaration): Parse splice-scope-specifier.
+ 	(cp_parser_decomposition_declaration): Detect annotations on structured
+ 	bindings.
+ 	(cp_parser_decltype_expr): Parse splice-expression.
+ 	(cp_parser_template_id): New parsed_templ argument.  If it's nonnull,
+ 	don't parse the template name.  Turn an assert into a condition.
+ 	(cp_parser_type_specifier): Handle typename [: :].
+ 	(cp_parser_simple_type_specifier): Parse splice-type-specifier.
+ 	(cp_parser_enum_specifier): Set ENUM_BEING_DEFINED_P.
+ 	(cp_parser_namespace_alias_definition): Parse splice-specifier.
+ 	(cp_parser_using_directive): Likewise.
+ 	(cp_parser_type_id_1): New bool * parameter to distinguish between
+ 	types and type aliases.  Set it.
+ 	(cp_parser_type_id): Adjust the call to cp_parser_type_id_1.
+ 	(cp_parser_template_type_arg): Likewise.
+ 	(cp_parser_trailing_type_id): Likewise.
+ 	(cp_parser_base_specifier): Handle annotations.  Maybe give an error
+ 	for splice-scope-specifier.  Parse splice-type-specifier.  Pass
+ 	annotations to finish_base_specifier.
+ 	(cp_parser_annotation): New.
+ 	(cp_parser_std_attribute_list): Detect mixing annotations and attributes
+ 	in the same list.
+ 	(cp_parser_annotation_list): New.
+ 	(cp_parser_std_attribute_spec): Parse annotations.
+ 	(cp_parser_skip_balanced_tokens): Also handle CPP_OPEN_SPLICE
+ 	and CPP_CLOSE_SPLICE.
+ 	(cp_parser_type_requirement): Parse splice-type-specifier.
+ 	(cp_parser_lookup_name): Also consider dependent namespaces.  Don't
+ 	call check_accessibility_of_qualified_id for USING_DECLs.
+ 	(cp_parser_required_error): Handle RT_CLOSE_SPLICE.
+ 	* pt.cc (current_function_decl_without_access_scope): New.
+ 	(verify_unstripped_args_1): REFLECT_EXPR_P is OK.
+ 	(iterative_hash_template_arg): Handle REFLECT_EXPR.
+ 	(convert_nontype_argument): Maybe give an error for REFLECTION_TYPE_P.
+ 	(for_each_template_parm_r): Handle SPLICE_SCOPE.
+ 	(instantiate_class_template): Handle annotations.
+ 	(tsubst_pack_index): Make static.
+ 	(tsubst_decl): Handle NAMESPACE_DECL.
+ 	(tsubst_splice_scope): New.
+ 	(tsubst_splice_expr): New.
+ 	(tsubst): Don't return early for NAMESPACE_DECL.   New META_TYPE case.
+ 	Handle a splice-specifier that expanded into a NAMESPACE_DECL.  Handle
+ 	SPLICE_SCOPE, SPLICE_EXPR, and TEMPLATE_ID_EXPR.
+ 	(tsubst_scope): Also accept NAMESPACE_DECL.
+ 	(tsubst_qualified_id): Check dependent_namespace_p.
+ 	(tsubst_lambda_expr): Set LAMBDA_EXPR_CONSTEVAL_BLOCK_P.
+ 	(tsubst_expr): Allow dependent_splice_p in an assert.  Check
+ 	COMPONENT_REF_SPLICE_P and pass it to finish_class_member_access_expr.
+ 	<case NAMESPACE_DECL>: Remove.
+ 	New REFLECT_EXPR and SPLICE_EXPR cases.
+ 	(unify): Handle META_TYPE.
+ 	(instantiate_body): Call check_consteval_only_fn.
+ 	(tsubst_enum): Set ENUM_BEING_DEFINED_P.
+ 	(dependent_type_p_r): A splice-scope-specifier is dependent.
+ 	(dependent_namespace_p): New.
+ 	(value_dependent_expression_p): Handle REFLECT_EXPR.  Also handle
+ 	[meta.reflection.access.context]/8.
+ 	(type_dependent_expression_p): REFLECT_EXPR_P is not type-dependent.
+ 	(convert_reflect_constant_arg): New.
+ 	* search.cc (check_final_overrider): Adjust for CWG 3117.
+ 	* semantics.cc (finish_base_specifier): Handle annotations.
+ 	(parsing_lambda_declarator): No longer static.
+ 	(finish_id_expression_1): Check dependent_namespace_p.
+ 	(fold_builtin_is_string_literal): New.
+ 	(trait_expr_value): Handle CPTK_IS_CONSTEVAL_ONLY.
+ 	(finish_trait_expr): Likewise.
+ 	* tree.cc (handle_annotation_attribute): New.
+ 	(builtin_valid_in_constant_expr_p): Return true for
+ 	CP_BUILT_IN_IS_STRING_LITERAL.
+ 	(cp_tree_equal): Handle comparing REFLECT_EXPRs.
+ 	(internal_attributes): Add "annotation ".
+ 	(annotation_p): New.
+ 	* typeck.cc (finish_class_member_access_expr): New splice_p argument.
+ 	Handle dependent splices.  Implement splicing a base class subobject.
+ 	Handle class member access using a splice-expression.
+ 	(cp_build_binary_op): Handle comparing std::meta::infos.
+ 	(check_return_expr): Call check_out_of_consteval_use.
+ 	* metafns.gperf: New file.
+ 	* metafns.h: New file.
+ 	* reflect.cc: New file.
+ 
+ 2026-01-14  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* call.cc (get_fndecl_argument_location): Use DECL_SOURCE_LOCATION
+ 	for "this".
+ 	* cp-tree.h (class candidate_context): New.
+ 	(print_candidates): Add optional candidate_context param.
+ 	* decl2.cc: Include "gcc-rich-location.h" and
+ 	"tree-pretty-print-markup.h".
+ 	(struct fndecl_signature): New.
+ 	(class parm_rich_location): New.
+ 	(class fndecl_comparison): New.
+ 	(class decl_mismatch_context): New.
+ 	(check_classfn): For the "no declaration matches" case, pass an
+ 	instance of a custom candidate_context subclass to
+ 	print_candidates, using fndecl_comparison to report on close
+ 	matches.
+ 	* pt.cc (print_candidates): Add optional candidate_context param.
+ 	Use it if provided to potentially emit per-candidate notes.
+ 
+ 2026-01-14  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* call.cc (print_z_candidates): Move inform_n call into a new
+ 	inform_num_candidates function.
+ 	* class.cc (check_methods): Pass location to call to
+ 	print_candidates.
+ 	(resolve_address_of_overloaded_function): Likewise.
+ 	* cp-tree.h (print_candidates): Add location_t param.
+ 	(inform_num_candidates): New decl.
+ 	* decl.cc (make_typename_type): Pass location to call to
+ 	print_candidates.
+ 	(reshape_init_class): Likewise.
+ 	(lookup_and_check_tag): Likewise.
+ 	* decl2.cc (check_classfn): Likewise.
+ 	* error.cc (qualified_name_lookup_error): Likewise.
+ 	* init.cc (build_new_1): Likewise.
+ 	* name-lookup.cc (lookup_using_decl): Likewise.
+ 	(set_decl_namespace): Likewise.
+ 	(push_namespace): Likewise.
+ 	* parser.cc (cp_parser_nested_name_specifier_opt): Likewise.
+ 	(cp_parser_lookup_name): Likewise.
+ 	* pt.cc  (print_candidates_1): Drop, converting the looping part
+ 	into...
+ 	(flatten_candidates): ...this new function.
+ 	(inform_num_candidates): New function.
+ 	(print_candidates): Use flatten_candidates to build an auto_vec
+ 	of candidates, and use this to print them here, rather than in
+ 	print_candidates_1.  Eliminate the dynamic allocation of spaces
+ 	for a prefix in favor of printing "candidate %i" when there is
+ 	more than one candidate.  Add "error_loc" param and pass it to
+ 	inform_num_candidates to show a heading, and add nesting levels
+ 	for it and for the candidate notes.
+ 	(determine_specialization): Pass location to calls to
+ 	print_candidates.
+ 	* search.cc (lookup_member): Likewise.
+ 	* semantics.cc (finish_id_expression_1): Likewise.
+ 
+ 2026-01-14  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123551
+ 	* constexpr.cc (potential_constant_expression_1) <case GOTO_EXPR>:
+ 	Only test DECL_ARTIFICIAL on LABEL_DECLs.
+ 
+ 2026-01-13  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	* coroutines.cc (create_coroutine_info_table): New function.
+ 	(get_or_insert_coroutine_info): Mark static.
+ 	(ensure_coro_initialized): Likewise; use
+ 	create_coroutine_info_table.
+ 	(coro_promise_type_found_p): Set DECL_CONTEXT for proxies.
+ 	(coro_set_ramp_function): New function.
+ 	(coro_set_transform_functions): New function.
+ 	(coro_build_actor_or_destroy_function): Use
+ 	coro_set_ramp_function, mark as DECL_COROUTINE_P.
+ 	* cp-tree.h (coro_set_transform_functions): Declare.
+ 	(coro_set_ramp_function): Declare.
+ 	* module.cc (struct merge_key): New field coro_disc.
+ 	(dumper::impl::nested_name): Distinguish coroutine transform
+ 	functions.
+ 	(get_coroutine_discriminator): New function.
+ 	(trees_out::key_mergeable): Stream coroutine discriminator.
+ 	(check_mergeable_decl): Adjust comment, check for matching
+ 	coroutine discriminator.
+ 	(trees_in::key_mergeable): Read coroutine discriminator.
+ 	(has_definition): Override for coroutine transform functions.
+ 	(trees_out::write_function_def): Stream linked ramp, actor, and
+ 	destroy functions for coroutines.
+ 	(trees_in::read_function_def): Read them.
+ 	(module_state::read_cluster): Set cfun->coroutine_component.
+ 
+ 2026-01-13  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	* module.cc (trees_out::lang_decl_bools): Update list of flags.
+ 	(trees_in::lang_decl_bools): Likewise.
+ 
+ 2026-01-12  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/123189
+ 	* name-lookup.cc (binding_to_template_parms_of_scope_p):
+ 	Gracefully handle TEMPLATE_INFO whose TI_TEMPLATE is a TREE_LIST.
+ 	* pt.cc (maybe_begin_member_template_processing): For a friend
+ 	template specialization consider its class context instead.
+ 
+ 2026-01-12  Jason Merrill  <jason@redhat.com>
+ 
+ 	PR libstdc++/123326
+ 	* cp-tree.h (DECL_NONGNU_INLINE_P): New.
+ 	* decl.cc (duplicate_decls, start_decl): Check it.
+ 	* decl2.cc (vague_linkage_p, import_export_class): Likewise.
+ 	(vtables_uniquely_emitted, import_export_decl): Likewise.
+ 	* class.cc (determine_key_method): Check it instead of
+ 	lookup_attribute.
+ 
+ 2026-01-12  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/115163
+ 	* call.cc (implicit_conversion_error): Add flags argument, call
+ 	maybe_show_nonconverting_candidate.
+ 	(build_converted_constant_expr_internal): Pass flags to
+ 	implicit_conversion_error.
+ 	(perform_implicit_conversion_flags): Likewise.
+ 	* cvt.cc (ocp_convert): Call maybe_show_nonconverting_candidate
+ 	on conversion error.
+ 
+ 2026-01-12  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123526
+ 	* method.cc: Include attribs.h.
+ 	(implicitly_declare_fn): Remove gnu::gnu_inline attribute.
+ 
  2026-01-09  Jakub Jelinek  <jakub@redhat.com>
  
  	* gen-cxxapi-file.py: Update copyright year.  Separate
diff -Nrcpad gcc-16-20260111/gcc/cp/Make-lang.in gcc-16-20260118/gcc/cp/Make-lang.in
*** gcc-16-20260111/gcc/cp/Make-lang.in	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/Make-lang.in	Sun Jan 18 22:32:07 2026
*************** CXX_AND_OBJCXX_OBJS = \
*** 107,113 ****
  	cp/method.o cp/module.o \
  	cp/name-lookup.o cp/optimize.o \
  	cp/parser.o cp/pt.o cp/ptree.o \
! 	cp/rtti.o \
  	cp/search.o cp/semantics.o \
  	cp/tree.o cp/typeck.o cp/typeck2.o \
  	cp/vtable-class-hierarchy.o $(CXX_C_OBJS)
--- 107,113 ----
  	cp/method.o cp/module.o \
  	cp/name-lookup.o cp/optimize.o \
  	cp/parser.o cp/pt.o cp/ptree.o \
! 	cp/reflect.o cp/rtti.o \
  	cp/search.o cp/semantics.o \
  	cp/tree.o cp/typeck.o cp/typeck2.o \
  	cp/vtable-class-hierarchy.o $(CXX_C_OBJS)
*************** endif
*** 188,193 ****
--- 188,211 ----
  # This is the file that depends on the generated header file.
  cp/name-lookup.o: $(srcdir)/cp/std-name-hint.h
  
+ ifeq ($(ENABLE_MAINTAINER_RULES), true)
+ # Special build rule.  This is a maintainer rule, that is only
+ # available when GCC is configured with --enable-maintainer-mode.  In
+ # other cases, it is not available to avoid triggering rebuilds if a
+ # user has the source checked out with unusual timestamps.
+ $(srcdir)/cp/metafns.h: $(srcdir)/cp/metafns.gperf
+ else
+ # We keep the rule so that you can still force a rebuild, even if you
+ # didn't configure GCC with --enable-maintainer-mode, by manually
+ # deleting the $(srcdir)/cp/metafns.h file.
+ $(srcdir)/cp/metafns.h:
+ endif
+ 	cd $(srcdir)/cp; gperf -o -C -E -k '1,4,5,11,14,$$' -D -N find -L C++ \
+ 		metafns.gperf --output-file metafns.h
+ 
+ # This is the file that depends on the generated header file.
+ cp/reflect.o: $(srcdir)/cp/metafns.h
+ 
  components_in_prev = "bfd opcodes binutils fixincludes gas gcc gmp mpfr mpc isl gold intl ld libbacktrace libcpp libcody libdecnumber libiberty libiberty-linker-plugin libiconv zlib lto-plugin libctf libsframe"
  components_in_prev_target = "libstdc++-v3 libsanitizer libvtv libgcc libbacktrace libphobos zlib libgomp libatomic"
  
diff -Nrcpad gcc-16-20260111/gcc/cp/call.cc gcc-16-20260118/gcc/cp/call.cc
*** gcc-16-20260111/gcc/cp/call.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/call.cc	Sun Jan 18 22:32:07 2026
*************** print_z_candidates (location_t loc, stru
*** 4261,4269 ****
        ++num_candidates;
      }
  
!   inform_n (loc,
! 	    num_candidates, "there is %i candidate", "there are %i candidates",
! 	    num_candidates);
    auto_diagnostic_nesting_level sentinel2;
  
    int candidate_idx = 0;
--- 4261,4268 ----
        ++num_candidates;
      }
  
!   inform_num_candidates (loc, num_candidates);
! 
    auto_diagnostic_nesting_level sentinel2;
  
    int candidate_idx = 0;
*************** build_user_type_conversion (tree totype,
*** 4917,4923 ****
  /* Give a helpful diagnostic when implicit_conversion fails.  */
  
  static void
! implicit_conversion_error (location_t loc, tree type, tree expr)
  {
    tsubst_flags_t complain = tf_warning_or_error;
  
--- 4916,4923 ----
  /* Give a helpful diagnostic when implicit_conversion fails.  */
  
  static void
! implicit_conversion_error (location_t loc, tree type, tree expr,
! 			   int flags)
  {
    tsubst_flags_t complain = tf_warning_or_error;
  
*************** implicit_conversion_error (location_t lo
*** 4932,4949 ****
  	   && !CP_AGGREGATE_TYPE_P (type))
      error_at (loc, "designated initializers cannot be used with a "
  	      "non-aggregate type %qT", type);
!   else if (is_stub_object (expr))
!     /* The expression is generated by a trait check, we don't have
!        a useful location to highlight the label.  */
!     error_at (loc, "could not convert %qH to %qI",
! 	      TREE_TYPE (expr), type);
!   else
      {
!       range_label_for_type_mismatch label (TREE_TYPE (expr), type);
!       gcc_rich_location rich_loc (loc, &label,
! 				  highlight_colors::percent_h);
!       error_at (&rich_loc, "could not convert %qE from %qH to %qI",
! 		expr, TREE_TYPE (expr), type);
      }
  }
  
--- 4932,4954 ----
  	   && !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))
! 	/* The expression is generated by a trait check, we don't have
! 	   a useful location to highlight the label.  */
! 	error_at (loc, "could not convert %qH to %qI",
! 		  TREE_TYPE (expr), type);
!       else
! 	{
! 	  range_label_for_type_mismatch label (TREE_TYPE (expr), type);
! 	  gcc_rich_location rich_loc (loc, &label,
! 				      highlight_colors::percent_h);
! 	  error_at (&rich_loc, "could not convert %qE from %qH to %qI",
! 		    expr, TREE_TYPE (expr), type);
! 	}
!       maybe_show_nonconverting_candidate (type, TREE_TYPE (expr), expr, flags);
      }
  }
  
*************** build_converted_constant_expr_internal (
*** 5065,5071 ****
    else
      {
        if (complain & tf_error)
! 	implicit_conversion_error (loc, type, expr);
        expr = error_mark_node;
      }
  
--- 5070,5076 ----
    else
      {
        if (complain & tf_error)
! 	implicit_conversion_error (loc, type, expr, flags);
        expr = error_mark_node;
      }
  
*************** get_fndecl_argument_location (tree fndec
*** 8594,8599 ****
--- 8599,8607 ----
    if (DECL_ARTIFICIAL (fndecl))
      return DECL_SOURCE_LOCATION (fndecl);
  
+   if (argnum == -1)
+     return DECL_SOURCE_LOCATION (fndecl);
+ 
    int i;
    tree param;
  
*************** perform_implicit_conversion_flags (tree
*** 14107,14113 ****
    if (!conv)
      {
        if (complain & tf_error)
! 	implicit_conversion_error (loc, type, expr);
        expr = error_mark_node;
      }
    else if (processing_template_decl && conv->kind != ck_identity)
--- 14115,14121 ----
    if (!conv)
      {
        if (complain & tf_error)
! 	implicit_conversion_error (loc, type, expr, flags);
        expr = error_mark_node;
      }
    else if (processing_template_decl && conv->kind != ck_identity)
diff -Nrcpad gcc-16-20260111/gcc/cp/class.cc gcc-16-20260118/gcc/cp/class.cc
*** gcc-16-20260111/gcc/cp/class.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/class.cc	Sun Jan 18 22:32:07 2026
*************** check_methods (tree t)
*** 5138,5144 ****
  	    error_at (location_of (t), "no viable destructor for %qT", t);
  	  else
  	    error_at (location_of (t), "destructor for %qT is ambiguous", t);
! 	  print_candidates (dtor);
  
  	  /* Arbitrarily prune the overload set to a single function for
  	     sake of error recovery.  */
--- 5138,5144 ----
  	    error_at (location_of (t), "no viable destructor for %qT", t);
  	  else
  	    error_at (location_of (t), "destructor for %qT is ambiguous", t);
! 	  print_candidates (location_of (t), dtor);
  
  	  /* Arbitrarily prune the overload set to a single function for
  	     sake of error recovery.  */
*************** determine_key_method (tree type)
*** 7472,7483 ****
    for (method = TYPE_FIELDS (type); method; method = DECL_CHAIN (method))
      if (TREE_CODE (method) == FUNCTION_DECL
  	&& DECL_VINDEX (method) != NULL_TREE
! 	&& (! DECL_DECLARED_INLINE_P (method)
! 	    /* [[gnu::gnu_inline]] virtual inline/constexpr methods will
! 	       have out of line bodies emitted in some other TU and so
! 	       those can be key methods and vtable emitted in the TU with
! 	       the actual out of line definition.  */
! 	    || lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (method)))
  	&& ! DECL_PURE_VIRTUAL_P (method))
        {
  	SET_CLASSTYPE_KEY_METHOD (type, method);
--- 7472,7482 ----
    for (method = TYPE_FIELDS (type); method; method = DECL_CHAIN (method))
      if (TREE_CODE (method) == FUNCTION_DECL
  	&& DECL_VINDEX (method) != NULL_TREE
! 	/* [[gnu::gnu_inline]] virtual inline/constexpr methods will
! 	   have out of line bodies emitted in some other TU and so
! 	   those can be key methods and vtable emitted in the TU with
! 	   the actual out of line definition.  */
! 	&& ! DECL_NONGNU_INLINE_P (method)
  	&& ! DECL_PURE_VIRTUAL_P (method))
        {
  	SET_CLASSTYPE_KEY_METHOD (type, method);
*************** finish_struct (tree t, tree attributes)
*** 8349,8354 ****
--- 8348,8358 ----
        && !LAMBDA_TYPE_P (t))
      add_stmt (build_min (TAG_DEFN, t));
  
+   /* Lambdas will be keyed by their LAMBDA_TYPE_EXTRA_SCOPE when that
+      gets set; other local types might need keying anyway though.  */
+   if (at_function_scope_p () && !LAMBDA_TYPE_P (t))
+     maybe_key_decl (current_scope (), TYPE_NAME (t));
+ 
    return t;
  }
  
*************** resolve_address_of_overloaded_function (
*** 9116,9122 ****
  	  error ("no matches converting function %qD to type %q#T",
  		 OVL_NAME (overload), target_type);
  
! 	  print_candidates (overload);
  	}
        return error_mark_node;
      }
--- 9120,9126 ----
  	  error ("no matches converting function %qD to type %q#T",
  		 OVL_NAME (overload), target_type);
  
! 	  print_candidates (input_location, overload);
  	}
        return error_mark_node;
      }
*************** resolve_address_of_overloaded_function (
*** 9148,9154 ****
  	      for (match = matches; match; match = TREE_CHAIN (match))
  		TREE_VALUE (match) = TREE_PURPOSE (match);
  
! 	      print_candidates (matches);
  	    }
  
  	  return error_mark_node;
--- 9152,9158 ----
  	      for (match = matches; match; match = TREE_CHAIN (match))
  		TREE_VALUE (match) = TREE_PURPOSE (match);
  
! 	      print_candidates (input_location, matches);
  	    }
  
  	  return error_mark_node;
diff -Nrcpad gcc-16-20260111/gcc/cp/config-lang.in gcc-16-20260118/gcc/cp/config-lang.in
*** gcc-16-20260111/gcc/cp/config-lang.in	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/config-lang.in	Sun Jan 18 22:32:07 2026
*************** gtfiles="\
*** 51,57 ****
  \$(srcdir)/cp/mangle.cc \$(srcdir)/cp/method.cc \$(srcdir)/cp/module.cc \
  \$(srcdir)/cp/name-lookup.cc \
  \$(srcdir)/cp/parser.cc \$(srcdir)/cp/pt.cc \
! \$(srcdir)/cp/rtti.cc \
  \$(srcdir)/cp/semantics.cc \
  \$(srcdir)/cp/tree.cc \$(srcdir)/cp/typeck2.cc \
  \$(srcdir)/cp/vtable-class-hierarchy.cc \
--- 51,57 ----
  \$(srcdir)/cp/mangle.cc \$(srcdir)/cp/method.cc \$(srcdir)/cp/module.cc \
  \$(srcdir)/cp/name-lookup.cc \
  \$(srcdir)/cp/parser.cc \$(srcdir)/cp/pt.cc \
! \$(srcdir)/cp/reflect.cc \$(srcdir)/cp/rtti.cc \
  \$(srcdir)/cp/semantics.cc \
  \$(srcdir)/cp/tree.cc \$(srcdir)/cp/typeck2.cc \
  \$(srcdir)/cp/vtable-class-hierarchy.cc \
diff -Nrcpad gcc-16-20260111/gcc/cp/constexpr.cc gcc-16-20260118/gcc/cp/constexpr.cc
*** gcc-16-20260111/gcc/cp/constexpr.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/constexpr.cc	Sun Jan 18 22:32:07 2026
*************** public:
*** 1200,1214 ****
    /* If non-null, only allow modification of existing values of the variables
       in this set.  Set by modifiable_tracker, below.  */
    hash_set<tree> *modifiable;
    /* Number of heap VAR_DECL deallocations.  */
    unsigned heap_dealloc_count;
    /* Number of uncaught exceptions.  */
    unsigned uncaught_exceptions;
  
    /* Constructor.  */
    constexpr_global_ctx ()
      : constexpr_ops_count (0), cleanups (NULL), modifiable (nullptr),
!       heap_dealloc_count (0), uncaught_exceptions (0) {}
  
    bool is_outside_lifetime (tree t)
    {
--- 1200,1228 ----
    /* If non-null, only allow modification of existing values of the variables
       in this set.  Set by modifiable_tracker, below.  */
    hash_set<tree> *modifiable;
+   /* If cxx_eval_outermost_constant_expr is called on the consteval block
+      operator (), this is the FUNCTION_DECL of that operator ().  */
+   tree consteval_block;
    /* Number of heap VAR_DECL deallocations.  */
    unsigned heap_dealloc_count;
    /* Number of uncaught exceptions.  */
    unsigned uncaught_exceptions;
+   /* 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
+      function, is_complete_type depends on type definitions and template
+      specializations in between the calls, define_aggregate even defines
+      class types, etc.  Thus, we need to arrange for calls which call
+      at least some metafunctions to be non-cacheable, because their behavior
+      might not be the same.  Until we figure out which exact metafunctions
+      need this and which don't, do it for all of them.  */
+   bool metafns_called;
  
    /* Constructor.  */
    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)
    {
*************** struct constexpr_ctx {
*** 1322,1327 ****
--- 1336,1377 ----
    mce_value manifestly_const_eval;
  };
  
+ /* Return ctx->quiet.  For use in reflect.cc.  */
+ 
+ bool
+ cxx_constexpr_quiet_p (const constexpr_ctx *ctx)
+ {
+   return ctx->quiet;
+ }
+ 
+ /* Return ctx->manifestly_const_eval.  For use in reflect.cc.  */
+ 
+ mce_value
+ cxx_constexpr_manifestly_const_eval (const constexpr_ctx *ctx)
+ {
+   return ctx->manifestly_const_eval;
+ }
+ 
+ /* Return ctx->call->fundef->decl or NULL_TREE.  For use in
+    reflect.cc.  */
+ 
+ tree
+ cxx_constexpr_caller (const constexpr_ctx *ctx)
+ {
+   if (ctx->call)
+     return ctx->call->fundef->decl;
+   else
+     return NULL_TREE;
+ }
+ 
+ /* Return ctx->global->consteval_block.  For use in reflect.cc.  */
+ 
+ tree
+ cxx_constexpr_consteval_block (const constexpr_ctx *ctx)
+ {
+   return ctx->global->consteval_block;
+ }
+ 
  /* Predicates for the meaning of *jump_target.  */
  
  static bool
*************** save_fundef_copy (tree fun, tree copy)
*** 1589,1605 ****
    *slot = copy;
  }
  
- /* Whether our evaluation wants a prvalue (e.g. CONSTRUCTOR or _CST),
-    a glvalue (e.g. VAR_DECL or _REF), or nothing.  */
- 
- enum value_cat {
-    vc_prvalue = 0,
-    vc_glvalue = 1,
-    vc_discard = 2
- };
- 
- static tree cxx_eval_constant_expression (const constexpr_ctx *, tree,
- 					  value_cat, bool *, bool *, tree *);
  static tree cxx_eval_bare_aggregate (const constexpr_ctx *, tree,
  				     value_cat, bool *, bool *, tree *);
  static tree cxx_fold_indirect_ref (const constexpr_ctx *, location_t, tree, tree,
--- 1639,1644 ----
*************** cxx_eval_cxa_builtin_fn (const constexpr
*** 2034,2039 ****
--- 2073,2082 ----
  	    {
  	      if (type_build_dtor_call (TREE_TYPE (arg)))
  		{
+ 		  /* So that we don't complain about out-of-consteval use.  */
+ 		  temp_override<tree> ovr (current_function_decl);
+ 		  if (ctx->call && ctx->call->fundef)
+ 		    current_function_decl = ctx->call->fundef->decl;
  		  tree cleanup
  		    = cxx_maybe_build_cleanup (arg, (ctx->quiet ? tf_none
  						     : tf_warning_or_error));
*************** cxx_eval_builtin_function_call (const co
*** 2457,2462 ****
--- 2500,2521 ----
  	}
        new_call = fold_builtin_is_corresponding_member (loc, nargs, args);
      }
+   else if (fndecl_built_in_p (fun, CP_BUILT_IN_IS_STRING_LITERAL,
+ 			      BUILT_IN_FRONTEND))
+     {
+       location_t loc = EXPR_LOCATION (t);
+       if (nargs >= 1)
+ 	{
+ 	  tree arg = CALL_EXPR_ARG (t, 0);
+ 	  arg = cxx_eval_constant_expression (ctx, arg, vc_prvalue,
+ 					      non_constant_p, overflow_p,
+ 					      jump_target);
+ 	  if (*jump_target)
+ 	    return NULL_TREE;
+ 	  args[0] = arg;
+ 	}
+       new_call = fold_builtin_is_string_literal (loc, nargs, args);
+     }
    else
      new_call = fold_builtin_call_array (EXPR_LOCATION (t), TREE_TYPE (t),
  					CALL_EXPR_FN (t), nargs, args);
*************** is_std_class (tree ctx, const char *name
*** 3184,3195 ****
  bool
  is_std_allocator (tree ctx)
  {
!   return is_std_class (ctx, "allocator");
  }
  
  /* Return true if FNDECL is std::allocator<T>::{,de}allocate.  */
  
! static inline bool
  is_std_allocator_allocate (tree fndecl)
  {
    tree name = DECL_NAME (fndecl);
--- 3243,3256 ----
  bool
  is_std_allocator (tree ctx)
  {
!   return (is_std_class (ctx, "allocator")
! 	  || (flag_reflection
! 	      && is_std_class (ctx, "__new_allocator")));
  }
  
  /* Return true if FNDECL is std::allocator<T>::{,de}allocate.  */
  
! bool
  is_std_allocator_allocate (tree fndecl)
  {
    tree name = DECL_NAME (fndecl);
*************** cxx_set_object_constness (const constexp
*** 3670,3675 ****
--- 3731,3773 ----
      }
  }
  
+ /* Allocate an exception for OBJECT and throw it.  */
+ 
+ tree
+ cxa_allocate_and_throw_exception (location_t loc, const constexpr_ctx *ctx,
+ 				  tree object)
+ {
+   tree type = TREE_TYPE (object);
+   /* This simulates a call to __cxa_allocate_exception.  We need
+      (struct exception *) &heap -- memory on the heap so that
+      it can survive the stack being unwound.  */
+   tree arr = build_array_of_n_type (type, 1);
+   tree var = cxa_allocate_exception (loc, ctx, arr, size_zero_node);
+   DECL_NAME (var) = heap_identifier;
+   ctx->global->put_value (var, NULL_TREE);
+ 
+   /* *(struct exception *) &heap  = exc{ ... }  */
+   tree ptr = build_nop (build_pointer_type (type), build_address (var));
+   object = cp_build_init_expr (cp_build_fold_indirect_ref (ptr), object);
+   bool non_constant_p = false, overflow_p = false;
+   tree jump_target = NULL_TREE;
+   cxx_eval_constant_expression (ctx, object, vc_prvalue, &non_constant_p,
+ 				&overflow_p, &jump_target);
+   if (non_constant_p)
+     {
+       if (!ctx->quiet)
+ 	error_at (loc, "couldn%'t throw %qT", type);
+       return NULL_TREE;
+     }
+ 
+   /* Now we can __cxa_throw.  */
+   DECL_EXCEPTION_REFCOUNT (var)
+     = size_binop (PLUS_EXPR, DECL_EXCEPTION_REFCOUNT (var), size_one_node);
+   ++ctx->global->uncaught_exceptions;
+ 
+   return var;
+ }
+ 
  /* Subroutine of cxx_eval_constant_expression.
     Evaluate the call expression tree T in the context of OLD_CALL expression
     evaluation.  */
*************** cxx_eval_call_expression (const constexp
*** 3752,3757 ****
--- 3850,3884 ----
    if (DECL_THUNK_P (fun))
      return cxx_eval_thunk_call (ctx, t, fun, lval, non_constant_p, overflow_p,
  				jump_target);
+   if (metafunction_p (fun))
+     {
+       /* To be able to evaluate a metafunction, we may have to instantiate
+ 	 constexpr functions.  If we're not allowed to instantiate, leave
+ 	 this for later.  Don't evaluate metafunctions at all when mce_unknown,
+ 	 otherwise we might fold those prematurely.  See
+ 	 g++.dg/reflect/p2996-17.C.  */
+       if (uid_sensitive_constexpr_evaluation_p ()
+ 	  || ctx->manifestly_const_eval == mce_unknown)
+ 	{
+ 	  *non_constant_p = true;
+ 	  return t;
+ 	}
+       ctx->global->metafns_called = true;
+       tree e = process_metafunction (ctx, fun, t, non_constant_p, overflow_p,
+ 				     jump_target);
+       if (*jump_target)
+ 	return NULL_TREE;
+       if (*non_constant_p)
+ 	return t;
+       e = cxx_eval_constant_expression (ctx, e, vc_prvalue,
+ 					non_constant_p, overflow_p,
+ 					jump_target);
+       if (*jump_target)
+ 	return NULL_TREE;
+       if (*non_constant_p)
+ 	return t;
+       return e;
+     }
    bool non_constexpr_call = false;
    if (!maybe_constexpr_fn (fun))
      {
*************** cxx_eval_call_expression (const constexp
*** 4201,4206 ****
--- 4328,4334 ----
  	  call_ctx.call = &new_call;
  	  unsigned save_heap_alloc_count = ctx->global->heap_vars.length ();
  	  unsigned save_heap_dealloc_count = ctx->global->heap_dealloc_count;
+ 	  bool save_metafns_called = ctx->global->metafns_called;
  
  	  /* Make sure we fold std::is_constant_evaluated to true in an
  	     immediate function.  */
*************** cxx_eval_call_expression (const constexp
*** 4232,4237 ****
--- 4360,4367 ----
  		return NULL_TREE;
  	    }
  
+ 	  ctx->global->metafns_called = false;
+ 
  	  tree jmp_target = NULL_TREE;
  	  cxx_eval_constant_expression (&call_ctx, body,
  					vc_discard, non_constant_p, overflow_p,
*************** cxx_eval_call_expression (const constexp
*** 4265,4270 ****
--- 4395,4404 ----
  		}
  	    }
  
+ 	  if (ctx->global->metafns_called)
+ 	    cacheable = false;
+ 	  ctx->global->metafns_called |= save_metafns_called;
+ 
  	  /* At this point, the object's constructor will have run, so
  	     the object is no longer under construction, and its possible
  	     'const' semantics now apply.  Make a note of this fact by
*************** reduced_constant_expression_p (tree t, t
*** 4405,4410 ****
--- 4539,4545 ----
    switch (TREE_CODE (t))
      {
      case PTRMEM_CST:
+     case REFLECT_EXPR:
        /* Even if we can't lower this yet, it's constant.  */
        return true;
  
*************** cxx_eval_binary_expression (const conste
*** 4879,4884 ****
--- 5014,5024 ----
  	lhs = cplus_expand_constant (lhs);
        else if (TREE_CODE (rhs) == PTRMEM_CST)
  	rhs = cplus_expand_constant (rhs);
+       else if (REFLECT_EXPR_P (lhs) && REFLECT_EXPR_P (rhs))
+ 	{
+ 	  const bool eq = compare_reflections (lhs, rhs);
+ 	  r = constant_boolean_node (eq == is_code_eq, type);
+ 	}
      }
    if (r == NULL_TREE
        && TREE_CODE_CLASS (code) == tcc_comparison
*************** merge_jump_target (location_t loc, const
*** 8818,8824 ****
  /* FIXME unify with c_fully_fold */
  /* FIXME overflow_p is too global */
  
! static tree
  cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
  			      value_cat lval,
  			      bool *non_constant_p, bool *overflow_p,
--- 8958,8964 ----
  /* FIXME unify with c_fully_fold */
  /* FIXME overflow_p is too global */
  
! tree
  cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
  			      value_cat lval,
  			      bool *non_constant_p, bool *overflow_p,
*************** cxx_eval_constant_expression (const cons
*** 9011,9016 ****
--- 9151,9157 ----
      case CASE_LABEL_EXPR:
      case PREDICT_EXPR:
      case OMP_DECLARE_MAPPER:
+     case REFLECT_EXPR:
        return t;
  
      case PARM_DECL:
*************** cxx_eval_constant_expression (const cons
*** 9981,9986 ****
--- 10122,10135 ----
  	      = build_pointer_type (TREE_TYPE (var));
  	  }
  
+ 	/* This can happen for std::meta::info(^^int) where the cast has no
+ 	   meaning.  */
+ 	if (REFLECTION_TYPE_P (type) && REFLECT_EXPR_P (op))
+ 	  {
+ 	    r = op;
+ 	    break;
+ 	  }
+ 
  	if (op == oldop && tcode != UNARY_PLUS_EXPR)
  	  /* We didn't fold at the top so we could check for ptr-int
  	     conversion.  */
*************** find_heap_var_refs (tree *tp, int *walk_
*** 10376,10382 ****
  /* Find immediate function decls in *TP if any.  */
  
  static tree
! find_immediate_fndecl (tree *tp, int */*walk_subtrees*/, void */*data*/)
  {
    if (TREE_CODE (*tp) == FUNCTION_DECL && DECL_IMMEDIATE_FUNCTION_P (*tp))
      return *tp;
--- 10525,10531 ----
  /* Find immediate function decls in *TP if any.  */
  
  static tree
! find_immediate_fndecl (tree *tp, int *walk_subtrees, void */*data*/)
  {
    if (TREE_CODE (*tp) == FUNCTION_DECL && DECL_IMMEDIATE_FUNCTION_P (*tp))
      return *tp;
*************** find_immediate_fndecl (tree *tp, int */*
*** 10384,10389 ****
--- 10533,10540 ----
        && TREE_CODE (PTRMEM_CST_MEMBER (*tp)) == FUNCTION_DECL
        && DECL_IMMEDIATE_FUNCTION_P (PTRMEM_CST_MEMBER (*tp)))
      return PTRMEM_CST_MEMBER (*tp);
+   if (REFLECT_EXPR_P (*tp))
+     *walk_subtrees = 0;
    return NULL_TREE;
  }
  
*************** cxx_eval_outermost_constant_expr (tree t
*** 10468,10473 ****
--- 10619,10630 ----
  	    return t;
  	  else
  	    is_consteval = true;
+ 	  tree lam;
+ 	  if (manifestly_const_eval == mce_true
+ 	      && LAMBDA_FUNCTION_P (fndecl)
+ 	      && (lam = CLASSTYPE_LAMBDA_EXPR (CP_DECL_CONTEXT (fndecl)))
+ 	      && LAMBDA_EXPR_CONSTEVAL_BLOCK_P (lam))
+ 	    global_ctx.consteval_block = fndecl;
  	}
      }
    else if (cxx_dialect >= cxx20
*************** cxx_eval_outermost_constant_expr (tree t
*** 10684,10689 ****
--- 10841,10877 ----
        non_constant_p = true;
      }
  
+   /* Detect consteval-only smuggling: turning a consteval-only object
+      into one that is not.  For instance, in
+        struct B { };
+        struct D : B { info r; };
+        constexpr D d{^^::};
+        constexpr const B &b = d; // #1
+      #1 is wrong because D is a consteval-only type but B is not.  */
+   if (flag_reflection
+       && !non_constant_p
+       && object
+       && POINTER_TYPE_P (TREE_TYPE (object))
+       && !consteval_only_p (object)
+       && check_out_of_consteval_use (r, /*complain=*/false))
+     {
+       if (!allow_non_constant)
+ 	{
+ 	  if (TYPE_REF_P (TREE_TYPE (object)))
+ 	    error_at (cp_expr_loc_or_input_loc (t),
+ 		      "reference into an object of consteval-only type is "
+ 		      "not a constant expression unless it also has "
+ 		      "consteval-only type");
+ 	  else
+ 	    error_at (cp_expr_loc_or_input_loc (t),
+ 		      "pointer into an object of consteval-only type is "
+ 		      "not a constant expression unless it also has "
+ 		      "consteval-only type");
+ 	}
+       r = t;
+       non_constant_p = true;
+     }
+ 
    if (!non_constant_p && !constexpr_dtor)
      verify_constant (r, allow_non_constant, &non_constant_p, &overflow_p);
  
*************** potential_constant_expression_1 (tree t,
*** 11476,11481 ****
--- 11664,11670 ----
      case REQUIRES_EXPR:
      case STATIC_ASSERT:
      case DEBUG_BEGIN_STMT:
+     case REFLECT_EXPR:
        return true;
  
      case RETURN_EXPR:
*************** potential_constant_expression_1 (tree t,
*** 12520,12526 ****
  	    *jump_target = *target;
  	    return true;
  	  }
! 	if (DECL_ARTIFICIAL (*target))
  	  /* The user didn't write this goto, this isn't the problem.  */
  	  return true;
  	if (flags & tf_error)
--- 12709,12715 ----
  	    *jump_target = *target;
  	    return true;
  	  }
! 	if (TREE_CODE (*target) == LABEL_DECL && DECL_ARTIFICIAL (*target))
  	  /* The user didn't write this goto, this isn't the problem.  */
  	  return true;
  	if (flags & tf_error)
*************** potential_constant_expression_1 (tree t,
*** 12567,12572 ****
--- 12756,12766 ----
      case TU_LOCAL_ENTITY:
        return false;
  
+     /* A splice expression is dependent, but will be constant after
+        substitution.  */
+     case SPLICE_EXPR:
+       return true;
+ 
      case NONTYPE_ARGUMENT_PACK:
        {
  	tree args = ARGUMENT_PACK_ARGS (t);
diff -Nrcpad gcc-16-20260111/gcc/cp/constraint.cc gcc-16-20260118/gcc/cp/constraint.cc
*** gcc-16-20260111/gcc/cp/constraint.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/constraint.cc	Sun Jan 18 22:32:07 2026
*************** diagnose_trait_expr (location_t loc, tre
*** 3316,3321 ****
--- 3316,3324 ----
      case CPTK_IS_VOLATILE:
        inform (loc, "%qT is not a volatile type", t1);
        break;
+     case CPTK_IS_CONSTEVAL_ONLY:
+       inform (decl_loc, "%qT is not consteval-only", t1);
+       break;
      case CPTK_RANK:
        inform (loc, "%qT cannot yield a rank", t1);
        break;
diff -Nrcpad gcc-16-20260111/gcc/cp/coroutines.cc gcc-16-20260118/gcc/cp/coroutines.cc
*** gcc-16-20260111/gcc/cp/coroutines.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/coroutines.cc	Sun Jan 18 22:32:07 2026
*************** coroutine_info_hasher::equal (coroutine_
*** 353,362 ****
    return lhs->function_decl == rhs;
  }
  
  /* Get the existing coroutine_info for FN_DECL, or insert a new one if the
     entry does not yet exist.  */
  
! coroutine_info *
  get_or_insert_coroutine_info (tree fn_decl)
  {
    gcc_checking_assert (coroutine_info_table != NULL);
--- 353,372 ----
    return lhs->function_decl == rhs;
  }
  
+ /* Initialize the coroutine info table, to hold state per coroutine decl,
+    if not already created.  */
+ 
+ static void
+ create_coroutine_info_table ()
+ {
+   if (!coroutine_info_table)
+     coroutine_info_table = hash_table<coroutine_info_hasher>::create_ggc (11);
+ }
+ 
  /* Get the existing coroutine_info for FN_DECL, or insert a new one if the
     entry does not yet exist.  */
  
! static coroutine_info *
  get_or_insert_coroutine_info (tree fn_decl)
  {
    gcc_checking_assert (coroutine_info_table != NULL);
*************** get_or_insert_coroutine_info (tree fn_de
*** 375,381 ****
  
  /* Get the existing coroutine_info for FN_DECL, fail if it doesn't exist.  */
  
! coroutine_info *
  get_coroutine_info (tree fn_decl)
  {
    if (coroutine_info_table == NULL)
--- 385,391 ----
  
  /* Get the existing coroutine_info for FN_DECL, fail if it doesn't exist.  */
  
! static coroutine_info *
  get_coroutine_info (tree fn_decl)
  {
    if (coroutine_info_table == NULL)
*************** ensure_coro_initialized (location_t loc)
*** 757,767 ****
        if (!void_coro_handle_address)
  	return false;
  
!       /* A table to hold the state, per coroutine decl.  */
!       gcc_checking_assert (coroutine_info_table == NULL);
!       coroutine_info_table =
! 	hash_table<coroutine_info_hasher>::create_ggc (11);
! 
        if (coroutine_info_table == NULL)
  	return false;
  
--- 767,773 ----
        if (!void_coro_handle_address)
  	return false;
  
!       create_coroutine_info_table ();
        if (coroutine_info_table == NULL)
  	return false;
  
*************** coro_promise_type_found_p (tree fndecl,
*** 873,883 ****
--- 879,891 ----
        coro_info->self_h_proxy
  	= build_lang_decl (VAR_DECL, coro_self_handle_id,
  			   coro_info->handle_type);
+       DECL_CONTEXT (coro_info->self_h_proxy) = fndecl;
  
        /* Build a proxy for the promise so that we can perform lookups.  */
        coro_info->promise_proxy
  	= build_lang_decl (VAR_DECL, coro_promise_id,
  			   coro_info->promise_type);
+       DECL_CONTEXT (coro_info->promise_proxy) = fndecl;
  
        /* Note where we first saw a coroutine keyword.  */
        coro_info->first_coro_keyword = loc;
*************** coro_get_ramp_function (tree decl)
*** 902,907 ****
--- 910,926 ----
    return NULL_TREE;
  }
  
+ /* Given a DECL, an actor or destroyer, build a link from that to the ramp
+    function.  Used by modules streaming.  */
+ 
+ void
+ coro_set_ramp_function (tree decl, tree ramp)
+ {
+   if (!to_ramp)
+     to_ramp = hash_map<tree, tree>::create_ggc (10);
+   to_ramp->put (decl, ramp);
+ }
+ 
  /* Given the DECL for a ramp function (the user's original declaration) return
     the actor function if it has been defined.  */
  
*************** coro_get_destroy_function (tree decl)
*** 926,931 ****
--- 945,971 ----
    return NULL_TREE;
  }
  
+ /* For a given ramp function DECL, set the actor and destroy functions.
+    This is only used by modules streaming.  */
+ 
+ void
+ coro_set_transform_functions (tree decl, tree actor, tree destroy)
+ {
+   /* Only relevant with modules.  */
+   gcc_checking_assert (modules_p ());
+ 
+   /* This should only be called for newly streamed declarations.  */
+   gcc_checking_assert (!get_coroutine_info (decl));
+ 
+   /* This might be the first use of coroutine info in the TU, so
+      create the coroutine info table if needed.  */
+   create_coroutine_info_table ();
+ 
+   coroutine_info *coroutine = get_or_insert_coroutine_info (decl);
+   coroutine->actor_decl = actor;
+   coroutine->destroy_decl = destroy;
+ }
+ 
  /* Given a CO_AWAIT_EXPR AWAIT_EXPR, return its resume call.  */
  
  tree
*************** coro_build_actor_or_destroy_function (tr
*** 4393,4406 ****
      = build_lang_decl (FUNCTION_DECL, copy_node (DECL_NAME (orig)), fn_type);
  
    /* Allow for locating the ramp (original) function from this one.  */
!   if (!to_ramp)
!     to_ramp = hash_map<tree, tree>::create_ggc (10);
!   to_ramp->put (fn, orig);
  
    DECL_CONTEXT (fn) = DECL_CONTEXT (orig);
    DECL_SOURCE_LOCATION (fn) = loc;
    DECL_ARTIFICIAL (fn) = true;
    DECL_INITIAL (fn) = error_mark_node;
  
    tree id = get_identifier ("frame_ptr");
    tree fp = build_lang_decl (PARM_DECL, id, coro_frame_ptr);
--- 4433,4445 ----
      = build_lang_decl (FUNCTION_DECL, copy_node (DECL_NAME (orig)), fn_type);
  
    /* Allow for locating the ramp (original) function from this one.  */
!   coro_set_ramp_function (fn, orig);
  
    DECL_CONTEXT (fn) = DECL_CONTEXT (orig);
    DECL_SOURCE_LOCATION (fn) = loc;
    DECL_ARTIFICIAL (fn) = true;
    DECL_INITIAL (fn) = error_mark_node;
+   DECL_COROUTINE_P (fn) = true;
  
    tree id = get_identifier ("frame_ptr");
    tree fp = build_lang_decl (PARM_DECL, id, coro_frame_ptr);
diff -Nrcpad gcc-16-20260111/gcc/cp/cp-gimplify.cc gcc-16-20260118/gcc/cp/cp-gimplify.cc
*** gcc-16-20260111/gcc/cp/cp-gimplify.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/cp-gimplify.cc	Sun Jan 18 22:32:07 2026
*************** lvalue_has_side_effects (tree e)
*** 486,492 ****
  
  /* Return true if FN is an immediate-escalating function.  */
  
! static bool
  immediate_escalating_function_p (tree fn)
  {
    if (!fn || !flag_immediate_escalation)
--- 486,492 ----
  
  /* Return true if FN is an immediate-escalating function.  */
  
! bool
  immediate_escalating_function_p (tree fn)
  {
    if (!fn || !flag_immediate_escalation)
*************** unchecked_immediate_escalating_function_
*** 524,530 ****
  
  /* Promote FN to an immediate function, including its clones.  */
  
! static void
  promote_function_to_consteval (tree fn)
  {
    SET_DECL_IMMEDIATE_FUNCTION_P (fn);
--- 524,530 ----
  
  /* Promote FN to an immediate function, including its clones.  */
  
! void
  promote_function_to_consteval (tree fn)
  {
    SET_DECL_IMMEDIATE_FUNCTION_P (fn);
*************** cp_gimplify_expr (tree *expr_p, gimple_s
*** 856,861 ****
--- 856,868 ----
  
      case CALL_EXPR:
        ret = GS_OK;
+       /* At this point any function that takes/returns a consteval-only
+ 	 expression is a problem.  */
+       for (int i = 0; i < call_expr_nargs (*expr_p); ++i)
+ 	if (check_out_of_consteval_use (CALL_EXPR_ARG (*expr_p, i)))
+ 	  ret = GS_ERROR;
+       if (consteval_only_p (TREE_TYPE (*expr_p)))
+ 	ret = GS_ERROR;
        if (flag_strong_eval_order == 2
  	  && CALL_EXPR_FN (*expr_p)
  	  && !CALL_EXPR_OPERATOR_SYNTAX (*expr_p)
*************** cp_gimplify_expr (tree *expr_p, gimple_s
*** 965,970 ****
--- 972,984 ----
  			  "__builtin_eh_ptr_adjust_ref");
  		*expr_p = void_node;
  		break;
+ 	      case CP_BUILT_IN_IS_STRING_LITERAL:
+ 		*expr_p
+ 		  = fold_builtin_is_string_literal (EXPR_LOCATION (*expr_p),
+ 						    call_expr_nargs (*expr_p),
+ 						    &CALL_EXPR_ARG (*expr_p,
+ 								    0));
+ 		break;
  	      default:
  		break;
  	      }
*************** cp_build_init_expr_for_ctor (tree call,
*** 1293,1298 ****
--- 1307,1329 ----
    return init;
  }
  
+ /* For every DECL_EXPR check if it declares a consteval-only variable and
+    if so, overwrite it with a no-op.  The point here is not to leak
+    consteval-only variables into the middle end.  */
+ 
+ static tree
+ wipe_consteval_only_r (tree *stmt_p, int *, void *)
+ {
+   if (TREE_CODE (*stmt_p) == DECL_EXPR)
+     {
+       tree d = DECL_EXPR_DECL (*stmt_p);
+       if (VAR_P (d) && consteval_only_p (d))
+ 	/* Wipe the DECL_EXPR so that it doesn't get into gimple.  */
+ 	*stmt_p = void_node;
+     }
+   return NULL_TREE;
+ }
+ 
  /* A walk_tree callback for cp_fold_function and cp_fully_fold_init to handle
     immediate functions.  */
  
*************** cp_fold_immediate_r (tree *stmt_p, int *
*** 1320,1331 ****
--- 1351,1382 ----
        return NULL_TREE;
      }
  
+   /* Most invalid uses of consteval-only types should have been already
+      detected at this point.  And the valid ones won't be needed
+      anymore.  */
+   if (flag_reflection
+       && complain
+       && (data->flags & ff_genericize)
+       && TREE_CODE (stmt) == STATEMENT_LIST)
+     for (tree s : tsi_range (stmt))
+       if (check_out_of_consteval_use (s))
+ 	*stmt_p = void_node;
+ 
    tree decl = NULL_TREE;
    bool call_p = false;
  
    /* We are looking for &fn or fn().  */
    switch (code)
      {
+     case DECL_EXPR:
+       /* Clear consteval-only DECL_EXPRs.  */
+       if (flag_reflection)
+ 	{
+ 	  tree d = DECL_EXPR_DECL (stmt);
+ 	  if (VAR_P (d) && consteval_only_p (d))
+ 	    *stmt_p = void_node;
+ 	}
+       break;
      case CALL_EXPR:
      case AGGR_INIT_EXPR:
        if (tree fn = cp_get_callee (stmt))
*************** cp_fold_immediate_r (tree *stmt_p, int *
*** 1344,1351 ****
        if (IF_STMT_CONSTEVAL_P (stmt))
  	{
  	  if (!data->pset.add (stmt))
! 	    cp_walk_tree (&ELSE_CLAUSE (stmt), cp_fold_immediate_r, data_,
! 			  NULL);
  	  *walk_subtrees = 0;
  	  return NULL_TREE;
  	}
--- 1395,1409 ----
        if (IF_STMT_CONSTEVAL_P (stmt))
  	{
  	  if (!data->pset.add (stmt))
! 	    {
! 	      cp_walk_tree (&ELSE_CLAUSE (stmt), cp_fold_immediate_r, data_,
! 			    nullptr);
! 	      if (flag_reflection)
! 		/* Check & clear consteval-only DECL_EXPRs even here,
! 		   because we wouldn't be walking this subtree otherwise.  */
! 		cp_walk_tree (&THEN_CLAUSE (stmt), wipe_consteval_only_r,
! 			      data_, nullptr);
! 	    }
  	  *walk_subtrees = 0;
  	  return NULL_TREE;
  	}
*************** cp_fold_immediate_r (tree *stmt_p, int *
*** 1419,1424 ****
--- 1477,1498 ----
  	  *walk_subtrees = 0;
  	  return stmt;
  	}
+       /* If we called a consteval function and it evaluated to a consteval-only
+ 	 expression, it could be a problem if we are outside a manifestly
+ 	 constant-evaluated context.  */
+       else if ((data->flags & ff_genericize)
+ 	       && check_out_of_consteval_use (e, complain))
+ 	{
+ 	  *stmt_p = void_node;
+ 	  if (complain & tf_error)
+ 	    return NULL_TREE;
+ 	  else
+ 	    {
+ 	      *walk_subtrees = 0;
+ 	      return stmt;
+ 	    }
+ 	}
+ 
        /* We've evaluated the consteval function call.  */
        if (call_p)
  	{
*************** cp_genericize_r (tree *stmt_p, int *walk
*** 2030,2035 ****
--- 2104,2123 ----
  	      cp_walk_tree (&DECL_INITIAL (decl), cp_genericize_r, data, NULL);
  	  wtd->no_sanitize_p = no_sanitize_p;
  	}
+       if (flag_reflection)
+ 	/* Wipe consteval-only vars from BIND_EXPR_VARS and BLOCK_VARS.  */
+ 	for (tree *p = &BIND_EXPR_VARS (stmt); *p; )
+ 	  {
+ 	    if (VAR_P (*p) && consteval_only_p (*p))
+ 	      {
+ 		if (BIND_EXPR_BLOCK (stmt)
+ 		    && *p == BLOCK_VARS (BIND_EXPR_BLOCK (stmt)))
+ 		  BLOCK_VARS (BIND_EXPR_BLOCK (stmt)) = DECL_CHAIN (*p);
+ 		*p = DECL_CHAIN (*p);
+ 		continue;
+ 	      }
+ 	    p = &DECL_CHAIN (*p);
+ 	  }
        wtd->bind_expr_stack.safe_push (stmt);
        cp_walk_tree (&BIND_EXPR_BODY (stmt),
  		    cp_genericize_r, data, NULL);
diff -Nrcpad gcc-16-20260111/gcc/cp/cp-objcp-common.cc gcc-16-20260118/gcc/cp/cp-objcp-common.cc
*** gcc-16-20260111/gcc/cp/cp-objcp-common.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/cp-objcp-common.cc	Sun Jan 18 22:32:07 2026
*************** cp_common_init_ts (void)
*** 646,651 ****
--- 646,653 ----
    MARK_TS_TYPE_NON_COMMON (TEMPLATE_TYPE_PARM);
    MARK_TS_TYPE_NON_COMMON (TYPE_PACK_EXPANSION);
    MARK_TS_TYPE_NON_COMMON (PACK_INDEX_TYPE);
+   MARK_TS_TYPE_NON_COMMON (META_TYPE);
+   MARK_TS_TYPE_NON_COMMON (SPLICE_SCOPE);
  
    /* Statements.  */
    MARK_TS_EXP (CLEANUP_STMT);
*************** cp_common_init_ts (void)
*** 696,701 ****
--- 698,705 ----
    MARK_TS_EXP (VEC_INIT_EXPR);
    MARK_TS_EXP (VEC_NEW_EXPR);
    MARK_TS_EXP (SPACESHIP_EXPR);
+   MARK_TS_EXP (SPLICE_EXPR);
+   MARK_TS_EXP (REFLECT_EXPR);
  
    /* Fold expressions.  */
    MARK_TS_EXP (BINARY_LEFT_FOLD_EXPR);
diff -Nrcpad gcc-16-20260111/gcc/cp/cp-trait.def gcc-16-20260118/gcc/cp/cp-trait.def
*** gcc-16-20260111/gcc/cp/cp-trait.def	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/cp-trait.def	Sun Jan 18 22:32:07 2026
*************** DEFTRAIT_EXPR (IS_BASE_OF, "__is_base_of
*** 69,74 ****
--- 69,75 ----
  DEFTRAIT_EXPR (IS_BOUNDED_ARRAY, "__is_bounded_array", 1)
  DEFTRAIT_EXPR (IS_CLASS, "__is_class", 1)
  DEFTRAIT_EXPR (IS_CONST, "__is_const", 1)
+ DEFTRAIT_EXPR (IS_CONSTEVAL_ONLY, "__builtin_is_consteval_only", 1)
  DEFTRAIT_EXPR (IS_CONSTRUCTIBLE, "__is_constructible", -1)
  DEFTRAIT_EXPR (IS_CONVERTIBLE, "__is_convertible", 2)
  DEFTRAIT_EXPR (IS_DESTRUCTIBLE, "__is_destructible", 1)
diff -Nrcpad gcc-16-20260111/gcc/cp/cp-tree.def gcc-16-20260118/gcc/cp/cp-tree.def
*** gcc-16-20260111/gcc/cp/cp-tree.def	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/cp-tree.def	Sun Jan 18 22:32:07 2026
*************** DEFTREECODE (POSTCONDITION_STMT, "postco
*** 586,591 ****
--- 586,609 ----
     wasn't an exposure (e.g. in a non-inline function template).  */
  DEFTREECODE (TU_LOCAL_ENTITY, "tu_local_entity", tcc_exceptional, 0)
  
+ /* C++26 reflection expression.  */
+ DEFTREECODE (REFLECT_EXPR, "reflect_expr", tcc_expression, 1)
+ 
+ /* Represents the std::meta::info type.  */
+ DEFTREECODE (META_TYPE, "meta_type", tcc_type, 0)
+ 
+ /* Represents a dependent splice expression.  If SPLICE_EXPR_EXPRESSION_P
+    is set, this tree represents a splice-expression (as opposed to
+    a splice-specifier).  */
+ DEFTREECODE (SPLICE_EXPR, "splice_expr", tcc_expression, 1)
+ 
+ /* Represents a dependent splice scope, or a dependent splice type
+    (SPLICE_SCOPE_TYPE_P says which one it is).  Its operand can be accessed
+    using SPLICE_SCOPE_EXPR.  The operand can be a SPLICE_EXPR or a
+    TEMPLATE_ID_EXPR; the SPLICE_SCOPE is necessary to denote that this
+    tree should expand to a type/scope.  */
+ DEFTREECODE (SPLICE_SCOPE, "splice_scope", tcc_type, 0)
+ 
  /*
  Local variables:
  mode:c
diff -Nrcpad gcc-16-20260111/gcc/cp/cp-tree.h gcc-16-20260118/gcc/cp/cp-tree.h
*** gcc-16-20260111/gcc/cp/cp-tree.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/cp-tree.h	Sun Jan 18 22:32:07 2026
*************** enum cp_tree_index
*** 175,180 ****
--- 175,181 ----
      CPTI_FOR_END_IDENTIFIER,
      CPTI_ABI_TAG_IDENTIFIER,
      CPTI_ALIGNED_IDENTIFIER,
+     CPTI_ANNOTATION_IDENTIFIER,
      CPTI_BEGIN_IDENTIFIER,
      CPTI_END_IDENTIFIER,
      CPTI_GET_IDENTIFIER,
*************** enum cp_tree_index
*** 211,216 ****
--- 212,218 ----
  
      /* We must find these via the global namespace.  */
      CPTI_STD,
+     CPTI_STD_META,
      CPTI_ABI,
  
      /* These are created at init time, but the library/headers provide
*************** enum cp_tree_index
*** 236,241 ****
--- 238,244 ----
      CPTI_DCAST,
  
      CPTI_PSEUDO_CONTRACT_VIOLATION,
+     CPTI_META_INFO_TYPE,
  
      CPTI_MAX
  };
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 257,262 ****
--- 260,266 ----
  #define vtbl_type_node			cp_global_trees[CPTI_VTBL_TYPE]
  #define vtbl_ptr_type_node		cp_global_trees[CPTI_VTBL_PTR_TYPE]
  #define std_node			cp_global_trees[CPTI_STD]
+ #define std_meta_node			cp_global_trees[CPTI_STD_META]
  #define abi_node			cp_global_trees[CPTI_ABI]
  #define global_namespace		cp_global_trees[CPTI_GLOBAL]
  #define const_type_info_type_node	cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE]
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 266,271 ****
--- 270,276 ----
  /* 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
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 329,334 ****
--- 334,340 ----
  #define for_end_identifier		cp_global_trees[CPTI_FOR_END_IDENTIFIER]
  #define abi_tag_identifier		cp_global_trees[CPTI_ABI_TAG_IDENTIFIER]
  #define aligned_identifier		cp_global_trees[CPTI_ALIGNED_IDENTIFIER]
+ #define annotation_identifier		cp_global_trees[CPTI_ANNOTATION_IDENTIFIER]
  #define begin_identifier		cp_global_trees[CPTI_BEGIN_IDENTIFIER]
  #define end_identifier			cp_global_trees[CPTI_END_IDENTIFIER]
  #define get__identifier			cp_global_trees[CPTI_GET_IDENTIFIER]
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 454,459 ****
--- 460,468 ----
        MUST_NOT_THROW_NOEXCEPT_P (in MUST_NOT_THROW_EXPR)
        CONSTEVAL_BLOCK_P (in STATIC_ASSERT)
        LAMBDA_EXPR_CONSTEVAL_BLOCK_P (in LAMBDA_EXPR)
+       SPLICE_EXPR_EXPRESSION_P (in SPLICE_EXPR)
+       OLD_PARM_DECL_P (in PARM_DECL)
+       COMPONENT_REF_SPLICE_P (in COMPONENT_REF)
     1: IDENTIFIER_KIND_BIT_1 (in IDENTIFIER_NODE)
        TI_PENDING_TEMPLATE_FLAG.
        TEMPLATE_PARMS_FOR_INLINE.
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 476,481 ****
--- 485,491 ----
        STATIC_INIT_DECOMP_BASE_P (in the TREE_LIST for {static,tls}_aggregates)
        MUST_NOT_THROW_THROW_P (in MUST_NOT_THROW_EXPR)
        LAMBDA_EXPR_CONST_QUAL_P (in LAMBDA_EXPR)
+       SPLICE_EXPR_MEMBER_ACCESS_P (in SPLICE_EXPR)
     2: IDENTIFIER_KIND_BIT_2 (in IDENTIFIER_NODE)
        ICS_THIS_FLAG (in _CONV)
        DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL)
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 499,504 ****
--- 509,516 ----
        STATIC_INIT_DECOMP_NONBASE_P (in the TREE_LIST
  				    for {static,tls}_aggregates)
        MUST_NOT_THROW_CATCH_P (in MUST_NOT_THROW_EXPR)
+       MULTIPLE_NAMES_PARM_P (in PARM_DECL)
+       SPLICE_EXPR_ADDRESS_P (in SPLICE_EXPR)
     3: IMPLICIT_RVALUE_P (in NON_LVALUE_EXPR or STATIC_CAST_EXPR)
        ICS_BAD_FLAG (in _CONV)
        FN_TRY_BLOCK_P (in TRY_BLOCK)
*************** extern GTY(()) tree cp_global_trees[CPTI
*** 541,546 ****
--- 553,559 ----
     1: TYPE_HAS_USER_CONSTRUCTOR.
     2: TYPE_HAS_LATE_RETURN_TYPE (in FUNCTION_TYPE, METHOD_TYPE)
        TYPE_PTRMEMFUNC_FLAG (in RECORD_TYPE)
+       ENUM_BEING_DEFINED_P (in ENUMERAL_TYPE)
     4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR
     5: CLASS_TYPE_P (in RECORD_TYPE and UNION_TYPE)
        ENUM_FIXED_UNDERLYING_TYPE_P (in ENUMERAL_TYPE)
*************** struct GTY(()) tree_tu_local_entity {
*** 1883,1888 ****
--- 1896,1993 ----
  #define REQUIRES_EXPR_EXTRA_ARGS(NODE) \
    TREE_OPERAND (TREE_CHECK (NODE, REQUIRES_EXPR), 2)
  
+ /* True iff TYPE is cv decltype(^^int).  */
+ #define REFLECTION_TYPE_P(TYPE) (TREE_CODE (TYPE) == META_TYPE)
+ 
+ /* True if NODE is a REFLECT_EXPR.  */
+ #define REFLECT_EXPR_P(NODE) (TREE_CODE (NODE) == REFLECT_EXPR)
+ 
+ /* The handle of a reflection expression.  */
+ #define REFLECT_EXPR_HANDLE(NODE) \
+   TREE_OPERAND (TREE_CHECK (NODE, REFLECT_EXPR), 0)
+ 
+ /* Various kinds of reflections.  Sometimes we cannot simply look at the
+    handle and figure out the kind from it.  For instance,
+ 
+      consteval void fn(int p) {
+        constexpr auto rp = parameters_of(^^fn)[0];
+        // is_variable(^^p) is true
+        // is_function_parameter(^^p) is false
+        // is_variable(rp) is false
+        // is_function_parameter(rp) is true
+      }
+ 
+    but we represent the handle p with a PARM_DECL in all cases.
+ 
+    The size is limited to addr_space_t because we only have 8 bits.  */
+ 
+ enum reflect_kind : addr_space_t {
+   /* Detect the category from the handle.  */
+   REFLECT_UNDEF,
+   /* The reflection represents an object.  */
+   REFLECT_OBJECT,
+   /* The reflection represents a value.  */
+   REFLECT_VALUE,
+   /* The reflection represents a variable.  Used for underlying
+      variable of tuple structured binding.  */
+   REFLECT_VAR,
+   /* The reflection represents a function parameter.  */
+   REFLECT_PARM,
+   /* The reflection represents a data member description.  */
+   REFLECT_DATA_MEMBER_SPEC,
+   /* The reflection represents a direct base relationship.  */
+   REFLECT_BASE,
+   /* The reflection represents an annotation.  */
+   REFLECT_ANNOTATION
+ };
+ 
+ /* The reflect_kind of a REFLECT_EXPR.  */
+ #define REFLECT_EXPR_KIND(NODE) \
+   (static_cast<reflect_kind> \
+    (REFLECT_EXPR_CHECK (NODE)->base.u.bits.address_space))
+ 
+ #define SET_REFLECT_EXPR_KIND(NODE, VAL) \
+   (REFLECT_EXPR_CHECK (NODE)->base.u.bits.address_space = VAL)
+ 
+ /* True if this SPLICE_EXPR represents a splice-expression (as opposed to
+    a splice-specifier), so it cannot expand to e.g. a type.  */
+ #define SPLICE_EXPR_EXPRESSION_P(NODE) \
+    TREE_LANG_FLAG_0 (SPLICE_EXPR_CHECK (NODE))
+ 
+ /* Helper macro to set SPLICE_EXPR_EXPRESSION_P.  This macro handles
+    dependent_splice_p trees: either [:T:] or [:T:]<arg>.  */
+ #define SET_SPLICE_EXPR_EXPRESSION_P(NODE) \
+   (SPLICE_EXPR_EXPRESSION_P (TREE_CODE (NODE) == SPLICE_EXPR \
+ 			     ? NODE : TREE_OPERAND (NODE, 0)) = true)
+ 
+ /* True if this SPLICE_EXPR is used in foo.[: bar :] or foo->[: bar :]
+    context.  */
+ #define SPLICE_EXPR_MEMBER_ACCESS_P(NODE) \
+    TREE_LANG_FLAG_1 (SPLICE_EXPR_CHECK (NODE))
+ 
+ /* Helper macro to set SPLICE_EXPR_MEMBER_ACCESS_P.  */
+ #define SET_SPLICE_EXPR_MEMBER_ACCESS_P(NODE, VAL) \
+   (SPLICE_EXPR_MEMBER_ACCESS_P (TREE_CODE (NODE) == SPLICE_EXPR \
+ 				? NODE : TREE_OPERAND (NODE, 0)) = (VAL))
+ 
+ /* True if we are taking the address of this SPLICE_EXPR.  */
+ #define SPLICE_EXPR_ADDRESS_P(NODE) \
+    TREE_LANG_FLAG_2 (SPLICE_EXPR_CHECK (NODE))
+ 
+ /* Helper macro to set SPLICE_EXPR_ADDRESS_P.  */
+ #define SET_SPLICE_EXPR_ADDRESS_P(NODE, VAL) \
+   (SPLICE_EXPR_ADDRESS_P (TREE_CODE (NODE) == SPLICE_EXPR \
+ 			  ? NODE : TREE_OPERAND (NODE, 0)) = (VAL))
+ 
+ /* The expression in question for a SPLICE_SCOPE.  */
+ #define SPLICE_SCOPE_EXPR(NODE) \
+   (TYPE_VALUES_RAW (SPLICE_SCOPE_CHECK (NODE)))
+ 
+ /* True if this splice represents a splice-type-specifier rather than
+    a splice-scope-specifier.  */
+ #define SPLICE_SCOPE_TYPE_P(NODE) \
+   (SPLICE_SCOPE_CHECK (NODE))->type_common.string_flag
+ 
  enum cp_tree_node_structure_enum {
    TS_CP_GENERIC,
    TS_CP_IDENTIFIER,
*************** enum languages { lang_c, lang_cplusplus
*** 2366,2371 ****
--- 2471,2477 ----
     || TREE_CODE (T) == DECLTYPE_TYPE			\
     || TREE_CODE (T) == TRAIT_TYPE			\
     || TREE_CODE (T) == DEPENDENT_OPERATOR_TYPE		\
+    || TREE_CODE (T) == SPLICE_SCOPE			\
     || TREE_CODE (T) == PACK_INDEX_TYPE)
  
  /* Nonzero if T is a class (or struct or union) type.  Also nonzero
*************** struct GTY(()) lang_decl {
*** 3848,3853 ****
--- 3954,3965 ----
  #define DECL_PENDING_INLINE_INFO(NODE) \
    (LANG_DECL_FN_CHECK (NODE)->u.pending_inline_info)
  
+ /* True if NODE is a non-gnu_inline inline function; gnu_inline overrides the
+    usual vague linkage effects of inline.  */
+ #define DECL_NONGNU_INLINE_P(NODE) \
+   (DECL_DECLARED_INLINE_P (NODE) \
+    && !lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (NODE)))
+ 
  /* Nonzero for TYPE_DECL means that it was written 'using name = type'.  */
  #define TYPE_DECL_ALIAS_P(NODE) \
    DECL_LANG_FLAG_6 (TYPE_DECL_CHECK (NODE))
*************** templated_operator_saved_lookups (tree t
*** 4372,4377 ****
--- 4484,4494 ----
  #define REF_PARENTHESIZED_P(NODE) \
    TREE_LANG_FLAG_2 (TREE_CHECK5 ((NODE), COMPONENT_REF, INDIRECT_REF, SCOPE_REF, VIEW_CONVERT_EXPR, PAREN_EXPR))
  
+ /* True on a dependent COMPONENT_REF with a splice expression.  */
+ 
+ #define COMPONENT_REF_SPLICE_P(NODE) \
+   TREE_LANG_FLAG_0 (COMPONENT_REF_CHECK (NODE))
+ 
  /* Nonzero if this AGGR_INIT_EXPR provides for initialization via a
     constructor call, rather than an ordinary function call.  */
  #define AGGR_INIT_VIA_CTOR_P(NODE) \
*************** get_vec_init_expr (tree t)
*** 4749,4757 ****
  
  /* [basic.types]
  
!    Arithmetic types, enumeration types, pointer types,
!    pointer-to-member types, and std::nullptr_t are collectively called
!    scalar types.
  
     Keep these checks in ascending code order.  */
  #define SCALAR_TYPE_P(TYPE)			\
--- 4866,4874 ----
  
  /* [basic.types]
  
!    Arithmetic types, enumeration types, pointer types, pointer-to-member types,
!    std::meta::info, std::nullptr_t and cv-qualified versions of these types
!    are collectively called scalar types.
  
     Keep these checks in ascending code order.  */
  #define SCALAR_TYPE_P(TYPE)			\
*************** get_vec_init_expr (tree t)
*** 4760,4766 ****
     || ARITHMETIC_TYPE_P (TYPE)			\
     || TYPE_PTR_P (TYPE)				\
     || TYPE_PTRMEMFUNC_P (TYPE)                  \
!    || NULLPTR_TYPE_P (TYPE))
  
  /* Determines whether this type is a C++0x scoped enumeration
     type. Scoped enumerations types are introduced via "enum class" or
--- 4877,4884 ----
     || ARITHMETIC_TYPE_P (TYPE)			\
     || TYPE_PTR_P (TYPE)				\
     || TYPE_PTRMEMFUNC_P (TYPE)                  \
!    || NULLPTR_TYPE_P (TYPE)			\
!    || REFLECTION_TYPE_P (TYPE))
  
  /* Determines whether this type is a C++0x scoped enumeration
     type. Scoped enumerations types are introduced via "enum class" or
*************** get_vec_init_expr (tree t)
*** 4801,4806 ****
--- 4919,4929 ----
  #define OPAQUE_ENUM_P(TYPE)				\
    (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_OPAQUE (TYPE))
  
+ /* Nonzero when the ENUMERAL_TYPE is being defined (enumerators parsed
+    or instantiated).  */
+ #define ENUM_BEING_DEFINED_P(NODE) \
+   (TYPE_LANG_FLAG_2 (ENUMERAL_TYPE_CHECK (NODE)))
+ 
  /* [dcl.init.aggr]
  
     An aggregate is an array or a class with no user-provided
*************** get_vec_init_expr (tree t)
*** 5168,5173 ****
--- 5291,5308 ----
  #define DECL_ARRAY_PARAMETER_P(NODE) \
    DECL_LANG_FLAG_1 (PARM_DECL_CHECK (NODE))
  
+ /* Nonzero for PARM_DECL node means it is a parameter of an earlier
+    declaration which is no longer in DECL_ARGUMENTS (DECL_CONTEXT (NODE))
+    chain because a function definition has been parsed later.  */
+ #define OLD_PARM_DECL_P(NODE) \
+   TREE_LANG_FLAG_0 (PARM_DECL_CHECK (NODE))
+ 
+ /* Nonzero for PARM_DECL node means it has different names on different
+    declarations of the same FUNCTION_DECL.  If it is unnamed on one and
+    named on another, that is still fine.  */
+ #define MULTIPLE_NAMES_PARM_P(NODE) \
+   TREE_LANG_FLAG_2 (PARM_DECL_CHECK (NODE))
+ 
  /* Nonzero for a FIELD_DECL who's NSMDI is currently being
     instantiated.  */
  #define DECL_INSTANTIATING_NSDMI_P(NODE) \
*************** extern bool comparing_override_contracts
*** 6029,6034 ****
--- 6164,6171 ----
  
  /* In parser.cc.  */
  
+ extern bool cp_preserve_using_decl;
+ 
  /* Nonzero if we are parsing an unevaluated operand: an operand to
     sizeof, typeof, or alignof.  This is a count since operands to
     sizeof can be nested.  */
*************** enum ovl_op_flags {
*** 6526,6533 ****
  enum ovl_op_code {
    OVL_OP_ERROR_MARK,
    OVL_OP_NOP_EXPR,
! #define DEF_OPERATOR(NAME, CODE, MANGLING, FLAGS) OVL_OP_##CODE,
! #define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING) /* NOTHING */
  #include "operators.def"
    OVL_OP_MAX
  };
--- 6663,6670 ----
  enum ovl_op_code {
    OVL_OP_ERROR_MARK,
    OVL_OP_NOP_EXPR,
! #define DEF_OPERATOR(NAME, CODE, MANGLING, FLAGS, META) OVL_OP_##CODE,
! #define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING, META) /* NOTHING */
  #include "operators.def"
    OVL_OP_MAX
  };
*************** struct GTY(()) ovl_op_info_t {
*** 6542,6547 ****
--- 6679,6687 ----
    const char *name;
    /* The mangled name of the operator.  */
    const char *mangled_name;
+   /* The name of the std::meta::operators enumerator without
+      the "op_" prefix if any (otherwise NULL).  */
+   const char *meta_name;
    /* The (regular) tree code.  */
    enum tree_code tree_code : 16;
    /* The (compressed) operator code.  */
*************** enum cp_built_in_function {
*** 6933,6938 ****
--- 7073,7079 ----
    CP_BUILT_IN_IS_POINTER_INTERCONVERTIBLE_WITH_CLASS,
    CP_BUILT_IN_SOURCE_LOCATION,
    CP_BUILT_IN_EH_PTR_ADJUST_REF,
+   CP_BUILT_IN_IS_STRING_LITERAL,
    CP_BUILT_IN_LAST
  };
  
*************** extern tree get_copy_ctor			(tree, tsubs
*** 7684,7689 ****
--- 7825,7831 ----
  extern tree get_copy_assign			(tree);
  extern tree get_default_ctor			(tree);
  extern tree get_dtor				(tree, tsubst_flags_t);
+ extern tree build_stub_type			(tree, int, bool);
  extern tree build_stub_object			(tree);
  extern bool is_stub_object			(tree);
  extern tree build_invoke			(tree, const_tree,
*************** extern void remove_dummy_lambda_op (tree
*** 7844,7849 ****
--- 7986,7992 ----
  extern tree canonical_type_parameter		(tree);
  extern void push_access_scope			(tree);
  extern void pop_access_scope			(tree);
+ extern tree current_function_decl_without_access_scope ();
  extern bool check_template_shadow		(tree);
  extern tree get_innermost_template_args		(tree, int);
  extern void maybe_begin_member_template_processing (tree);
*************** extern tree maybe_process_partial_specia
*** 7941,7947 ****
  extern tree most_specialized_instantiation	(tree);
  extern tree most_specialized_partial_spec       (tree, tsubst_flags_t, bool = false);
  extern tree most_constrained_function		(tree);
! extern void print_candidates			(tree);
  extern void instantiate_pending_templates	(int);
  extern tree tsubst_default_argument		(tree, int, tree, tree,
  						 tsubst_flags_t);
--- 8084,8104 ----
  extern tree most_specialized_instantiation	(tree);
  extern tree most_specialized_partial_spec       (tree, tsubst_flags_t, bool = false);
  extern tree most_constrained_function		(tree);
! extern void inform_num_candidates		(location_t, int);
! 
! /* Abstract base class for optionally providing extra diagnostic note(s)
!    about a candidate in calls to print_candidates.  */
! 
! class candidate_context
! {
! public:
!   virtual ~candidate_context () {}
!   virtual void emit_any_notes_for_candidate (tree cand_fndecl) = 0;
! };
! 
! extern void print_candidates			(location_t, tree,
! 						 candidate_context * = nullptr);
! 
  extern void instantiate_pending_templates	(int);
  extern tree tsubst_default_argument		(tree, int, tree, tree,
  						 tsubst_flags_t);
*************** extern int processing_template_parmlist;
*** 7963,7968 ****
--- 8120,8126 ----
  extern bool dependent_type_p			(tree);
  extern bool dependent_scope_p			(tree);
  extern bool dependentish_scope_p		(tree);
+ extern bool dependent_namespace_p		(tree);
  extern bool any_dependent_template_arguments_p  (const_tree);
  extern bool any_erroneous_template_args_p       (const_tree);
  extern bool dependent_template_p		(tree);
*************** extern tree add_outermost_template_args
*** 8045,8050 ****
--- 8203,8209 ----
  extern tree add_extra_args			(tree, tree, tsubst_flags_t, tree);
  extern tree build_extra_args			(tree, tree, tsubst_flags_t);
  extern void finish_expansion_stmt		(tree, tree, tsubst_flags_t, tree);
+ extern tree convert_reflect_constant_arg	(tree, tree);
  
  /* in rtti.cc */
  /* A vector of all tinfo decls that haven't been emitted yet.  */
*************** extern tree finish_template_template_par
*** 8243,8251 ****
  extern tree begin_class_definition		(tree);
  extern void finish_template_decl		(tree);
  extern tree finish_template_type		(tree, tree, int);
! extern tree finish_base_specifier		(tree, tree, bool);
  extern void finish_member_declaration		(tree);
  extern bool outer_automatic_var_p		(tree);
  extern tree process_outer_var_ref		(tree, tsubst_flags_t, bool force_use = false);
  extern cp_expr finish_id_expression		(tree, tree, tree,
  						 cp_id_kind *,
--- 8402,8411 ----
  extern tree begin_class_definition		(tree);
  extern void finish_template_decl		(tree);
  extern tree finish_template_type		(tree, tree, int);
! extern tree finish_base_specifier		(tree, tree, bool, tree);
  extern void finish_member_declaration		(tree);
  extern bool outer_automatic_var_p		(tree);
+ extern bool parsing_lambda_declarator		();
  extern tree process_outer_var_ref		(tree, tsubst_flags_t, bool force_use = false);
  extern cp_expr finish_id_expression		(tree, tree, tree,
  						 cp_id_kind *,
*************** extern tree finish_decltype_type
*** 8326,8331 ****
--- 8486,8492 ----
  extern tree fold_builtin_is_corresponding_member (location_t, int, tree *);
  extern bool pointer_interconvertible_base_of_p	(tree, tree, bool = false);
  extern tree fold_builtin_is_pointer_inverconvertible_with_class (location_t, int, tree *);
+ extern tree fold_builtin_is_string_literal	(location_t, int, tree *);
  extern tree finish_structured_binding_size	(location_t, tree, tsubst_flags_t);
  extern tree finish_trait_expr			(location_t, enum cp_trait_kind, tree, tree);
  extern tree finish_trait_type			(enum cp_trait_kind, tree, tree, tsubst_flags_t);
*************** extern tree cxx_copy_lang_qualifiers		(c
*** 8540,8545 ****
--- 8701,8707 ----
  
  extern void cxx_print_statistics		(void);
  extern bool maybe_warn_zero_as_null_pointer_constant (tree, location_t);
+ extern bool annotation_p			(tree) ATTRIBUTE_PURE;
  
  /* in ptree.cc */
  extern void cxx_print_xnode			(FILE *, tree, int);
*************** extern tree decay_conversion			(tree,
*** 8593,8599 ****
  extern tree build_class_member_access_expr      (cp_expr, tree, tree, bool,
  						 tsubst_flags_t);
  extern tree finish_class_member_access_expr     (cp_expr, tree, bool,
! 						 tsubst_flags_t);
  extern tree lookup_destructor			(tree, tree, tree, tsubst_flags_t);
  extern tree build_dependent_operator_type	(tree, enum tree_code, bool);
  extern tree build_x_indirect_ref		(location_t, tree,
--- 8755,8761 ----
  extern tree build_class_member_access_expr      (cp_expr, tree, tree, bool,
  						 tsubst_flags_t);
  extern tree finish_class_member_access_expr     (cp_expr, tree, bool,
! 						 tsubst_flags_t, bool = false);
  extern tree lookup_destructor			(tree, tree, tree, tsubst_flags_t);
  extern tree build_dependent_operator_type	(tree, enum tree_code, bool);
  extern tree build_x_indirect_ref		(location_t, tree,
*************** extern tree process_stmt_assume_attribut
*** 8904,8909 ****
--- 9066,9073 ----
  extern bool simple_empty_class_p		(tree, tree, tree_code);
  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_consteval	(tree);
  extern tree cp_fold_immediate			(tree *, mce_value,
  						 tree = current_function_decl);
  extern void process_and_check_pending_immediate_escalating_fns ();
*************** extern bool is_nondependent_static_init_
*** 9060,9065 ****
--- 9224,9230 ----
  extern bool is_static_init_expression    (tree);
  extern bool is_std_class (tree, const char *);
  extern bool is_std_allocator (tree);
+ extern bool is_std_allocator_allocate (tree);
  extern bool potential_rvalue_constant_expression (tree);
  extern bool require_potential_constant_expression (tree);
  extern bool require_constant_expression (tree);
*************** extern tree find_failing_clause			(const
*** 9101,9106 ****
--- 9266,9289 ----
  extern void diagnose_failing_condition		(tree, location_t, bool,
  						 const constexpr_ctx * = nullptr);
  extern bool replace_decl			(tree *, tree, tree);
+ extern tree cxa_allocate_and_throw_exception	(location_t, const constexpr_ctx *,
+ 						 tree);
+ 
+ /* Whether our evaluation wants a prvalue (e.g. CONSTRUCTOR or _CST),
+    a glvalue (e.g. VAR_DECL or _REF), or nothing.  */
+ enum value_cat {
+    vc_prvalue = 0,
+    vc_glvalue = 1,
+    vc_discard = 2
+ };
+ 
+ extern tree cxx_eval_constant_expression	(const constexpr_ctx *, tree,
+ 						 value_cat, bool *, bool *,
+ 						 tree *);
+ extern bool cxx_constexpr_quiet_p		(const constexpr_ctx *);
+ extern mce_value cxx_constexpr_manifestly_const_eval (const constexpr_ctx *);
+ extern tree cxx_constexpr_caller		(const constexpr_ctx *);
+ extern tree cxx_constexpr_consteval_block	(const constexpr_ctx *);
  
  /* An RAII sentinel used to restrict constexpr evaluation so that it
     doesn't do anything that causes extra DECL_UID generation.  */
*************** extern tree coro_get_ramp_function		(tre
*** 9144,9149 ****
--- 9327,9357 ----
  
  extern tree co_await_get_resume_call		(tree await_expr);
  
+ /* Only for use by modules.  */
+ extern void coro_set_transform_functions	(tree, tree, tree);
+ extern void coro_set_ramp_function		(tree, tree);
+ 
+ /* In reflect.cc */
+ extern void init_reflection ();
+ extern bool metafunction_p (tree) ATTRIBUTE_PURE;
+ extern tree direct_base_derived (tree) ATTRIBUTE_PURE;
+ extern tree process_metafunction (const constexpr_ctx *, tree, tree,
+ 				  bool *, bool *, tree *);
+ extern tree get_reflection (location_t, tree, reflect_kind = REFLECT_UNDEF);
+ extern tree get_null_reflection () ATTRIBUTE_PURE;
+ extern tree splice (tree);
+ extern bool check_out_of_consteval_use (tree, bool = true);
+ extern bool consteval_only_p (tree) ATTRIBUTE_PURE;
+ extern bool compare_reflections (tree, tree) ATTRIBUTE_PURE;
+ extern bool valid_splice_type_p (const_tree) ATTRIBUTE_PURE;
+ extern bool valid_splice_scope_p (const_tree) ATTRIBUTE_PURE;
+ extern bool check_splice_expr (location_t, location_t, tree, bool, bool, bool)
+   ATTRIBUTE_PURE;
+ extern tree make_splice_scope (tree, bool);
+ extern bool dependent_splice_p (const_tree) ATTRIBUTE_PURE;
+ extern tree reflection_mangle_prefix (tree, char [3]);
+ extern void check_consteval_only_fn (tree);
+ 
  /* Inline bodies.  */
  
  inline tree
diff -Nrcpad gcc-16-20260111/gcc/cp/cvt.cc gcc-16-20260118/gcc/cp/cvt.cc
*** gcc-16-20260111/gcc/cp/cvt.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/cvt.cc	Sun Jan 18 22:32:07 2026
*************** ocp_convert (tree type, tree expr, int c
*** 994,1001 ****
        if (invalid_nonstatic_memfn_p (loc, expr, complain))
  	/* We displayed the error message.  */;
        else
! 	error_at (loc, "conversion from %qH to non-scalar type %qI requested",
! 		  TREE_TYPE (expr), type);
      }
    return error_mark_node;
  }
--- 994,1006 ----
        if (invalid_nonstatic_memfn_p (loc, expr, complain))
  	/* We displayed the error message.  */;
        else
! 	{
! 	  auto_diagnostic_group d;
! 	  error_at (loc, "conversion from %qH to non-scalar type %qI requested",
! 		    TREE_TYPE (expr), type);
! 	  maybe_show_nonconverting_candidate (type, TREE_TYPE (expr), expr,
! 					      flags);
! 	}
      }
    return error_mark_node;
  }
*************** convert_to_void (tree expr, impl_conv_vo
*** 1207,1212 ****
--- 1212,1223 ----
     if (concept_check_p (expr))
       expr = evaluate_concept_check (expr);
  
+   /* Detect using expressions of consteval-only types outside manifestly
+      constant-evaluated contexts.  We are going to discard this expression,
+      so we can't wait till cp_fold_immediate_r.  */
+   if (check_out_of_consteval_use (expr))
+     return error_mark_node;
+ 
    if (VOID_TYPE_P (TREE_TYPE (expr)))
      return expr;
  
diff -Nrcpad gcc-16-20260111/gcc/cp/cxx-pretty-print.cc gcc-16-20260118/gcc/cp/cxx-pretty-print.cc
*** gcc-16-20260111/gcc/cp/cxx-pretty-print.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/cxx-pretty-print.cc	Sun Jan 18 22:32:07 2026
*************** pp_cxx_delete_expression (cxx_pretty_pri
*** 813,818 ****
--- 813,819 ----
        sizeof ... ( identifier )
        new-expression
        delete-expression
+       reflect-expression
  
     unary-operator: one of
        *   &   +   -  !
*************** cxx_pretty_printer::unary_expression (tr
*** 898,903 ****
--- 899,917 ----
        pp_cxx_cast_expression (this, TREE_OPERAND (t, 0));
        break;
  
+     case REFLECT_EXPR:
+       {
+ 	pp_cxx_ws_string (this, "^^");
+ 	tree h = REFLECT_EXPR_HANDLE (t);
+ 	if (DECL_P (h))
+ 	  declaration (h);
+ 	else if (TYPE_P (h))
+ 	  type_id (h);
+ 	else
+ 	  expression (h);
+       }
+       break;
+ 
      default:
        c_pretty_printer::unary_expression (t);
        break;
*************** cxx_pretty_printer::expression (tree t)
*** 1184,1189 ****
--- 1198,1204 ----
      case ALIGNOF_EXPR:
      case NOEXCEPT_EXPR:
      case UNARY_PLUS_EXPR:
+     case REFLECT_EXPR:
        unary_expression (t);
        break;
  
*************** cxx_pretty_printer::simple_type_specifie
*** 1427,1432 ****
--- 1442,1451 ----
        pp_cxx_trait (this, t);
        break;
  
+     case META_TYPE:
+       pp_cxx_ws_string (this, "std::meta::info");
+       break;
+ 
      default:
        c_pretty_printer::simple_type_specifier (t);
        break;
*************** cxx_pretty_printer::type_id (tree t)
*** 1923,1928 ****
--- 1942,1948 ----
      case NULLPTR_TYPE:
      case TEMPLATE_ID_EXPR:
      case OFFSET_TYPE:
+     case META_TYPE:
        pp_cxx_type_specifier_seq (this, t);
        if (TYPE_PTRMEM_P (t))
  	abstract_declarator (t);
diff -Nrcpad gcc-16-20260111/gcc/cp/decl.cc gcc-16-20260118/gcc/cp/decl.cc
*** gcc-16-20260111/gcc/cp/decl.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/decl.cc	Sun Jan 18 22:32:07 2026
*************** static bool identify_goto (tree, locatio
*** 134,139 ****
--- 134,140 ----
     Namespaces,
  
  	tree std_node;
+ 	tree std_meta_node;
  	tree abi_node;
  
     A FUNCTION_DECL which can call `abort'.  Not necessarily the
*************** duplicate_decls (tree newdecl, tree oldd
*** 3043,3051 ****
  
        /* 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);
--- 3044,3053 ----
  
        /* 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);
*************** duplicate_decls (tree newdecl, tree oldd
*** 3063,3068 ****
--- 3065,3126 ----
  		      "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)
*************** duplicate_decls (tree newdecl, tree oldd
*** 3087,3093 ****
  
  	  SET_DECL_TEMPLATE_SPECIALIZATION (olddecl);
  	  DECL_COMDAT (newdecl) = (TREE_PUBLIC (newdecl)
! 				   && DECL_DECLARED_INLINE_P (newdecl));
  
  	  /* Don't propagate visibility from the template to the
  	     specialization here.  We'll do that in determine_visibility if
--- 3145,3151 ----
  
  	  SET_DECL_TEMPLATE_SPECIALIZATION (olddecl);
  	  DECL_COMDAT (newdecl) = (TREE_PUBLIC (newdecl)
! 				   && DECL_NONGNU_INLINE_P (newdecl));
  
  	  /* Don't propagate visibility from the template to the
  	     specialization here.  We'll do that in determine_visibility if
*************** duplicate_decls (tree newdecl, tree oldd
*** 3160,3165 ****
--- 3218,3232 ----
  	  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
+ 	     arguments are held across this point and used later.
+ 	     Such PARM_DECLs are no longer present in
+ 	     DECL_ARGUMENTS (DECL_CONTEXT (oldarg)) chain.  */
+ 	  for (tree oldarg = DECL_ARGUMENTS (olddecl);
+ 	       oldarg; oldarg = DECL_CHAIN (oldarg))
+ 	    OLD_PARM_DECL_P (oldarg) = 1;
+ 
  	  /* These need to be copied so that the names are available.
  	     Note that if the types do match, we'll preserve inline
  	     info and other bits, but if not, we won't.  */
*************** make_typename_type (tree context, tree n
*** 5066,5072 ****
  	{
  	  auto_diagnostic_group d;
  	  error ("lookup of %qT in %qT is ambiguous", name, context);
! 	  print_candidates (t);
  	}
        return error_mark_node;
      }
--- 5133,5139 ----
  	{
  	  auto_diagnostic_group d;
  	  error ("lookup of %qT in %qT is ambiguous", name, context);
! 	  print_candidates (input_location, t);
  	}
        return error_mark_node;
      }
*************** initialize_predefined_identifiers (void)
*** 5330,5335 ****
--- 5397,5403 ----
      {"heap []", &heap_vec_identifier, cik_normal},
      {"omp", &omp_identifier, cik_normal},
      {"internal ", &internal_identifier, cik_normal},
+     {"annotation ", &annotation_identifier, cik_normal},
      {NULL, NULL, cik_normal}
    };
  
*************** cxx_init_decl_processing (void)
*** 5563,5568 ****
--- 5631,5643 ----
        set_call_expr_flags (decl, ECF_NOTHROW | ECF_LEAF);
      }
  
+   decl
+     = add_builtin_function ("__builtin_is_string_literal",
+ 			    bool_vaftype,
+ 			    CP_BUILT_IN_IS_STRING_LITERAL,
+ 			    BUILT_IN_FRONTEND, NULL, NULL_TREE);
+   set_call_expr_flags (decl, ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+ 
    integer_two_node = build_int_cst (NULL_TREE, 2);
  
    /* Guess at the initial static decls size.  */
*************** cxx_init_decl_processing (void)
*** 5693,5698 ****
--- 5768,5776 ----
    if (modules_p ())
      init_modules (parse_in);
  
+   if (flag_reflection)
+     init_reflection ();
+ 
    make_fname_decl = cp_make_fname_decl;
    start_fname_decls ();
  
*************** start_decl (const cp_declarator *declara
*** 6636,6642 ****
  	  SET_DECL_TEMPLATE_SPECIALIZATION (decl);
  	  if (TREE_CODE (decl) == FUNCTION_DECL)
  	    DECL_COMDAT (decl) = (TREE_PUBLIC (decl)
! 				  && DECL_DECLARED_INLINE_P (decl));
  	  else
  	    DECL_COMDAT (decl) = false;
  
--- 6714,6720 ----
  	  SET_DECL_TEMPLATE_SPECIALIZATION (decl);
  	  if (TREE_CODE (decl) == FUNCTION_DECL)
  	    DECL_COMDAT (decl) = (TREE_PUBLIC (decl)
! 				  && DECL_NONGNU_INLINE_P (decl));
  	  else
  	    DECL_COMDAT (decl) = false;
  
*************** maybe_commonize_var (tree decl)
*** 7220,7225 ****
--- 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)
*************** reshape_init_class (tree type, reshape_i
*** 7775,7781 ****
  		      auto_diagnostic_group g;
  		      error ("request for member %qD is ambiguous",
  			     d->cur->index);
! 		      print_candidates (field);
  		    }
  		  else
  		    error ("%qT has no non-static data member named %qD", type,
--- 7857,7863 ----
  		      auto_diagnostic_group g;
  		      error ("request for member %qD is ambiguous",
  			     d->cur->index);
! 		      print_candidates (input_location, field);
  		    }
  		  else
  		    error ("%qT has no non-static data member named %qD", type,
*************** check_initializer (tree decl, tree init,
*** 8577,8582 ****
--- 8659,8674 ----
  	  init = NULL_TREE;
  	}
      }
+   else if (!init && REFLECTION_TYPE_P (type))
+     {
+       /* [dcl.init.general]: To default-initialize an object of type
+ 	 std::meta::info means that the object is zero-initialized.  */
+       DECL_INITIAL (decl)
+ 	= build_zero_init (type, NULL_TREE, /*static_storage_p=*/false);
+       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = true;
+       TREE_CONSTANT (decl) = true;
+       init = NULL_TREE;
+     }
    else
      {
        if (CLASS_TYPE_P (core_type = strip_array_types (type))
*************** make_rtl_for_nonlocal_decl (tree decl, t
*** 8696,8701 ****
--- 8788,8801 ----
    if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl))
      return;
  
+   /* Don't output reflection variables.  */
+   if (consteval_only_p (decl))
+     {
+       /* Disable assemble_variable.  */
+       DECL_EXTERNAL (decl) = true;
+       return;
+     }
+ 
    /* We defer emission of local statics until the corresponding
       DECL_EXPR is expanded.  But with constexpr its function might never
       be expanded, so go ahead and tell cgraph about the variable now.  */
*************** cp_finish_decl (tree decl, tree init, bo
*** 9743,9748 ****
--- 9843,9852 ----
  	    }
  	}
  
+       /* Detect stuff like 'info r = ^^int;' outside a manifestly
+ 	 constant-evaluated context.  */
+       check_out_of_consteval_use (decl);
+ 
        /* If this is a local variable that will need a mangled name,
  	 register it now.  We must do this before processing the
  	 initializer for the variable, since the initialization might
*************** cp_finish_decl (tree decl, tree init, bo
*** 9751,9757 ****
  	 variable.  */
        if (DECL_FUNCTION_SCOPE_P (decl)
  	  && TREE_STATIC (decl)
! 	  && !DECL_ARTIFICIAL (decl))
  	{
  	  /* The variable holding an anonymous union will have had its
  	     discriminator set in finish_anon_union, after which it's
--- 9855,9862 ----
  	 variable.  */
        if (DECL_FUNCTION_SCOPE_P (decl)
  	  && TREE_STATIC (decl)
! 	  && !DECL_ARTIFICIAL (decl)
! 	  && !consteval_only_p (decl))
  	{
  	  /* The variable holding an anonymous union will have had its
  	     discriminator set in finish_anon_union, after which it's
*************** get_tuple_size (tree type)
*** 10280,10286 ****
    inst = complete_type (inst);
    if (inst == error_mark_node
        || !COMPLETE_TYPE_P (inst)
!       || !CLASS_TYPE_P (type))
      return NULL_TREE;
    tree val = lookup_qualified_name (inst, value_identifier,
  				    LOOK_want::NORMAL, /*complain*/false);
--- 10385,10391 ----
    inst = complete_type (inst);
    if (inst == error_mark_node
        || !COMPLETE_TYPE_P (inst)
!       || !CLASS_TYPE_P (inst))
      return NULL_TREE;
    tree val = lookup_qualified_name (inst, value_identifier,
  				    LOOK_want::NORMAL, /*complain*/false);
*************** grokfndecl (tree ctype,
*** 12574,12579 ****
--- 12679,12686 ----
    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;
  
*************** lookup_and_check_tag (enum tag_types tag
*** 18105,18111 ****
      {
        auto_diagnostic_group d;
        error ("reference to %qD is ambiguous", name);
!       print_candidates (decl);
        return error_mark_node;
      }
  
--- 18212,18218 ----
      {
        auto_diagnostic_group d;
        error ("reference to %qD is ambiguous", name);
!       print_candidates (input_location, decl);
        return error_mark_node;
      }
  
*************** xref_basetypes (tree ref, tree base_list
*** 18369,18374 ****
--- 18476,18483 ----
    unsigned max_vbases = 0; /* Maximum direct & indirect virtual bases.  */
    unsigned max_bases = 0;  /* Maximum direct bases.  */
    unsigned max_dvbases = 0; /* Maximum direct virtual bases.  */
+   /* Highest direct base index with annotations.  */
+   unsigned max_annotated_base = 0;
    int i;
    tree default_access;
    tree igo_prev; /* Track Inheritance Graph Order.  */
*************** xref_basetypes (tree ref, tree base_list
*** 18406,18411 ****
--- 18515,18522 ----
        else
  	{
  	  max_bases++;
+ 	  if (TREE_CODE (TREE_PURPOSE (*basep)) == TREE_LIST)
+ 	    max_annotated_base = max_bases;
  	  if (TREE_TYPE (*basep))
  	    max_dvbases++;
  	  if (CLASS_TYPE_P (basetype))
*************** xref_basetypes (tree ref, tree base_list
*** 18434,18440 ****
  
    if (max_bases)
      {
!       vec_alloc (BINFO_BASE_ACCESSES (binfo), max_bases);
        /* A C++98 POD cannot have base classes.  */
        CLASSTYPE_NON_LAYOUT_POD_P (ref) = true;
  
--- 18545,18552 ----
  
    if (max_bases)
      {
!       vec_alloc (BINFO_BASE_ACCESSES (binfo), max_bases + max_annotated_base);
!       BINFO_BASE_ACCESSES (binfo)->quick_grow (max_bases + max_annotated_base);
        /* A C++98 POD cannot have base classes.  */
        CLASSTYPE_NON_LAYOUT_POD_P (ref) = true;
  
*************** xref_basetypes (tree ref, tree base_list
*** 18464,18469 ****
--- 18576,18605 ----
    for (igo_prev = binfo; base_list; base_list = TREE_CHAIN (base_list))
      {
        tree access = TREE_PURPOSE (base_list);
+       tree annotations = NULL_TREE;
+       if (TREE_CODE (access) == TREE_LIST)
+ 	{
+ 	  annotations = TREE_VALUE (access);
+ 	  access = TREE_PURPOSE (access);
+ 	  for (tree *d = &annotations; *d; )
+ 	    {
+ 	      if (annotation_p (*d))
+ 		{
+ 		  tree name = get_attribute_name (*d);
+ 		  tree args = TREE_VALUE (*d);
+ 		  const attribute_spec *as
+ 		    = lookup_attribute_spec (TREE_PURPOSE (*d));
+ 		  bool no_add_attrs = false;
+ 		  as->handler (&binfo, name, args, 0, &no_add_attrs);
+ 		  if (no_add_attrs)
+ 		    {
+ 		      *d = TREE_CHAIN (*d);
+ 		      continue;
+ 		    }
+ 		}
+ 	      d = &TREE_CHAIN (*d);
+ 	    }
+ 	}
        int via_virtual = TREE_TYPE (base_list) != NULL_TREE;
        tree basetype = TREE_VALUE (base_list);
  
*************** xref_basetypes (tree ref, tree base_list
*** 18530,18537 ****
        if (!BINFO_INHERITANCE_CHAIN (base_binfo))
  	BINFO_INHERITANCE_CHAIN (base_binfo) = binfo;
  
        BINFO_BASE_APPEND (binfo, base_binfo);
!       BINFO_BASE_ACCESS_APPEND (binfo, access);
        continue;
  
      dropped_base:
--- 18666,18677 ----
        if (!BINFO_INHERITANCE_CHAIN (base_binfo))
  	BINFO_INHERITANCE_CHAIN (base_binfo) = binfo;
  
+       unsigned len;
+       len = BINFO_N_BASE_BINFOS (binfo);
        BINFO_BASE_APPEND (binfo, base_binfo);
!       BINFO_BASE_ACCESS (binfo, len) = access;
!       if (len < max_annotated_base)
! 	BINFO_BASE_ACCESS (binfo, max_bases + len) = annotations;
        continue;
  
      dropped_base:
*************** xref_basetypes (tree ref, tree base_list
*** 18547,18552 ****
--- 18687,18703 ----
  	  -= vec_safe_length (CLASSTYPE_VBASECLASSES (basetype));
      }
  
+   unsigned len = BINFO_N_BASE_BINFOS (binfo);
+   if (len < max_bases)
+     {
+       if (len && max_annotated_base)
+ 	memmove (&BINFO_BASE_ACCESS (binfo, len),
+ 		 &BINFO_BASE_ACCESS (binfo, max_bases),
+ 		 MIN (max_annotated_base, len) * sizeof (tree));
+       BINFO_BASE_ACCESSES (binfo)->truncate (len + MIN (max_annotated_base,
+ 							len));
+     }
+ 
    if (CLASSTYPE_VBASECLASSES (ref)
        && max_vbases == 0)
      vec_free (CLASSTYPE_VBASECLASSES (ref));
*************** finish_enum_value_list (tree enumtype)
*** 18816,18821 ****
--- 18967,18974 ----
    tree minnode, maxnode;
    tree t;
  
+   ENUM_BEING_DEFINED_P (enumtype) = 0;
+ 
    bool fixed_underlying_type_p
      = ENUM_UNDERLYING_TYPE (enumtype) != NULL_TREE;
  
diff -Nrcpad gcc-16-20260111/gcc/cp/decl2.cc gcc-16-20260118/gcc/cp/decl2.cc
*** gcc-16-20260111/gcc/cp/decl2.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/decl2.cc	Sun Jan 18 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 53,58 ****
--- 53,60 ----
  #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;
*************** check_member_template (tree tmpl)
*** 770,775 ****
--- 772,978 ----
      error ("template declaration of %q#D", decl);
  }
  
+ /* A struct for conveniently working with the parameter types of a
+    fndecl.  */
+ 
+ struct fndecl_signature
+ {
+   fndecl_signature (tree fndecl)
+   : m_fndecl (fndecl),
+     m_num_artificial_parms (num_artificial_parms_for (fndecl)),
+     m_variadic (true)
+   {
+     function_args_iterator iter;
+     tree argtype;
+     FOREACH_FUNCTION_ARGS (TREE_TYPE (fndecl), argtype, iter)
+       {
+ 	/* A trailing "void" type means that FNDECL is non-variadic.  */
+ 	if (VOID_TYPE_P (argtype))
+ 	  {
+ 	    gcc_assert (!TREE_CHAIN (iter.next));
+ 	    m_variadic = false;
+ 	    break;
+ 	  }
+ 	m_parm_types.safe_push (argtype);
+       }
+     gcc_assert (m_parm_types.length () >= (size_t)m_num_artificial_parms);
+     m_num_user_parms = m_parm_types.length () - m_num_artificial_parms;
+   }
+ 
+   /* Convert from index within DECL_ARGUMENTS to 0-based user-written
+      parameter, or -1 for "this".  */
+   int
+   get_argno_from_idx (size_t idx) const
+   {
+     return static_cast<int> (idx) - m_num_artificial_parms;
+   }
+ 
+   location_t
+   get_argno_location (int argno) const
+   {
+     return get_fndecl_argument_location (m_fndecl, argno);
+   }
+ 
+   tree m_fndecl;
+   int m_num_artificial_parms;
+   auto_vec<tree> m_parm_types;
+   size_t m_num_user_parms;
+   bool m_variadic;
+ };
+ 
+ /* A rich_location subclass that highlights a given argno
+    within FNDECL_SIG using HIGHLIGHT_COLOR in the quoted source.  */
+ 
+ class parm_rich_location : public gcc_rich_location
+ {
+ public:
+   parm_rich_location (const fndecl_signature &fndecl_sig,
+ 		      int argno,
+ 		      const char *highlight_color)
+   : gcc_rich_location (fndecl_sig.get_argno_location (argno),
+ 		       nullptr,
+ 		       highlight_color)
+   {
+   }
+ };
+ 
+ /* A class for comparing a pair of fndecls and emitting diagnostic notes
+    about the differences between them, if they are sufficiently close.  */
+ 
+ class fndecl_comparison
+ {
+ public:
+   fndecl_comparison (tree decl_a,
+ 		     tree decl_b)
+   : m_decl_a (decl_a),
+     m_decl_b (decl_b)
+   {
+     gcc_assert (TREE_CODE (decl_a) == FUNCTION_DECL);
+     gcc_assert (TREE_CODE (decl_b) == FUNCTION_DECL);
+   }
+ 
+   /* Attempt to emit diagnostic notes describing the differences between
+      the fndecls, when they are a sufficiently close match.  */
+   void
+   maybe_emit_notes_for_close_match () const
+   {
+     /* If there's a difference in "variadicness", don't attempt to emit
+        any notes.  */
+     if (m_decl_a.m_variadic != m_decl_b.m_variadic)
+       return;
+ 
+     auto_vec<parm_difference> differences = get_differences ();
+     if (differences.length () == 1)
+       {
+ 	auto_diagnostic_nesting_level sentinel;
+ 	print_parm_type_difference (differences[0]);
+       }
+   }
+ 
+ private:
+   struct parm_difference
+   {
+     size_t m_parm_idx_a;
+     size_t m_parm_idx_b;
+   };
+ 
+   /* If we have a close match, return the differences between the two
+      fndecls.  Otherwise return an empty vector.  */
+   auto_vec<parm_difference>
+   get_differences () const
+   {
+     auto_vec<parm_difference> differences;
+ 
+     /* For now, just handle the case where the "user parm" count is
+        equal.  */
+     if (m_decl_a.m_num_user_parms != m_decl_b.m_num_user_parms)
+       return differences;
+ 
+     /* Ideally we'd check the edit distance, and thus report on close
+        matches which are missing a param, have transposed params, etc.
+        For now, just iterate through the params, finding differences
+        elementwise.  */
+ 
+     /* Find differences in artificial params, if they are comparable.
+        This should find e.g. const vs non-const differences in "this".  */
+     if (m_decl_a.m_num_artificial_parms == m_decl_b.m_num_artificial_parms)
+       for (int parm_idx = 0;
+ 	   parm_idx < m_decl_a.m_num_artificial_parms;
+ 	   ++parm_idx)
+ 	compare (parm_idx, parm_idx, differences);
+ 
+     /* Find differences in user-provided params.  */
+     for (size_t user_parm_idx = 0;
+ 	 user_parm_idx < m_decl_a.m_num_user_parms;
+ 	 ++user_parm_idx)
+       {
+ 	const size_t idx_a = m_decl_a.m_num_artificial_parms + user_parm_idx;
+ 	const size_t idx_b = m_decl_b.m_num_artificial_parms + user_parm_idx;
+ 	compare (idx_a, idx_b, differences);
+       }
+ 
+     return differences;
+   }
+ 
+   void
+   compare (size_t idx_a, size_t idx_b,
+ 	   auto_vec<parm_difference> &differences) const
+   {
+     if (!same_type_p (m_decl_a.m_parm_types[idx_a],
+ 		      m_decl_b.m_parm_types[idx_b]))
+       differences.safe_push (parm_difference {idx_a, idx_b});
+   }
+ 
+   void
+   print_parm_type_difference (const parm_difference &diff) const
+   {
+     const char * const highlight_a = "highlight-a";
+     pp_markup::element_quoted_type type_of_parm_a
+       (m_decl_a.m_parm_types[diff.m_parm_idx_a],
+        highlight_a);
+     const int argno_a = m_decl_a.get_argno_from_idx (diff.m_parm_idx_a);
+     parm_rich_location rich_loc_a (m_decl_a, argno_a, highlight_a);
+     inform (&rich_loc_a,
+ 	    "parameter %P of candidate has type %e...",
+ 	    argno_a, &type_of_parm_a);
+ 
+     const char * const highlight_b = "highlight-b";
+     pp_markup::element_quoted_type type_of_parm_b
+       (m_decl_b.m_parm_types[diff.m_parm_idx_b],
+        highlight_b);
+     const int argno_b = m_decl_b.get_argno_from_idx (diff.m_parm_idx_b);
+     parm_rich_location rich_loc_b (m_decl_b, argno_b, highlight_b);
+     inform (&rich_loc_b,
+ 	    "...which does not match type %e",
+ 	    &type_of_parm_b);
+   }
+ 
+   fndecl_signature m_decl_a;
+   fndecl_signature m_decl_b;
+ };
+ 
+ class decl_mismatch_context : public candidate_context
+ {
+ public:
+   decl_mismatch_context (tree function)
+   : m_function (function)
+   {
+     gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
+   }
+ 
+   void
+   emit_any_notes_for_candidate (tree cand) final override
+   {
+     if (TREE_CODE (cand) == FUNCTION_DECL)
+       {
+ 	fndecl_comparison diff (cand, m_function);
+ 	diff.maybe_emit_notes_for_close_match ();
+       }
+   }
+ private:
+   tree m_function;
+ };
+ 
  /* Sanity check: report error if this function FUNCTION is not
     really a member of the class (CTYPE) it is supposed to belong to.
     TEMPLATE_PARMS is used to specify the template parameters of a member
*************** check_classfn (tree ctype, tree function
*** 917,923 ****
  	  error_at (DECL_SOURCE_LOCATION (function),
  		    "no declaration matches %q#D", function);
  	  if (fns)
! 	    print_candidates (fns);
  	  else if (DECL_CONV_FN_P (function))
  	    inform (DECL_SOURCE_LOCATION (function),
  		    "no conversion operators declared");
--- 1120,1129 ----
  	  error_at (DECL_SOURCE_LOCATION (function),
  		    "no declaration matches %q#D", function);
  	  if (fns)
! 	    {
! 	      decl_mismatch_context ctxt (function);
! 	      print_candidates (DECL_SOURCE_LOCATION (function), fns, &ctxt);
! 	    }
  	  else if (DECL_CONV_FN_P (function))
  	    inform (DECL_SOURCE_LOCATION (function),
  		    "no conversion operators declared");
*************** is_late_template_attribute (tree attr, t
*** 1472,1477 ****
--- 1678,1688 ----
      = lookup_attribute_spec (TREE_PURPOSE (attr));
    tree arg;
  
+   /* Handle all annotations as late, so that they aren't incorrectly
+      reordered if some have dependent expressions and others don't.  */
+   if (annotation_p (attr))
+     return true;
+ 
    if (!spec)
      /* Unknown attribute.  */
      return false;
*************** cp_check_const_attributes (tree attribut
*** 1750,1755 ****
--- 1961,1970 ----
        if (cxx_contract_attribute_p (attr))
  	continue;
  
+       /* Annotation arguments are handled in handle_annotation_attribute.  */
+       if (annotation_p (attr))
+ 	continue;
+ 
        tree arg;
        /* As we implement alignas using gnu::aligned attribute and
  	 alignas argument is a constant expression, force manifestly
*************** maybe_make_one_only (tree decl)
*** 2460,2465 ****
--- 2675,2684 ----
    if (! flag_weak)
      return;
  
+   /* These are not to be output.  */
+   if (consteval_only_p (decl))
+     return;
+ 
    /* We can't set DECL_COMDAT on functions, or cp_finish_file will think
       we can get away with not emitting them if they aren't used.  We need
       to for variables so that cp_finish_decl will update their linkage,
*************** vague_linkage_p (tree decl)
*** 2511,2517 ****
       DECL_COMDAT.  */
    if (DECL_COMDAT (decl)
        || (TREE_CODE (decl) == FUNCTION_DECL
! 	  && DECL_DECLARED_INLINE_P (decl))
        || (DECL_LANG_SPECIFIC (decl)
  	  && DECL_TEMPLOID_INSTANTIATION (decl))
        || (VAR_P (decl) && DECL_INLINE_VAR_P (decl)))
--- 2730,2736 ----
       DECL_COMDAT.  */
    if (DECL_COMDAT (decl)
        || (TREE_CODE (decl) == FUNCTION_DECL
! 	  && DECL_NONGNU_INLINE_P (decl))
        || (DECL_LANG_SPECIFIC (decl)
  	  && DECL_TEMPLOID_INSTANTIATION (decl))
        || (VAR_P (decl) && DECL_INLINE_VAR_P (decl)))
*************** import_export_class (tree ctype)
*** 2581,2587 ****
  	     translation units.  If we were to emit the vtable in each
  	     translation unit containing a definition, we would get
  	     multiple definition errors at link-time.  */
! 	  if (method && (flag_weak || ! DECL_DECLARED_INLINE_P (method)))
  	    import_export = (DECL_REALLY_EXTERN (method) ? -1 : 1);
  	}
      }
--- 2800,2806 ----
  	     translation units.  If we were to emit the vtable in each
  	     translation unit containing a definition, we would get
  	     multiple definition errors at link-time.  */
! 	  if (method && (flag_weak || ! DECL_NONGNU_INLINE_P (method)))
  	    import_export = (DECL_REALLY_EXTERN (method) ? -1 : 1);
  	}
      }
*************** var_finalized_p (tree var)
*** 2616,2621 ****
--- 2835,2844 ----
  void
  mark_needed (tree decl)
  {
+   /* These are not to be output.  */
+   if (consteval_only_p (decl))
+     return;
+ 
    TREE_USED (decl) = 1;
    if (TREE_CODE (decl) == FUNCTION_DECL)
      {
*************** min_vis_r (tree *tp, int *walk_subtrees,
*** 2834,2840 ****
  /* walk_tree helper function for expr_visibility.  */
  
  static tree
! min_vis_expr_r (tree *tp, int */*walk_subtrees*/, void *data)
  {
    int *vis_p = (int *)data;
    int tpvis = VISIBILITY_DEFAULT;
--- 3057,3063 ----
  /* walk_tree helper function for expr_visibility.  */
  
  static tree
! min_vis_expr_r (tree *tp, int *walk_subtrees, void *data)
  {
    int *vis_p = (int *)data;
    int tpvis = VISIBILITY_DEFAULT;
*************** min_vis_expr_r (tree *tp, int */*walk_su
*** 2906,2911 ****
--- 3129,3187 ----
        tpvis = type_visibility (DECL_CONTEXT (t));
        break;
  
+     case REFLECT_EXPR:
+       tree r;
+       r = REFLECT_EXPR_HANDLE (t);
+       switch (REFLECT_EXPR_KIND (t))
+ 	{
+ 	case REFLECT_BASE:
+ 	  /* For direct base class relationship, determine visibility
+ 	     from both D and B types.  */
+ 	  tpvis = type_visibility (BINFO_TYPE (r));
+ 	  if (tpvis > *vis_p)
+ 	    *vis_p = tpvis;
+ 	  tpvis = type_visibility (direct_base_derived (r));
+ 	  *walk_subtrees = 0;
+ 	  break;
+ 	case REFLECT_DATA_MEMBER_SPEC:
+ 	  /* For data member description determine visibility
+ 	     from the type.  */
+ 	  tpvis = type_visibility (TREE_VEC_ELT (r, 0));
+ 	  *walk_subtrees = 0;
+ 	  break;
+ 	case REFLECT_PARM:
+ 	  /* For function parameter reflection determine visibility
+ 	     based on parent_of.  */
+ 	  tpvis = expr_visibility (DECL_CONTEXT (r));
+ 	  *walk_subtrees = 0;
+ 	  break;
+ 	case REFLECT_ANNOTATION:
+ 	  /* Annotations are always local to the TU.  */
+ 	  tpvis = VISIBILITY_ANON;
+ 	  *walk_subtrees = 0;
+ 	  break;
+ 	case REFLECT_OBJECT:
+ 	  r = get_base_address (r);
+ 	  gcc_fallthrough ();
+ 	default:
+ 	  if (TYPE_P (r))
+ 	    {
+ 	      tpvis = type_visibility (r);
+ 	      *walk_subtrees = 0;
+ 	      break;
+ 	    }
+ 	  if ((VAR_P (r) && decl_function_context (r))
+ 	      || TREE_CODE (r) == PARM_DECL)
+ 	    {
+ 	      /* Block scope variables are local to the TU.  */
+ 	      tpvis = VISIBILITY_ANON;
+ 	      *walk_subtrees = 0;
+ 	      break;
+ 	    }
+ 	  break;
+ 	}
+       break;
+ 
      default:
        break;
      }
*************** vtables_uniquely_emitted (tree ctype)
*** 3532,3538 ****
       object for the TU containing the definition of the key function.  This is
       unique if the key function is not inline.  */
    tree key_method = CLASSTYPE_KEY_METHOD (ctype);
!   if (key_method && !DECL_DECLARED_INLINE_P (key_method))
      return true;
  
    /* Otherwise, the tables are emitted in every object that references
--- 3808,3814 ----
       object for the TU containing the definition of the key function.  This is
       unique if the key function is not inline.  */
    tree key_method = CLASSTYPE_KEY_METHOD (ctype);
!   if (key_method && !DECL_NONGNU_INLINE_P (key_method))
      return true;
  
    /* Otherwise, the tables are emitted in every object that references
*************** import_export_decl (tree decl)
*** 3730,3736 ****
      }
    else if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
      {
!       if (!DECL_DECLARED_INLINE_P (decl))
  	{
  	  tree ctype = DECL_CONTEXT (decl);
  	  import_export_class (ctype);
--- 4006,4012 ----
      }
    else if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
      {
!       if (!DECL_NONGNU_INLINE_P (decl))
  	{
  	  tree ctype = DECL_CONTEXT (decl);
  	  import_export_class (ctype);
*************** prune_vars_needing_no_initialization (tr
*** 4788,4793 ****
--- 5064,5077 ----
  	  continue;
  	}
  
+       /* Reflections are consteval-only types and we don't want them
+ 	 to survive until gimplification.  */
+       if (consteval_only_p (decl))
+ 	{
+ 	  var = &TREE_CHAIN (t);
+ 	  continue;
+ 	}
+ 
        /* This variable is going to need initialization and/or
  	 finalization, so we add it to the list.  */
        *var = TREE_CHAIN (t);
*************** no_linkage_error (tree decl)
*** 5136,5141 ****
--- 5420,5431 ----
      /* An imported decl is ok.  */
      return;
  
+   /* Metafunctions are magic and should be considered defined even though
+      they have no bodies.  ??? This can't be checked in decl_defined_p;
+      we'd get redefinition errors for some of our metafunctions.  */
+   if (TREE_CODE (decl) == FUNCTION_DECL && metafunction_p (decl))
+     return;
+ 
    tree t = no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false);
    if (t == NULL_TREE)
      /* The type that got us on no_linkage_decls must have gotten a name for
*************** c_parse_final_cleanups (void)
*** 5810,5816 ****
        /* Static data members are just like namespace-scope globals.  */
        FOR_EACH_VEC_SAFE_ELT (pending_statics, i, decl)
  	{
! 	  if (var_finalized_p (decl) || DECL_REALLY_EXTERN (decl)
  	      /* Don't write it out if we haven't seen a definition.  */
  	      || DECL_IN_AGGR_P (decl))
  	    continue;
--- 6100,6108 ----
        /* Static data members are just like namespace-scope globals.  */
        FOR_EACH_VEC_SAFE_ELT (pending_statics, i, decl)
  	{
! 	  if (consteval_only_p (decl)
! 	      || var_finalized_p (decl)
! 	      || DECL_REALLY_EXTERN (decl)
  	      /* Don't write it out if we haven't seen a definition.  */
  	      || DECL_IN_AGGR_P (decl))
  	    continue;
*************** c_parse_final_cleanups (void)
*** 5852,5857 ****
--- 6144,6151 ----
  	     should have synthesized it above.)  */
  	  && !(header_module_p ()
  	       && (DECL_DEFAULTED_FN (decl) || decl_tls_wrapper_p (decl)))
+ 	  /* Metafunctions are never defined.  */
+ 	  && !metafunction_p (decl)
  	  /* Don't complain if the template was defined.  */
  	  && !(DECL_TEMPLOID_INSTANTIATION (decl)
  	       && DECL_INITIAL (DECL_TEMPLATE_RESULT
diff -Nrcpad gcc-16-20260111/gcc/cp/error.cc gcc-16-20260118/gcc/cp/error.cc
*** gcc-16-20260111/gcc/cp/error.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/error.cc	Sun Jan 18 22:32:07 2026
*************** dump_type (cxx_pretty_printer *pp, tree
*** 749,754 ****
--- 749,755 ----
  
      case TEMPLATE_DECL:
      case NAMESPACE_DECL:
+     case CONST_DECL:
        dump_decl (pp, t, flags & ~TFF_DECL_SPECIFIERS);
        break;
  
*************** dump_type (cxx_pretty_printer *pp, tree
*** 877,882 ****
--- 878,891 ----
        pp_string (pp, "std::nullptr_t");
        break;
  
+     case META_TYPE:
+       pp_string (pp, "std::meta::info");
+       break;
+ 
+     case SPLICE_SCOPE:
+       dump_expr (pp, SPLICE_SCOPE_EXPR (t), flags & ~TFF_EXPR_IN_PARENS);
+       break;
+ 
      default:
        pp_unsupported_tree (pp, t);
        /* Fall through.  */
*************** dump_type_prefix (cxx_pretty_printer *pp
*** 1136,1141 ****
--- 1145,1152 ----
      case FIXED_POINT_TYPE:
      case NULLPTR_TYPE:
      case PACK_INDEX_TYPE:
+     case META_TYPE:
+     case SPLICE_SCOPE:
        dump_type (pp, t, flags);
        pp->set_padding (pp_before);
        break;
*************** dump_type_suffix (cxx_pretty_printer *pp
*** 1269,1274 ****
--- 1280,1287 ----
      case FIXED_POINT_TYPE:
      case NULLPTR_TYPE:
      case PACK_INDEX_TYPE:
+     case META_TYPE:
+     case SPLICE_SCOPE:
        break;
  
      default:
*************** dump_decl (cxx_pretty_printer *pp, tree
*** 1615,1623 ****
  	tree name = TREE_OPERAND (t, 0);
  	tree args = TREE_OPERAND (t, 1);
  
! 	if (!identifier_p (name))
! 	  name = OVL_NAME (name);
! 	dump_decl (pp, name, flags);
  	pp_cxx_begin_template_argument_list (pp);
  	if (args == error_mark_node)
  	  pp_string (pp, M_("<template arguments error>"));
--- 1628,1641 ----
  	tree name = TREE_OPERAND (t, 0);
  	tree args = TREE_OPERAND (t, 1);
  
! 	if (TREE_CODE (name) == SPLICE_EXPR)
! 	  dump_expr (pp, name, flags);
! 	else
! 	  {
! 	    if (!identifier_p (name))
! 	      name = OVL_NAME (name);
! 	    dump_decl (pp, name, flags);
! 	  }
  	pp_cxx_begin_template_argument_list (pp);
  	if (args == error_mark_node)
  	  pp_string (pp, M_("<template arguments error>"));
*************** dump_expr (cxx_pretty_printer *pp, tree
*** 3311,3316 ****
--- 3329,3355 ----
  	}
        break;
  
+     case REFLECT_EXPR:
+       {
+ 	pp_string (pp, "^^");
+ 	tree h = REFLECT_EXPR_HANDLE (t);
+ 	if (DECL_P (h))
+ 	  dump_decl (pp, h, flags);
+ 	else if (TYPE_P (h))
+ 	  dump_type (pp, h, flags);
+ 	else
+ 	  dump_expr (pp, h, flags);
+ 	break;
+       }
+ 
+     case SPLICE_EXPR:
+       pp_cxx_ws_string (pp, "[:");
+       pp_cxx_whitespace (pp);
+       dump_expr (pp, TREE_OPERAND (t, 0), flags);
+       pp_cxx_whitespace (pp);
+       pp_cxx_ws_string (pp, ":]");
+       break;
+ 
        /*  This list is incomplete, but should suffice for now.
  	  It is very important that `sorry' does not call
  	  `report_error_function'.  That could cause an infinite loop.  */
*************** qualified_name_lookup_error (tree scope,
*** 4988,4994 ****
  	  auto_diagnostic_group d;
  	  error_at (location, "reference to %<%T::%D%> is ambiguous",
  		    scope, name);
! 	  print_candidates (decl);
  	}
        else
  	{
--- 5027,5033 ----
  	  auto_diagnostic_group d;
  	  error_at (location, "reference to %<%T::%D%> is ambiguous",
  		    scope, name);
! 	  print_candidates (location, decl);
  	}
        else
  	{
diff -Nrcpad gcc-16-20260111/gcc/cp/init.cc gcc-16-20260118/gcc/cp/init.cc
*** gcc-16-20260111/gcc/cp/init.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/init.cc	Sun Jan 18 22:32:07 2026
*************** build_zero_init_1 (tree type, tree nelts
*** 178,183 ****
--- 178,187 ----
  
    if (type == error_mark_node)
      ;
+   else if (REFLECTION_TYPE_P (type))
+     /* [dcl.init.general]: "if T is std::meta::info, the object is initialized
+        to a null reflection value".  */
+     init = get_null_reflection ();
    else if (static_storage_p && zero_init_p (type))
      /* In order to save space, we do not explicitly build initializers
         for items that do not need them.  GCC's semantics are that
*************** perform_member_init (tree member, tree i
*** 993,998 ****
--- 997,1005 ----
    if (init == error_mark_node)
      return;
  
+   if (check_out_of_consteval_use (init))
+     return;
+ 
    /* Effective C++ rule 12 requires that all data members be
       initialized.  */
    if (warn_ecpp && init == NULL_TREE && TREE_CODE (type) != ARRAY_TYPE)
*************** build_new_1 (vec<tree, va_gc> **placemen
*** 3430,3436 ****
  	    {
  	      auto_diagnostic_group d;
  	      error ("request for member %qD is ambiguous", fnname);
! 	      print_candidates (fns);
  	    }
  	  return error_mark_node;
  	}
--- 3437,3443 ----
  	    {
  	      auto_diagnostic_group d;
  	      error ("request for member %qD is ambiguous", fnname);
! 	      print_candidates (input_location, fns);
  	    }
  	  return error_mark_node;
  	}
diff -Nrcpad gcc-16-20260111/gcc/cp/lex.cc gcc-16-20260118/gcc/cp/lex.cc
*** gcc-16-20260111/gcc/cp/lex.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/lex.cc	Sun Jan 18 22:32:07 2026
*************** cxx_finish (void)
*** 85,96 ****
  ovl_op_info_t ovl_op_info[2][OVL_OP_MAX] =
    {
      {
!       {NULL_TREE, NULL, NULL, ERROR_MARK, OVL_OP_ERROR_MARK, 0},
!       {NULL_TREE, NULL, NULL, NOP_EXPR, OVL_OP_NOP_EXPR, 0},
! #define DEF_OPERATOR(NAME, CODE, MANGLING, FLAGS) \
!       {NULL_TREE, NAME, MANGLING, CODE, OVL_OP_##CODE, FLAGS},
  #define OPERATOR_TRANSITION }, {			\
!       {NULL_TREE, NULL, NULL, ERROR_MARK, OVL_OP_ERROR_MARK, 0},
  #include "operators.def"
      }
    };
--- 85,96 ----
  ovl_op_info_t ovl_op_info[2][OVL_OP_MAX] =
    {
      {
!       {NULL_TREE, NULL, NULL, NULL, ERROR_MARK, OVL_OP_ERROR_MARK, 0},
!       {NULL_TREE, NULL, NULL, NULL, NOP_EXPR, OVL_OP_NOP_EXPR, 0},
! #define DEF_OPERATOR(NAME, CODE, MANGLING, FLAGS, META) \
!       {NULL_TREE, NAME, MANGLING, META, CODE, OVL_OP_##CODE, FLAGS},
  #define OPERATOR_TRANSITION }, {			\
!       {NULL_TREE, NULL, NULL, NULL, ERROR_MARK, OVL_OP_ERROR_MARK, 0},
  #include "operators.def"
      }
    };
diff -Nrcpad gcc-16-20260111/gcc/cp/mangle.cc gcc-16-20260118/gcc/cp/mangle.cc
*** gcc-16-20260111/gcc/cp/mangle.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/mangle.cc	Sun Jan 18 22:32:07 2026
*************** write_local_name (tree function, const t
*** 2439,2444 ****
--- 2439,2445 ----
                                  # class member access
       <type> ::= DT <expression> # decltype of an expression
       <type> ::= Dn              # decltype of nullptr
+      <type> ::= Dm		# decltype of ^^int
  
     TYPE is a type node.  */
  
*************** write_type (tree type)
*** 2716,2721 ****
--- 2717,2727 ----
  		++is_builtin_type;
  	      break;
  
+ 	    case META_TYPE:
+ 	      write_string ("Dm");
+ 	      ++is_builtin_type;
+ 	      break;
+ 
  	    case TYPEOF_TYPE:
  	      sorry ("mangling %<typeof%>, use %<decltype%> instead");
  	      break;
*************** write_expression (tree expr)
*** 3467,3473 ****
      write_template_param (expr);
    /* Handle literals.  */
    else if (TREE_CODE_CLASS (code) == tcc_constant
! 	   || code == CONST_DECL)
      write_template_arg_literal (expr);
    else if (code == EXCESS_PRECISION_EXPR
  	   && TREE_CODE (TREE_OPERAND (expr, 0)) == REAL_CST)
--- 3473,3480 ----
      write_template_param (expr);
    /* Handle literals.  */
    else if (TREE_CODE_CLASS (code) == tcc_constant
! 	   || code == CONST_DECL
! 	   || code == REFLECT_EXPR)
      write_template_arg_literal (expr);
    else if (code == EXCESS_PRECISION_EXPR
  	   && TREE_CODE (TREE_OPERAND (expr, 0)) == REAL_CST)
*************** write_expression (tree expr)
*** 4104,4109 ****
--- 4111,4250 ----
      }
  }
  
+ /* Non-terminal <reflection>.
+ 
+      <reflection> ::= nu				# null reflection
+ 		  ::= vl <expression>			# value
+ 		  ::= ob <expression>			# object
+ 		  ::= vr <variable name>		# variable
+ 		  ::= sb <sb name>			# structured binding
+ 		  ::= fn <function encoding>		# function
+ 		  ::= pa [ <nonnegative number> ] _ <encoding>	# fn param
+ 		  ::= en <prefix> <unqualified-name>	# enumerator
+ 		  ::= an [ <nonnegative number> ] _	# annotation
+ 		  ::= ta <alias prefix>			# type alias
+ 		  ::= ty <type>				# type
+ 		  ::= dm <prefix> <unqualified-name>	# ns data member
+ 		  ::= un <prefix> [ <nonnegative number> ] _ # unnamed bitfld
+ 		  ::= ct [ <prefix> ] <unqualified-name> # class template
+ 		  ::= ft [ <prefix> ] <unqualified-name> # function template
+ 		  ::= vt [ <prefix> ] <unqualified-name> # variable template
+ 		  ::= at [ <prefix> ] <unqualified-name> # alias template
+ 		  ::= co [ <prefix> ] <unqualified-name> # concept
+ 		  ::= na [ <prefix> ] <unqualified-name> # namespace alias
+ 		  ::= ns [ <prefix> ] <unqualified-name> # namespace
+ 		  ::= ng				# ^^::
+ 		  ::= ba [ <nonnegative number> ] _ <type> # dir. base cls rel
+ 		  ::= ds <type> _ [ <unqualified-name> ] _
+ 		      [ <alignment number> ] _ [ <bit-width number> ] _
+ 		      [ n ]				# data member spec  */
+ 
+ static void
+ write_reflection (tree refl)
+ {
+   char prefix[3];
+   tree arg = reflection_mangle_prefix (refl, prefix);
+   write_string (prefix);
+   /* If there is no argument, nothing further needs to be mangled.  */
+   if (arg == NULL_TREE)
+     return;
+   if (strcmp (prefix, "vl") == 0 || strcmp (prefix, "ob") == 0)
+     write_expression (arg);
+   else if (strcmp (prefix, "vr") == 0 || strcmp (prefix, "sb") == 0)
+     write_name (arg, 0);
+   else if (strcmp (prefix, "fn") == 0)
+     write_encoding (arg);
+   else if (strcmp (prefix, "pa") == 0)
+     {
+       tree fn = DECL_CONTEXT (arg);
+       tree args = FUNCTION_FIRST_USER_PARM (fn);
+       int idx = 0;
+       while (arg != args)
+ 	{
+ 	  args = DECL_CHAIN (args);
+ 	  ++idx;
+ 	}
+       write_compact_number (idx);
+       write_encoding (fn);
+     }
+   else if (strcmp (prefix, "en") == 0)
+     {
+       write_prefix (decl_mangling_context (arg));
+       write_unqualified_name (arg);
+     }
+   else if (strcmp (prefix, "an") == 0)
+     write_compact_number (tree_to_uhwi (arg));
+   else if (strcmp (prefix, "ta") == 0)
+     {
+       arg = TYPE_NAME (arg);
+       write_prefix (arg);
+     }
+   else if (strcmp (prefix, "ty") == 0)
+     write_type (arg);
+   else if (strcmp (prefix, "dm") == 0)
+     {
+       tree ctx = decl_mangling_context (arg);
+       while (ctx && ANON_UNION_TYPE_P (ctx))
+ 	ctx = decl_mangling_context (TYPE_NAME (ctx));
+       write_prefix (ctx);
+       write_unqualified_name (arg);
+     }
+   else if (strcmp (prefix, "un") == 0)
+     {
+       tree ctx = DECL_CONTEXT (arg);
+       int idx = 0;
+       for (tree f = TYPE_FIELDS (ctx); f; f = DECL_CHAIN (f))
+ 	if (f == arg)
+ 	  break;
+ 	else if (TREE_CODE (f) == FIELD_DECL && DECL_UNNAMED_BIT_FIELD (f))
+ 	  ++idx;
+       write_prefix (decl_mangling_context (arg));
+       write_compact_number (idx);
+     }
+   else if (strcmp (prefix, "ct") == 0
+ 	   || strcmp (prefix, "ft") == 0
+ 	   || strcmp (prefix, "vt") == 0
+ 	   || strcmp (prefix, "at") == 0
+ 	   || strcmp (prefix, "co") == 0
+ 	   || strcmp (prefix, "na") == 0
+ 	   || strcmp (prefix, "ns") == 0)
+     {
+       write_prefix (decl_mangling_context (arg));
+       write_unqualified_name (arg);
+     }
+   else if (strcmp (prefix, "ba") == 0)
+     {
+       gcc_assert (TREE_CODE (arg) == TREE_BINFO);
+       tree c = arg, base_binfo;
+       while (BINFO_INHERITANCE_CHAIN (c))
+ 	c = BINFO_INHERITANCE_CHAIN (c);
+ 
+       unsigned idx;
+       for (idx = 0; BINFO_BASE_ITERATE (c, idx, base_binfo); idx++)
+ 	if (base_binfo == arg)
+ 	  break;
+       write_compact_number (idx);
+       write_type (BINFO_TYPE (c));
+     }
+   else if (strcmp (prefix, "ds") == 0)
+     {
+       gcc_assert (TREE_CODE (arg) == TREE_VEC);
+       write_type (TREE_VEC_ELT (arg, 0));
+       write_char ('_');
+       if (TREE_VEC_ELT (arg, 1))
+ 	write_unqualified_id (TREE_VEC_ELT (arg, 1));
+       write_char ('_');
+       if (TREE_VEC_ELT (arg, 2))
+ 	write_number (tree_to_shwi (TREE_VEC_ELT (arg, 2)), 0, 10);
+       write_char ('_');
+       if (TREE_VEC_ELT (arg, 3))
+ 	write_number (tree_to_shwi (TREE_VEC_ELT (arg, 3)), 0, 10);
+       write_char ('_');
+       if (integer_nonzerop (TREE_VEC_ELT (arg, 4)))
+ 	write_char ('n');
+     }
+ }
+ 
  /* Literal subcase of non-terminal <template-arg>.
  
       "Literal arguments, e.g. "A<42L>", are encoded with their type
*************** write_template_arg_literal (const tree v
*** 4192,4197 ****
--- 4333,4342 ----
  	  break;
  	}
  
+       case REFLECT_EXPR:
+ 	write_reflection (value);
+ 	break;
+ 
        default:
  	gcc_unreachable ();
        }
*************** write_template_arg (tree node)
*** 4273,4279 ****
      write_template_template_arg (node);
    else if ((TREE_CODE_CLASS (code) == tcc_constant && code != PTRMEM_CST)
  	   || code == CONST_DECL
! 	   || null_member_pointer_value_p (node))
      write_template_arg_literal (node);
    else if (code == EXCESS_PRECISION_EXPR
  	   && TREE_CODE (TREE_OPERAND (node, 0)) == REAL_CST)
--- 4418,4425 ----
      write_template_template_arg (node);
    else if ((TREE_CODE_CLASS (code) == tcc_constant && code != PTRMEM_CST)
  	   || code == CONST_DECL
! 	   || null_member_pointer_value_p (node)
! 	   || code == REFLECT_EXPR)
      write_template_arg_literal (node);
    else if (code == EXCESS_PRECISION_EXPR
  	   && TREE_CODE (TREE_OPERAND (node, 0)) == REAL_CST)
diff -Nrcpad gcc-16-20260111/gcc/cp/metafns.gperf gcc-16-20260118/gcc/cp/metafns.gperf
*** gcc-16-20260111/gcc/cp/metafns.gperf	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/cp/metafns.gperf	Sun Jan 18 22:32:07 2026
***************
*** 0 ****
--- 1,688 ----
+ %language=C++
+ %define class-name metafn_lookup
+ %struct-type
+ %{
+ /* Copyright (C) 2025-2026 Free Software Foundation, Inc.
+    Written by Jakub Jelinek <jakub@redhat.com>
+ 
+ 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.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ enum metafn_code {
+   METAFN_OPERATOR_OF,
+   METAFN_SYMBOL_OF,
+   METAFN_U8SYMBOL_OF,
+   METAFN_HAS_IDENTIFIER,
+   METAFN_IDENTIFIER_OF,
+   METAFN_U8IDENTIFIER_OF,
+   METAFN_DISPLAY_STRING_OF,
+   METAFN_U8DISPLAY_STRING_OF,
+   METAFN_SOURCE_LOCATION_OF,
+   METAFN_TYPE_OF,
+   METAFN_OBJECT_OF,
+   METAFN_CONSTANT_OF,
+   METAFN_IS_PUBLIC,
+   METAFN_IS_PROTECTED,
+   METAFN_IS_PRIVATE,
+   METAFN_IS_VIRTUAL,
+   METAFN_IS_PURE_VIRTUAL,
+   METAFN_IS_OVERRIDE,
+   METAFN_IS_FINAL,
+   METAFN_IS_DELETED,
+   METAFN_IS_DEFAULTED,
+   METAFN_IS_USER_PROVIDED,
+   METAFN_IS_USER_DECLARED,
+   METAFN_IS_EXPLICIT,
+   METAFN_IS_NOEXCEPT,
+   METAFN_IS_BIT_FIELD,
+   METAFN_IS_ENUMERATOR,
+   METAFN_IS_ANNOTATION,
+   METAFN_IS_CONST,
+   METAFN_IS_VOLATILE,
+   METAFN_IS_MUTABLE_MEMBER,
+   METAFN_IS_LVALUE_REFERENCE_QUALIFIED,
+   METAFN_IS_RVALUE_REFERENCE_QUALIFIED,
+   METAFN_HAS_STATIC_STORAGE_DURATION,
+   METAFN_HAS_THREAD_STORAGE_DURATION,
+   METAFN_HAS_AUTOMATIC_STORAGE_DURATION,
+   METAFN_HAS_INTERNAL_LINKAGE,
+   METAFN_HAS_MODULE_LINKAGE,
+   METAFN_HAS_EXTERNAL_LINKAGE,
+   METAFN_HAS_C_LANGUAGE_LINKAGE,
+   METAFN_HAS_LINKAGE,
+   METAFN_IS_COMPLETE_TYPE,
+   METAFN_IS_ENUMERABLE_TYPE,
+   METAFN_IS_VARIABLE,
+   METAFN_IS_TYPE,
+   METAFN_IS_NAMESPACE,
+   METAFN_IS_TYPE_ALIAS,
+   METAFN_IS_NAMESPACE_ALIAS,
+   METAFN_IS_FUNCTION,
+   METAFN_IS_CONVERSION_FUNCTION,
+   METAFN_IS_OPERATOR_FUNCTION,
+   METAFN_IS_LITERAL_OPERATOR,
+   METAFN_IS_SPECIAL_MEMBER_FUNCTION,
+   METAFN_IS_CONSTRUCTOR,
+   METAFN_IS_DEFAULT_CONSTRUCTOR,
+   METAFN_IS_COPY_CONSTRUCTOR,
+   METAFN_IS_MOVE_CONSTRUCTOR,
+   METAFN_IS_ASSIGNMENT,
+   METAFN_IS_COPY_ASSIGNMENT,
+   METAFN_IS_MOVE_ASSIGNMENT,
+   METAFN_IS_DESTRUCTOR,
+   METAFN_IS_FUNCTION_PARAMETER,
+   METAFN_IS_EXPLICIT_OBJECT_PARAMETER,
+   METAFN_HAS_DEFAULT_ARGUMENT,
+   METAFN_HAS_ELLIPSIS_PARAMETER,
+   METAFN_IS_TEMPLATE,
+   METAFN_IS_FUNCTION_TEMPLATE,
+   METAFN_IS_VARIABLE_TEMPLATE,
+   METAFN_IS_CLASS_TEMPLATE,
+   METAFN_IS_ALIAS_TEMPLATE,
+   METAFN_IS_CONVERSION_FUNCTION_TEMPLATE,
+   METAFN_IS_OPERATOR_FUNCTION_TEMPLATE,
+   METAFN_IS_LITERAL_OPERATOR_TEMPLATE,
+   METAFN_IS_CONSTRUCTOR_TEMPLATE,
+   METAFN_IS_CONCEPT,
+   METAFN_IS_VALUE,
+   METAFN_IS_OBJECT,
+   METAFN_IS_STRUCTURED_BINDING,
+   METAFN_IS_CLASS_MEMBER,
+   METAFN_IS_NAMESPACE_MEMBER,
+   METAFN_IS_NONSTATIC_DATA_MEMBER,
+   METAFN_IS_STATIC_MEMBER,
+   METAFN_IS_BASE,
+   METAFN_HAS_DEFAULT_MEMBER_INITIALIZER,
+   METAFN_HAS_PARENT,
+   METAFN_PARENT_OF,
+   METAFN_DEALIAS,
+   METAFN_HAS_TEMPLATE_ARGUMENTS,
+   METAFN_TEMPLATE_OF,
+   METAFN_TEMPLATE_ARGUMENTS_OF,
+   METAFN_PARAMETERS_OF,
+   METAFN_VARIABLE_OF,
+   METAFN_RETURN_TYPE_OF,
+   METAFN_IS_ACCESSIBLE,
+   METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS,
+   METAFN_HAS_INACCESSIBLE_BASES,
+   METAFN_HAS_INACCESSIBLE_SUBOBJECTS,
+   METAFN_MEMBERS_OF,
+   METAFN_BASES_OF,
+   METAFN_STATIC_DATA_MEMBERS_OF,
+   METAFN_NONSTATIC_DATA_MEMBERS_OF,
+   METAFN_SUBOBJECTS_OF,
+   METAFN_ENUMERATORS_OF,
+   METAFN_OFFSET_OF,
+   METAFN_SIZE_OF,
+   METAFN_ALIGNMENT_OF,
+   METAFN_BIT_SIZE_OF,
+   METAFN_EXTRACT,
+   METAFN_CAN_SUBSTITUTE,
+   METAFN_SUBSTITUTE,
+   METAFN_REFLECT_CONSTANT,
+   METAFN_REFLECT_OBJECT,
+   METAFN_REFLECT_FUNCTION,
+   METAFN_REFLECT_CONSTANT_STRING,
+   METAFN_REFLECT_CONSTANT_ARRAY,
+   METAFN_DATA_MEMBER_SPEC,
+   METAFN_IS_DATA_MEMBER_SPEC,
+   METAFN_DEFINE_AGGREGATE,
+   METAFN_IS_VOID_TYPE,
+   METAFN_IS_NULL_POINTER_TYPE,
+   METAFN_IS_INTEGRAL_TYPE,
+   METAFN_IS_FLOATING_POINT_TYPE,
+   METAFN_IS_ARRAY_TYPE,
+   METAFN_IS_POINTER_TYPE,
+   METAFN_IS_LVALUE_REFERENCE_TYPE,
+   METAFN_IS_RVALUE_REFERENCE_TYPE,
+   METAFN_IS_MEMBER_OBJECT_POINTER_TYPE,
+   METAFN_IS_MEMBER_FUNCTION_POINTER_TYPE,
+   METAFN_IS_ENUM_TYPE,
+   METAFN_IS_UNION_TYPE,
+   METAFN_IS_CLASS_TYPE,
+   METAFN_IS_FUNCTION_TYPE,
+   METAFN_IS_REFLECTION_TYPE,
+   METAFN_IS_REFERENCE_TYPE,
+   METAFN_IS_ARITHMETIC_TYPE,
+   METAFN_IS_FUNDAMENTAL_TYPE,
+   METAFN_IS_OBJECT_TYPE,
+   METAFN_IS_SCALAR_TYPE,
+   METAFN_IS_COMPOUND_TYPE,
+   METAFN_IS_MEMBER_POINTER_TYPE,
+   METAFN_IS_CONST_TYPE,
+   METAFN_IS_VOLATILE_TYPE,
+   METAFN_IS_TRIVIALLY_COPYABLE_TYPE,
+   METAFN_IS_STANDARD_LAYOUT_TYPE,
+   METAFN_IS_EMPTY_TYPE,
+   METAFN_IS_POLYMORPHIC_TYPE,
+   METAFN_IS_ABSTRACT_TYPE,
+   METAFN_IS_FINAL_TYPE,
+   METAFN_IS_AGGREGATE_TYPE,
+   METAFN_IS_CONSTEVAL_ONLY_TYPE,
+   METAFN_IS_SIGNED_TYPE,
+   METAFN_IS_UNSIGNED_TYPE,
+   METAFN_IS_BOUNDED_ARRAY_TYPE,
+   METAFN_IS_UNBOUNDED_ARRAY_TYPE,
+   METAFN_IS_SCOPED_ENUM_TYPE,
+   METAFN_IS_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_DEFAULT_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_COPY_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_MOVE_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_ASSIGNABLE_TYPE,
+   METAFN_IS_COPY_ASSIGNABLE_TYPE,
+   METAFN_IS_MOVE_ASSIGNABLE_TYPE,
+   METAFN_IS_SWAPPABLE_WITH_TYPE,
+   METAFN_IS_SWAPPABLE_TYPE,
+   METAFN_IS_DESTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_COPY_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_ASSIGNABLE_TYPE,
+   METAFN_IS_TRIVIALLY_COPY_ASSIGNABLE_TYPE,
+   METAFN_IS_TRIVIALLY_MOVE_ASSIGNABLE_TYPE,
+   METAFN_IS_TRIVIALLY_DESTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_COPY_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_MOVE_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_ASSIGNABLE_TYPE,
+   METAFN_IS_NOTHROW_COPY_ASSIGNABLE_TYPE,
+   METAFN_IS_NOTHROW_MOVE_ASSIGNABLE_TYPE,
+   METAFN_IS_NOTHROW_SWAPPABLE_WITH_TYPE,
+   METAFN_IS_NOTHROW_SWAPPABLE_TYPE,
+   METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE,
+   METAFN_IS_IMPLICIT_LIFETIME_TYPE,
+   METAFN_HAS_VIRTUAL_DESTRUCTOR,
+   METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS,
+   METAFN_REFERENCE_CONSTRUCTS_FROM_TEMPORARY,
+   METAFN_REFERENCE_CONVERTS_FROM_TEMPORARY,
+   METAFN_RANK,
+   METAFN_EXTENT,
+   METAFN_IS_SAME_TYPE,
+   METAFN_IS_BASE_OF_TYPE,
+   METAFN_IS_VIRTUAL_BASE_OF_TYPE,
+   METAFN_IS_CONVERTIBLE_TYPE,
+   METAFN_IS_NOTHROW_CONVERTIBLE_TYPE,
+   METAFN_IS_LAYOUT_COMPATIBLE_TYPE,
+   METAFN_IS_POINTER_INTERCONVERTIBLE_BASE_OF_TYPE,
+   METAFN_IS_INVOCABLE_TYPE,
+   METAFN_IS_INVOCABLE_R_TYPE,
+   METAFN_IS_NOTHROW_INVOCABLE_TYPE,
+   METAFN_IS_NOTHROW_INVOCABLE_R_TYPE,
+   METAFN_REMOVE_CONST,
+   METAFN_REMOVE_VOLATILE,
+   METAFN_REMOVE_CV,
+   METAFN_ADD_CONST,
+   METAFN_ADD_VOLATILE,
+   METAFN_ADD_CV,
+   METAFN_REMOVE_REFERENCE,
+   METAFN_ADD_LVALUE_REFERENCE,
+   METAFN_ADD_RVALUE_REFERENCE,
+   METAFN_MAKE_SIGNED,
+   METAFN_MAKE_UNSIGNED,
+   METAFN_REMOVE_EXTENT,
+   METAFN_REMOVE_ALL_EXTENTS,
+   METAFN_REMOVE_POINTER,
+   METAFN_ADD_POINTER,
+   METAFN_REMOVE_CVREF,
+   METAFN_DECAY,
+   METAFN_COMMON_TYPE,
+   METAFN_COMMON_REFERENCE,
+   METAFN_UNDERLYING_TYPE,
+   METAFN_INVOKE_RESULT,
+   METAFN_UNWRAP_REFERENCE,
+   METAFN_UNWRAP_REF_DECAY,
+   METAFN_TUPLE_SIZE,
+   METAFN_TUPLE_ELEMENT,
+   METAFN_VARIANT_SIZE,
+   METAFN_VARIANT_ALTERNATIVE,
+   METAFN_TYPE_ORDER,
+   METAFN_ANNOTATIONS_OF,
+   METAFN_ANNOTATIONS_OF_WITH_TYPE,
+   /* Special metafunctions.  */
+   METAFN_ACCESS_CONTEXT_CURRENT,
+   METAFN_EXCEPTION__S_EXCEPTION_CVT_TO_UTF8,
+   METAFN_EXCEPTION__S_EXCEPTION_CVT_FROM_UTF8
+ };
+ 
+ enum {
+   METAFN_KIND_SHIFT = 5,
+   METAFN_KIND_MASK = (1 << METAFN_KIND_SHIFT) - 1
+ };
+ 
+ /* Possible return types of metafunctions.  */
+ enum metafn_kind_ret {
+   METAFN_KIND_RET_BOOL,
+   METAFN_KIND_RET_INFO,
+   METAFN_KIND_RET_SIZE_T,
+   METAFN_KIND_RET_MEMBER_OFFSET,
+   METAFN_KIND_RET_OPERATORS,
+   METAFN_KIND_RET_SOURCE_LOCATION,
+   METAFN_KIND_RET_STRING_VIEW,
+   METAFN_KIND_RET_U8STRING_VIEW,
+   METAFN_KIND_RET_STRONG_ORDERING,
+   METAFN_KIND_RET_VECTOR_INFO,
+   METAFN_KIND_RET_ACCESS_CONTEXT,
+   METAFN_KIND_RET_TEMPLATE_PARM,
+ };
+ static_assert (METAFN_KIND_RET_TEMPLATE_PARM <= (int) METAFN_KIND_MASK);
+ 
+ /* Possible argument types of metafunctions.  */
+ enum metafn_kind_arg {
+   METAFN_KIND_ARG_VOID = 0,
+   METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARG_TINFO, /* info argument which throws if not a type.  */
+   METAFN_KIND_ARG_REFLECTION_RANGE,
+   /* reflection_range with type infos only.  */
+   METAFN_KIND_ARG_REFLECTION_RANGET,
+   METAFN_KIND_ARG_INPUT_RANGE,
+   METAFN_KIND_ARG_SIZE_T,
+   METAFN_KIND_ARG_UNSIGNED,
+   METAFN_KIND_ARG_OPERATORS,
+   METAFN_KIND_ARG_ACCESS_CONTEXT,
+   METAFN_KIND_ARG_DATA_MEMBER_OPTIONS,
+   METAFN_KIND_ARG_TEMPLATE_PARM, /* Some other template parameter.  */
+   METAFN_KIND_ARG_TEMPLATE_PARM_REF /* Reference to template parameter.  */
+ };
+ static_assert (METAFN_KIND_ARG_TEMPLATE_PARM_REF <= (int) METAFN_KIND_MASK);
+ 
+ /* Possible sets of 0-3 arguments of metafunctions.  */
+ enum metafn_kind_args {
+   METAFN_KIND_ARGS_VOID = METAFN_KIND_ARG_VOID,
+   METAFN_KIND_ARGS_INFO = METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARGS_TINFO = METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_REFLECTION_RANGET = METAFN_KIND_ARG_REFLECTION_RANGET,
+   METAFN_KIND_ARGS_INPUT_RANGE = METAFN_KIND_ARG_INPUT_RANGE,
+   METAFN_KIND_ARGS_OPERATORS = METAFN_KIND_ARG_OPERATORS,
+   METAFN_KIND_ARGS_TEMPLATE_PARM = METAFN_KIND_ARG_TEMPLATE_PARM,
+   METAFN_KIND_ARGS_TEMPLATE_PARM_REF = METAFN_KIND_ARG_TEMPLATE_PARM_REF,
+   METAFN_KIND_ARGS_INFO_INFO
+     = (METAFN_KIND_ARG_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARGS_TINFO_TINFO
+     = (METAFN_KIND_ARG_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_TINFO_UNSIGNED
+     = (METAFN_KIND_ARG_UNSIGNED << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT
+     = (METAFN_KIND_ARG_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARGS_TINFO_DATA_MEMBER_OPTIONS
+     = (METAFN_KIND_ARG_DATA_MEMBER_OPTIONS << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_INFO_REFLECTION_RANGE
+     = (METAFN_KIND_ARG_REFLECTION_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARG_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_SIZE_T_TINFO
+     = (METAFN_KIND_ARG_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_SIZE_T,
+   METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARG_REFLECTION_RANGET << (2 * METAFN_KIND_SHIFT))
+       | METAFN_KIND_ARGS_TINFO_TINFO,
+ };
+ 
+ /* This encodes metafn_kind_ret in the low METAFN_KIND_SHIFT bits, then
+    first argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that,
+    second argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that
+    and third argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that.
+    Missing argument is METAFN_KIND_ARG_VOID aka 0.  */
+ enum metafn_kind {
+   METAFN_KIND_BOOL_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_TINFO
+     = (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT
+     = (METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_TINFO_TINFO
+     = (METAFN_KIND_ARGS_TINFO_TINFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_INFO_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TINFO
+     = (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TINFO_DATA_MEMBER_OPTIONS
+     = (METAFN_KIND_ARGS_TINFO_DATA_MEMBER_OPTIONS << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARGS_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_INFO_REFLECTION_RANGE
+     = (METAFN_KIND_ARGS_INFO_REFLECTION_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_INPUT_RANGE
+     = (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TEMPLATE_PARM
+     = (METAFN_KIND_ARGS_TEMPLATE_PARM << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TEMPLATE_PARM_REF
+     = (METAFN_KIND_ARGS_TEMPLATE_PARM_REF << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_SIZE_T_TINFO
+     = (METAFN_KIND_ARGS_SIZE_T_TINFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_MEMBER_OFFSET_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_MEMBER_OFFSET,
+   METAFN_KIND_OPERATORS_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_OPERATORS,
+   METAFN_KIND_SIZE_T_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_SIZE_T,
+   METAFN_KIND_SIZE_T_TINFO
+     = (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_SIZE_T,
+   METAFN_KIND_SIZE_T_TINFO_UNSIGNED
+     = (METAFN_KIND_ARGS_TINFO_UNSIGNED << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_SIZE_T,
+   METAFN_KIND_SOURCE_LOCATION_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_SOURCE_LOCATION,
+   METAFN_KIND_STRING_VIEW_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_STRING_VIEW,
+   METAFN_KIND_STRING_VIEW_OPERATORS
+     = (METAFN_KIND_ARGS_OPERATORS << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_STRING_VIEW,
+   METAFN_KIND_U8STRING_VIEW_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_U8STRING_VIEW,
+   METAFN_KIND_U8STRING_VIEW_OPERATORS
+     = (METAFN_KIND_ARGS_OPERATORS << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_U8STRING_VIEW,
+   METAFN_KIND_STRONG_ORDERING_TINFO_TINFO
+     = (METAFN_KIND_ARGS_TINFO_TINFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_STRONG_ORDERING,
+   METAFN_KIND_VECTOR_INFO_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_VECTOR_INFO,
+   METAFN_KIND_VECTOR_INFO_INFO_INFO
+     = (METAFN_KIND_ARGS_INFO_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_VECTOR_INFO,
+   METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT
+     = (METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_VECTOR_INFO,
+   METAFN_KIND_TEMPLATE_PARM_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_TEMPLATE_PARM,
+   METAFN_KIND_ACCESS_CONTEXT_VOID
+     = (METAFN_KIND_ARGS_VOID << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_ACCESS_CONTEXT,
+   METAFN_KIND_STRING_VIEW_INPUT_RANGE
+     = (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_STRING_VIEW,
+   METAFN_KIND_U8STRING_VIEW_INPUT_RANGE
+     = (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_U8STRING_VIEW
+ };
+ %}
+ struct metafn_info
+ {
+   /* A name within "std::meta::" (or "std::meta::access_context::").  */
+   const char *name;
+ 
+   /* METAFN_ code.  */
+   metafn_code code;
+ 
+   /* METAFN_KIND_ kind of arguments and return type.  */
+   metafn_kind kind;
+ };
+ %%
+ operator_of, METAFN_OPERATOR_OF, METAFN_KIND_OPERATORS_INFO,
+ symbol_of, METAFN_SYMBOL_OF, METAFN_KIND_STRING_VIEW_OPERATORS,
+ u8symbol_of, METAFN_U8SYMBOL_OF, METAFN_KIND_U8STRING_VIEW_OPERATORS,
+ has_identifier, METAFN_HAS_IDENTIFIER, METAFN_KIND_BOOL_INFO,
+ identifier_of, METAFN_IDENTIFIER_OF, METAFN_KIND_STRING_VIEW_INFO,
+ u8identifier_of, METAFN_U8IDENTIFIER_OF, METAFN_KIND_U8STRING_VIEW_INFO,
+ display_string_of, METAFN_DISPLAY_STRING_OF, METAFN_KIND_STRING_VIEW_INFO,
+ u8display_string_of, METAFN_U8DISPLAY_STRING_OF, METAFN_KIND_U8STRING_VIEW_INFO,
+ source_location_of, METAFN_SOURCE_LOCATION_OF, METAFN_KIND_SOURCE_LOCATION_INFO,
+ type_of, METAFN_TYPE_OF, METAFN_KIND_INFO_INFO,
+ object_of, METAFN_OBJECT_OF, METAFN_KIND_INFO_INFO,
+ constant_of, METAFN_CONSTANT_OF, METAFN_KIND_INFO_INFO,
+ is_public, METAFN_IS_PUBLIC, METAFN_KIND_BOOL_INFO,
+ is_protected, METAFN_IS_PROTECTED, METAFN_KIND_BOOL_INFO,
+ is_private, METAFN_IS_PRIVATE, METAFN_KIND_BOOL_INFO,
+ is_virtual, METAFN_IS_VIRTUAL, METAFN_KIND_BOOL_INFO,
+ is_pure_virtual, METAFN_IS_PURE_VIRTUAL, METAFN_KIND_BOOL_INFO,
+ is_override, METAFN_IS_OVERRIDE, METAFN_KIND_BOOL_INFO,
+ is_final, METAFN_IS_FINAL, METAFN_KIND_BOOL_INFO,
+ is_deleted, METAFN_IS_DELETED, METAFN_KIND_BOOL_INFO,
+ is_defaulted, METAFN_IS_DEFAULTED, METAFN_KIND_BOOL_INFO,
+ is_user_provided, METAFN_IS_USER_PROVIDED, METAFN_KIND_BOOL_INFO,
+ is_user_declared, METAFN_IS_USER_DECLARED, METAFN_KIND_BOOL_INFO,
+ is_explicit, METAFN_IS_EXPLICIT, METAFN_KIND_BOOL_INFO,
+ is_noexcept, METAFN_IS_NOEXCEPT, METAFN_KIND_BOOL_INFO,
+ is_bit_field, METAFN_IS_BIT_FIELD, METAFN_KIND_BOOL_INFO,
+ is_enumerator, METAFN_IS_ENUMERATOR, METAFN_KIND_BOOL_INFO,
+ is_annotation, METAFN_IS_ANNOTATION, METAFN_KIND_BOOL_INFO,
+ is_const, METAFN_IS_CONST, METAFN_KIND_BOOL_INFO,
+ is_volatile, METAFN_IS_VOLATILE, METAFN_KIND_BOOL_INFO,
+ is_mutable_member, METAFN_IS_MUTABLE_MEMBER, METAFN_KIND_BOOL_INFO,
+ is_lvalue_reference_qualified, METAFN_IS_LVALUE_REFERENCE_QUALIFIED, METAFN_KIND_BOOL_INFO,
+ is_rvalue_reference_qualified, METAFN_IS_RVALUE_REFERENCE_QUALIFIED, METAFN_KIND_BOOL_INFO,
+ has_static_storage_duration, METAFN_HAS_STATIC_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,
+ has_thread_storage_duration, METAFN_HAS_THREAD_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,
+ has_automatic_storage_duration, METAFN_HAS_AUTOMATIC_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,
+ has_internal_linkage, METAFN_HAS_INTERNAL_LINKAGE, METAFN_KIND_BOOL_INFO,
+ has_module_linkage, METAFN_HAS_MODULE_LINKAGE, METAFN_KIND_BOOL_INFO,
+ has_external_linkage, METAFN_HAS_EXTERNAL_LINKAGE, METAFN_KIND_BOOL_INFO,
+ has_c_language_linkage, METAFN_HAS_C_LANGUAGE_LINKAGE, METAFN_KIND_BOOL_INFO,
+ has_linkage, METAFN_HAS_LINKAGE, METAFN_KIND_BOOL_INFO,
+ is_complete_type, METAFN_IS_COMPLETE_TYPE, METAFN_KIND_BOOL_INFO,
+ is_enumerable_type, METAFN_IS_ENUMERABLE_TYPE, METAFN_KIND_BOOL_INFO,
+ is_variable, METAFN_IS_VARIABLE, METAFN_KIND_BOOL_INFO,
+ is_type, METAFN_IS_TYPE, METAFN_KIND_BOOL_INFO,
+ is_namespace, METAFN_IS_NAMESPACE, METAFN_KIND_BOOL_INFO,
+ is_type_alias, METAFN_IS_TYPE_ALIAS, METAFN_KIND_BOOL_INFO,
+ is_namespace_alias, METAFN_IS_NAMESPACE_ALIAS, METAFN_KIND_BOOL_INFO,
+ is_function, METAFN_IS_FUNCTION, METAFN_KIND_BOOL_INFO,
+ is_conversion_function, METAFN_IS_CONVERSION_FUNCTION, METAFN_KIND_BOOL_INFO,
+ is_operator_function, METAFN_IS_OPERATOR_FUNCTION, METAFN_KIND_BOOL_INFO,
+ is_literal_operator, METAFN_IS_LITERAL_OPERATOR, METAFN_KIND_BOOL_INFO,
+ is_special_member_function, METAFN_IS_SPECIAL_MEMBER_FUNCTION, METAFN_KIND_BOOL_INFO,
+ is_constructor, METAFN_IS_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,
+ is_default_constructor, METAFN_IS_DEFAULT_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,
+ is_copy_constructor, METAFN_IS_COPY_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,
+ is_move_constructor, METAFN_IS_MOVE_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,
+ is_assignment, METAFN_IS_ASSIGNMENT, METAFN_KIND_BOOL_INFO,
+ is_copy_assignment, METAFN_IS_COPY_ASSIGNMENT, METAFN_KIND_BOOL_INFO,
+ is_move_assignment, METAFN_IS_MOVE_ASSIGNMENT, METAFN_KIND_BOOL_INFO,
+ is_destructor, METAFN_IS_DESTRUCTOR, METAFN_KIND_BOOL_INFO,
+ is_function_parameter, METAFN_IS_FUNCTION_PARAMETER, METAFN_KIND_BOOL_INFO,
+ is_explicit_object_parameter, METAFN_IS_EXPLICIT_OBJECT_PARAMETER, METAFN_KIND_BOOL_INFO,
+ has_default_argument, METAFN_HAS_DEFAULT_ARGUMENT, METAFN_KIND_BOOL_INFO,
+ has_ellipsis_parameter, METAFN_HAS_ELLIPSIS_PARAMETER, METAFN_KIND_BOOL_INFO,
+ is_template, METAFN_IS_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_function_template, METAFN_IS_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_variable_template, METAFN_IS_VARIABLE_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_class_template, METAFN_IS_CLASS_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_alias_template, METAFN_IS_ALIAS_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_conversion_function_template, METAFN_IS_CONVERSION_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_operator_function_template, METAFN_IS_OPERATOR_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_literal_operator_template, METAFN_IS_LITERAL_OPERATOR_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_constructor_template, METAFN_IS_CONSTRUCTOR_TEMPLATE, METAFN_KIND_BOOL_INFO,
+ is_concept, METAFN_IS_CONCEPT, METAFN_KIND_BOOL_INFO,
+ is_value, METAFN_IS_VALUE, METAFN_KIND_BOOL_INFO,
+ is_object, METAFN_IS_OBJECT, METAFN_KIND_BOOL_INFO,
+ is_structured_binding, METAFN_IS_STRUCTURED_BINDING, METAFN_KIND_BOOL_INFO,
+ is_class_member, METAFN_IS_CLASS_MEMBER, METAFN_KIND_BOOL_INFO,
+ is_namespace_member, METAFN_IS_NAMESPACE_MEMBER, METAFN_KIND_BOOL_INFO,
+ is_nonstatic_data_member, METAFN_IS_NONSTATIC_DATA_MEMBER, METAFN_KIND_BOOL_INFO,
+ is_static_member, METAFN_IS_STATIC_MEMBER, METAFN_KIND_BOOL_INFO,
+ is_base, METAFN_IS_BASE, METAFN_KIND_BOOL_INFO,
+ has_default_member_initializer, METAFN_HAS_DEFAULT_MEMBER_INITIALIZER, METAFN_KIND_BOOL_INFO,
+ has_parent, METAFN_HAS_PARENT, METAFN_KIND_BOOL_INFO,
+ parent_of, METAFN_PARENT_OF, METAFN_KIND_INFO_INFO,
+ dealias, METAFN_DEALIAS, METAFN_KIND_INFO_INFO,
+ has_template_arguments, METAFN_HAS_TEMPLATE_ARGUMENTS, METAFN_KIND_BOOL_INFO,
+ template_of, METAFN_TEMPLATE_OF, METAFN_KIND_INFO_INFO,
+ template_arguments_of, METAFN_TEMPLATE_ARGUMENTS_OF, METAFN_KIND_VECTOR_INFO_INFO,
+ parameters_of, METAFN_PARAMETERS_OF, METAFN_KIND_VECTOR_INFO_INFO,
+ variable_of, METAFN_VARIABLE_OF, METAFN_KIND_INFO_INFO,
+ return_type_of, METAFN_RETURN_TYPE_OF, METAFN_KIND_INFO_INFO,
+ is_accessible, METAFN_IS_ACCESSIBLE, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,
+ has_inaccessible_nonstatic_data_members, METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,
+ has_inaccessible_bases, METAFN_HAS_INACCESSIBLE_BASES, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,
+ has_inaccessible_subobjects, METAFN_HAS_INACCESSIBLE_SUBOBJECTS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,
+ members_of, METAFN_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,
+ bases_of, METAFN_BASES_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,
+ static_data_members_of, METAFN_STATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,
+ nonstatic_data_members_of, METAFN_NONSTATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,
+ subobjects_of, METAFN_SUBOBJECTS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,
+ enumerators_of, METAFN_ENUMERATORS_OF, METAFN_KIND_VECTOR_INFO_INFO,
+ offset_of, METAFN_OFFSET_OF, METAFN_KIND_MEMBER_OFFSET_INFO,
+ size_of, METAFN_SIZE_OF, METAFN_KIND_SIZE_T_INFO,
+ alignment_of, METAFN_ALIGNMENT_OF, METAFN_KIND_SIZE_T_INFO,
+ bit_size_of, METAFN_BIT_SIZE_OF, METAFN_KIND_SIZE_T_INFO,
+ extract, METAFN_EXTRACT, METAFN_KIND_TEMPLATE_PARM_INFO,
+ can_substitute, METAFN_CAN_SUBSTITUTE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,
+ substitute, METAFN_SUBSTITUTE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,
+ reflect_constant, METAFN_REFLECT_CONSTANT, METAFN_KIND_INFO_TEMPLATE_PARM,
+ reflect_object, METAFN_REFLECT_OBJECT, METAFN_KIND_INFO_TEMPLATE_PARM_REF,
+ reflect_function, METAFN_REFLECT_FUNCTION, METAFN_KIND_INFO_TEMPLATE_PARM_REF,
+ reflect_constant_string, METAFN_REFLECT_CONSTANT_STRING, METAFN_KIND_INFO_INPUT_RANGE,
+ reflect_constant_array, METAFN_REFLECT_CONSTANT_ARRAY, METAFN_KIND_INFO_INPUT_RANGE,
+ data_member_spec, METAFN_DATA_MEMBER_SPEC, METAFN_KIND_INFO_TINFO_DATA_MEMBER_OPTIONS,
+ is_data_member_spec, METAFN_IS_DATA_MEMBER_SPEC, METAFN_KIND_BOOL_INFO,
+ define_aggregate, METAFN_DEFINE_AGGREGATE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,
+ is_void_type, METAFN_IS_VOID_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_null_pointer_type, METAFN_IS_NULL_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_integral_type, METAFN_IS_INTEGRAL_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_floating_point_type, METAFN_IS_FLOATING_POINT_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_array_type, METAFN_IS_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_pointer_type, METAFN_IS_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_lvalue_reference_type, METAFN_IS_LVALUE_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_rvalue_reference_type, METAFN_IS_RVALUE_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_member_object_pointer_type, METAFN_IS_MEMBER_OBJECT_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_member_function_pointer_type, METAFN_IS_MEMBER_FUNCTION_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_enum_type, METAFN_IS_ENUM_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_union_type, METAFN_IS_UNION_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_class_type, METAFN_IS_CLASS_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_function_type, METAFN_IS_FUNCTION_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_reflection_type, METAFN_IS_REFLECTION_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_reference_type, METAFN_IS_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_arithmetic_type, METAFN_IS_ARITHMETIC_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_fundamental_type, METAFN_IS_FUNDAMENTAL_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_object_type, METAFN_IS_OBJECT_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_scalar_type, METAFN_IS_SCALAR_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_compound_type, METAFN_IS_COMPOUND_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_member_pointer_type, METAFN_IS_MEMBER_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_const_type, METAFN_IS_CONST_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_volatile_type, METAFN_IS_VOLATILE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_trivially_copyable_type, METAFN_IS_TRIVIALLY_COPYABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_standard_layout_type, METAFN_IS_STANDARD_LAYOUT_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_empty_type, METAFN_IS_EMPTY_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_polymorphic_type, METAFN_IS_POLYMORPHIC_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_abstract_type, METAFN_IS_ABSTRACT_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_final_type, METAFN_IS_FINAL_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_aggregate_type, METAFN_IS_AGGREGATE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_consteval_only_type, METAFN_IS_CONSTEVAL_ONLY_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_signed_type, METAFN_IS_SIGNED_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_unsigned_type, METAFN_IS_UNSIGNED_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_bounded_array_type, METAFN_IS_BOUNDED_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_unbounded_array_type, METAFN_IS_UNBOUNDED_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_scoped_enum_type, METAFN_IS_SCOPED_ENUM_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_constructible_type, METAFN_IS_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,
+ is_default_constructible_type, METAFN_IS_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_copy_constructible_type, METAFN_IS_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_move_constructible_type, METAFN_IS_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_assignable_type, METAFN_IS_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_copy_assignable_type, METAFN_IS_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_move_assignable_type, METAFN_IS_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_swappable_with_type, METAFN_IS_SWAPPABLE_WITH_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_swappable_type, METAFN_IS_SWAPPABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_destructible_type, METAFN_IS_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_trivially_constructible_type, METAFN_IS_TRIVIALLY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,
+ is_trivially_default_constructible_type, METAFN_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_trivially_copy_constructible_type, METAFN_IS_TRIVIALLY_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_trivially_move_constructible_type, METAFN_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_trivially_assignable_type, METAFN_IS_TRIVIALLY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_trivially_copy_assignable_type, METAFN_IS_TRIVIALLY_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_trivially_move_assignable_type, METAFN_IS_TRIVIALLY_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_trivially_destructible_type, METAFN_IS_TRIVIALLY_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_nothrow_constructible_type, METAFN_IS_NOTHROW_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,
+ is_nothrow_default_constructible_type, METAFN_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_nothrow_copy_constructible_type, METAFN_IS_NOTHROW_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_nothrow_move_constructible_type, METAFN_IS_NOTHROW_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_nothrow_assignable_type, METAFN_IS_NOTHROW_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_nothrow_copy_assignable_type, METAFN_IS_NOTHROW_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_nothrow_move_assignable_type, METAFN_IS_NOTHROW_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_nothrow_swappable_with_type, METAFN_IS_NOTHROW_SWAPPABLE_WITH_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_nothrow_swappable_type, METAFN_IS_NOTHROW_SWAPPABLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_nothrow_destructible_type, METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,
+ is_implicit_lifetime_type, METAFN_IS_IMPLICIT_LIFETIME_TYPE, METAFN_KIND_BOOL_TINFO,
+ has_virtual_destructor, METAFN_HAS_VIRTUAL_DESTRUCTOR, METAFN_KIND_BOOL_TINFO,
+ has_unique_object_representations, METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS, METAFN_KIND_BOOL_TINFO,
+ reference_constructs_from_temporary, METAFN_REFERENCE_CONSTRUCTS_FROM_TEMPORARY, METAFN_KIND_BOOL_TINFO_TINFO,
+ reference_converts_from_temporary, METAFN_REFERENCE_CONVERTS_FROM_TEMPORARY, METAFN_KIND_BOOL_TINFO_TINFO,
+ rank, METAFN_RANK, METAFN_KIND_SIZE_T_TINFO,
+ extent, METAFN_EXTENT, METAFN_KIND_SIZE_T_TINFO_UNSIGNED,
+ is_same_type, METAFN_IS_SAME_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_base_of_type, METAFN_IS_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_virtual_base_of_type, METAFN_IS_VIRTUAL_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_convertible_type, METAFN_IS_CONVERTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_nothrow_convertible_type, METAFN_IS_NOTHROW_CONVERTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_layout_compatible_type, METAFN_IS_LAYOUT_COMPATIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_pointer_interconvertible_base_of_type, METAFN_IS_POINTER_INTERCONVERTIBLE_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,
+ is_invocable_type, METAFN_IS_INVOCABLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,
+ is_invocable_r_type, METAFN_IS_INVOCABLE_R_TYPE, METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET,
+ is_nothrow_invocable_type, METAFN_IS_NOTHROW_INVOCABLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,
+ is_nothrow_invocable_r_type, METAFN_IS_NOTHROW_INVOCABLE_R_TYPE, METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET,
+ remove_const, METAFN_REMOVE_CONST, METAFN_KIND_INFO_TINFO,
+ remove_volatile, METAFN_REMOVE_VOLATILE, METAFN_KIND_INFO_TINFO,
+ remove_cv, METAFN_REMOVE_CV, METAFN_KIND_INFO_TINFO,
+ add_const, METAFN_ADD_CONST, METAFN_KIND_INFO_TINFO,
+ add_volatile, METAFN_ADD_VOLATILE, METAFN_KIND_INFO_TINFO,
+ add_cv, METAFN_ADD_CV, METAFN_KIND_INFO_TINFO,
+ remove_reference, METAFN_REMOVE_REFERENCE, METAFN_KIND_INFO_TINFO,
+ add_lvalue_reference, METAFN_ADD_LVALUE_REFERENCE, METAFN_KIND_INFO_TINFO,
+ add_rvalue_reference, METAFN_ADD_RVALUE_REFERENCE, METAFN_KIND_INFO_TINFO,
+ make_signed, METAFN_MAKE_SIGNED, METAFN_KIND_INFO_TINFO,
+ make_unsigned, METAFN_MAKE_UNSIGNED, METAFN_KIND_INFO_TINFO,
+ remove_extent, METAFN_REMOVE_EXTENT, METAFN_KIND_INFO_TINFO,
+ remove_all_extents, METAFN_REMOVE_ALL_EXTENTS, METAFN_KIND_INFO_TINFO,
+ remove_pointer, METAFN_REMOVE_POINTER, METAFN_KIND_INFO_TINFO,
+ add_pointer, METAFN_ADD_POINTER, METAFN_KIND_INFO_TINFO,
+ remove_cvref, METAFN_REMOVE_CVREF, METAFN_KIND_INFO_TINFO,
+ decay, METAFN_DECAY, METAFN_KIND_INFO_TINFO,
+ common_type, METAFN_COMMON_TYPE, METAFN_KIND_INFO_REFLECTION_RANGET,
+ common_reference, METAFN_COMMON_REFERENCE, METAFN_KIND_INFO_REFLECTION_RANGET,
+ underlying_type, METAFN_UNDERLYING_TYPE, METAFN_KIND_INFO_TINFO,
+ invoke_result, METAFN_INVOKE_RESULT, METAFN_KIND_INFO_TINFO_REFLECTION_RANGET,
+ unwrap_reference, METAFN_UNWRAP_REFERENCE, METAFN_KIND_INFO_TINFO,
+ unwrap_ref_decay, METAFN_UNWRAP_REF_DECAY, METAFN_KIND_INFO_TINFO,
+ tuple_size, METAFN_TUPLE_SIZE, METAFN_KIND_SIZE_T_TINFO,
+ tuple_element, METAFN_TUPLE_ELEMENT, METAFN_KIND_INFO_SIZE_T_TINFO,
+ variant_size, METAFN_VARIANT_SIZE, METAFN_KIND_SIZE_T_TINFO,
+ variant_alternative, METAFN_VARIANT_ALTERNATIVE, METAFN_KIND_INFO_SIZE_T_TINFO,
+ type_order, METAFN_TYPE_ORDER, METAFN_KIND_STRONG_ORDERING_TINFO_TINFO,
+ annotations_of, METAFN_ANNOTATIONS_OF, METAFN_KIND_VECTOR_INFO_INFO,
+ annotations_of_with_type, METAFN_ANNOTATIONS_OF_WITH_TYPE, METAFN_KIND_VECTOR_INFO_INFO_INFO,
+ current, METAFN_ACCESS_CONTEXT_CURRENT, METAFN_KIND_ACCESS_CONTEXT_VOID,
+ _S_exception_cvt_to_utf8, METAFN_EXCEPTION__S_EXCEPTION_CVT_TO_UTF8, METAFN_KIND_U8STRING_VIEW_INPUT_RANGE,
+ _S_exception_cvt_from_utf8, METAFN_EXCEPTION__S_EXCEPTION_CVT_FROM_UTF8, METAFN_KIND_STRING_VIEW_INPUT_RANGE,
diff -Nrcpad gcc-16-20260111/gcc/cp/metafns.h gcc-16-20260118/gcc/cp/metafns.h
*** gcc-16-20260111/gcc/cp/metafns.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/cp/metafns.h	Sun Jan 18 22:32:07 2026
***************
*** 0 ****
--- 1,1181 ----
+ /* C++ code produced by gperf version 3.2.1 */
+ /* Command-line: gperf -o -C -E -k '1,4,5,11,14,$' -D -N find -L C++ --output-file metafns.h metafns.gperf  */
+ 
+ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+       && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+       && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+       && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+       && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+       && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+       && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+       && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+       && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+       && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+       && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+       && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+       && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+       && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+       && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+       && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+       && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+       && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+       && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+       && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+       && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+       && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+       && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+ /* The character set is not based on ISO-646.  */
+ #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gperf@gnu.org>."
+ #endif
+ 
+ #line 4 "metafns.gperf"
+ 
+ /* Copyright (C) 2025-2026 Free Software Foundation, Inc.
+    Written by Jakub Jelinek <jakub@redhat.com>
+ 
+ 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.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ enum metafn_code {
+   METAFN_OPERATOR_OF,
+   METAFN_SYMBOL_OF,
+   METAFN_U8SYMBOL_OF,
+   METAFN_HAS_IDENTIFIER,
+   METAFN_IDENTIFIER_OF,
+   METAFN_U8IDENTIFIER_OF,
+   METAFN_DISPLAY_STRING_OF,
+   METAFN_U8DISPLAY_STRING_OF,
+   METAFN_SOURCE_LOCATION_OF,
+   METAFN_TYPE_OF,
+   METAFN_OBJECT_OF,
+   METAFN_CONSTANT_OF,
+   METAFN_IS_PUBLIC,
+   METAFN_IS_PROTECTED,
+   METAFN_IS_PRIVATE,
+   METAFN_IS_VIRTUAL,
+   METAFN_IS_PURE_VIRTUAL,
+   METAFN_IS_OVERRIDE,
+   METAFN_IS_FINAL,
+   METAFN_IS_DELETED,
+   METAFN_IS_DEFAULTED,
+   METAFN_IS_USER_PROVIDED,
+   METAFN_IS_USER_DECLARED,
+   METAFN_IS_EXPLICIT,
+   METAFN_IS_NOEXCEPT,
+   METAFN_IS_BIT_FIELD,
+   METAFN_IS_ENUMERATOR,
+   METAFN_IS_ANNOTATION,
+   METAFN_IS_CONST,
+   METAFN_IS_VOLATILE,
+   METAFN_IS_MUTABLE_MEMBER,
+   METAFN_IS_LVALUE_REFERENCE_QUALIFIED,
+   METAFN_IS_RVALUE_REFERENCE_QUALIFIED,
+   METAFN_HAS_STATIC_STORAGE_DURATION,
+   METAFN_HAS_THREAD_STORAGE_DURATION,
+   METAFN_HAS_AUTOMATIC_STORAGE_DURATION,
+   METAFN_HAS_INTERNAL_LINKAGE,
+   METAFN_HAS_MODULE_LINKAGE,
+   METAFN_HAS_EXTERNAL_LINKAGE,
+   METAFN_HAS_C_LANGUAGE_LINKAGE,
+   METAFN_HAS_LINKAGE,
+   METAFN_IS_COMPLETE_TYPE,
+   METAFN_IS_ENUMERABLE_TYPE,
+   METAFN_IS_VARIABLE,
+   METAFN_IS_TYPE,
+   METAFN_IS_NAMESPACE,
+   METAFN_IS_TYPE_ALIAS,
+   METAFN_IS_NAMESPACE_ALIAS,
+   METAFN_IS_FUNCTION,
+   METAFN_IS_CONVERSION_FUNCTION,
+   METAFN_IS_OPERATOR_FUNCTION,
+   METAFN_IS_LITERAL_OPERATOR,
+   METAFN_IS_SPECIAL_MEMBER_FUNCTION,
+   METAFN_IS_CONSTRUCTOR,
+   METAFN_IS_DEFAULT_CONSTRUCTOR,
+   METAFN_IS_COPY_CONSTRUCTOR,
+   METAFN_IS_MOVE_CONSTRUCTOR,
+   METAFN_IS_ASSIGNMENT,
+   METAFN_IS_COPY_ASSIGNMENT,
+   METAFN_IS_MOVE_ASSIGNMENT,
+   METAFN_IS_DESTRUCTOR,
+   METAFN_IS_FUNCTION_PARAMETER,
+   METAFN_IS_EXPLICIT_OBJECT_PARAMETER,
+   METAFN_HAS_DEFAULT_ARGUMENT,
+   METAFN_HAS_ELLIPSIS_PARAMETER,
+   METAFN_IS_TEMPLATE,
+   METAFN_IS_FUNCTION_TEMPLATE,
+   METAFN_IS_VARIABLE_TEMPLATE,
+   METAFN_IS_CLASS_TEMPLATE,
+   METAFN_IS_ALIAS_TEMPLATE,
+   METAFN_IS_CONVERSION_FUNCTION_TEMPLATE,
+   METAFN_IS_OPERATOR_FUNCTION_TEMPLATE,
+   METAFN_IS_LITERAL_OPERATOR_TEMPLATE,
+   METAFN_IS_CONSTRUCTOR_TEMPLATE,
+   METAFN_IS_CONCEPT,
+   METAFN_IS_VALUE,
+   METAFN_IS_OBJECT,
+   METAFN_IS_STRUCTURED_BINDING,
+   METAFN_IS_CLASS_MEMBER,
+   METAFN_IS_NAMESPACE_MEMBER,
+   METAFN_IS_NONSTATIC_DATA_MEMBER,
+   METAFN_IS_STATIC_MEMBER,
+   METAFN_IS_BASE,
+   METAFN_HAS_DEFAULT_MEMBER_INITIALIZER,
+   METAFN_HAS_PARENT,
+   METAFN_PARENT_OF,
+   METAFN_DEALIAS,
+   METAFN_HAS_TEMPLATE_ARGUMENTS,
+   METAFN_TEMPLATE_OF,
+   METAFN_TEMPLATE_ARGUMENTS_OF,
+   METAFN_PARAMETERS_OF,
+   METAFN_VARIABLE_OF,
+   METAFN_RETURN_TYPE_OF,
+   METAFN_IS_ACCESSIBLE,
+   METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS,
+   METAFN_HAS_INACCESSIBLE_BASES,
+   METAFN_HAS_INACCESSIBLE_SUBOBJECTS,
+   METAFN_MEMBERS_OF,
+   METAFN_BASES_OF,
+   METAFN_STATIC_DATA_MEMBERS_OF,
+   METAFN_NONSTATIC_DATA_MEMBERS_OF,
+   METAFN_SUBOBJECTS_OF,
+   METAFN_ENUMERATORS_OF,
+   METAFN_OFFSET_OF,
+   METAFN_SIZE_OF,
+   METAFN_ALIGNMENT_OF,
+   METAFN_BIT_SIZE_OF,
+   METAFN_EXTRACT,
+   METAFN_CAN_SUBSTITUTE,
+   METAFN_SUBSTITUTE,
+   METAFN_REFLECT_CONSTANT,
+   METAFN_REFLECT_OBJECT,
+   METAFN_REFLECT_FUNCTION,
+   METAFN_REFLECT_CONSTANT_STRING,
+   METAFN_REFLECT_CONSTANT_ARRAY,
+   METAFN_DATA_MEMBER_SPEC,
+   METAFN_IS_DATA_MEMBER_SPEC,
+   METAFN_DEFINE_AGGREGATE,
+   METAFN_IS_VOID_TYPE,
+   METAFN_IS_NULL_POINTER_TYPE,
+   METAFN_IS_INTEGRAL_TYPE,
+   METAFN_IS_FLOATING_POINT_TYPE,
+   METAFN_IS_ARRAY_TYPE,
+   METAFN_IS_POINTER_TYPE,
+   METAFN_IS_LVALUE_REFERENCE_TYPE,
+   METAFN_IS_RVALUE_REFERENCE_TYPE,
+   METAFN_IS_MEMBER_OBJECT_POINTER_TYPE,
+   METAFN_IS_MEMBER_FUNCTION_POINTER_TYPE,
+   METAFN_IS_ENUM_TYPE,
+   METAFN_IS_UNION_TYPE,
+   METAFN_IS_CLASS_TYPE,
+   METAFN_IS_FUNCTION_TYPE,
+   METAFN_IS_REFLECTION_TYPE,
+   METAFN_IS_REFERENCE_TYPE,
+   METAFN_IS_ARITHMETIC_TYPE,
+   METAFN_IS_FUNDAMENTAL_TYPE,
+   METAFN_IS_OBJECT_TYPE,
+   METAFN_IS_SCALAR_TYPE,
+   METAFN_IS_COMPOUND_TYPE,
+   METAFN_IS_MEMBER_POINTER_TYPE,
+   METAFN_IS_CONST_TYPE,
+   METAFN_IS_VOLATILE_TYPE,
+   METAFN_IS_TRIVIALLY_COPYABLE_TYPE,
+   METAFN_IS_STANDARD_LAYOUT_TYPE,
+   METAFN_IS_EMPTY_TYPE,
+   METAFN_IS_POLYMORPHIC_TYPE,
+   METAFN_IS_ABSTRACT_TYPE,
+   METAFN_IS_FINAL_TYPE,
+   METAFN_IS_AGGREGATE_TYPE,
+   METAFN_IS_CONSTEVAL_ONLY_TYPE,
+   METAFN_IS_SIGNED_TYPE,
+   METAFN_IS_UNSIGNED_TYPE,
+   METAFN_IS_BOUNDED_ARRAY_TYPE,
+   METAFN_IS_UNBOUNDED_ARRAY_TYPE,
+   METAFN_IS_SCOPED_ENUM_TYPE,
+   METAFN_IS_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_DEFAULT_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_COPY_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_MOVE_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_ASSIGNABLE_TYPE,
+   METAFN_IS_COPY_ASSIGNABLE_TYPE,
+   METAFN_IS_MOVE_ASSIGNABLE_TYPE,
+   METAFN_IS_SWAPPABLE_WITH_TYPE,
+   METAFN_IS_SWAPPABLE_TYPE,
+   METAFN_IS_DESTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_COPY_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_TRIVIALLY_ASSIGNABLE_TYPE,
+   METAFN_IS_TRIVIALLY_COPY_ASSIGNABLE_TYPE,
+   METAFN_IS_TRIVIALLY_MOVE_ASSIGNABLE_TYPE,
+   METAFN_IS_TRIVIALLY_DESTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_COPY_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_MOVE_CONSTRUCTIBLE_TYPE,
+   METAFN_IS_NOTHROW_ASSIGNABLE_TYPE,
+   METAFN_IS_NOTHROW_COPY_ASSIGNABLE_TYPE,
+   METAFN_IS_NOTHROW_MOVE_ASSIGNABLE_TYPE,
+   METAFN_IS_NOTHROW_SWAPPABLE_WITH_TYPE,
+   METAFN_IS_NOTHROW_SWAPPABLE_TYPE,
+   METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE,
+   METAFN_IS_IMPLICIT_LIFETIME_TYPE,
+   METAFN_HAS_VIRTUAL_DESTRUCTOR,
+   METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS,
+   METAFN_REFERENCE_CONSTRUCTS_FROM_TEMPORARY,
+   METAFN_REFERENCE_CONVERTS_FROM_TEMPORARY,
+   METAFN_RANK,
+   METAFN_EXTENT,
+   METAFN_IS_SAME_TYPE,
+   METAFN_IS_BASE_OF_TYPE,
+   METAFN_IS_VIRTUAL_BASE_OF_TYPE,
+   METAFN_IS_CONVERTIBLE_TYPE,
+   METAFN_IS_NOTHROW_CONVERTIBLE_TYPE,
+   METAFN_IS_LAYOUT_COMPATIBLE_TYPE,
+   METAFN_IS_POINTER_INTERCONVERTIBLE_BASE_OF_TYPE,
+   METAFN_IS_INVOCABLE_TYPE,
+   METAFN_IS_INVOCABLE_R_TYPE,
+   METAFN_IS_NOTHROW_INVOCABLE_TYPE,
+   METAFN_IS_NOTHROW_INVOCABLE_R_TYPE,
+   METAFN_REMOVE_CONST,
+   METAFN_REMOVE_VOLATILE,
+   METAFN_REMOVE_CV,
+   METAFN_ADD_CONST,
+   METAFN_ADD_VOLATILE,
+   METAFN_ADD_CV,
+   METAFN_REMOVE_REFERENCE,
+   METAFN_ADD_LVALUE_REFERENCE,
+   METAFN_ADD_RVALUE_REFERENCE,
+   METAFN_MAKE_SIGNED,
+   METAFN_MAKE_UNSIGNED,
+   METAFN_REMOVE_EXTENT,
+   METAFN_REMOVE_ALL_EXTENTS,
+   METAFN_REMOVE_POINTER,
+   METAFN_ADD_POINTER,
+   METAFN_REMOVE_CVREF,
+   METAFN_DECAY,
+   METAFN_COMMON_TYPE,
+   METAFN_COMMON_REFERENCE,
+   METAFN_UNDERLYING_TYPE,
+   METAFN_INVOKE_RESULT,
+   METAFN_UNWRAP_REFERENCE,
+   METAFN_UNWRAP_REF_DECAY,
+   METAFN_TUPLE_SIZE,
+   METAFN_TUPLE_ELEMENT,
+   METAFN_VARIANT_SIZE,
+   METAFN_VARIANT_ALTERNATIVE,
+   METAFN_TYPE_ORDER,
+   METAFN_ANNOTATIONS_OF,
+   METAFN_ANNOTATIONS_OF_WITH_TYPE,
+   /* Special metafunctions.  */
+   METAFN_ACCESS_CONTEXT_CURRENT,
+   METAFN_EXCEPTION__S_EXCEPTION_CVT_TO_UTF8,
+   METAFN_EXCEPTION__S_EXCEPTION_CVT_FROM_UTF8
+ };
+ 
+ enum {
+   METAFN_KIND_SHIFT = 5,
+   METAFN_KIND_MASK = (1 << METAFN_KIND_SHIFT) - 1
+ };
+ 
+ /* Possible return types of metafunctions.  */
+ enum metafn_kind_ret {
+   METAFN_KIND_RET_BOOL,
+   METAFN_KIND_RET_INFO,
+   METAFN_KIND_RET_SIZE_T,
+   METAFN_KIND_RET_MEMBER_OFFSET,
+   METAFN_KIND_RET_OPERATORS,
+   METAFN_KIND_RET_SOURCE_LOCATION,
+   METAFN_KIND_RET_STRING_VIEW,
+   METAFN_KIND_RET_U8STRING_VIEW,
+   METAFN_KIND_RET_STRONG_ORDERING,
+   METAFN_KIND_RET_VECTOR_INFO,
+   METAFN_KIND_RET_ACCESS_CONTEXT,
+   METAFN_KIND_RET_TEMPLATE_PARM,
+ };
+ static_assert (METAFN_KIND_RET_TEMPLATE_PARM <= (int) METAFN_KIND_MASK);
+ 
+ /* Possible argument types of metafunctions.  */
+ enum metafn_kind_arg {
+   METAFN_KIND_ARG_VOID = 0,
+   METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARG_TINFO, /* info argument which throws if not a type.  */
+   METAFN_KIND_ARG_REFLECTION_RANGE,
+   /* reflection_range with type infos only.  */
+   METAFN_KIND_ARG_REFLECTION_RANGET,
+   METAFN_KIND_ARG_INPUT_RANGE,
+   METAFN_KIND_ARG_SIZE_T,
+   METAFN_KIND_ARG_UNSIGNED,
+   METAFN_KIND_ARG_OPERATORS,
+   METAFN_KIND_ARG_ACCESS_CONTEXT,
+   METAFN_KIND_ARG_DATA_MEMBER_OPTIONS,
+   METAFN_KIND_ARG_TEMPLATE_PARM, /* Some other template parameter.  */
+   METAFN_KIND_ARG_TEMPLATE_PARM_REF /* Reference to template parameter.  */
+ };
+ static_assert (METAFN_KIND_ARG_TEMPLATE_PARM_REF <= (int) METAFN_KIND_MASK);
+ 
+ /* Possible sets of 0-3 arguments of metafunctions.  */
+ enum metafn_kind_args {
+   METAFN_KIND_ARGS_VOID = METAFN_KIND_ARG_VOID,
+   METAFN_KIND_ARGS_INFO = METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARGS_TINFO = METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_REFLECTION_RANGET = METAFN_KIND_ARG_REFLECTION_RANGET,
+   METAFN_KIND_ARGS_INPUT_RANGE = METAFN_KIND_ARG_INPUT_RANGE,
+   METAFN_KIND_ARGS_OPERATORS = METAFN_KIND_ARG_OPERATORS,
+   METAFN_KIND_ARGS_TEMPLATE_PARM = METAFN_KIND_ARG_TEMPLATE_PARM,
+   METAFN_KIND_ARGS_TEMPLATE_PARM_REF = METAFN_KIND_ARG_TEMPLATE_PARM_REF,
+   METAFN_KIND_ARGS_INFO_INFO
+     = (METAFN_KIND_ARG_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARGS_TINFO_TINFO
+     = (METAFN_KIND_ARG_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_TINFO_UNSIGNED
+     = (METAFN_KIND_ARG_UNSIGNED << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT
+     = (METAFN_KIND_ARG_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARGS_TINFO_DATA_MEMBER_OPTIONS
+     = (METAFN_KIND_ARG_DATA_MEMBER_OPTIONS << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_INFO_REFLECTION_RANGE
+     = (METAFN_KIND_ARG_REFLECTION_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_INFO,
+   METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARG_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_ARG_TINFO,
+   METAFN_KIND_ARGS_SIZE_T_TINFO
+     = (METAFN_KIND_ARG_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_ARG_SIZE_T,
+   METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARG_REFLECTION_RANGET << (2 * METAFN_KIND_SHIFT))
+       | METAFN_KIND_ARGS_TINFO_TINFO,
+ };
+ 
+ /* This encodes metafn_kind_ret in the low METAFN_KIND_SHIFT bits, then
+    first argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that,
+    second argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that
+    and third argument metafn_kind_arg in METAFN_KIND_SHIFT bits above that.
+    Missing argument is METAFN_KIND_ARG_VOID aka 0.  */
+ enum metafn_kind {
+   METAFN_KIND_BOOL_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_TINFO
+     = (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT
+     = (METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_TINFO_TINFO
+     = (METAFN_KIND_ARGS_TINFO_TINFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARGS_TINFO_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_BOOL,
+   METAFN_KIND_INFO_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TINFO
+     = (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TINFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARGS_TINFO_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TINFO_DATA_MEMBER_OPTIONS
+     = (METAFN_KIND_ARGS_TINFO_DATA_MEMBER_OPTIONS << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_REFLECTION_RANGET
+     = (METAFN_KIND_ARGS_REFLECTION_RANGET << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_INFO_REFLECTION_RANGE
+     = (METAFN_KIND_ARGS_INFO_REFLECTION_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_INPUT_RANGE
+     = (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TEMPLATE_PARM
+     = (METAFN_KIND_ARGS_TEMPLATE_PARM << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_TEMPLATE_PARM_REF
+     = (METAFN_KIND_ARGS_TEMPLATE_PARM_REF << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_INFO_SIZE_T_TINFO
+     = (METAFN_KIND_ARGS_SIZE_T_TINFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_INFO,
+   METAFN_KIND_MEMBER_OFFSET_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_MEMBER_OFFSET,
+   METAFN_KIND_OPERATORS_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_OPERATORS,
+   METAFN_KIND_SIZE_T_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_SIZE_T,
+   METAFN_KIND_SIZE_T_TINFO
+     = (METAFN_KIND_ARGS_TINFO << METAFN_KIND_SHIFT) | METAFN_KIND_RET_SIZE_T,
+   METAFN_KIND_SIZE_T_TINFO_UNSIGNED
+     = (METAFN_KIND_ARGS_TINFO_UNSIGNED << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_SIZE_T,
+   METAFN_KIND_SOURCE_LOCATION_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_SOURCE_LOCATION,
+   METAFN_KIND_STRING_VIEW_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_STRING_VIEW,
+   METAFN_KIND_STRING_VIEW_OPERATORS
+     = (METAFN_KIND_ARGS_OPERATORS << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_STRING_VIEW,
+   METAFN_KIND_U8STRING_VIEW_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_U8STRING_VIEW,
+   METAFN_KIND_U8STRING_VIEW_OPERATORS
+     = (METAFN_KIND_ARGS_OPERATORS << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_U8STRING_VIEW,
+   METAFN_KIND_STRONG_ORDERING_TINFO_TINFO
+     = (METAFN_KIND_ARGS_TINFO_TINFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_STRONG_ORDERING,
+   METAFN_KIND_VECTOR_INFO_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_VECTOR_INFO,
+   METAFN_KIND_VECTOR_INFO_INFO_INFO
+     = (METAFN_KIND_ARGS_INFO_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_VECTOR_INFO,
+   METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT
+     = (METAFN_KIND_ARGS_INFO_ACCESS_CONTEXT << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_VECTOR_INFO,
+   METAFN_KIND_TEMPLATE_PARM_INFO
+     = (METAFN_KIND_ARGS_INFO << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_TEMPLATE_PARM,
+   METAFN_KIND_ACCESS_CONTEXT_VOID
+     = (METAFN_KIND_ARGS_VOID << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_ACCESS_CONTEXT,
+   METAFN_KIND_STRING_VIEW_INPUT_RANGE
+     = (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_STRING_VIEW,
+   METAFN_KIND_U8STRING_VIEW_INPUT_RANGE
+     = (METAFN_KIND_ARGS_INPUT_RANGE << METAFN_KIND_SHIFT)
+       | METAFN_KIND_RET_U8STRING_VIEW
+ };
+ #line 443 "metafns.gperf"
+ struct metafn_info
+ {
+   /* A name within "std::meta::" (or "std::meta::access_context::").  */
+   const char *name;
+ 
+   /* METAFN_ code.  */
+   metafn_code code;
+ 
+   /* METAFN_KIND_ kind of arguments and return type.  */
+   metafn_kind kind;
+ };
+ /* maximum key range = 879, duplicates = 0 */
+ 
+ class metafn_lookup
+ {
+ private:
+   static inline unsigned int hash (const char *str, size_t len);
+ public:
+   static const struct metafn_info *find (const char *str, size_t len);
+ };
+ 
+ inline unsigned int
+ metafn_lookup::hash (const char *str, size_t len)
+ {
+   static const unsigned short asso_values[] =
+     {
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918,   0, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918,   5, 100, 145,  10,  45,
+       165,   5,  55,  50,  72,  20, 248,   0,  55, 105,
+         0, 205,   0,  45,  35,  55,  25, 195,   5, 199,
+        20, 311,  20, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918, 918, 918, 918,
+       918, 918, 918, 918, 918, 918, 918
+     };
+   unsigned int hval = len;
+ 
+   switch (hval)
+     {
+       default:
+         hval += asso_values[static_cast<unsigned char>(str[13])];
+ #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+       [[fallthrough]];
+ #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+       __attribute__ ((__fallthrough__));
+ #endif
+       /*FALLTHROUGH*/
+       case 13:
+       case 12:
+       case 11:
+         hval += asso_values[static_cast<unsigned char>(str[10])];
+ #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+       [[fallthrough]];
+ #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+       __attribute__ ((__fallthrough__));
+ #endif
+       /*FALLTHROUGH*/
+       case 10:
+       case 9:
+       case 8:
+       case 7:
+       case 6:
+       case 5:
+         hval += asso_values[static_cast<unsigned char>(str[4]+1)];
+ #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+       [[fallthrough]];
+ #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+       __attribute__ ((__fallthrough__));
+ #endif
+       /*FALLTHROUGH*/
+       case 4:
+         hval += asso_values[static_cast<unsigned char>(str[3])];
+ #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))
+       [[fallthrough]];
+ #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)
+       __attribute__ ((__fallthrough__));
+ #endif
+       /*FALLTHROUGH*/
+       case 3:
+       case 2:
+       case 1:
+         hval += asso_values[static_cast<unsigned char>(str[0])];
+         break;
+     }
+   return hval + asso_values[static_cast<unsigned char>(str[len - 1])];
+ }
+ 
+ const struct metafn_info *
+ metafn_lookup::find (const char *str, size_t len)
+ {
+   enum
+     {
+       TOTAL_KEYWORDS = 234,
+       MIN_WORD_LENGTH = 4,
+       MAX_WORD_LENGTH = 40,
+       MIN_HASH_VALUE = 39,
+       MAX_HASH_VALUE = 917
+     };
+ 
+ #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+ #endif
+   static const struct metafn_info wordlist[] =
+     {
+ #line 643 "metafns.gperf"
+       {"rank", METAFN_RANK, METAFN_KIND_SIZE_T_TINFO,},
+ #line 573 "metafns.gperf"
+       {"is_void_type", METAFN_IS_VOID_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 578 "metafns.gperf"
+       {"is_pointer_type", METAFN_IS_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 484 "metafns.gperf"
+       {"is_volatile", METAFN_IS_VOLATILE, METAFN_KIND_BOOL_INFO,},
+ #line 530 "metafns.gperf"
+       {"is_value", METAFN_IS_VALUE, METAFN_KIND_BOOL_INFO,},
+ #line 537 "metafns.gperf"
+       {"is_base", METAFN_IS_BASE, METAFN_KIND_BOOL_INFO,},
+ #line 498 "metafns.gperf"
+       {"is_variable", METAFN_IS_VARIABLE, METAFN_KIND_BOOL_INFO,},
+ #line 649 "metafns.gperf"
+       {"is_nothrow_convertible_type", METAFN_IS_NOTHROW_CONVERTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 628 "metafns.gperf"
+       {"is_nothrow_constructible_type", METAFN_IS_NOTHROW_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,},
+ #line 654 "metafns.gperf"
+       {"is_nothrow_invocable_type", METAFN_IS_NOTHROW_INVOCABLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,},
+ #line 633 "metafns.gperf"
+       {"is_nothrow_copy_assignable_type", METAFN_IS_NOTHROW_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 655 "metafns.gperf"
+       {"is_nothrow_invocable_r_type", METAFN_IS_NOTHROW_INVOCABLE_R_TYPE, METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET,},
+ #line 630 "metafns.gperf"
+       {"is_nothrow_copy_constructible_type", METAFN_IS_NOTHROW_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 646 "metafns.gperf"
+       {"is_base_of_type", METAFN_IS_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 634 "metafns.gperf"
+       {"is_nothrow_move_assignable_type", METAFN_IS_NOTHROW_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 631 "metafns.gperf"
+       {"is_nothrow_move_constructible_type", METAFN_IS_NOTHROW_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 522 "metafns.gperf"
+       {"is_variable_template", METAFN_IS_VARIABLE_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 681 "metafns.gperf"
+       {"variant_size", METAFN_VARIANT_SIZE, METAFN_KIND_SIZE_T_TINFO,},
+ #line 574 "metafns.gperf"
+       {"is_null_pointer_type", METAFN_IS_NULL_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 499 "metafns.gperf"
+       {"is_type", METAFN_IS_TYPE, METAFN_KIND_BOOL_INFO,},
+ #line 467 "metafns.gperf"
+       {"is_public", METAFN_IS_PUBLIC, METAFN_KIND_BOOL_INFO,},
+ #line 479 "metafns.gperf"
+       {"is_noexcept", METAFN_IS_NOEXCEPT, METAFN_KIND_BOOL_INFO,},
+ #line 562 "metafns.gperf"
+       {"extract", METAFN_EXTRACT, METAFN_KIND_TEMPLATE_PARM_INFO,},
+ #line 682 "metafns.gperf"
+       {"variant_alternative", METAFN_VARIANT_ALTERNATIVE, METAFN_KIND_INFO_SIZE_T_TINFO,},
+ #line 600 "metafns.gperf"
+       {"is_polymorphic_type", METAFN_IS_POLYMORPHIC_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 469 "metafns.gperf"
+       {"is_private", METAFN_IS_PRIVATE, METAFN_KIND_BOOL_INFO,},
+ #line 503 "metafns.gperf"
+       {"is_function", METAFN_IS_FUNCTION, METAFN_KIND_BOOL_INFO,},
+ #line 500 "metafns.gperf"
+       {"is_namespace", METAFN_IS_NAMESPACE, METAFN_KIND_BOOL_INFO,},
+ #line 651 "metafns.gperf"
+       {"is_pointer_interconvertible_base_of_type", METAFN_IS_POINTER_INTERCONVERTIBLE_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 607 "metafns.gperf"
+       {"is_bounded_array_type", METAFN_IS_BOUNDED_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 483 "metafns.gperf"
+       {"is_const", METAFN_IS_CONST, METAFN_KIND_BOOL_INFO,},
+ #line 529 "metafns.gperf"
+       {"is_concept", METAFN_IS_CONCEPT, METAFN_KIND_BOOL_INFO,},
+ #line 645 "metafns.gperf"
+       {"is_same_type", METAFN_IS_SAME_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 553 "metafns.gperf"
+       {"bases_of", METAFN_BASES_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,},
+ #line 492 "metafns.gperf"
+       {"has_module_linkage", METAFN_HAS_MODULE_LINKAGE, METAFN_KIND_BOOL_INFO,},
+ #line 521 "metafns.gperf"
+       {"is_function_template", METAFN_IS_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 632 "metafns.gperf"
+       {"is_nothrow_assignable_type", METAFN_IS_NOTHROW_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 504 "metafns.gperf"
+       {"is_conversion_function", METAFN_IS_CONVERSION_FUNCTION, METAFN_KIND_BOOL_INFO,},
+ #line 637 "metafns.gperf"
+       {"is_nothrow_destructible_type", METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 648 "metafns.gperf"
+       {"is_convertible_type", METAFN_IS_CONVERTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 638 "metafns.gperf"
+       {"is_implicit_lifetime_type", METAFN_IS_IMPLICIT_LIFETIME_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 520 "metafns.gperf"
+       {"is_template", METAFN_IS_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 629 "metafns.gperf"
+       {"is_nothrow_default_constructible_type", METAFN_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 563 "metafns.gperf"
+       {"can_substitute", METAFN_CAN_SUBSTITUTE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,},
+ #line 525 "metafns.gperf"
+       {"is_conversion_function_template", METAFN_IS_CONVERSION_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 456 "metafns.gperf"
+       {"symbol_of", METAFN_SYMBOL_OF, METAFN_KIND_STRING_VIEW_OPERATORS,},
+ #line 612 "metafns.gperf"
+       {"is_copy_constructible_type", METAFN_IS_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 610 "metafns.gperf"
+       {"is_constructible_type", METAFN_IS_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,},
+ #line 490 "metafns.gperf"
+       {"has_automatic_storage_duration", METAFN_HAS_AUTOMATIC_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,},
+ #line 615 "metafns.gperf"
+       {"is_copy_assignable_type", METAFN_IS_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 679 "metafns.gperf"
+       {"tuple_size", METAFN_TUPLE_SIZE, METAFN_KIND_SIZE_T_TINFO,},
+ #line 501 "metafns.gperf"
+       {"is_type_alias", METAFN_IS_TYPE_ALIAS, METAFN_KIND_BOOL_INFO,},
+ #line 510 "metafns.gperf"
+       {"is_copy_constructor", METAFN_IS_COPY_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,},
+ #line 546 "metafns.gperf"
+       {"variable_of", METAFN_VARIABLE_OF, METAFN_KIND_INFO_INFO,},
+ #line 539 "metafns.gperf"
+       {"has_parent", METAFN_HAS_PARENT, METAFN_KIND_BOOL_INFO,},
+ #line 587 "metafns.gperf"
+       {"is_reflection_type", METAFN_IS_REFLECTION_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 590 "metafns.gperf"
+       {"is_fundamental_type", METAFN_IS_FUNDAMENTAL_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 650 "metafns.gperf"
+       {"is_layout_compatible_type", METAFN_IS_LAYOUT_COMPATIBLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 561 "metafns.gperf"
+       {"bit_size_of", METAFN_BIT_SIZE_OF, METAFN_KIND_SIZE_T_INFO,},
+ #line 513 "metafns.gperf"
+       {"is_copy_assignment", METAFN_IS_COPY_ASSIGNMENT, METAFN_KIND_BOOL_INFO,},
+ #line 686 "metafns.gperf"
+       {"current", METAFN_ACCESS_CONTEXT_CURRENT, METAFN_KIND_ACCESS_CONTEXT_VOID,},
+ #line 673 "metafns.gperf"
+       {"common_type", METAFN_COMMON_TYPE, METAFN_KIND_INFO_REFLECTION_RANGET,},
+ #line 528 "metafns.gperf"
+       {"is_constructor_template", METAFN_IS_CONSTRUCTOR_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 683 "metafns.gperf"
+       {"type_order", METAFN_TYPE_ORDER, METAFN_KIND_STRONG_ORDERING_TINFO_TINFO,},
+ #line 674 "metafns.gperf"
+       {"common_reference", METAFN_COMMON_REFERENCE, METAFN_KIND_INFO_REFLECTION_RANGET,},
+ #line 538 "metafns.gperf"
+       {"has_default_member_initializer", METAFN_HAS_DEFAULT_MEMBER_INITIALIZER, METAFN_KIND_BOOL_INFO,},
+ #line 680 "metafns.gperf"
+       {"tuple_element", METAFN_TUPLE_ELEMENT, METAFN_KIND_INFO_SIZE_T_TINFO,},
+ #line 567 "metafns.gperf"
+       {"reflect_function", METAFN_REFLECT_FUNCTION, METAFN_KIND_INFO_TEMPLATE_PARM_REF,},
+ #line 518 "metafns.gperf"
+       {"has_default_argument", METAFN_HAS_DEFAULT_ARGUMENT, METAFN_KIND_BOOL_INFO,},
+ #line 613 "metafns.gperf"
+       {"is_move_constructible_type", METAFN_IS_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 464 "metafns.gperf"
+       {"type_of", METAFN_TYPE_OF, METAFN_KIND_INFO_INFO,},
+ #line 508 "metafns.gperf"
+       {"is_constructor", METAFN_IS_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,},
+ #line 618 "metafns.gperf"
+       {"is_swappable_type", METAFN_IS_SWAPPABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 636 "metafns.gperf"
+       {"is_nothrow_swappable_type", METAFN_IS_NOTHROW_SWAPPABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 588 "metafns.gperf"
+       {"is_reference_type", METAFN_IS_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 495 "metafns.gperf"
+       {"has_linkage", METAFN_HAS_LINKAGE, METAFN_KIND_BOOL_INFO,},
+ #line 635 "metafns.gperf"
+       {"is_nothrow_swappable_with_type", METAFN_IS_NOTHROW_SWAPPABLE_WITH_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 594 "metafns.gperf"
+       {"is_member_pointer_type", METAFN_IS_MEMBER_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 616 "metafns.gperf"
+       {"is_move_assignable_type", METAFN_IS_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 519 "metafns.gperf"
+       {"has_ellipsis_parameter", METAFN_HAS_ELLIPSIS_PARAMETER, METAFN_KIND_BOOL_INFO,},
+ #line 511 "metafns.gperf"
+       {"is_move_constructor", METAFN_IS_MOVE_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,},
+ #line 545 "metafns.gperf"
+       {"parameters_of", METAFN_PARAMETERS_OF, METAFN_KIND_VECTOR_INFO_INFO,},
+ #line 559 "metafns.gperf"
+       {"size_of", METAFN_SIZE_OF, METAFN_KIND_SIZE_T_INFO,},
+ #line 514 "metafns.gperf"
+       {"is_move_assignment", METAFN_IS_MOVE_ASSIGNMENT, METAFN_KIND_BOOL_INFO,},
+ #line 614 "metafns.gperf"
+       {"is_assignable_type", METAFN_IS_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 533 "metafns.gperf"
+       {"is_class_member", METAFN_IS_CLASS_MEMBER, METAFN_KIND_BOOL_INFO,},
+ #line 597 "metafns.gperf"
+       {"is_trivially_copyable_type", METAFN_IS_TRIVIALLY_COPYABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 512 "metafns.gperf"
+       {"is_assignment", METAFN_IS_ASSIGNMENT, METAFN_KIND_BOOL_INFO,},
+ #line 534 "metafns.gperf"
+       {"is_namespace_member", METAFN_IS_NAMESPACE_MEMBER, METAFN_KIND_BOOL_INFO,},
+ #line 552 "metafns.gperf"
+       {"members_of", METAFN_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,},
+ #line 620 "metafns.gperf"
+       {"is_trivially_constructible_type", METAFN_IS_TRIVIALLY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,},
+ #line 625 "metafns.gperf"
+       {"is_trivially_copy_assignable_type", METAFN_IS_TRIVIALLY_COPY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 622 "metafns.gperf"
+       {"is_trivially_copy_constructible_type", METAFN_IS_TRIVIALLY_COPY_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 644 "metafns.gperf"
+       {"extent", METAFN_EXTENT, METAFN_KIND_SIZE_T_TINFO_UNSIGNED,},
+ #line 583 "metafns.gperf"
+       {"is_enum_type", METAFN_IS_ENUM_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 543 "metafns.gperf"
+       {"template_of", METAFN_TEMPLATE_OF, METAFN_KIND_INFO_INFO,},
+ #line 523 "metafns.gperf"
+       {"is_class_template", METAFN_IS_CLASS_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 507 "metafns.gperf"
+       {"is_special_member_function", METAFN_IS_SPECIAL_MEMBER_FUNCTION, METAFN_KIND_BOOL_INFO,},
+ #line 468 "metafns.gperf"
+       {"is_protected", METAFN_IS_PROTECTED, METAFN_KIND_BOOL_INFO,},
+ #line 535 "metafns.gperf"
+       {"is_nonstatic_data_member", METAFN_IS_NONSTATIC_DATA_MEMBER, METAFN_KIND_BOOL_INFO,},
+ #line 677 "metafns.gperf"
+       {"unwrap_reference", METAFN_UNWRAP_REFERENCE, METAFN_KIND_INFO_TINFO,},
+ #line 497 "metafns.gperf"
+       {"is_enumerable_type", METAFN_IS_ENUMERABLE_TYPE, METAFN_KIND_BOOL_INFO,},
+ #line 589 "metafns.gperf"
+       {"is_arithmetic_type", METAFN_IS_ARITHMETIC_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 540 "metafns.gperf"
+       {"parent_of", METAFN_PARENT_OF, METAFN_KIND_INFO_INFO,},
+ #line 471 "metafns.gperf"
+       {"is_pure_virtual", METAFN_IS_PURE_VIRTUAL, METAFN_KIND_BOOL_INFO,},
+ #line 670 "metafns.gperf"
+       {"add_pointer", METAFN_ADD_POINTER, METAFN_KIND_INFO_TINFO,},
+ #line 611 "metafns.gperf"
+       {"is_default_constructible_type", METAFN_IS_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 675 "metafns.gperf"
+       {"underlying_type", METAFN_UNDERLYING_TYPE, METAFN_KIND_INFO_TINFO,},
+ #line 516 "metafns.gperf"
+       {"is_function_parameter", METAFN_IS_FUNCTION_PARAMETER, METAFN_KIND_BOOL_INFO,},
+ #line 459 "metafns.gperf"
+       {"identifier_of", METAFN_IDENTIFIER_OF, METAFN_KIND_STRING_VIEW_INFO,},
+ #line 592 "metafns.gperf"
+       {"is_scalar_type", METAFN_IS_SCALAR_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 664 "metafns.gperf"
+       {"add_rvalue_reference", METAFN_ADD_RVALUE_REFERENCE, METAFN_KIND_INFO_TINFO,},
+ #line 485 "metafns.gperf"
+       {"is_mutable_member", METAFN_IS_MUTABLE_MEMBER, METAFN_KIND_BOOL_INFO,},
+ #line 502 "metafns.gperf"
+       {"is_namespace_alias", METAFN_IS_NAMESPACE_ALIAS, METAFN_KIND_BOOL_INFO,},
+ #line 626 "metafns.gperf"
+       {"is_trivially_move_assignable_type", METAFN_IS_TRIVIALLY_MOVE_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 623 "metafns.gperf"
+       {"is_trivially_move_constructible_type", METAFN_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 509 "metafns.gperf"
+       {"is_default_constructor", METAFN_IS_DEFAULT_CONSTRUCTOR, METAFN_KIND_BOOL_INFO,},
+ #line 481 "metafns.gperf"
+       {"is_enumerator", METAFN_IS_ENUMERATOR, METAFN_KIND_BOOL_INFO,},
+ #line 531 "metafns.gperf"
+       {"is_object", METAFN_IS_OBJECT, METAFN_KIND_BOOL_INFO,},
+ #line 603 "metafns.gperf"
+       {"is_aggregate_type", METAFN_IS_AGGREGATE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 515 "metafns.gperf"
+       {"is_destructor", METAFN_IS_DESTRUCTOR, METAFN_KIND_BOOL_INFO,},
+ #line 582 "metafns.gperf"
+       {"is_member_function_pointer_type", METAFN_IS_MEMBER_FUNCTION_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 591 "metafns.gperf"
+       {"is_object_type", METAFN_IS_OBJECT_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 564 "metafns.gperf"
+       {"substitute", METAFN_SUBSTITUTE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,},
+ #line 580 "metafns.gperf"
+       {"is_rvalue_reference_type", METAFN_IS_RVALUE_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 661 "metafns.gperf"
+       {"add_cv", METAFN_ADD_CV, METAFN_KIND_INFO_TINFO,},
+ #line 565 "metafns.gperf"
+       {"reflect_constant", METAFN_REFLECT_CONSTANT, METAFN_KIND_INFO_TEMPLATE_PARM,},
+ #line 624 "metafns.gperf"
+       {"is_trivially_assignable_type", METAFN_IS_TRIVIALLY_ASSIGNABLE_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 470 "metafns.gperf"
+       {"is_virtual", METAFN_IS_VIRTUAL, METAFN_KIND_BOOL_INFO,},
+ #line 488 "metafns.gperf"
+       {"has_static_storage_duration", METAFN_HAS_STATIC_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,},
+ #line 663 "metafns.gperf"
+       {"add_lvalue_reference", METAFN_ADD_LVALUE_REFERENCE, METAFN_KIND_INFO_TINFO,},
+ #line 579 "metafns.gperf"
+       {"is_lvalue_reference_type", METAFN_IS_LVALUE_REFERENCE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 557 "metafns.gperf"
+       {"enumerators_of", METAFN_ENUMERATORS_OF, METAFN_KIND_VECTOR_INFO_INFO,},
+ #line 619 "metafns.gperf"
+       {"is_destructible_type", METAFN_IS_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 544 "metafns.gperf"
+       {"template_arguments_of", METAFN_TEMPLATE_ARGUMENTS_OF, METAFN_KIND_VECTOR_INFO_INFO,},
+ #line 652 "metafns.gperf"
+       {"is_invocable_type", METAFN_IS_INVOCABLE_TYPE, METAFN_KIND_BOOL_TINFO_REFLECTION_RANGET,},
+ #line 659 "metafns.gperf"
+       {"add_const", METAFN_ADD_CONST, METAFN_KIND_INFO_TINFO,},
+ #line 524 "metafns.gperf"
+       {"is_alias_template", METAFN_IS_ALIAS_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 599 "metafns.gperf"
+       {"is_empty_type", METAFN_IS_EMPTY_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 627 "metafns.gperf"
+       {"is_trivially_destructible_type", METAFN_IS_TRIVIALLY_DESTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 493 "metafns.gperf"
+       {"has_external_linkage", METAFN_HAS_EXTERNAL_LINKAGE, METAFN_KIND_BOOL_INFO,},
+ #line 548 "metafns.gperf"
+       {"is_accessible", METAFN_IS_ACCESSIBLE, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,},
+ #line 653 "metafns.gperf"
+       {"is_invocable_r_type", METAFN_IS_INVOCABLE_R_TYPE, METAFN_KIND_BOOL_TINFO_TINFO_REFLECTION_RANGET,},
+ #line 647 "metafns.gperf"
+       {"is_virtual_base_of_type", METAFN_IS_VIRTUAL_BASE_OF_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 596 "metafns.gperf"
+       {"is_volatile_type", METAFN_IS_VOLATILE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 568 "metafns.gperf"
+       {"reflect_constant_string", METAFN_REFLECT_CONSTANT_STRING, METAFN_KIND_INFO_INPUT_RANGE,},
+ #line 621 "metafns.gperf"
+       {"is_trivially_default_constructible_type", METAFN_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 527 "metafns.gperf"
+       {"is_literal_operator_template", METAFN_IS_LITERAL_OPERATOR_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 455 "metafns.gperf"
+       {"operator_of", METAFN_OPERATOR_OF, METAFN_KIND_OPERATORS_INFO,},
+ #line 605 "metafns.gperf"
+       {"is_signed_type", METAFN_IS_SIGNED_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 609 "metafns.gperf"
+       {"is_scoped_enum_type", METAFN_IS_SCOPED_ENUM_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 617 "metafns.gperf"
+       {"is_swappable_with_type", METAFN_IS_SWAPPABLE_WITH_TYPE, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 556 "metafns.gperf"
+       {"subobjects_of", METAFN_SUBOBJECTS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,},
+ #line 558 "metafns.gperf"
+       {"offset_of", METAFN_OFFSET_OF, METAFN_KIND_MEMBER_OFFSET_INFO,},
+ #line 532 "metafns.gperf"
+       {"is_structured_binding", METAFN_IS_STRUCTURED_BINDING, METAFN_KIND_BOOL_INFO,},
+ #line 473 "metafns.gperf"
+       {"is_final", METAFN_IS_FINAL, METAFN_KIND_BOOL_INFO,},
+ #line 506 "metafns.gperf"
+       {"is_literal_operator", METAFN_IS_LITERAL_OPERATOR, METAFN_KIND_BOOL_INFO,},
+ #line 666 "metafns.gperf"
+       {"make_unsigned", METAFN_MAKE_UNSIGNED, METAFN_KIND_INFO_TINFO,},
+ #line 462 "metafns.gperf"
+       {"u8display_string_of", METAFN_U8DISPLAY_STRING_OF, METAFN_KIND_U8STRING_VIEW_INFO,},
+ #line 639 "metafns.gperf"
+       {"has_virtual_destructor", METAFN_HAS_VIRTUAL_DESTRUCTOR, METAFN_KIND_BOOL_TINFO,},
+ #line 595 "metafns.gperf"
+       {"is_const_type", METAFN_IS_CONST_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 478 "metafns.gperf"
+       {"is_explicit", METAFN_IS_EXPLICIT, METAFN_KIND_BOOL_INFO,},
+ #line 571 "metafns.gperf"
+       {"is_data_member_spec", METAFN_IS_DATA_MEMBER_SPEC, METAFN_KIND_BOOL_INFO,},
+ #line 496 "metafns.gperf"
+       {"is_complete_type", METAFN_IS_COMPLETE_TYPE, METAFN_KIND_BOOL_INFO,},
+ #line 482 "metafns.gperf"
+       {"is_annotation", METAFN_IS_ANNOTATION, METAFN_KIND_BOOL_INFO,},
+ #line 586 "metafns.gperf"
+       {"is_function_type", METAFN_IS_FUNCTION_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 547 "metafns.gperf"
+       {"return_type_of", METAFN_RETURN_TYPE_OF, METAFN_KIND_INFO_INFO,},
+ #line 474 "metafns.gperf"
+       {"is_deleted", METAFN_IS_DELETED, METAFN_KIND_BOOL_INFO,},
+ #line 466 "metafns.gperf"
+       {"constant_of", METAFN_CONSTANT_OF, METAFN_KIND_INFO_INFO,},
+ #line 660 "metafns.gperf"
+       {"add_volatile", METAFN_ADD_VOLATILE, METAFN_KIND_INFO_TINFO,},
+ #line 475 "metafns.gperf"
+       {"is_defaulted", METAFN_IS_DEFAULTED, METAFN_KIND_BOOL_INFO,},
+ #line 640 "metafns.gperf"
+       {"has_unique_object_representations", METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS, METAFN_KIND_BOOL_TINFO,},
+ #line 581 "metafns.gperf"
+       {"is_member_object_pointer_type", METAFN_IS_MEMBER_OBJECT_POINTER_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 461 "metafns.gperf"
+       {"display_string_of", METAFN_DISPLAY_STRING_OF, METAFN_KIND_STRING_VIEW_INFO,},
+ #line 517 "metafns.gperf"
+       {"is_explicit_object_parameter", METAFN_IS_EXPLICIT_OBJECT_PARAMETER, METAFN_KIND_BOOL_INFO,},
+ #line 536 "metafns.gperf"
+       {"is_static_member", METAFN_IS_STATIC_MEMBER, METAFN_KIND_BOOL_INFO,},
+ #line 465 "metafns.gperf"
+       {"object_of", METAFN_OBJECT_OF, METAFN_KIND_INFO_INFO,},
+ #line 604 "metafns.gperf"
+       {"is_consteval_only_type", METAFN_IS_CONSTEVAL_ONLY_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 472 "metafns.gperf"
+       {"is_override", METAFN_IS_OVERRIDE, METAFN_KIND_BOOL_INFO,},
+ #line 658 "metafns.gperf"
+       {"remove_cv", METAFN_REMOVE_CV, METAFN_KIND_INFO_TINFO,},
+ #line 566 "metafns.gperf"
+       {"reflect_object", METAFN_REFLECT_OBJECT, METAFN_KIND_INFO_TEMPLATE_PARM_REF,},
+ #line 576 "metafns.gperf"
+       {"is_floating_point_type", METAFN_IS_FLOATING_POINT_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 458 "metafns.gperf"
+       {"has_identifier", METAFN_HAS_IDENTIFIER, METAFN_KIND_BOOL_INFO,},
+ #line 662 "metafns.gperf"
+       {"remove_reference", METAFN_REMOVE_REFERENCE, METAFN_KIND_INFO_TINFO,},
+ #line 550 "metafns.gperf"
+       {"has_inaccessible_bases", METAFN_HAS_INACCESSIBLE_BASES, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,},
+ #line 494 "metafns.gperf"
+       {"has_c_language_linkage", METAFN_HAS_C_LANGUAGE_LINKAGE, METAFN_KIND_BOOL_INFO,},
+ #line 551 "metafns.gperf"
+       {"has_inaccessible_subobjects", METAFN_HAS_INACCESSIBLE_SUBOBJECTS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,},
+ #line 667 "metafns.gperf"
+       {"remove_extent", METAFN_REMOVE_EXTENT, METAFN_KIND_INFO_TINFO,},
+ #line 549 "metafns.gperf"
+       {"has_inaccessible_nonstatic_data_members", METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS, METAFN_KIND_BOOL_INFO_ACCESS_CONTEXT,},
+ #line 487 "metafns.gperf"
+       {"is_rvalue_reference_qualified", METAFN_IS_RVALUE_REFERENCE_QUALIFIED, METAFN_KIND_BOOL_INFO,},
+ #line 642 "metafns.gperf"
+       {"reference_converts_from_temporary", METAFN_REFERENCE_CONVERTS_FROM_TEMPORARY, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 585 "metafns.gperf"
+       {"is_class_type", METAFN_IS_CLASS_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 477 "metafns.gperf"
+       {"is_user_declared", METAFN_IS_USER_DECLARED, METAFN_KIND_BOOL_INFO,},
+ #line 570 "metafns.gperf"
+       {"data_member_spec", METAFN_DATA_MEMBER_SPEC, METAFN_KIND_INFO_TINFO_DATA_MEMBER_OPTIONS,},
+ #line 486 "metafns.gperf"
+       {"is_lvalue_reference_qualified", METAFN_IS_LVALUE_REFERENCE_QUALIFIED, METAFN_KIND_BOOL_INFO,},
+ #line 489 "metafns.gperf"
+       {"has_thread_storage_duration", METAFN_HAS_THREAD_STORAGE_DURATION, METAFN_KIND_BOOL_INFO,},
+ #line 480 "metafns.gperf"
+       {"is_bit_field", METAFN_IS_BIT_FIELD, METAFN_KIND_BOOL_INFO,},
+ #line 671 "metafns.gperf"
+       {"remove_cvref", METAFN_REMOVE_CVREF, METAFN_KIND_INFO_TINFO,},
+ #line 676 "metafns.gperf"
+       {"invoke_result", METAFN_INVOKE_RESULT, METAFN_KIND_INFO_TINFO_REFLECTION_RANGET,},
+ #line 542 "metafns.gperf"
+       {"has_template_arguments", METAFN_HAS_TEMPLATE_ARGUMENTS, METAFN_KIND_BOOL_INFO,},
+ #line 505 "metafns.gperf"
+       {"is_operator_function", METAFN_IS_OPERATOR_FUNCTION, METAFN_KIND_BOOL_INFO,},
+ #line 669 "metafns.gperf"
+       {"remove_pointer", METAFN_REMOVE_POINTER, METAFN_KIND_INFO_TINFO,},
+ #line 541 "metafns.gperf"
+       {"dealias", METAFN_DEALIAS, METAFN_KIND_INFO_INFO,},
+ #line 656 "metafns.gperf"
+       {"remove_const", METAFN_REMOVE_CONST, METAFN_KIND_INFO_TINFO,},
+ #line 526 "metafns.gperf"
+       {"is_operator_function_template", METAFN_IS_OPERATOR_FUNCTION_TEMPLATE, METAFN_KIND_BOOL_INFO,},
+ #line 641 "metafns.gperf"
+       {"reference_constructs_from_temporary", METAFN_REFERENCE_CONSTRUCTS_FROM_TEMPORARY, METAFN_KIND_BOOL_TINFO_TINFO,},
+ #line 668 "metafns.gperf"
+       {"remove_all_extents", METAFN_REMOVE_ALL_EXTENTS, METAFN_KIND_INFO_TINFO,},
+ #line 577 "metafns.gperf"
+       {"is_array_type", METAFN_IS_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 491 "metafns.gperf"
+       {"has_internal_linkage", METAFN_HAS_INTERNAL_LINKAGE, METAFN_KIND_BOOL_INFO,},
+ #line 665 "metafns.gperf"
+       {"make_signed", METAFN_MAKE_SIGNED, METAFN_KIND_INFO_TINFO,},
+ #line 554 "metafns.gperf"
+       {"static_data_members_of", METAFN_STATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,},
+ #line 593 "metafns.gperf"
+       {"is_compound_type", METAFN_IS_COMPOUND_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 601 "metafns.gperf"
+       {"is_abstract_type", METAFN_IS_ABSTRACT_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 572 "metafns.gperf"
+       {"define_aggregate", METAFN_DEFINE_AGGREGATE, METAFN_KIND_INFO_INFO_REFLECTION_RANGE,},
+ #line 687 "metafns.gperf"
+       {"_S_exception_cvt_to_utf8", METAFN_EXCEPTION__S_EXCEPTION_CVT_TO_UTF8, METAFN_KIND_U8STRING_VIEW_INPUT_RANGE,},
+ #line 688 "metafns.gperf"
+       {"_S_exception_cvt_from_utf8", METAFN_EXCEPTION__S_EXCEPTION_CVT_FROM_UTF8, METAFN_KIND_STRING_VIEW_INPUT_RANGE,},
+ #line 608 "metafns.gperf"
+       {"is_unbounded_array_type", METAFN_IS_UNBOUNDED_ARRAY_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 598 "metafns.gperf"
+       {"is_standard_layout_type", METAFN_IS_STANDARD_LAYOUT_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 678 "metafns.gperf"
+       {"unwrap_ref_decay", METAFN_UNWRAP_REF_DECAY, METAFN_KIND_INFO_TINFO,},
+ #line 569 "metafns.gperf"
+       {"reflect_constant_array", METAFN_REFLECT_CONSTANT_ARRAY, METAFN_KIND_INFO_INPUT_RANGE,},
+ #line 457 "metafns.gperf"
+       {"u8symbol_of", METAFN_U8SYMBOL_OF, METAFN_KIND_U8STRING_VIEW_OPERATORS,},
+ #line 575 "metafns.gperf"
+       {"is_integral_type", METAFN_IS_INTEGRAL_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 555 "metafns.gperf"
+       {"nonstatic_data_members_of", METAFN_NONSTATIC_DATA_MEMBERS_OF, METAFN_KIND_VECTOR_INFO_INFO_ACCESS_CONTEXT,},
+ #line 672 "metafns.gperf"
+       {"decay", METAFN_DECAY, METAFN_KIND_INFO_TINFO,},
+ #line 602 "metafns.gperf"
+       {"is_final_type", METAFN_IS_FINAL_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 657 "metafns.gperf"
+       {"remove_volatile", METAFN_REMOVE_VOLATILE, METAFN_KIND_INFO_TINFO,},
+ #line 560 "metafns.gperf"
+       {"alignment_of", METAFN_ALIGNMENT_OF, METAFN_KIND_SIZE_T_INFO,},
+ #line 463 "metafns.gperf"
+       {"source_location_of", METAFN_SOURCE_LOCATION_OF, METAFN_KIND_SOURCE_LOCATION_INFO,},
+ #line 685 "metafns.gperf"
+       {"annotations_of_with_type", METAFN_ANNOTATIONS_OF_WITH_TYPE, METAFN_KIND_VECTOR_INFO_INFO_INFO,},
+ #line 460 "metafns.gperf"
+       {"u8identifier_of", METAFN_U8IDENTIFIER_OF, METAFN_KIND_U8STRING_VIEW_INFO,},
+ #line 684 "metafns.gperf"
+       {"annotations_of", METAFN_ANNOTATIONS_OF, METAFN_KIND_VECTOR_INFO_INFO,},
+ #line 584 "metafns.gperf"
+       {"is_union_type", METAFN_IS_UNION_TYPE, METAFN_KIND_BOOL_TINFO,},
+ #line 476 "metafns.gperf"
+       {"is_user_provided", METAFN_IS_USER_PROVIDED, METAFN_KIND_BOOL_INFO,},
+ #line 606 "metafns.gperf"
+       {"is_unsigned_type", METAFN_IS_UNSIGNED_TYPE, METAFN_KIND_BOOL_TINFO,}
+     };
+ #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3)
+ #pragma GCC diagnostic pop
+ #endif
+ 
+   static const short lookup[] =
+     {
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,
+        -1,  -1,   1,  -1,  -1,   2,   3,  -1,   4,  -1,
+        -1,  -1,   5,  -1,  -1,  -1,   6,   7,  -1,   8,
+         9,  10,  11,  -1,  12,  13,  14,  -1,  -1,  15,
+        16,  -1,  17,  -1,  -1,  18,  -1,  19,  -1,  20,
+        -1,  21,  22,  -1,  23,  -1,  -1,  -1,  -1,  24,
+        25,  26,  27,  -1,  -1,  28,  29,  -1,  30,  -1,
+        31,  -1,  32,  33,  -1,  34,  -1,  -1,  -1,  -1,
+        35,  36,  37,  38,  39,  40,  -1,  -1,  -1,  -1,
+        -1,  41,  42,  -1,  43,  -1,  44,  -1,  -1,  45,
+        -1,  46,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  47,  48,  49,  -1,
+        50,  -1,  -1,  51,  52,  -1,  53,  54,  55,  56,
+        57,  58,  -1,  59,  -1,  -1,  -1,  60,  -1,  -1,
+        -1,  61,  -1,  62,  -1,  63,  64,  65,  66,  -1,
+        -1,  67,  -1,  -1,  -1,  -1,  -1,  68,  -1,  -1,
+        -1,  69,  70,  -1,  71,  -1,  -1,  72,  -1,  -1,
+        73,  -1,  74,  75,  -1,  76,  -1,  77,  78,  79,
+        -1,  -1,  -1,  -1,  80,  -1,  -1,  -1,  81,  -1,
+        -1,  -1,  82,  83,  -1,  -1,  -1,  -1,  84,  -1,
+        85,  86,  -1,  87,  88,  89,  90,  -1,  91,  -1,
+        -1,  92,  -1,  -1,  -1,  -1,  93,  94,  -1,  -1,
+        -1,  95,  96,  -1,  -1,  -1,  97,  98,  -1,  -1,
+        -1,  -1,  -1,  -1,  99,  -1, 100,  -1, 101,  -1,
+        -1,  -1,  -1, 102, 103, 104, 105,  -1,  -1, 106,
+       107, 108,  -1,  -1,  -1,  -1,  -1,  -1, 109, 110,
+       111,  -1, 112, 113,  -1,  -1,  -1,  -1, 114,  -1,
+        -1, 115, 116, 117, 118,  -1,  -1,  -1,  -1, 119,
+        -1,  -1,  -1, 120,  -1,  -1, 121,  -1,  -1, 122,
+       123,  -1,  -1, 124,  -1,  -1, 125,  -1,  -1,  -1,
+        -1, 126,  -1, 127,  -1,  -1,  -1,  -1, 128, 129,
+       130,  -1,  -1, 131, 132, 133, 134, 135,  -1, 136,
+        -1,  -1, 137,  -1, 138, 139,  -1, 140, 141, 142,
+        -1, 143, 144, 145, 146,  -1, 147,  -1,  -1,  -1,
+        -1, 148, 149,  -1, 150,  -1, 151,  -1, 152, 153,
+        -1, 154,  -1,  -1,  -1,  -1, 155, 156, 157, 158,
+        -1,  -1,  -1, 159, 160,  -1,  -1, 161,  -1, 162,
+        -1,  -1, 163, 164,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1, 165,  -1, 166, 167, 168,  -1,  -1,  -1,
+        -1, 169, 170, 171, 172,  -1,  -1, 173,  -1,  -1,
+        -1,  -1,  -1,  -1, 174,  -1, 175,  -1,  -1, 176,
+        -1,  -1, 177,  -1,  -1, 178,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1, 179,  -1,  -1,  -1, 180,  -1,  -1,
+        -1,  -1, 181,  -1, 182, 183,  -1, 184,  -1, 185,
+        -1,  -1, 186,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1, 187,  -1, 188,  -1,  -1,  -1, 189, 190,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 191,
+        -1, 192,  -1,  -1,  -1,  -1, 193,  -1, 194, 195,
+       196, 197,  -1, 198,  -1,  -1,  -1,  -1,  -1, 199,
+       200,  -1,  -1, 201,  -1,  -1,  -1,  -1,  -1,  -1,
+       202, 203,  -1,  -1, 204,  -1,  -1,  -1,  -1,  -1,
+        -1, 205, 206,  -1,  -1,  -1,  -1,  -1,  -1, 207,
+       208, 209,  -1,  -1,  -1, 210,  -1,  -1,  -1,  -1,
+        -1,  -1, 211,  -1,  -1,  -1,  -1, 212,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1, 213,  -1,  -1,  -1, 214,  -1, 215, 216,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 217,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1, 218,  -1,  -1,
+        -1,  -1,  -1, 219,  -1,  -1,  -1, 220,  -1,  -1,
+        -1,  -1, 221,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+       222,  -1,  -1,  -1,  -1,  -1, 223,  -1,  -1,  -1,
+        -1,  -1, 224,  -1,  -1,  -1,  -1,  -1,  -1, 225,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1, 226,  -1,  -1,  -1,  -1,  -1, 227,  -1,
+        -1,  -1,  -1,  -1, 228,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1, 229,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1, 230,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 231,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1, 232,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,
+        -1,  -1,  -1,  -1,  -1,  -1,  -1, 233
+     };
+ 
+   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+     {
+       unsigned int key = hash (str, len);
+ 
+       if (key <= MAX_HASH_VALUE)
+         {
+           int index = lookup[key];
+ 
+           if (index >= 0)
+             {
+               const char *s = wordlist[index].name;
+ 
+               if (*str == *s && !strcmp (str + 1, s + 1))
+                 return &wordlist[index];
+             }
+         }
+     }
+   return static_cast<struct metafn_info *> (0);
+ }
diff -Nrcpad gcc-16-20260111/gcc/cp/method.cc gcc-16-20260118/gcc/cp/method.cc
*** gcc-16-20260111/gcc/cp/method.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/method.cc	Sun Jan 18 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 33,38 ****
--- 33,39 ----
  #include "toplev.h"
  #include "intl.h"
  #include "common/common-target.h"
+ #include "attribs.h"
  
  static void do_build_copy_assign (tree);
  static void do_build_copy_constructor (tree);
*************** maybe_synthesize_method (tree fndecl)
*** 1898,1904 ****
  /* Build a reference to type TYPE with cv-quals QUALS, which is an
     rvalue if RVALUE is true.  */
  
! static tree
  build_stub_type (tree type, int quals, bool rvalue)
  {
    tree argtype = cp_build_qualified_type (type, quals);
--- 1899,1905 ----
  /* Build a reference to type TYPE with cv-quals QUALS, which is an
     rvalue if RVALUE is true.  */
  
! tree
  build_stub_type (tree type, int quals, bool rvalue)
  {
    tree argtype = cp_build_qualified_type (type, quals);
*************** implicitly_declare_fn (special_function_
*** 3595,3600 ****
--- 3596,3604 ----
        tree inherited_ctor_fn = STRIP_TEMPLATE (inherited_ctor);
        /* Also copy any attributes.  */
        DECL_ATTRIBUTES (fn) = clone_attrs (DECL_ATTRIBUTES (inherited_ctor_fn));
+       /* But remove gnu::gnu_inline attribute.  See PR123526.  */
+       DECL_ATTRIBUTES (fn)
+ 	= remove_attribute ("gnu", "gnu_inline", DECL_ATTRIBUTES (fn));
        DECL_DISREGARD_INLINE_LIMITS (fn)
  	= DECL_DISREGARD_INLINE_LIMITS (inherited_ctor_fn);
      }
diff -Nrcpad gcc-16-20260111/gcc/cp/module.cc gcc-16-20260118/gcc/cp/module.cc
*** gcc-16-20260111/gcc/cp/module.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/module.cc	Sun Jan 18 22:32:07 2026
*************** static char const *const merge_kind_name
*** 2969,2974 ****
--- 2969,2975 ----
  /* Mergeable entity location data.  */
  struct merge_key {
    cp_ref_qualifier ref_q : 2;
+   unsigned coro_disc : 2;  /* Discriminator for coroutine transforms.  */
    unsigned index;
  
    tree ret;  /* Return type, if appropriate.  */
*************** struct merge_key {
*** 2977,2983 ****
    tree constraints;  /* Constraints.  */
  
    merge_key ()
!     :ref_q (REF_QUAL_NONE), index (0),
       ret (NULL_TREE), args (NULL_TREE),
       constraints (NULL_TREE)
    {
--- 2978,2984 ----
    tree constraints;  /* Constraints.  */
  
    merge_key ()
!     :ref_q (REF_QUAL_NONE), coro_disc (0), index (0),
       ret (NULL_TREE), args (NULL_TREE),
       constraints (NULL_TREE)
    {
*************** dumper::impl::nested_name (tree t)
*** 4590,4595 ****
--- 4591,4607 ----
    else
      fputs ("#null#", stream);
  
+   if (t && TREE_CODE (t) == FUNCTION_DECL && DECL_COROUTINE_P (t))
+     if (tree ramp = DECL_RAMP_FN (t))
+       {
+ 	if (DECL_ACTOR_FN (ramp) == t)
+ 	  fputs (".actor", stream);
+ 	else if (DECL_DESTROY_FN (ramp) == t)
+ 	  fputs (".destroy", stream);
+ 	else
+ 	  gcc_unreachable ();
+       }
+ 
    if (origin >= 0)
      {
        const module_state *module = (*modules)[origin];
*************** trees_out::lang_decl_bools (tree t, bits
*** 6085,6093 ****
    /* Do not write lang->u.base.not_really_extern, importer will set
       when reading the definition (if any).  */
    WB (lang->u.base.initialized_in_class);
    WB (lang->u.base.threadprivate_or_deleted_p);
!   /* Do not write lang->u.base.anticipated_p, it is a property of the
!      current TU.  */
    WB (lang->u.base.friend_or_tls);
    WB (lang->u.base.unknown_bound_p);
    /* Do not write lang->u.base.odr_used, importer will recalculate if
--- 6097,6105 ----
    /* Do not write lang->u.base.not_really_extern, importer will set
       when reading the definition (if any).  */
    WB (lang->u.base.initialized_in_class);
+ 
    WB (lang->u.base.threadprivate_or_deleted_p);
!   WB (lang->u.base.anticipated_p);
    WB (lang->u.base.friend_or_tls);
    WB (lang->u.base.unknown_bound_p);
    /* Do not write lang->u.base.odr_used, importer will recalculate if
*************** trees_out::lang_decl_bools (tree t, bits
*** 6095,6106 ****
--- 6107,6124 ----
    WB (lang->u.base.concept_p);
    WB (lang->u.base.var_declared_inline_p);
    WB (lang->u.base.dependent_init_p);
+ 
    /* When building a header unit, everthing is marked as purview, (so
       we know which decls to write).  But when we import them we do not
       want to mark them as in module purview.  */
    WB (lang->u.base.module_purview_p && !header_module_p ());
    WB (lang->u.base.module_attach_p);
+   /* Importer will set module_import_p and module_entity_p themselves
+      as appropriate.  */
    WB (lang->u.base.module_keyed_decls_p);
+ 
+   WB (lang->u.base.omp_declare_mapper_p);
+ 
    switch (lang->u.base.selector)
      {
      default:
*************** trees_out::lang_decl_bools (tree t, bits
*** 6109,6114 ****
--- 6127,6133 ----
      case lds_fn:  /* lang_decl_fn.  */
        WB (lang->u.fn.global_ctor_p);
        WB (lang->u.fn.global_dtor_p);
+ 
        WB (lang->u.fn.static_function);
        WB (lang->u.fn.pure_virtual);
        WB (lang->u.fn.defaulted_p);
*************** trees_out::lang_decl_bools (tree t, bits
*** 6118,6130 ****
        gcc_assert (!lang->u.fn.pending_inline_p);
        WB (lang->u.fn.nonconverting);
        WB (lang->u.fn.thunk_p);
        WB (lang->u.fn.this_thunk_p);
-       /* Do not stream lang->u.hidden_friend_p, it is a property of
- 	 the TU.  */
        WB (lang->u.fn.omp_declare_reduction_p);
        WB (lang->u.fn.has_dependent_explicit_spec_p);
        WB (lang->u.fn.immediate_fn_p);
        WB (lang->u.fn.maybe_deleted);
        WB (lang->u.fn.implicit_constexpr);
        WB (lang->u.fn.escalated_p);
        WB (lang->u.fn.xobj_func);
--- 6137,6149 ----
        gcc_assert (!lang->u.fn.pending_inline_p);
        WB (lang->u.fn.nonconverting);
        WB (lang->u.fn.thunk_p);
+ 
        WB (lang->u.fn.this_thunk_p);
        WB (lang->u.fn.omp_declare_reduction_p);
        WB (lang->u.fn.has_dependent_explicit_spec_p);
        WB (lang->u.fn.immediate_fn_p);
        WB (lang->u.fn.maybe_deleted);
+       WB (lang->u.fn.coroutine_p);
        WB (lang->u.fn.implicit_constexpr);
        WB (lang->u.fn.escalated_p);
        WB (lang->u.fn.xobj_func);
*************** trees_in::lang_decl_bools (tree t, bits_
*** 6164,6180 ****
    lang->u.base.use_template = v;
    /* lang->u.base.not_really_extern is not streamed.  */
    RB (lang->u.base.initialized_in_class);
    RB (lang->u.base.threadprivate_or_deleted_p);
!   /* lang->u.base.anticipated_p is not streamed.  */
    RB (lang->u.base.friend_or_tls);
    RB (lang->u.base.unknown_bound_p);
    /* lang->u.base.odr_used is not streamed.  */
    RB (lang->u.base.concept_p);
    RB (lang->u.base.var_declared_inline_p);
    RB (lang->u.base.dependent_init_p);
    RB (lang->u.base.module_purview_p);
    RB (lang->u.base.module_attach_p);
    RB (lang->u.base.module_keyed_decls_p);
    switch (lang->u.base.selector)
      {
      default:
--- 6183,6205 ----
    lang->u.base.use_template = v;
    /* lang->u.base.not_really_extern is not streamed.  */
    RB (lang->u.base.initialized_in_class);
+ 
    RB (lang->u.base.threadprivate_or_deleted_p);
!   RB (lang->u.base.anticipated_p);
    RB (lang->u.base.friend_or_tls);
    RB (lang->u.base.unknown_bound_p);
    /* lang->u.base.odr_used is not streamed.  */
    RB (lang->u.base.concept_p);
    RB (lang->u.base.var_declared_inline_p);
    RB (lang->u.base.dependent_init_p);
+ 
    RB (lang->u.base.module_purview_p);
    RB (lang->u.base.module_attach_p);
+   /* module_import_p and module_entity_p are not streamed.  */
    RB (lang->u.base.module_keyed_decls_p);
+ 
+   RB (lang->u.base.omp_declare_mapper_p);
+ 
    switch (lang->u.base.selector)
      {
      default:
*************** trees_in::lang_decl_bools (tree t, bits_
*** 6183,6201 ****
      case lds_fn:  /* lang_decl_fn.  */
        RB (lang->u.fn.global_ctor_p);
        RB (lang->u.fn.global_dtor_p);
        RB (lang->u.fn.static_function);
        RB (lang->u.fn.pure_virtual);
        RB (lang->u.fn.defaulted_p);
        RB (lang->u.fn.has_in_charge_parm_p);
        RB (lang->u.fn.has_vtt_parm_p);
        RB (lang->u.fn.nonconverting);
        RB (lang->u.fn.thunk_p);
        RB (lang->u.fn.this_thunk_p);
-       /* lang->u.fn.hidden_friend_p is not streamed.  */
        RB (lang->u.fn.omp_declare_reduction_p);
        RB (lang->u.fn.has_dependent_explicit_spec_p);
        RB (lang->u.fn.immediate_fn_p);
        RB (lang->u.fn.maybe_deleted);
        RB (lang->u.fn.implicit_constexpr);
        RB (lang->u.fn.escalated_p);
        RB (lang->u.fn.xobj_func);
--- 6208,6229 ----
      case lds_fn:  /* lang_decl_fn.  */
        RB (lang->u.fn.global_ctor_p);
        RB (lang->u.fn.global_dtor_p);
+ 
        RB (lang->u.fn.static_function);
        RB (lang->u.fn.pure_virtual);
        RB (lang->u.fn.defaulted_p);
        RB (lang->u.fn.has_in_charge_parm_p);
        RB (lang->u.fn.has_vtt_parm_p);
+       /* lang->u.f.n.pending_inline_p is not streamed.  */
        RB (lang->u.fn.nonconverting);
        RB (lang->u.fn.thunk_p);
+ 
        RB (lang->u.fn.this_thunk_p);
        RB (lang->u.fn.omp_declare_reduction_p);
        RB (lang->u.fn.has_dependent_explicit_spec_p);
        RB (lang->u.fn.immediate_fn_p);
        RB (lang->u.fn.maybe_deleted);
+       RB (lang->u.fn.coroutine_p);
        RB (lang->u.fn.implicit_constexpr);
        RB (lang->u.fn.escalated_p);
        RB (lang->u.fn.xobj_func);
*************** trees_out::type_node (tree type)
*** 9815,9820 ****
--- 9843,9852 ----
  	    wu (nunits.coeffs[ix]);
  	}
        break;
+ 
+     case META_TYPE:
+       /* No additional data.  */
+       break;
      }
  
    tree_node (TYPE_ATTRIBUTES (type));
*************** trees_in::tree_node (bool is_use)
*** 10660,10665 ****
--- 10692,10702 ----
  		res = build_vector_type (res, nunits);
  	    }
  	    break;
+ 
+ 	  case META_TYPE:
+ 	    if (!get_overrun ())
+ 	      res = meta_info_type_node;
+ 	    break;
  	  }
  
  	/* In the exporting TU, a derived type with attributes was built by
*************** trees_out::get_merge_kind (tree decl, de
*** 11566,11572 ****
  	    gcc_checking_assert
  	      (DECL_IMPLICIT_TYPEDEF_P (STRIP_TEMPLATE (decl)));
  
! 	    mk = MK_local_type;
  	    break;
  
  	  case RECORD_TYPE:
--- 11603,11614 ----
  	    gcc_checking_assert
  	      (DECL_IMPLICIT_TYPEDEF_P (STRIP_TEMPLATE (decl)));
  
! 	    if (has_definition (ctx))
! 	      mk = MK_local_type;
! 	    else
! 	      /* We're not providing a definition of the context to key
! 		 the local type into; use the keyed map instead.  */
! 	      mk = MK_keyed;
  	    break;
  
  	  case RECORD_TYPE:
*************** trees_in::decl_container ()
*** 11696,11701 ****
--- 11738,11762 ----
    return container;
  }
  
+ /* Gets a 2-bit discriminator to distinguish coroutine actor or destroy
+    functions from a normal function.  */
+ 
+ static int
+ get_coroutine_discriminator (tree inner)
+ {
+   if (DECL_COROUTINE_P (inner))
+     if (tree ramp = DECL_RAMP_FN (inner))
+       {
+ 	if (DECL_ACTOR_FN (ramp) == inner)
+ 	  return 1;
+ 	else if (DECL_DESTROY_FN (ramp) == inner)
+ 	  return 2;
+ 	else
+ 	  gcc_unreachable ();
+       }
+   return 0;
+ }
+ 
  /* Write out key information about a mergeable DEP.  Does not write
     the contents of DEP itself.  The context has already been
     written.  The container has already been streamed.  */
*************** trees_out::key_mergeable (int tag, merge
*** 11787,11792 ****
--- 11848,11854 ----
  	      tree fn_type = TREE_TYPE (inner);
  
  	      key.ref_q = type_memfn_rqual (fn_type);
+ 	      key.coro_disc = get_coroutine_discriminator (inner);
  	      key.args = TYPE_ARG_TYPES (fn_type);
  
  	      if (tree reqs = get_constraints (inner))
*************** trees_out::key_mergeable (int tag, merge
*** 11923,11929 ****
        tree_node (name);
        if (streaming_p ())
  	{
! 	  unsigned code = (key.ref_q << 0) | (key.index << 2);
  	  u (code);
  	}
  
--- 11985,11996 ----
        tree_node (name);
        if (streaming_p ())
  	{
! 	  /* Check we have enough bits for the index.  */
! 	  gcc_checking_assert (key.index < (1u << (sizeof (unsigned) * 8 - 4)));
! 
! 	  unsigned code = ((key.ref_q << 0)
! 			   | (key.coro_disc << 2)
! 			   | (key.index << 4));
  	  u (code);
  	}
  
*************** trees_out::key_mergeable (int tag, merge
*** 11947,11954 ****
      }
  }
  
! /* DECL is a new declaration that may be duplicated in OVL.  Use RET &
!    ARGS to find its clone, or NULL.  If DECL's DECL_NAME is NULL, this
     has been found by a proxy.  It will be an enum type located by its
     first member.
  
--- 12014,12021 ----
      }
  }
  
! /* DECL is a new declaration that may be duplicated in OVL.  Use KEY
!    to find its clone, or NULL.  If DECL's DECL_NAME is NULL, this
     has been found by a proxy.  It will be an enum type located by its
     first member.
  
*************** check_mergeable_decl (merge_kind mk, tre
*** 12003,12008 ****
--- 12070,12076 ----
  		 || same_type_p (key.ret, fndecl_declared_return_type (m_inner)))
  		&& type_memfn_rqual (m_type) == key.ref_q
  		&& compparms (key.args, TYPE_ARG_TYPES (m_type))
+ 		&& get_coroutine_discriminator (m_inner) == key.coro_disc
  		/* Reject if old is a "C" builtin and new is not "C".
  		   Matches decls_match behaviour.  */
  		&& (!DECL_IS_UNDECLARED_BUILTIN (m_inner)
*************** trees_in::key_mergeable (int tag, merge_
*** 12125,12131 ****
        merge_key key;
        unsigned code = u ();
        key.ref_q = cp_ref_qualifier ((code >> 0) & 3);
!       key.index = code >> 2;
  
        if (mk == MK_enum)
  	key.ret = tree_node ();
--- 12193,12200 ----
        merge_key key;
        unsigned code = u ();
        key.ref_q = cp_ref_qualifier ((code >> 0) & 3);
!       key.coro_disc = (code >> 2) & 3;
!       key.index = code >> 4;
  
        if (mk == MK_enum)
  	key.ret = tree_node ();
*************** trees_in::key_mergeable (int tag, merge_
*** 12179,12185 ****
  	       && DECL_MODULE_KEYED_DECLS_P (name))
  	{
  	  gcc_checking_assert (TREE_CODE (container) == NAMESPACE_DECL
! 			       || TREE_CODE (container) == TYPE_DECL);
  	  if (auto *set = keyed_table->get (name))
  	    if (key.index < set->length ())
  	      {
--- 12248,12255 ----
  	       && DECL_MODULE_KEYED_DECLS_P (name))
  	{
  	  gcc_checking_assert (TREE_CODE (container) == NAMESPACE_DECL
! 			       || TREE_CODE (container) == TYPE_DECL
! 			       || TREE_CODE (container) == FUNCTION_DECL);
  	  if (auto *set = keyed_table->get (name))
  	    if (key.index < set->length ())
  	      {
*************** has_definition (tree decl)
*** 12858,12863 ****
--- 12928,12939 ----
  	  if (use_tpl < 2)
  	    return true;
  	}
+ 
+       /* Coroutine transform functions always need to be emitted
+ 	 into the importing TU if the ramp function will be.  */
+       if (DECL_COROUTINE_P (decl))
+ 	if (tree ramp = DECL_RAMP_FN (decl))
+ 	  return has_definition (ramp);
        break;
  
      case TYPE_DECL:
*************** trees_out::write_function_def (tree decl
*** 13041,13046 ****
--- 13117,13133 ----
        state->write_location (*this, f->function_start_locus);
        state->write_location (*this, f->function_end_locus);
      }
+ 
+   if (DECL_COROUTINE_P (decl))
+     {
+       tree ramp = DECL_RAMP_FN (decl);
+       tree_node (ramp);
+       if (!ramp)
+ 	{
+ 	  tree_node (DECL_ACTOR_FN (decl));
+ 	  tree_node (DECL_DESTROY_FN (decl));
+ 	}
+     }
  }
  
  void
*************** trees_in::read_function_def (tree decl,
*** 13056,13068 ****
    tree initial = tree_node ();
    tree saved = tree_node ();
    tree context = tree_node ();
-   constexpr_fundef cexpr;
    post_process_data pdata {};
    pdata.decl = maybe_template;
  
    tree maybe_dup = odr_duplicate (maybe_template, DECL_SAVED_TREE (decl));
    bool installing = maybe_dup && !DECL_SAVED_TREE (decl);
  
    if (u ())
      {
        cexpr.parms = chained_decls ();
--- 13143,13155 ----
    tree initial = tree_node ();
    tree saved = tree_node ();
    tree context = tree_node ();
    post_process_data pdata {};
    pdata.decl = maybe_template;
  
    tree maybe_dup = odr_duplicate (maybe_template, DECL_SAVED_TREE (decl));
    bool installing = maybe_dup && !DECL_SAVED_TREE (decl);
  
+   constexpr_fundef cexpr;
    if (u ())
      {
        cexpr.parms = chained_decls ();
*************** trees_in::read_function_def (tree decl,
*** 13074,13080 ****
      cexpr.decl = NULL_TREE;
  
    unsigned flags = u ();
- 
    if (flags & 2)
      {
        pdata.start_locus = state->read_location (*this);
--- 13161,13166 ----
*************** trees_in::read_function_def (tree decl,
*** 13085,13090 ****
--- 13171,13191 ----
        pdata.infinite_loop = flags & 32;
      }
  
+   tree coro_actor = NULL_TREE;
+   tree coro_destroy = NULL_TREE;
+   tree coro_ramp = NULL_TREE;
+   if (DECL_COROUTINE_P (decl))
+     {
+       coro_ramp = tree_node ();
+       if (!coro_ramp)
+ 	{
+ 	  coro_actor = tree_node ();
+ 	  coro_destroy = tree_node ();
+ 	  if ((coro_actor == NULL_TREE) != (coro_destroy == NULL_TREE))
+ 	    set_overrun ();
+ 	}
+     }
+ 
    if (get_overrun ())
      return NULL_TREE;
  
*************** trees_in::read_function_def (tree decl,
*** 13100,13105 ****
--- 13201,13211 ----
        if (cexpr.decl)
  	register_constexpr_fundef (cexpr);
  
+       if (coro_ramp)
+ 	coro_set_ramp_function (decl, coro_ramp);
+       else if (coro_actor && coro_destroy)
+ 	coro_set_transform_functions (decl, coro_actor, coro_destroy);
+ 
        if (DECL_LOCAL_DECL_P (decl))
  	/* Block-scope OMP UDRs aren't real functions, and don't need a
  	   function structure to be allocated or to be expanded.  */
*************** module_state::read_cluster (unsigned snu
*** 17556,17561 ****
--- 17662,17668 ----
        cfun->language->returns_null = pdata.returns_null;
        cfun->language->returns_abnormally = pdata.returns_abnormally;
        cfun->language->infinite_loop = pdata.infinite_loop;
+       cfun->coroutine_component = DECL_COROUTINE_P (decl);
  
        /* Make sure we emit explicit instantiations.
  	 FIXME do we want to do this in expand_or_defer_fn instead?  */
*************** check_module_decl_linkage (tree decl)
*** 21945,21950 ****
--- 22052,22086 ----
      }
  }
  
+ /* Given a scope CTX, find the scope we want to attach the key to,
+    or NULL if no key scope is required.  */
+ 
+ static tree
+ adjust_key_scope (tree ctx)
+ {
+   /* For members, key it to the containing type to handle deduplication
+      correctly.  For fields, this is necessary as FIELD_DECLs have no
+      dep and so would only be streamed after the lambda type, defeating
+      our ability to merge them.
+ 
+      Other class-scope key decls might depend on the type of the lambda
+      but be within the same cluster; we need to ensure that we never
+      first see the key decl while streaming the lambda type as merging
+      would then fail when comparing the partially-streamed lambda type
+      of the key decl with the existing (PR c++/122310).
+ 
+      Perhaps sort_cluster can be adjusted to handle this better, but
+      this is a simple workaround (and might down on the number of
+      entries in keyed_table as a bonus).  */
+   while (!DECL_NAMESPACE_SCOPE_P (ctx))
+     if (DECL_CLASS_SCOPE_P (ctx))
+       ctx = TYPE_NAME (DECL_CONTEXT (ctx));
+     else
+       ctx = DECL_CONTEXT (ctx);
+ 
+   return ctx;
+ }
+ 
  /* DECL is keyed to CTX for odr purposes.  */
  
  void
*************** maybe_key_decl (tree ctx, tree decl)
*** 21953,21983 ****
    if (!modules_p ())
      return;
  
!   /* We only need to deal with lambdas attached to var, field,
!      parm, type, or concept decls.  */
    if (TREE_CODE (ctx) != VAR_DECL
        && TREE_CODE (ctx) != FIELD_DECL
        && TREE_CODE (ctx) != PARM_DECL
        && TREE_CODE (ctx) != TYPE_DECL
        && TREE_CODE (ctx) != CONCEPT_DECL)
      return;
  
!   /* For members, key it to the containing type to handle deduplication
!      correctly.  For fields, this is necessary as FIELD_DECLs have no
!      dep and so would only be streamed after the lambda type, defeating
!      our ability to merge them.
  
!      Other class-scope key decls might depend on the type of the lambda
!      but be within the same cluster; we need to ensure that we never
!      first see the key decl while streaming the lambda type as merging
!      would then fail when comparing the partially-streamed lambda type
!      of the key decl with the existing (PR c++/122310).
  
!      Perhaps sort_cluster can be adjusted to handle this better, but
!      this is a simple workaround (and might down on the number of
!      entries in keyed_table as a bonus).  */
!   while (DECL_CLASS_SCOPE_P (ctx))
!     ctx = TYPE_NAME (DECL_CONTEXT (ctx));
  
    if (!keyed_table)
      keyed_table = new keyed_map_t (EXPERIMENT (1, 400));
--- 22089,22119 ----
    if (!modules_p ())
      return;
  
!   /* We only need to deal here with decls attached to var, field,
!      parm, type, function, or concept decls.  */
    if (TREE_CODE (ctx) != VAR_DECL
        && TREE_CODE (ctx) != FIELD_DECL
        && TREE_CODE (ctx) != PARM_DECL
        && TREE_CODE (ctx) != TYPE_DECL
+       && TREE_CODE (ctx) != FUNCTION_DECL
        && TREE_CODE (ctx) != CONCEPT_DECL)
      return;
  
!   gcc_checking_assert (LAMBDA_TYPE_P (TREE_TYPE (decl))
! 		       || TREE_CODE (ctx) == FUNCTION_DECL);
  
!   /* We don't need to use the keyed map for functions with definitions,
!      as we can instead use the MK_local_type handling for streaming.  */
!   if (TREE_CODE (ctx) == FUNCTION_DECL
!       && (has_definition (ctx)
! 	  /* If we won't be streaming this definition there's also no
! 	     need to record the key, as it will not be useful for merging
! 	     (this function is non-inline and so a matching declaration
! 	     will always be an ODR violation anyway).  */
! 	  || !module_maybe_has_cmi_p ()))
!     return;
  
!   ctx = adjust_key_scope (ctx);
  
    if (!keyed_table)
      keyed_table = new keyed_map_t (EXPERIMENT (1, 400));
*************** maybe_key_decl (tree ctx, tree decl)
*** 21988,22003 ****
        retrofit_lang_decl (ctx);
        DECL_MODULE_KEYED_DECLS_P (ctx) = true;
      }
    vec.safe_push (decl);
  }
  
! /* Find the scope that the lambda DECL is keyed to, if any.  */
  
  static tree
  get_keyed_decl_scope (tree decl)
  {
!   gcc_checking_assert (LAMBDA_TYPE_P (TREE_TYPE (decl)));
!   tree scope = LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl));
    if (!scope)
      return NULL_TREE;
  
--- 22124,22146 ----
        retrofit_lang_decl (ctx);
        DECL_MODULE_KEYED_DECLS_P (ctx) = true;
      }
+   if (CHECKING_P)
+     for (tree t : vec)
+       gcc_checking_assert (t != decl);
+ 
    vec.safe_push (decl);
  }
  
! /* Find the scope that the local type or lambda DECL is keyed to, if any.  */
  
  static tree
  get_keyed_decl_scope (tree decl)
  {
!   gcc_checking_assert (DECL_IMPLICIT_TYPEDEF_P (STRIP_TEMPLATE (decl)));
! 
!   tree scope = (LAMBDA_TYPE_P (TREE_TYPE (decl))
! 		? LAMBDA_TYPE_EXTRA_SCOPE (TREE_TYPE (decl))
! 		: CP_DECL_CONTEXT (decl));
    if (!scope)
      return NULL_TREE;
  
*************** get_keyed_decl_scope (tree decl)
*** 22005,22016 ****
  		       || TREE_CODE (scope) == FIELD_DECL
  		       || TREE_CODE (scope) == PARM_DECL
  		       || TREE_CODE (scope) == TYPE_DECL
  		       || TREE_CODE (scope) == CONCEPT_DECL);
  
!   while (DECL_CLASS_SCOPE_P (scope))
!     scope = TYPE_NAME (DECL_CONTEXT (scope));
  
!   gcc_checking_assert (DECL_LANG_SPECIFIC (scope)
  		       && DECL_MODULE_KEYED_DECLS_P (scope));
    return scope;
  }
--- 22148,22161 ----
  		       || TREE_CODE (scope) == FIELD_DECL
  		       || TREE_CODE (scope) == PARM_DECL
  		       || TREE_CODE (scope) == TYPE_DECL
+ 		       || (TREE_CODE (scope) == FUNCTION_DECL
+ 			   && !has_definition (scope))
  		       || TREE_CODE (scope) == CONCEPT_DECL);
  
!   scope = adjust_key_scope (scope);
  
!   gcc_checking_assert (scope
! 		       && DECL_LANG_SPECIFIC (scope)
  		       && DECL_MODULE_KEYED_DECLS_P (scope));
    return scope;
  }
diff -Nrcpad gcc-16-20260111/gcc/cp/name-lookup.cc gcc-16-20260118/gcc/cp/name-lookup.cc
*** gcc-16-20260111/gcc/cp/name-lookup.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/name-lookup.cc	Sun Jan 18 22:32:07 2026
*************** name_lookup::adl_type (tree type)
*** 1583,1588 ****
--- 1583,1595 ----
        adl_type (TYPE_PTRMEM_POINTED_TO_TYPE (type));
        return;
      }
+   else if (REFLECTION_TYPE_P (type))
+     {
+       /* The namespace std::meta is an associated namespace of
+ 	 std::meta::info.  */
+       adl_namespace (std_meta_node);
+       return;
+     }
  
    switch (TREE_CODE (type))
      {
*************** strip_using_decl (tree decl)
*** 2765,2771 ****
    if (decl == NULL_TREE)
      return NULL_TREE;
  
!   while (TREE_CODE (decl) == USING_DECL && !DECL_DEPENDENT_P (decl))
      decl = USING_DECL_DECLS (decl);
  
    if (TREE_CODE (decl) == USING_DECL && DECL_DEPENDENT_P (decl)
--- 2772,2781 ----
    if (decl == NULL_TREE)
      return NULL_TREE;
  
!   while (TREE_CODE (decl) == USING_DECL
! 	 && !DECL_DEPENDENT_P (decl)
! 	 && (LIKELY (!cp_preserve_using_decl)
! 	     || TREE_CODE (USING_DECL_DECLS (decl)) == NAMESPACE_DECL))
      decl = USING_DECL_DECLS (decl);
  
    if (TREE_CODE (decl) == USING_DECL && DECL_DEPENDENT_P (decl)
*************** lookup_using_decl (tree scope, name_look
*** 6336,6342 ****
      {
        auto_diagnostic_group d;
        error ("reference to %qD is ambiguous", lookup.name);
!       print_candidates (TREE_CODE (lookup.value) == TREE_LIST
  			? lookup.value : lookup.type);
        return NULL_TREE;
      }
--- 6346,6353 ----
      {
        auto_diagnostic_group d;
        error ("reference to %qD is ambiguous", lookup.name);
!       print_candidates (input_location,
! 			TREE_CODE (lookup.value) == TREE_LIST
  			? lookup.value : lookup.type);
        return NULL_TREE;
      }
*************** set_decl_namespace (tree decl, tree scop
*** 6469,6475 ****
        auto_diagnostic_group d;
        DECL_CONTEXT (decl) = FROB_CONTEXT (scope);
        error ("reference to %qD is ambiguous", decl);
!       print_candidates (old);
        return;
      }
  
--- 6480,6486 ----
        auto_diagnostic_group d;
        DECL_CONTEXT (decl) = FROB_CONTEXT (scope);
        error ("reference to %qD is ambiguous", decl);
!       print_candidates (input_location, old);
        return;
      }
  
*************** handle_namespace_attrs (tree ns, tree at
*** 6682,6687 ****
--- 6693,6707 ----
  	    DECL_ATTRIBUTES (ns) = tree_cons (name, args,
  					      DECL_ATTRIBUTES (ns));
  	}
+       else if (annotation_p (d))
+ 	{
+ 	  const attribute_spec *as = lookup_attribute_spec (TREE_PURPOSE (d));
+ 	  bool no_add_attrs = false;
+ 	  as->handler (&ns, name, args, 0, &no_add_attrs);
+ 	  if (!no_add_attrs)
+ 	    DECL_ATTRIBUTES (ns) = tree_cons (TREE_PURPOSE (d), args,
+ 					      DECL_ATTRIBUTES (ns));
+ 	}
        else if (!attribute_ignored_p (d))
  	{
  	  warning (OPT_Wattributes, "%qD attribute directive ignored",
*************** do_namespace_alias (location_t loc, tree
*** 6719,6727 ****
    if (name_space == error_mark_node)
      return;
  
!   gcc_assert (TREE_CODE (name_space) == NAMESPACE_DECL);
! 
!   name_space = ORIGINAL_NAMESPACE (name_space);
  
    /* Build the alias.  */
    alias = build_lang_decl_loc (loc, NAMESPACE_DECL, alias, void_type_node);
--- 6739,6748 ----
    if (name_space == error_mark_node)
      return;
  
!   if (TREE_CODE (name_space) == NAMESPACE_DECL)
!     name_space = ORIGINAL_NAMESPACE (name_space);
!   else
!     gcc_assert (TREE_CODE (name_space) == SPLICE_EXPR);
  
    /* Build the alias.  */
    alias = build_lang_decl_loc (loc, NAMESPACE_DECL, alias, void_type_node);
*************** lookup_qualified_name (tree scope, tree
*** 7531,7537 ****
  
  	  /* If we have a known type overload, pull it out.  This can happen
  	     for using decls.  */
! 	  if (TREE_CODE (t) == OVERLOAD && TREE_TYPE (t) != unknown_type_node)
  	    t = OVL_FUNCTION (t);
  	}
      }
--- 7552,7560 ----
  
  	  /* If we have a known type overload, pull it out.  This can happen
  	     for using decls.  */
! 	  if (TREE_CODE (t) == OVERLOAD
! 	      && TREE_TYPE (t) != unknown_type_node
! 	      && LIKELY (!cp_preserve_using_decl))
  	    t = OVL_FUNCTION (t);
  	}
      }
*************** binding_to_template_parms_of_scope_p (cx
*** 8004,8009 ****
--- 8027,8033 ----
    /* The template of the current scope, iff said scope is a primary
       template.  */
    tmpl = (tinfo
+ 	  && TREE_CODE (TI_TEMPLATE (tinfo)) == TEMPLATE_DECL
  	  && PRIMARY_TEMPLATE_P (TI_TEMPLATE (tinfo))
  	  ? TI_TEMPLATE (tinfo)
  	  : NULL_TREE);
*************** finish_using_directive (tree target, tre
*** 9153,9158 ****
--- 9177,9184 ----
  		diagnosed = true;
  	      }
  	  }
+ 	else if (annotation_p (a))
+ 	  error ("annotation on using directive");
  	else if (!attribute_ignored_p (a))
  	  warning (OPT_Wattributes, "%qD attribute directive ignored", name);
        }
*************** push_namespace (tree name, bool make_inl
*** 9366,9372 ****
  	if (TREE_CHAIN (lookup.value))
  	  {
  	    error ("%<namespace %E%> is ambiguous", name);
! 	    print_candidates (lookup.value);
  	  }
        }
      else if (TREE_CODE (lookup.value) == NAMESPACE_DECL)
--- 9392,9398 ----
  	if (TREE_CHAIN (lookup.value))
  	  {
  	    error ("%<namespace %E%> is ambiguous", name);
! 	    print_candidates (input_location, lookup.value);
  	  }
        }
      else if (TREE_CODE (lookup.value) == NAMESPACE_DECL)
diff -Nrcpad gcc-16-20260111/gcc/cp/operators.def gcc-16-20260118/gcc/cp/operators.def
*** gcc-16-20260111/gcc/cp/operators.def	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/operators.def	Sun Jan 18 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 50,55 ****
--- 50,61 ----
       ovl_op_flags bits.  Postincrement and postdecrement operators are
       marked as binary.
  
+    META_NAME
+ 
+      The name of std::meta::operators enumerator corresponding to the
+      operator, without the "op_" prefix or NULL if there is no
+      corresponding enumerator.
+ 
     Before including this file, you should define DEF_OPERATOR
     to take these arguments.
  
*************** along with GCC; see the file COPYING3.
*** 63,145 ****
     FLAGS (OVL_OP_FLAG_BINARY).  */
  
  #ifndef DEF_ASSN_OPERATOR
! #define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING) \
!   DEF_OPERATOR(NAME, CODE, MANGLING, OVL_OP_FLAG_BINARY)
  #endif
  
  /* Memory allocation operators.  ARITY has special meaning. */
! DEF_OPERATOR ("new", NEW_EXPR, "nw", OVL_OP_FLAG_ALLOC)
  DEF_OPERATOR ("new []", VEC_NEW_EXPR, "na",
! 	      OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_VEC)
  DEF_OPERATOR ("delete", DELETE_EXPR, "dl",
! 	      OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE)
  DEF_OPERATOR ("delete []", VEC_DELETE_EXPR, "da",
! 	      OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE | OVL_OP_FLAG_VEC)
  
  /* Unary operators.  */
! DEF_OPERATOR ("+", UNARY_PLUS_EXPR, "ps", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("-", NEGATE_EXPR, "ng", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("&", ADDR_EXPR, "ad", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("*", INDIRECT_REF, "de", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("~", BIT_NOT_EXPR, "co", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("!", TRUTH_NOT_EXPR, "nt", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("++", PREINCREMENT_EXPR, "pp", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("--", PREDECREMENT_EXPR, "mm", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("->", COMPONENT_REF, "pt", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("sizeof", SIZEOF_EXPR, "sz", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("co_await", CO_AWAIT_EXPR, "aw", OVL_OP_FLAG_UNARY)
  
  /* These are extensions.  */
! DEF_OPERATOR ("alignof", ALIGNOF_EXPR, "az", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("__imag__", IMAGPART_EXPR, "v18__imag__", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR ("__real__", REALPART_EXPR, "v18__real__", OVL_OP_FLAG_UNARY)
  
  /* Binary operators.  */
! DEF_OPERATOR ("+", PLUS_EXPR, "pl", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("-", MINUS_EXPR, "mi", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("*", MULT_EXPR, "ml", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("/", TRUNC_DIV_EXPR, "dv", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("%", TRUNC_MOD_EXPR, "rm", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("&", BIT_AND_EXPR, "an", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("|", BIT_IOR_EXPR, "or", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("^", BIT_XOR_EXPR, "eo", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("<<", LSHIFT_EXPR, "ls", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR (">>", RSHIFT_EXPR, "rs", OVL_OP_FLAG_BINARY)
  
  /* defaultable_fn_check relies on the ordering of the comparison operators.  */
! DEF_OPERATOR ("==", EQ_EXPR, "eq", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("!=", NE_EXPR, "ne", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("<", LT_EXPR, "lt", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR (">", GT_EXPR, "gt", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("<=", LE_EXPR, "le", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR (">=", GE_EXPR, "ge", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("<=>", SPACESHIP_EXPR, "ss", OVL_OP_FLAG_BINARY)
  
! DEF_OPERATOR ("&&", TRUTH_ANDIF_EXPR, "aa", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("||", TRUTH_ORIF_EXPR, "oo", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR (",", COMPOUND_EXPR, "cm", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("->*", MEMBER_REF, "pm", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR (".*", DOTSTAR_EXPR, "ds", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("[]", ARRAY_REF, "ix", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", OVL_OP_FLAG_BINARY)
! DEF_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", OVL_OP_FLAG_BINARY)
  
  /* Miscellaneous.  */
! DEF_OPERATOR ("?:", COND_EXPR, "qu", OVL_OP_FLAG_NONE)
! DEF_OPERATOR ("()", CALL_EXPR, "cl", OVL_OP_FLAG_NONE)
  
  /* Operators needed for mangling.  */
! DEF_OPERATOR (NULL, CAST_EXPR, "cv", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR (NULL, DYNAMIC_CAST_EXPR, "dc", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR (NULL, REINTERPRET_CAST_EXPR, "rc", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR (NULL, CONST_CAST_EXPR, "cc", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR (NULL, STATIC_CAST_EXPR, "sc", OVL_OP_FLAG_UNARY)
! DEF_OPERATOR (NULL, SCOPE_REF, "sr", OVL_OP_FLAG_NONE)
! DEF_OPERATOR (NULL, EXPR_PACK_EXPANSION, "sp", OVL_OP_FLAG_NONE)
! DEF_OPERATOR (NULL, UNARY_LEFT_FOLD_EXPR, "fl", OVL_OP_FLAG_NONE)
! DEF_OPERATOR (NULL, UNARY_RIGHT_FOLD_EXPR, "fr", OVL_OP_FLAG_NONE)
! DEF_OPERATOR (NULL, BINARY_LEFT_FOLD_EXPR, "fL", OVL_OP_FLAG_NONE)
! DEF_OPERATOR (NULL, BINARY_RIGHT_FOLD_EXPR, "fR", OVL_OP_FLAG_NONE)
  
  #ifdef OPERATOR_TRANSITION
  OPERATOR_TRANSITION
--- 69,156 ----
     FLAGS (OVL_OP_FLAG_BINARY).  */
  
  #ifndef DEF_ASSN_OPERATOR
! #define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING, META) \
!   DEF_OPERATOR(NAME, CODE, MANGLING, OVL_OP_FLAG_BINARY, META)
  #endif
  
  /* Memory allocation operators.  ARITY has special meaning. */
! DEF_OPERATOR ("new", NEW_EXPR, "nw", OVL_OP_FLAG_ALLOC, "new")
  DEF_OPERATOR ("new []", VEC_NEW_EXPR, "na",
! 	      OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_VEC, "array_new")
  DEF_OPERATOR ("delete", DELETE_EXPR, "dl",
! 	      OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE, "delete")
  DEF_OPERATOR ("delete []", VEC_DELETE_EXPR, "da",
! 	      OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE
! 	      | OVL_OP_FLAG_VEC, "array_delete")
  
  /* Unary operators.  */
! DEF_OPERATOR ("+", UNARY_PLUS_EXPR, "ps", OVL_OP_FLAG_UNARY, "plus")
! DEF_OPERATOR ("-", NEGATE_EXPR, "ng", OVL_OP_FLAG_UNARY, "minus")
! DEF_OPERATOR ("&", ADDR_EXPR, "ad", OVL_OP_FLAG_UNARY, "ampersand")
! DEF_OPERATOR ("*", INDIRECT_REF, "de", OVL_OP_FLAG_UNARY, "star")
! DEF_OPERATOR ("~", BIT_NOT_EXPR, "co", OVL_OP_FLAG_UNARY, "tilde")
! DEF_OPERATOR ("!", TRUTH_NOT_EXPR, "nt", OVL_OP_FLAG_UNARY, "exclamation")
! DEF_OPERATOR ("++", PREINCREMENT_EXPR, "pp", OVL_OP_FLAG_UNARY, "plus_plus")
! DEF_OPERATOR ("--", PREDECREMENT_EXPR, "mm", OVL_OP_FLAG_UNARY, "minus_minus")
! DEF_OPERATOR ("->", COMPONENT_REF, "pt", OVL_OP_FLAG_UNARY, "arrow")
! DEF_OPERATOR ("sizeof", SIZEOF_EXPR, "sz", OVL_OP_FLAG_UNARY, NULL)
! DEF_OPERATOR ("co_await", CO_AWAIT_EXPR, "aw", OVL_OP_FLAG_UNARY, "co_await")
  
  /* These are extensions.  */
! DEF_OPERATOR ("alignof", ALIGNOF_EXPR, "az", OVL_OP_FLAG_UNARY, NULL)
! DEF_OPERATOR ("__imag__", IMAGPART_EXPR, "v18__imag__", OVL_OP_FLAG_UNARY,
! 	      NULL)
! DEF_OPERATOR ("__real__", REALPART_EXPR, "v18__real__", OVL_OP_FLAG_UNARY,
! 	      NULL)
  
  /* Binary operators.  */
! DEF_OPERATOR ("+", PLUS_EXPR, "pl", OVL_OP_FLAG_BINARY, "plus")
! DEF_OPERATOR ("-", MINUS_EXPR, "mi", OVL_OP_FLAG_BINARY, "minus")
! DEF_OPERATOR ("*", MULT_EXPR, "ml", OVL_OP_FLAG_BINARY, "star")
! DEF_OPERATOR ("/", TRUNC_DIV_EXPR, "dv", OVL_OP_FLAG_BINARY, "slash")
! DEF_OPERATOR ("%", TRUNC_MOD_EXPR, "rm", OVL_OP_FLAG_BINARY, "percent")
! DEF_OPERATOR ("&", BIT_AND_EXPR, "an", OVL_OP_FLAG_BINARY, "ampersand")
! DEF_OPERATOR ("|", BIT_IOR_EXPR, "or", OVL_OP_FLAG_BINARY, "pipe")
! DEF_OPERATOR ("^", BIT_XOR_EXPR, "eo", OVL_OP_FLAG_BINARY, "caret")
! DEF_OPERATOR ("<<", LSHIFT_EXPR, "ls", OVL_OP_FLAG_BINARY, "less_less")
! DEF_OPERATOR (">>", RSHIFT_EXPR, "rs", OVL_OP_FLAG_BINARY, "greater_greater")
  
  /* defaultable_fn_check relies on the ordering of the comparison operators.  */
! DEF_OPERATOR ("==", EQ_EXPR, "eq", OVL_OP_FLAG_BINARY, "equals_equals")
! DEF_OPERATOR ("!=", NE_EXPR, "ne", OVL_OP_FLAG_BINARY, "exclamation_equals")
! DEF_OPERATOR ("<", LT_EXPR, "lt", OVL_OP_FLAG_BINARY, "less")
! DEF_OPERATOR (">", GT_EXPR, "gt", OVL_OP_FLAG_BINARY, "greater")
! DEF_OPERATOR ("<=", LE_EXPR, "le", OVL_OP_FLAG_BINARY, "less_equals")
! DEF_OPERATOR (">=", GE_EXPR, "ge", OVL_OP_FLAG_BINARY, "greater_equals")
! DEF_OPERATOR ("<=>", SPACESHIP_EXPR, "ss", OVL_OP_FLAG_BINARY, "spaceship")
  
! DEF_OPERATOR ("&&", TRUTH_ANDIF_EXPR, "aa", OVL_OP_FLAG_BINARY,
! 	      "ampersand_ampersand")
! DEF_OPERATOR ("||", TRUTH_ORIF_EXPR, "oo", OVL_OP_FLAG_BINARY, "pipe_pipe")
! DEF_OPERATOR (",", COMPOUND_EXPR, "cm", OVL_OP_FLAG_BINARY, "comma")
! DEF_OPERATOR ("->*", MEMBER_REF, "pm", OVL_OP_FLAG_BINARY, "arrow_star")
! DEF_OPERATOR (".*", DOTSTAR_EXPR, "ds", OVL_OP_FLAG_BINARY, NULL)
! DEF_OPERATOR ("[]", ARRAY_REF, "ix", OVL_OP_FLAG_BINARY, "square_brackets")
! DEF_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", OVL_OP_FLAG_BINARY, "plus_plus")
! DEF_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", OVL_OP_FLAG_BINARY,
! 	      "minus_minus")
  
  /* Miscellaneous.  */
! DEF_OPERATOR ("?:", COND_EXPR, "qu", OVL_OP_FLAG_NONE, NULL)
! DEF_OPERATOR ("()", CALL_EXPR, "cl", OVL_OP_FLAG_NONE, "parentheses")
  
  /* Operators needed for mangling.  */
! DEF_OPERATOR (NULL, CAST_EXPR, "cv", OVL_OP_FLAG_UNARY, NULL)
! DEF_OPERATOR (NULL, DYNAMIC_CAST_EXPR, "dc", OVL_OP_FLAG_UNARY, NULL)
! DEF_OPERATOR (NULL, REINTERPRET_CAST_EXPR, "rc", OVL_OP_FLAG_UNARY, NULL)
! DEF_OPERATOR (NULL, CONST_CAST_EXPR, "cc", OVL_OP_FLAG_UNARY, NULL)
! DEF_OPERATOR (NULL, STATIC_CAST_EXPR, "sc", OVL_OP_FLAG_UNARY, NULL)
! DEF_OPERATOR (NULL, SCOPE_REF, "sr", OVL_OP_FLAG_NONE, NULL)
! DEF_OPERATOR (NULL, EXPR_PACK_EXPANSION, "sp", OVL_OP_FLAG_NONE, NULL)
! DEF_OPERATOR (NULL, UNARY_LEFT_FOLD_EXPR, "fl", OVL_OP_FLAG_NONE, NULL)
! DEF_OPERATOR (NULL, UNARY_RIGHT_FOLD_EXPR, "fr", OVL_OP_FLAG_NONE, NULL)
! DEF_OPERATOR (NULL, BINARY_LEFT_FOLD_EXPR, "fL", OVL_OP_FLAG_NONE, NULL)
! DEF_OPERATOR (NULL, BINARY_RIGHT_FOLD_EXPR, "fR", OVL_OP_FLAG_NONE, NULL)
  
  #ifdef OPERATOR_TRANSITION
  OPERATOR_TRANSITION
*************** OPERATOR_TRANSITION
*** 147,163 ****
  #endif
  
  /* Assignment operators.  */
! DEF_ASSN_OPERATOR ("=", NOP_EXPR, "aS")
! DEF_ASSN_OPERATOR ("+=", PLUS_EXPR, "pL")
! DEF_ASSN_OPERATOR ("-=", MINUS_EXPR, "mI")
! DEF_ASSN_OPERATOR ("*=", MULT_EXPR, "mL")
! DEF_ASSN_OPERATOR ("/=", TRUNC_DIV_EXPR, "dV")
! DEF_ASSN_OPERATOR ("%=", TRUNC_MOD_EXPR, "rM")
! DEF_ASSN_OPERATOR ("&=", BIT_AND_EXPR, "aN")
! DEF_ASSN_OPERATOR ("|=", BIT_IOR_EXPR, "oR")
! DEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO")
! DEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS")
! DEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS")
  
  #undef DEF_ASSN_OPERATOR
  #undef DEF_OPERATOR
--- 158,174 ----
  #endif
  
  /* Assignment operators.  */
! DEF_ASSN_OPERATOR ("=", NOP_EXPR, "aS", "equals")
! DEF_ASSN_OPERATOR ("+=", PLUS_EXPR, "pL", "plus_equals")
! DEF_ASSN_OPERATOR ("-=", MINUS_EXPR, "mI", "minus_equals")
! DEF_ASSN_OPERATOR ("*=", MULT_EXPR, "mL", "star_equals")
! DEF_ASSN_OPERATOR ("/=", TRUNC_DIV_EXPR, "dV", "slash_equals")
! DEF_ASSN_OPERATOR ("%=", TRUNC_MOD_EXPR, "rM", "percent_equals")
! DEF_ASSN_OPERATOR ("&=", BIT_AND_EXPR, "aN", "ampersand_equals")
! DEF_ASSN_OPERATOR ("|=", BIT_IOR_EXPR, "oR", "pipe_equals")
! DEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO", "caret_equals")
! DEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS", "less_less_equals")
! DEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS", "greater_greater_equals")
  
  #undef DEF_ASSN_OPERATOR
  #undef DEF_OPERATOR
diff -Nrcpad gcc-16-20260111/gcc/cp/parser.cc gcc-16-20260118/gcc/cp/parser.cc
*** gcc-16-20260111/gcc/cp/parser.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/parser.cc	Sun Jan 18 22:32:07 2026
*************** enum required_token {
*** 152,157 ****
--- 152,158 ----
    RT_COMMA_CLOSE_PAREN, /* ',' or ')' */
    RT_PRAGMA_EOL, /* end of line */
    RT_NAME, /* identifier */
+   RT_CLOSE_SPLICE, /* ':]' */
  
    /* The type is CPP_KEYWORD */
    RT_NEW, /* new */
*************** static FILE *cp_lexer_debug_stream;
*** 292,297 ****
--- 293,302 ----
     sizeof, typeof, or alignof.  */
  int cp_unevaluated_operand;
  
+ /* Nonzero if we are parsing a reflect-expression and shouldn't strip
+    using-declarations.  */
+ bool cp_preserve_using_decl;
+ 
  #if ENABLE_ANALYZER
  
  namespace ana {
*************** static tree cp_parser_template_type_arg
*** 2754,2760 ****
    (cp_parser *);
  static tree cp_parser_trailing_type_id (cp_parser *);
  static tree cp_parser_type_id_1
!   (cp_parser *, cp_parser_flags, bool, bool, location_t *);
  static void cp_parser_type_specifier_seq
    (cp_parser *, cp_parser_flags, bool, bool, cp_decl_specifier_seq *);
  static tree cp_parser_parameter_declaration_clause
--- 2759,2765 ----
    (cp_parser *);
  static tree cp_parser_trailing_type_id (cp_parser *);
  static tree cp_parser_type_id_1
!   (cp_parser *, cp_parser_flags, bool, bool, location_t *, bool *);
  static void cp_parser_type_specifier_seq
    (cp_parser *, cp_parser_flags, bool, bool, cp_decl_specifier_seq *);
  static tree cp_parser_parameter_declaration_clause
*************** static tree cp_parser_template_parameter
*** 2855,2861 ****
  static tree cp_parser_type_parameter
    (cp_parser *, bool *);
  static tree cp_parser_template_id
!   (cp_parser *, bool, bool, enum tag_types, bool);
  static tree cp_parser_template_id_expr
    (cp_parser *, bool, bool, bool);
  static tree cp_parser_template_name
--- 2860,2866 ----
  static tree cp_parser_type_parameter
    (cp_parser *, bool *);
  static tree cp_parser_template_id
!   (cp_parser *, bool, bool, enum tag_types, bool, tree = NULL_TREE);
  static tree cp_parser_template_id_expr
    (cp_parser *, bool, bool, bool);
  static tree cp_parser_template_name
*************** get_required_cpp_ttype (required_token t
*** 3346,3351 ****
--- 3351,3358 ----
        return CPP_COLON;
      case RT_CLOSE_PAREN:
        return CPP_CLOSE_PAREN;
+     case RT_CLOSE_SPLICE:
+       return CPP_CLOSE_SPLICE;
  
      default:
        /* Use CPP_EOF as a "no completions possible" code.  */
*************** cp_parser_pack_index (cp_parser *parser,
*** 6058,6063 ****
--- 6065,6507 ----
    return make_pack_index (pack, index);
  }
  
+ /* Return true iff the next tokens start a splice-type-specifier.
+    If REQUIRE_TYPENAME_P, we only return true if there is a preceding
+    typename keyword.  */
+ 
+ static bool
+ cp_parser_next_tokens_start_splice_type_spec_p (cp_parser *parser,
+ 						bool require_typename_p)
+ {
+   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SPLICE))
+     return !require_typename_p;
+   return (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME)
+ 	  && cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_SPLICE));
+ }
+ 
+ /* Return true iff the next tokens start a splice-scope-specifier.  */
+ 
+ static bool
+ cp_parser_next_tokens_can_start_splice_scope_spec_p (cp_parser *parser)
+ {
+   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SPLICE))
+     return true;
+   return (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE)
+ 	  && cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_SPLICE));
+ }
+ 
+ /* Parse a splice-specifier.
+ 
+    splice-specifier:
+      [: constant-expression :]
+ 
+     splice-specialization-specifier:
+       splice-specifier < template-argument-list[opt] >
+ 
+    TEMPLATE_P is true if we've parsed the leading template keyword.
+    TARGS_P is set to true if there is a splice-specialization-specifier.  */
+ 
+ static cp_expr
+ cp_parser_splice_specifier (cp_parser *parser, bool template_p = false,
+ 			    bool *targs_p = nullptr)
+ {
+   /* Get the location of the '[:'.  */
+   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
+ 
+   /* Consume the '[:'.  */
+   cp_lexer_consume_token (parser->lexer);
+ 
+   /* Get the location of the operand.  */
+   location_t caret_loc = cp_lexer_peek_token (parser->lexer)->location;
+ 
+   if (!flag_reflection)
+     {
+       error_at (caret_loc,
+ 		"reflection is only available with %<-freflection%>");
+       return error_mark_node;
+     }
+ 
+   tree object_type = parser->context->object_type;
+   /* Clear parser->context->object_type.  E.g.,
+      struct A { static int x; };
+      int q = A ().[: ^^x :];
+      should be an error -- x is not a member-qualified name and isn't
+      in scope.  */
+   parser->context->object_type = NULL;
+   tree expr = cp_parser_constant_expression (parser,
+ 					     /*allow_non_constant_p=*/false,
+ 					     /*non_constant_p=*/nullptr,
+ 					     /*strict_p=*/true);
+ 
+   /* Get the location of the ':]'.  */
+   location_t finish_loc = cp_lexer_peek_token (parser->lexer)->location;
+ 
+   /* Consume the ':]'.  */
+   if (!cp_parser_require (parser, CPP_CLOSE_SPLICE, RT_CLOSE_SPLICE))
+     return error_mark_node;
+ 
+   /* Get the reflected operand.  */
+   expr = splice (expr);
+ 
+   /* If the next token is a '<', it's a splice-specialization-specifier.  */
+   if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
+     {
+       /* For member access splice-specialization-specifier, try to wrap
+ 	 non-dependent splice for function template into a BASELINK so
+ 	 that cp_parser_template_id can handle it.  */
+       if (object_type
+ 	  && DECL_FUNCTION_TEMPLATE_P (OVL_FIRST (expr))
+ 	  && !dependent_type_p (object_type))
+ 	{
+ 	  tree scope = DECL_CONTEXT (OVL_FIRST (expr));
+ 	  if (scope && CLASS_TYPE_P (scope))
+ 	    {
+ 	      tree access_path = lookup_base (object_type, scope, ba_unique,
+ 					      NULL, tf_warning_or_error);
+ 	      if (access_path == error_mark_node)
+ 		expr = error_mark_node;
+ 	      else
+ 		expr
+ 		  = build_baselink (access_path, TYPE_BINFO (object_type),
+ 				    expr,
+ 				    IDENTIFIER_CONV_OP_P (OVL_NAME (expr))
+ 				    ? TREE_TYPE (OVL_NAME (expr)) : NULL_TREE);
+ 	    }
+ 	}
+       /* Let cp_parser_template_id parse the template arguments.  */
+       expr = cp_parser_template_id (parser, template_p,
+ 				    /*check_dependency_p=*/true,
+ 				    /*tag_type=*/none_type,
+ 				    /*is_declaration=*/false,
+ 				    expr);
+       if (targs_p)
+ 	*targs_p = true;
+     }
+ 
+   return cp_expr (expr, make_location (caret_loc, start_loc, finish_loc));
+ }
+ 
+ /* Parse a splice-type-specifier.
+ 
+    splice-type-specifier:
+      typename[opt] splice-specifier
+      typename[opt] splice-specialization-specifier
+ 
+  */
+ 
+ static tree
+ cp_parser_splice_type_specifier (cp_parser *parser)
+ {
+   /* Consume the optional typename.  */
+   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
+     cp_lexer_consume_token (parser->lexer);
+ 
+   cp_expr expr = cp_parser_splice_specifier (parser);
+   const location_t loc = (expr != error_mark_node
+ 			  ? expr.get_location () : input_location);
+   tree type = expr.get_value ();
+ 
+   if (TREE_CODE (type) == TYPE_DECL)
+     type = TREE_TYPE (type);
+ 
+   /* When we see [:T:] or [:T:]<arg> we don't know what it'll turn out
+      to be.  */
+   if (dependent_splice_p (type))
+     return make_splice_scope (type, /*type_p=*/true);
+ 
+   if (!valid_splice_type_p (type))
+     {
+       if (!cp_parser_simulate_error (parser))
+ 	error_at (loc, "reflection %qE not usable in a splice type", type);
+       type = NULL_TREE;
+     }
+ 
+   return type;
+ }
+ 
+ /* Parse a splice-expression.
+ 
+    splice-expression:
+      splice-specifier
+      template splice-specifier
+      template splice-specialization-specifier
+ 
+    TEMPLATE_P is true if we've parsed the leading template keyword.
+    ADDRESS_P is true if we are taking the address of the splice.
+    TEMPLATE_ARG_P is true iff this splice is a template argument.
+    MEMBER_ACCESS_P is true if this splice is used in foo.[: bar :] or
+    foo->[: bar :] context.  */
+ 
+ static tree
+ cp_parser_splice_expression (cp_parser *parser, bool template_p,
+ 			     bool address_p, bool template_arg_p,
+ 			     bool member_access_p, cp_id_kind *idk)
+ {
+   bool targs_p = false;
+ 
+   /* E.g., [: X::x :] is a separate lookup and we shouldn't take into
+      account any previous scopes.  */
+   parser->scope = NULL_TREE;
+   parser->object_scope = NULL_TREE;
+   parser->qualifying_scope = NULL_TREE;
+ 
+   cp_expr expr = cp_parser_splice_specifier (parser, template_p, &targs_p);
+ 
+   /* And don't leave the scopes set, either.  */
+   parser->scope = NULL_TREE;
+   parser->object_scope = NULL_TREE;
+   parser->qualifying_scope = NULL_TREE;
+ 
+   const location_t loc = expr.get_location ();
+   tree t = expr.get_value ();
+   STRIP_ANY_LOCATION_WRAPPER (t);
+   tree unresolved = t;
+   t = MAYBE_BASELINK_FUNCTIONS (t);
+   t = resolve_nondeduced_context (t, tf_warning_or_error);
+ 
+   if (dependent_splice_p (t))
+     {
+       SET_SPLICE_EXPR_EXPRESSION_P (t);
+       SET_SPLICE_EXPR_MEMBER_ACCESS_P (t, member_access_p);
+       SET_SPLICE_EXPR_ADDRESS_P (t, address_p);
+     }
+ 
+   if (error_operand_p (t))
+     {
+       gcc_assert (seen_error ());
+       return error_mark_node;
+     }
+ 
+   if (template_p)
+     {
+       /* [expr.prim.splice] For a splice-expression of the form template
+ 	 splice-specifier, the splice-specifier shall designate a function
+ 	 template.  */
+       if (!targs_p)
+ 	{
+ 	  if (!really_overloaded_fn (t) && !dependent_splice_p (t))
+ 	    {
+ 	      auto_diagnostic_group d;
+ 	      error_at (loc, "reflection %qE not usable in a template splice",
+ 			t);
+ 	      inform (loc, "only function templates are allowed here");
+ 	      return error_mark_node;
+ 	    }
+ 	}
+       /* [expr.prim.splice] For a splice-expression of the form
+ 	 template splice-specialization-specifier, the splice-specifier of the
+ 	 splice-specialization-specifier shall designate a template.  */
+       else
+ 	{
+ 	  if (really_overloaded_fn (t)
+ 	      || get_template_info (t)
+ 	      || TREE_CODE (t) == TEMPLATE_ID_EXPR)
+ 	    /* OK */;
+ 	  else
+ 	    {
+ 	      auto_diagnostic_group d;
+ 	      error_at (loc, "reflection %qE not usable in a template splice",
+ 			t);
+ 	      inform (loc, "only templates are allowed here");
+ 	      return error_mark_node;
+ 	    }
+ 	}
+     }
+   else if (/* No 'template' but there were template arguments?  */
+ 	   targs_p
+ 	   /* No 'template' but the splice-specifier designates a template?  */
+ 	   || really_overloaded_fn (t))
+     {
+       auto_diagnostic_group d;
+       if (targs_p)
+ 	error_at (loc, "reflection %qE not usable in a splice expression with "
+ 		  "template arguments", t);
+       else
+ 	error_at (loc, "reflection %qE not usable in a splice expression", t);
+       location_t sloc = expr.get_start ();
+       rich_location richloc (line_table, sloc);
+       richloc.add_fixit_insert_before (sloc, "template ");
+       inform (&richloc, "add %<template%> to denote a template");
+       return error_mark_node;
+     }
+ 
+   if (parser->in_template_argument_list_p
+       && !parser->greater_than_is_operator_p)
+     {
+       error_at (loc, "unparenthesized splice expression cannot be used as "
+ 		"a template argument");
+       return error_mark_node;
+     }
+ 
+   /* Make sure this splice-expression produces an expression.  */
+   if (!check_splice_expr (loc, expr.get_start (), t, address_p,
+ 			  member_access_p, /*complain=*/true))
+     return error_mark_node;
+ 
+   /* When doing foo.[: bar :], cp_parser_postfix_dot_deref_expression wants
+      to see an identifier or a TEMPLATE_ID_EXPR, if we have something like
+      s.template [: ^^S::var :]<int> where S::var is a variable template.  */
+   if (member_access_p)
+     {
+       /* Grab the unresolved expression then.  */
+       t = unresolved;
+       gcc_assert (TREE_CODE (t) == FIELD_DECL
+ 		  || VAR_P (t)
+ 		  || TREE_CODE (t) == CONST_DECL
+ 		  || TREE_CODE (t) == FUNCTION_DECL
+ 		  || DECL_FUNCTION_TEMPLATE_P (OVL_FIRST (t))
+ 		  || variable_template_p (t)
+ 		  || BASELINK_P (t)
+ 		  || TREE_CODE (t) == SPLICE_EXPR
+ 		  || TREE_CODE (t) == TEMPLATE_ID_EXPR
+ 		  || TREE_CODE (t) == TREE_BINFO);
+       /* ??? We're not setting *idk here.  */
+     }
+   else
+     {
+       /* We may have to instantiate; for instance, if we're dealing with
+ 	 a variable template.  For &[: ^^S::x :], we have to create an
+ 	 OFFSET_REF.  For a VAR_DECL, we need the convert_from_reference.  */
+       cp_unevaluated u;
+       /* CWG 3109 adjusted [class.protected] to say that checking access to
+ 	 protected non-static members is disabled for members designated by a
+ 	 splice-expression.  */
+       push_deferring_access_checks (dk_no_check);
+       const char *error_msg;
+       /* We don't have the parser scope here, so figure out the context.  In
+ 	   struct S { static constexpr int i = 42; };
+ 	   constexpr auto r = ^^S::i;
+ 	   int i = [: r :];
+ 	 we need to pass down 'S'.  */
+       tree ctx = DECL_P (t) ? DECL_CONTEXT (t) : NULL_TREE;
+       t = finish_id_expression (t, t, ctx, idk,
+ 				/*integral_constant_expression_p=*/false,
+ 				/*allow_non_integral_constant_expr_p=*/true,
+ 				&parser->non_integral_constant_expression_p,
+ 				template_p,
+ 				/*done=*/true,
+ 				address_p,
+ 				template_arg_p,
+ 				&error_msg,
+ 				loc);
+       if (error_msg)
+ 	cp_parser_error (parser, error_msg);
+       pop_deferring_access_checks ();
+     }
+ 
+   return t;
+ }
+ 
+ /* Parse a splice-scope-specifier.
+ 
+    splice-scope-specifier:
+      splice-specifier
+      template[opt] splice-specialization-specifier
+ 
+    TYPENAME_P is true if we've seen the typename keyword.
+    TEMPLATE_P is true if we've seen the leading template keyword.  */
+ 
+ static tree
+ cp_parser_splice_scope_specifier (cp_parser *parser, bool typename_p,
+ 				  bool template_p)
+ {
+   bool targs_p = false;
+   cp_expr scope = cp_parser_splice_specifier (parser, template_p, &targs_p);
+   const location_t loc = scope.get_location ();
+   if (TREE_CODE (scope) == TYPE_DECL)
+     scope = TREE_TYPE (scope);
+ 
+   if (template_p && !targs_p)
+     {
+       error_at (loc, "extra %<template%> in a scope splice");
+       return error_mark_node;
+     }
+   /* [expr.prim.id.qual] The template may only be omitted from the
+      form template(opt) splice-specialization-specifier :: when the
+      splice-specialization-specifier is preceded by typename.  */
+   if (targs_p && !typename_p && !template_p)
+     {
+       auto_diagnostic_group d;
+       error_at (loc, "missing %<template%> in a scope splice with template "
+ 		"arguments");
+       inform (loc, "%<template%> may only be omitted when the scope splice "
+ 	      "is preceded by %<typename%>");
+       return error_mark_node;
+     }
+ 
+   /* A dependent scope.  Turn this into SPLICE_SCOPE which is a type,
+      so that dependent_scope_p et al can recognize this.  */
+   if (dependent_splice_p (scope))
+     return make_splice_scope (scope, /*type_p=*/false);
+ 
+   if (!valid_splice_scope_p (scope))
+     {
+       auto_diagnostic_group d;
+       error_at (loc, "reflection not usable in a splice scope");
+       if (TYPE_P (scope))
+ 	inform (loc, "%qT is not a class, namespace, or enumeration",
+ 		tree (scope));
+       else
+ 	inform (loc, "%qE is not a class, namespace, or enumeration",
+ 		tree (scope));
+       scope = error_mark_node;
+     }
+ 
+   return scope;
+ }
+ 
+ /* We know the next token is '[:' (optionally preceded by a template or
+    typename) and we are wondering if a '::' follows right after the
+    closing ':]', or after the possible '<...>' after the ':]'.  Return
+    true if yes, false otherwise.  */
+ 
+ static bool
+ cp_parser_splice_spec_is_nns_p (cp_parser *parser)
+ {
+   /* ??? It'd be nice to use saved_token_sentinel, but its rollback
+      uses cp_lexer_previous_token, but we may be the first token in the
+      file so there are no previous tokens.  Sigh.  */
+   cp_lexer_save_tokens (parser->lexer);
+ 
+   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME)
+       || cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
+     cp_lexer_consume_token (parser->lexer);
+ 
+   bool ok = false;
+   size_t n = cp_parser_skip_balanced_tokens (parser, 1);
+   if (n != 1)
+     {
+       ok = true;
+       /* Consume tokens up to the ':]' (including).  */
+       for (n = n - 1; n; --n)
+ 	cp_lexer_consume_token (parser->lexer);
+ 
+       /* Consume the whole '<....>', if present.  */
+       if (cp_lexer_next_token_is (parser->lexer, CPP_LESS)
+ 	  && !cp_parser_skip_entire_template_parameter_list (parser))
+ 	ok = false;
+ 
+       ok = ok && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE);
+     }
+ 
+   /* Roll back the tokens we skipped.  */
+   cp_lexer_rollback_tokens (parser->lexer);
+ 
+   return ok;
+ }
+ 
+ /* Return true if the N-th token is '[:' and its closing ':]' is NOT
+    followed by a '::'.  For example, we could be checking if what follows
+    can be a splice-expression or not -- we can tell that '[:R:]::type' is
+    not a splice-expression.  */
+ 
+ static bool
+ cp_parser_nth_token_starts_splice_without_nns_p (cp_parser *parser, size_t n)
+ {
+   return (cp_lexer_nth_token_is (parser->lexer, n, CPP_OPEN_SPLICE)
+ 	  && !cp_parser_splice_spec_is_nns_p (parser));
+ }
+ 
  /* Parse a primary-expression.
  
     primary-expression:
*************** cp_parser_pack_index (cp_parser *parser,
*** 6066,6071 ****
--- 6510,6518 ----
       ( expression )
       id-expression
       lambda-expression (C++11)
+      fold-expression
+      requires-expression
+      splice-expression
  
     GNU Extensions:
  
*************** cp_parser_primary_expression (cp_parser
*** 6349,6354 ****
--- 6796,6806 ----
  	return lam;
        }
  
+     case CPP_OPEN_SPLICE:
+       return cp_parser_splice_expression (parser, /*template_p=*/false,
+ 					  address_p, template_arg_p,
+ 					  /*member_access_p=*/false, idk);
+ 
      case CPP_OBJC_STRING:
        if (c_dialect_objc ())
  	/* We have an Objective-C++ string literal. */
*************** cp_parser_primary_expression (cp_parser
*** 6505,6517 ****
  	case RID_TEMPLATE:
  	  if (parser->in_function_body
  	      && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
! 	      	  == CPP_LESS))
  	    {
  	      error_at (token->location,
  			"a template declaration cannot appear at block scope");
  	      cp_parser_skip_to_end_of_block_or_statement (parser);
  	      return error_mark_node;
  	    }
  	  /* FALLTHRU */
  	default:
  	  cp_parser_error (parser, "expected primary-expression");
--- 6957,6979 ----
  	case RID_TEMPLATE:
  	  if (parser->in_function_body
  	      && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
! 		  == CPP_LESS))
  	    {
  	      error_at (token->location,
  			"a template declaration cannot appear at block scope");
  	      cp_parser_skip_to_end_of_block_or_statement (parser);
  	      return error_mark_node;
  	    }
+ 	  else if (cp_lexer_peek_nth_token (parser->lexer, 2)->type
+ 		   == CPP_OPEN_SPLICE)
+ 	    {
+ 	      cp_lexer_consume_token (parser->lexer);
+ 	      return cp_parser_splice_expression (parser, /*template_p=*/true,
+ 						  address_p, template_arg_p,
+ 						  /*member_access_p=*/false,
+ 						  idk);
+ 	    }
+ 
  	  /* FALLTHRU */
  	default:
  	  cp_parser_error (parser, "expected primary-expression");
*************** cp_parser_primary_expression (cp_parser
*** 6701,6706 ****
--- 7163,7178 ----
  	return decl;
        }
  
+     case CPP_XOR:
+       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_XOR)
+ 	{
+ 	  error_at (token->location,
+ 		    "reflection is only available in C++26 with "
+ 		    "%<-freflection%>");
+ 	  return error_mark_node;
+ 	}
+       gcc_fallthrough ();
+ 
        /* Anything else is an error.  */
      default:
        cp_parser_error (parser, "expected primary-expression");
*************** cp_parser_unqualified_id (cp_parser* par
*** 7168,7173 ****
--- 7640,7659 ----
  	    if (cp_parser_parse_definitely (parser))
  	      done = true;
  	  }
+ 	/* Allow r.~typename [:R:].  */
+ 	else if (!done
+ 		 && cp_parser_next_tokens_start_splice_type_spec_p
+ 		     (parser, /*require_typename_p=*/true))
+ 	  {
+ 	    parser->scope = object_scope;
+ 	    parser->object_scope = NULL_TREE;
+ 	    parser->qualifying_scope = NULL_TREE;
+ 	    type_decl = cp_parser_splice_type_specifier (parser);
+ 	    if (!type_decl)
+ 	      /* We don't have a TYPE_DECL, so return early.  */
+ 	      return error_mark_node;
+ 	    return build_min_nt_loc (loc, BIT_NOT_EXPR, type_decl);
+ 	  }
  	/* Look in the surrounding context.  */
  	if (!done)
  	  {
*************** check_template_keyword_in_nested_name_sp
*** 7315,7320 ****
--- 7801,7807 ----
       type-name ::
       namespace-name ::
       computed-type-specifier ::
+      splice-scope-specifier ::
       nested-name-specifier identifier ::
       nested-name-specifier template [opt] simple-template-id ::
  
*************** cp_parser_nested_name_specifier_opt (cp_
*** 7402,7407 ****
--- 7889,7897 ----
        /* DR 743: decltype can be used in a nested-name-specifier.  */
        else if (token_is_decltype (token))
  	;
+       /* Could be a splice-scope-specifier.  */
+       else if (cp_parser_next_tokens_can_start_splice_scope_spec_p (parser))
+ 	;
        else
  	{
  	  /* If the next token is not an identifier, then it is
*************** cp_parser_nested_name_specifier_opt (cp_
*** 7607,7613 ****
  			      error_at (token->location,
  					"reference to %qD is ambiguous",
  					token->u.value);
! 			      print_candidates (ambiguous_decls);
  			    }
  			  decl = error_mark_node;
  			}
--- 8097,8104 ----
  			      error_at (token->location,
  					"reference to %qD is ambiguous",
  					token->u.value);
! 			      print_candidates (token->location,
! 						ambiguous_decls);
  			    }
  			  decl = error_mark_node;
  			}
*************** cp_parser_qualifying_entity (cp_parser *
*** 7778,7783 ****
--- 8269,8291 ----
        return scope;
      }
  
+   /* In a nested-name-specifier, we can reach a splice-specifier
+      either via the computed-type-specifier -> splice-type-specifier
+      production, or via splice-scope-specifier.  But [dcl.type.splice]
+      says "A splice-specifier or splice-specialization-specifier immediately
+      followed by :: is never interpreted as part of a splice-type-specifier"
+      so we call only cp_parser_splice_scope_specifier.  */
+   if (cp_parser_next_tokens_can_start_splice_scope_spec_p (parser)
+       && cp_parser_splice_spec_is_nns_p (parser))
+     {
+       if (cp_parser_optional_template_keyword (parser))
+ 	template_keyword_p = true;
+       scope = cp_parser_splice_scope_specifier (parser,
+ 						typename_keyword_p,
+ 						template_keyword_p);
+       return scope;
+     }
+ 
    /* Before we try to parse the class-name, we must save away the
       current PARSER->SCOPE since cp_parser_class_name will destroy
       it.  */
*************** literal_integer_zerop (const_tree expr)
*** 7871,7876 ****
--- 8379,8386 ----
       postfix-expression -> template [opt] id-expression
       postfix-expression . pseudo-destructor-name
       postfix-expression -> pseudo-destructor-name
+      postfix-expression . splice-expression
+      postfix-expression -> splice-expression
       postfix-expression ++
       postfix-expression --
       dynamic_cast < type-id > ( expression )
*************** cp_parser_postfix_expression (cp_parser
*** 8075,8080 ****
--- 8585,8596 ----
  
      case RID_TYPENAME:
        {
+ 	/* Just like cp_parser_type_specifier/RID_TYPENAME: if we see
+ 	   'typename [:', this could be a typename-specifier.  But if
+ 	   there's no '::' after the '[:x:]' then it is not.  */
+ 	if (cp_parser_nth_token_starts_splice_without_nns_p (parser, 2))
+ 	  goto default_;
+ 
  	tree type;
  	/* The syntax permitted here is the same permitted for an
  	   elaborated-type-specifier.  */
*************** cp_parser_postfix_expression (cp_parser
*** 8276,8281 ****
--- 8792,8798 ----
        }
  
      default:
+     default_:
        {
  	tree type;
  
*************** cp_parser_postfix_expression (cp_parser
*** 8623,8629 ****
  	  /* postfix-expression . template [opt] id-expression
  	     postfix-expression . pseudo-destructor-name
  	     postfix-expression -> template [opt] id-expression
! 	     postfix-expression -> pseudo-destructor-name */
  
  	  /* Consume the `.' or `->' operator.  */
  	  cp_lexer_consume_token (parser->lexer);
--- 9140,9148 ----
  	  /* postfix-expression . template [opt] id-expression
  	     postfix-expression . pseudo-destructor-name
  	     postfix-expression -> template [opt] id-expression
! 	     postfix-expression -> pseudo-destructor-name
! 	     postfix-expression . splice-expression
! 	     postfix-expression -> splice-expression  */
  
  	  /* Consume the `.' or `->' operator.  */
  	  cp_lexer_consume_token (parser->lexer);
*************** cp_parser_dot_deref_incomplete (tree *sc
*** 8983,8988 ****
--- 9502,9509 ----
       postfix-expression . pseudo-destructor-name
       postfix-expression -> template [opt] id-expression
       postfix-expression -> pseudo-destructor-name
+      postfix-expression . splice-expression
+      postfix-expression -> splice-expression
  
     FOR_OFFSETOF is set if we're being called in that context.  That sorta
     limits what of the above we'll actually accept, but nevermind.
*************** cp_parser_postfix_dot_deref_expression (
*** 9107,9121 ****
  	 ordinary class member access expression, rather than a
  	 pseudo-destructor-name.  */
        bool template_p;
        cp_token *token = cp_lexer_peek_token (parser->lexer);
!       /* Parse the id-expression.  */
!       name = (cp_parser_id_expression
! 	      (parser,
! 	       cp_parser_optional_template_keyword (parser),
! 	       /*check_dependency_p=*/true,
! 	       &template_p,
! 	       /*declarator_p=*/false,
! 	       /*optional_p=*/false));
        /* In general, build a SCOPE_REF if the member name is qualified.
  	 However, if the name was not dependent and has already been
  	 resolved; there is no need to build the SCOPE_REF.  For example;
--- 9628,9659 ----
  	 ordinary class member access expression, rather than a
  	 pseudo-destructor-name.  */
        bool template_p;
+       bool template_keyword_p = cp_parser_optional_template_keyword (parser);
        cp_token *token = cp_lexer_peek_token (parser->lexer);
!       /* See if there was this->[:R:].  Note that in this->[: ^^S :]::i;
! 	 the RHS is not a splice-expression.  */
!       const bool splice_p
! 	= cp_parser_nth_token_starts_splice_without_nns_p (parser, 1);
!       if (splice_p)
! 	{
! 	  name = cp_parser_splice_expression (parser, template_keyword_p,
! 					      /*address_p=*/false,
! 					      /*template_arg_p=*/false,
! 					      /*member_access_p=*/true, idk);
! 	  /* This is not the leading 'template' but the one after n-n-s,
! 	     which we don't have here.  */
! 	  template_p = false;
! 	}
!       else
! 	/* Parse the id-expression.  */
! 	name = (cp_parser_id_expression
! 		(parser,
! 		 template_keyword_p,
! 		 /*check_dependency_p=*/true,
! 		 &template_p,
! 		 /*declarator_p=*/false,
! 		 /*optional_p=*/false));
! 
        /* In general, build a SCOPE_REF if the member name is qualified.
  	 However, if the name was not dependent and has already been
  	 resolved; there is no need to build the SCOPE_REF.  For example;
*************** cp_parser_postfix_dot_deref_expression (
*** 9124,9133 ****
  	     template <typename T> void f(T* t) { t->X::f(); }
  
  	 Even though "t" is dependent, "X::f" is not and has been resolved
! 	 to a BASELINK; there is no need to include scope information.  */
  
!       /* But we do need to remember that there was an explicit scope for
! 	 virtual function calls.  */
        if (parser->scope)
  	*idk = CP_ID_KIND_QUALIFIED;
  
--- 9662,9677 ----
  	     template <typename T> void f(T* t) { t->X::f(); }
  
  	 Even though "t" is dependent, "X::f" is not and has been resolved
! 	 to a BASELINK; there is no need to include scope information.
  
! 	 But we do need to remember that there was an explicit scope for
! 	 virtual function calls.  If the name was represented by
! 	 a splice-expression, behave like this:
! 
! 	   [:^^B::fn:]()  // do not disable virtual dispatch
! 	   [:^^B:]::fn()  // disable virtual dispatch
! 
! 	 In the former, parser->scope has been cleared when we get here.  */
        if (parser->scope)
  	*idk = CP_ID_KIND_QUALIFIED;
  
*************** cp_parser_postfix_dot_deref_expression (
*** 9148,9153 ****
--- 9692,9705 ----
  			    parser->scope, name);
  		  postfix_expression = error_mark_node;
  		}
+ 	      /* cp_parser_splice_expression may have given us a SCOPE_REF.  */
+ 	      else if (TREE_CODE (name) == SCOPE_REF
+ 		       || TREE_CODE (name) == FIELD_DECL
+ 		       || VAR_P (name)
+ 		       || TREE_CODE (name) == CONST_DECL
+ 		       || TREE_CODE (name) == FUNCTION_DECL
+ 		       || DECL_FUNCTION_TEMPLATE_P (OVL_FIRST (name)))
+ 		gcc_checking_assert (splice_p);
  	      else
  		name = build_qualified_name (/*type=*/NULL_TREE,
  					     parser->scope,
*************** cp_parser_postfix_dot_deref_expression (
*** 9157,9169 ****
  	      parser->qualifying_scope = NULL_TREE;
  	      parser->object_scope = NULL_TREE;
  	    }
! 	  if (parser->scope && name && BASELINK_P (name))
  	    adjust_result_of_qualified_name_lookup
! 	      (name, parser->scope, scope);
  	  postfix_expression
  	    = finish_class_member_access_expr (postfix_expression, name,
  					       template_p,
! 					       tf_warning_or_error);
  	  /* Build a location e.g.:
  	       ptr->access_expr
  	       ~~~^~~~~~~~~~~~~
--- 9709,9727 ----
  	      parser->qualifying_scope = NULL_TREE;
  	      parser->object_scope = NULL_TREE;
  	    }
! 	  if ((parser->scope || splice_p) && name && BASELINK_P (name))
  	    adjust_result_of_qualified_name_lookup
! 	      (name,
! 	       /* For obj->[:^^R:] we won't have parser->scope, but we still
! 		  have to perform this adjustment.  */
! 	       (splice_p
! 		? BINFO_TYPE (BASELINK_ACCESS_BINFO (name))
! 		: parser->scope),
! 	       scope);
  	  postfix_expression
  	    = finish_class_member_access_expr (postfix_expression, name,
  					       template_p,
! 					       tf_warning_or_error, splice_p);
  	  /* Build a location e.g.:
  	       ptr->access_expr
  	       ~~~^~~~~~~~~~~~~
*************** cp_parser_pseudo_destructor_name (cp_par
*** 9453,9458 ****
--- 10011,10178 ----
    *type = TREE_TYPE (cp_parser_nonclass_name (parser));
  }
  
+ /* Parse a reflection-name.
+ 
+    reflection-name:
+     nested-name-specifier[opt] identifier
+     nested-name-specifier template identifier
+ 
+  */
+ 
+ static tree
+ cp_parser_reflection_name (cp_parser *parser)
+ {
+   auto s = make_temp_override (cp_preserve_using_decl, true);
+ 
+   /* Look for the optional `::' operator.  */
+   bool global_scope_p
+     = (cp_parser_global_scope_opt (parser,
+ 				   /*current_scope_valid_p=*/false)
+        != NULL_TREE);
+   /* And the optional nested-name-specifier.  */
+   bool nested_name_specifier_p
+     = (cp_parser_nested_name_specifier_opt (parser,
+ 					    /*typename_keyword_p=*/false,
+ 					    /*check_dependency_p=*/true,
+ 					    /*type_p=*/false,
+ 					    /*is_declaration=*/false,
+ 					    /*template_keyword_p=*/false,
+ 					    global_scope_p)
+        != NULL_TREE);
+   /* Look for the optional `template' keyword.  */
+   if (cp_parser_optional_template_keyword (parser)
+       && !global_scope_p
+       && !nested_name_specifier_p)
+     cp_parser_error (parser, "%<template%> must follow a nested-name-"
+ 		     "specifier");
+ 
+   /* Look for the identifier.  */
+   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
+   tree name = cp_parser_identifier (parser);
+   tree decl = cp_parser_lookup_name_simple (parser, name, loc);
+   if (name != error_mark_node && decl == error_mark_node)
+     cp_parser_name_lookup_error (parser, name, decl, NLE_NULL, loc);
+ 
+   /* If lookup finds a class member of an anonymous union, R represents
+      that class member.  */
+   if (VAR_P (decl) && DECL_ANON_UNION_VAR_P (decl))
+     {
+       tree v = DECL_VALUE_EXPR (decl);
+       if (v != error_mark_node && TREE_CODE (v) == COMPONENT_REF)
+ 	decl = TREE_OPERAND (v, 1);
+     }
+ 
+   return decl;
+ }
+ 
+ /* Parse a reflect-expression.
+ 
+    reflect-expression:
+      ^^ ::
+      ^^ reflection-name
+      ^^ type-id
+      ^^ id-expression
+ 
+   Returns a representation of the reflection.  */
+ 
+ static tree
+ cp_parser_reflect_expression (cp_parser *parser)
+ {
+   if (!flag_reflection)
+     {
+       error_at (cp_lexer_peek_token (parser->lexer)->location,
+ 		"reflection is only available with %<-freflection%>");
+       return error_mark_node;
+     }
+ 
+   /* Consume the '^^'.  */
+   cp_lexer_consume_token (parser->lexer);
+ 
+   /* Get the location of the operand.  */
+   const location_t loc = cp_lexer_peek_token (parser->lexer)->location;
+ 
+   /* We don't know what this might be.  Try and see what works.  */
+   cp_parser_parse_tentatively (parser);
+   tree t = cp_parser_reflection_name (parser);
+   if (TREE_CODE (t) == TYPE_DECL && !cp_parser_error_occurred (parser))
+     /* Need to call cp_parser_type_id, because say
+ 	using A = int;
+ 	^^A &
+        should parse the type id rather than reflection-name.  */
+     cp_parser_simulate_error (parser);
+   /* For ^^tmpl<args>, looking for a nested-name-specifier in
+      cp_parser_reflection_name above creates a CPP_TEMPLATE_ID which
+      makes cp_parser_identifier cause a parser error.  So we don't
+      return early here.  */
+   if (cp_parser_parse_definitely (parser))
+     return get_reflection (loc, t);
+   /* Nope.  Well then, maybe it's a type-id.  */
+   cp_parser_parse_tentatively (parser);
+ 
+   bool type_alias_p;
+   t = cp_parser_type_id_1 (parser, CP_PARSER_FLAGS_NONE, false, false,
+ 			   nullptr, &type_alias_p);
+   if (cp_parser_parse_definitely (parser))
+     {
+       /* With using A = int; ^^A is a type alias but ^^const A or ^^A & or
+ 	 ^^A const is not.  With template<typename T> using B = C <T>;
+ 	 ^^B <int> is a type alias though.  */
+       if (TYPE_P (t) && !type_alias_p)
+ 	t = strip_typedefs (t);
+       return get_reflection (loc, t);
+     }
+   /* Try an id-expression.  */
+   {
+     cp_parser_parse_tentatively (parser);
+     /* [expr.reflect] The id-expression of a reflect-expression is
+        an unevaluated operand.  */
+     cp_unevaluated u;
+     tree id = cp_parser_id_expression (parser,
+ 				       /*template_keyword_p=*/false,
+ 				       /*check_dependency_p=*/true,
+ 				       /*template_p=*/nullptr,
+ 				       /*declarator_p=*/false,
+ 				       /*optional_p=*/false);
+     /* Lookup the name we got back from the id-expression.  */
+     if (identifier_p (id))
+       t = cp_parser_lookup_name_simple (parser, id, loc);
+     else
+       t = id;
+     /* We couldn't look ID up, harrumph.  */
+     if (id != error_mark_node && t == error_mark_node)
+       cp_parser_name_lookup_error (parser, id, t, NLE_NULL, loc);
+     /* We don't finish_id_expression here because we don't know in what
+        context this reflection will be used (address, class member access,
+        template argument, ...).  Except go ahead and (try to) resolve the
+        variable TEMPLATE_ID_EXPR (which is always considered type-dependent
+        because such TEMPLATE_ID_EXPRs don't have a type) now.  We don't need
+        to keep these TEMPLATE_ID_EXPRs for a possible class member access,
+        but most importantly, function templates with ^^vt<int> as one of its
+        template argument would never be mangled (mangle_decl checks if any
+        template arguments are dependent).  */
+     if (TREE_CODE (t) == TEMPLATE_ID_EXPR
+ 	&& variable_template_p (TREE_OPERAND (t, 0))
+ 	&& !concept_check_p (t))
+       t = finish_template_variable (t);
+     if (cp_parser_parse_definitely (parser))
+       return get_reflection (loc, t);
+   }
+ 
+   /* Last chance, see if there's ^^::.  This must be done only after we've
+      tried the other options.  */
+   if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
+     {
+       cp_lexer_consume_token (parser->lexer);
+       /* A reflect-expression of the form ^^:: represents the global
+ 	 namespace.  */
+       return get_reflection (loc, global_namespace);
+     }
+ 
+   /* Oy vey, nothing worked.  */
+   error_at (loc, "%<^^%> cannot be applied to this operand");
+   return error_mark_node;
+ }
+ 
  /* Parse a unary-expression.
  
     unary-expression:
*************** cp_parser_pseudo_destructor_name (cp_par
*** 9463,9471 ****
       unary-operator cast-expression
       sizeof unary-expression
       sizeof ( type-id )
!      alignof ( type-id )  [C++0x]
       new-expression
       delete-expression
  
     GNU Extensions:
  
--- 10183,10192 ----
       unary-operator cast-expression
       sizeof unary-expression
       sizeof ( type-id )
!      alignof ( type-id )  [C++11]
       new-expression
       delete-expression
+      reflect-expression	[C++26]
  
     GNU Extensions:
  
*************** cp_parser_unary_expression (cp_parser *p
*** 9729,9734 ****
--- 10450,10457 ----
        else if (keyword == RID_DELETE)
  	return cp_parser_delete_expression (parser);
      }
+   else if (cp_lexer_next_token_is (parser->lexer, CPP_REFLECT_OP))
+     return cp_parser_reflect_expression (parser);
  
    /* Look for a unary operator.  */
    unary_operator = cp_parser_unary_operator (token);
*************** cp_parser_declaration (cp_parser* parser
*** 16800,16805 ****
--- 17523,17534 ----
        /* `template <' indicates a template declaration.  */
        else if (token2->type == CPP_LESS)
  	cp_parser_template_declaration (parser, /*member_p=*/false);
+       /* We can have
+ 	   template [: ^^T :]<3>::type t = 4;
+ 	 where the template binds to the splice-scope-specifier.  */
+       else if (token2->type == CPP_OPEN_SPLICE
+ 	       && cp_parser_splice_spec_is_nns_p (parser))
+ 	cp_parser_block_declaration (parser, /*statement_p=*/false);
        /* Anything else must be an explicit instantiation.  */
        else
  	{
*************** cp_parser_decomposition_declaration (cp_
*** 17490,17495 ****
--- 18219,18226 ----
  	      attr = NULL_TREE;
  	    if (attr && first_attr == -1)
  	      first_attr = v.length ();
+ 	    if (lookup_attribute ("internal ", "annotation ", attr))
+ 	      error ("annotation on structured binding");
  	  }
  	v.safe_push (e);
  	++cnt;
*************** cp_parser_decltype_expr (cp_parser *pars
*** 18568,18576 ****
           expression.  */
        cp_parser_abort_tentative_parse (parser);
  
!       /* Parse a full expression.  */
!       expr = cp_parser_expression (parser, /*pidk=*/NULL, /*cast_p=*/false,
! 				   /*decltype_p=*/true);
      }
  
    return expr;
--- 19299,19320 ----
           expression.  */
        cp_parser_abort_tentative_parse (parser);
  
!       /* [dcl.type.decltype] "if E is an unparenthesized splice-expression,
! 	 decltype(E) is the type of the entity, object, or value designated
! 	 by the splice-specifier of E"  */
!       if (cp_parser_nth_token_starts_splice_without_nns_p (parser, 1))
! 	{
! 	  cp_id_kind idk;
! 	  expr = cp_parser_splice_expression (parser, /*template_p=*/false,
! 					      /*address_p=*/false,
! 					      /*template_arg_p=*/false,
! 					      /*member_access_p=*/false, &idk);
! 	  id_expression_or_member_access_p = true;
! 	}
!       else
! 	/* Parse a full expression.  */
! 	expr = cp_parser_expression (parser, /*pidk=*/NULL, /*cast_p=*/false,
! 				     /*decltype_p=*/true);
      }
  
    return expr;
*************** cp_parser_type_parameter (cp_parser* par
*** 20242,20247 ****
--- 20986,20994 ----
     of functions, returns a TEMPLATE_ID_EXPR.  If the template-name
     names a class, returns a TYPE_DECL for the specialization.
  
+    PARSED_TEMPL, if non-null, is the already parsed template-name.  This
+    is used when parsing a splice-specialization-specifier.
+ 
     If CHECK_DEPENDENCY_P is FALSE, names are looked up in
     uninstantiated templates.  */
  
*************** cp_parser_template_id (cp_parser *parser
*** 20250,20256 ****
  		       bool template_keyword_p,
  		       bool check_dependency_p,
  		       enum tag_types tag_type,
! 		       bool is_declaration)
  {
    tree templ;
    tree arguments;
--- 20997,21004 ----
  		       bool template_keyword_p,
  		       bool check_dependency_p,
  		       enum tag_types tag_type,
! 		       bool is_declaration,
! 		       tree parsed_templ/*=NULL_TREE*/)
  {
    tree templ;
    tree arguments;
*************** cp_parser_template_id (cp_parser *parser
*** 20271,20298 ****
  
    /* Avoid performing name lookup if there is no possibility of
       finding a template-id.  */
!   if ((token->type != CPP_NAME && token->keyword != RID_OPERATOR)
!       || (token->type == CPP_NAME
! 	  && !cp_parser_nth_token_starts_template_argument_list_p
! 	       (parser, 2)))
      {
        cp_parser_error (parser, "expected template-id");
        return error_mark_node;
      }
  
    /* Remember where the template-id starts.  */
!   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
      start_of_id = cp_lexer_token_position (parser->lexer, false);
  
    push_deferring_access_checks (dk_deferred);
  
    /* Parse the template-name.  */
    is_identifier = false;
!   templ = cp_parser_template_name (parser, template_keyword_p,
! 				   check_dependency_p,
! 				   is_declaration,
! 				   tag_type,
! 				   &is_identifier);
  
    /* Push any access checks inside the firewall we're about to create.  */
    vec<deferred_access_check, va_gc> *checks = get_deferred_access_checks ();
--- 21019,21050 ----
  
    /* Avoid performing name lookup if there is no possibility of
       finding a template-id.  */
!   if (!parsed_templ
!       && ((token->type != CPP_NAME && token->keyword != RID_OPERATOR)
! 	  || (token->type == CPP_NAME
! 	      && !cp_parser_nth_token_starts_template_argument_list_p
! 		   (parser, 2))))
      {
        cp_parser_error (parser, "expected template-id");
        return error_mark_node;
      }
  
    /* Remember where the template-id starts.  */
!   if (!parsed_templ && cp_parser_uncommitted_to_tentative_parse_p (parser))
      start_of_id = cp_lexer_token_position (parser->lexer, false);
  
    push_deferring_access_checks (dk_deferred);
  
    /* Parse the template-name.  */
    is_identifier = false;
!   if (parsed_templ)
!     templ = parsed_templ;
!   else
!     templ = cp_parser_template_name (parser, template_keyword_p,
! 				     check_dependency_p,
! 				     is_declaration,
! 				     tag_type,
! 				     &is_identifier);
  
    /* Push any access checks inside the firewall we're about to create.  */
    vec<deferred_access_check, va_gc> *checks = get_deferred_access_checks ();
*************** cp_parser_template_id (cp_parser *parser
*** 20414,20420 ****
      = make_location (token->location, token->location, parser->lexer);
  
    /* Build a representation of the specialization.  */
!   if (identifier_p (templ))
      template_id = build_min_nt_loc (combined_loc,
  				    TEMPLATE_ID_EXPR,
  				    templ, arguments);
--- 21166,21174 ----
      = make_location (token->location, token->location, parser->lexer);
  
    /* Build a representation of the specialization.  */
!   if (identifier_p (templ)
!       /* We can't do much with [:T:]<arg> at this point.  */
!       || TREE_CODE (templ) == SPLICE_EXPR)
      template_id = build_min_nt_loc (combined_loc,
  				    TEMPLATE_ID_EXPR,
  				    templ, arguments);
*************** cp_parser_template_id (cp_parser *parser
*** 20464,20470 ****
      {
        /* If it's not a class-template or a template-template, it should be
  	 a function-template.  */
!       gcc_assert (OVL_P (templ) || BASELINK_P (templ));
  
        template_id = lookup_template_function (templ, arguments);
        if (TREE_CODE (template_id) == TEMPLATE_ID_EXPR)
--- 21218,21237 ----
      {
        /* If it's not a class-template or a template-template, it should be
  	 a function-template.  */
!       if (OVL_P (templ) || BASELINK_P (templ))
! 	/* It is.  */;
!       else if (parsed_templ)
! 	{
! 	  /* This means there was a splice-specifier.  Maybe the user
! 	     used the wrong reflection, so complain.  */
! 	  if (TYPE_P (templ))
! 	    error_at (token->location, "%qT is not a template", templ);
! 	  else
! 	    error_at (token->location, "%qE is not a template", templ);
! 	  return error_mark_node;
! 	}
!       else
! 	gcc_assert (false);
  
        template_id = lookup_template_function (templ, arguments);
        if (TREE_CODE (template_id) == TEMPLATE_ID_EXPR)
*************** cp_parser_type_specifier (cp_parser* par
*** 21495,21500 ****
--- 22262,22274 ----
  
        /* 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))
+ 	break;
+ 
        /* Look for an elaborated-type-specifier.  */
        type_spec
  	= (cp_parser_elaborated_type_specifier
*************** cp_parser_type_specifier (cp_parser* par
*** 21593,21598 ****
--- 22367,22381 ----
  
       nested-name-specifier(opt) template-name
  
+    computed-type-specifier:
+      decltype-specifier
+      pack-index-specifier
+      splice-type-specifier
+ 
+    splice-type-specifier:
+      typename[opt] splice-specifier
+      typename[opt] splice-specialization-specifier
+ 
     GNU Extension:
  
     simple-type-specifier:
*************** cp_parser_simple_type_specifier (cp_pars
*** 21960,21965 ****
--- 22743,22757 ----
  	    type = NULL_TREE;
  	}
  
+       /* "[: ... :]" is a C++26 splice-type-specifier.  The second argument
+ 	 decides if we require 'typename' before the splice-type-specifier.
+ 	 In a type-only context ([temp.res.general]/4) we shouldn't require
+ 	 it.  */
+       if (!type
+ 	  && cp_parser_next_tokens_start_splice_type_spec_p (parser,
+ 							     !typename_p))
+ 	type = cp_parser_splice_type_specifier (parser);
+ 
        /* Otherwise, look for a type-name.  */
        if (!type)
  	{
*************** cp_parser_enum_specifier (cp_parser* par
*** 23136,23141 ****
--- 23928,23934 ----
  	{
  	  new_value_list = true;
  	  SET_OPAQUE_ENUM_P (type, false);
+ 	  ENUM_BEING_DEFINED_P (type) = 1;
  	  DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
  	}
        else
*************** cp_parser_namespace_body (cp_parser* par
*** 23544,23550 ****
  /* Parse a namespace-alias-definition.
  
     namespace-alias-definition:
!      namespace identifier = qualified-namespace-specifier ;  */
  
  static void
  cp_parser_namespace_alias_definition (cp_parser* parser)
--- 24337,24344 ----
  /* Parse a namespace-alias-definition.
  
     namespace-alias-definition:
!      namespace identifier = qualified-namespace-specifier
!      namespace identifier = splice-specifier  */
  
  static void
  cp_parser_namespace_alias_definition (cp_parser* parser)
*************** cp_parser_namespace_alias_definition (cp
*** 23573,23582 ****
        return;
      }
    cp_parser_require (parser, CPP_EQ, RT_EQ);
!   /* Look for the qualified-namespace-specifier.  */
!   namespace_specifier
!     = cp_parser_qualified_namespace_specifier (parser);
!   cp_warn_deprecated_use_scopes (namespace_specifier);
    /* Look for the `;' token.  */
    cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
  
--- 24367,24379 ----
        return;
      }
    cp_parser_require (parser, CPP_EQ, RT_EQ);
!   if (cp_parser_nth_token_starts_splice_without_nns_p (parser, 1))
!     namespace_specifier = cp_parser_splice_specifier (parser);
!   else
!     /* Look for the qualified-namespace-specifier.  */
!     namespace_specifier = cp_parser_qualified_namespace_specifier (parser);
!   if (!dependent_namespace_p (namespace_specifier))
!     cp_warn_deprecated_use_scopes (namespace_specifier);
    /* Look for the `;' token.  */
    cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
  
*************** cp_parser_alias_declaration (cp_parser*
*** 24038,24045 ****
  /* Parse a using-directive.
  
     using-directive:
!      attribute-specifier-seq [opt] using namespace :: [opt]
!        nested-name-specifier [opt] namespace-name ;  */
  
  static void
  cp_parser_using_directive (cp_parser* parser)
--- 24835,24843 ----
  /* Parse a using-directive.
  
     using-directive:
!      attribute-specifier-seq [opt] using namespace nested-name-specifier [opt]
!        namespace-name ;
!      attribute-specifier-seq [opt] using namespace splice-specifier ;  */
  
  static void
  cp_parser_using_directive (cp_parser* parser)
*************** cp_parser_using_directive (cp_parser* pa
*** 24058,24073 ****
    cp_parser_require_keyword (parser, RID_USING, RT_USING);
    /* And the `namespace' keyword.  */
    cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
!   /* Look for the optional `::' operator.  */
!   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
!   /* And the optional nested-name-specifier.  */
!   cp_parser_nested_name_specifier_opt (parser,
! 				       /*typename_keyword_p=*/false,
! 				       /*check_dependency_p=*/true,
! 				       /*type_p=*/false,
! 				       /*is_declaration=*/true);
!   /* Get the namespace being used.  */
!   namespace_decl = cp_parser_namespace_name (parser);
    cp_warn_deprecated_use_scopes (namespace_decl);
    /* And any specified GNU attributes.  */
    if (cp_next_tokens_can_be_gnu_attribute_p (parser))
--- 24856,24876 ----
    cp_parser_require_keyword (parser, RID_USING, RT_USING);
    /* And the `namespace' keyword.  */
    cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
!   if (cp_parser_nth_token_starts_splice_without_nns_p (parser, 1))
!     namespace_decl = cp_parser_splice_specifier (parser);
!   else
!     {
!       /* Look for the optional `::' operator.  */
!       cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
!       /* And the optional nested-name-specifier.  */
!       cp_parser_nested_name_specifier_opt (parser,
! 					   /*typename_keyword_p=*/false,
! 					   /*check_dependency_p=*/true,
! 					   /*type_p=*/false,
! 					   /*is_declaration=*/true);
!       /* Get the namespace being used.  */
!       namespace_decl = cp_parser_namespace_name (parser);
!     }
    cp_warn_deprecated_use_scopes (namespace_decl);
    /* And any specified GNU attributes.  */
    if (cp_next_tokens_can_be_gnu_attribute_p (parser))
*************** cp_parser_declarator_id (cp_parser* pars
*** 26826,26840 ****
     If IS_TRAILING_RETURN is true, we are in a trailing-return-type,
     i.e. we've just seen "->".
  
     Returns the TYPE specified.  */
  
  static tree
  cp_parser_type_id_1 (cp_parser *parser, cp_parser_flags flags,
  		     bool is_template_arg, bool is_trailing_return,
! 		     location_t *type_location)
  {
    cp_decl_specifier_seq type_specifier_seq;
    cp_declarator *abstract_declarator;
  
    /* Parse the type-specifier-seq.  */
    cp_parser_type_specifier_seq (parser, flags,
--- 27629,27653 ----
     If IS_TRAILING_RETURN is true, we are in a trailing-return-type,
     i.e. we've just seen "->".
  
+    If TYPE_ALIAS_P is non-null, we set it to true or false depending
+    on if the type-id is a type alias or just a type.  E.g., given
+ 
+      template<typename> struct S {};
+      template<typename T> using A = const S<T>;
+ 
+    ^^A<int> is a type alias, but ^^const A<int>, ^^A<int> const, or ^^A<int>*
+    are just types, not type aliases.
+ 
     Returns the TYPE specified.  */
  
  static tree
  cp_parser_type_id_1 (cp_parser *parser, cp_parser_flags flags,
  		     bool is_template_arg, bool is_trailing_return,
! 		     location_t *type_location, bool *type_alias_p)
  {
    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,
*************** cp_parser_type_id_1 (cp_parser *parser,
*** 26844,26849 ****
--- 27657,27673 ----
    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))
*************** cp_parser_type_id_1 (cp_parser *parser,
*** 26871,26876 ****
--- 27695,27705 ----
    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'
       outside the template-argument-list context here only for the sake of
*************** static tree
*** 26933,26939 ****
  cp_parser_type_id (cp_parser *parser, cp_parser_flags flags,
  		   location_t *type_location)
  {
!   return cp_parser_type_id_1 (parser, flags, false, false, type_location);
  }
  
  /* Wrapper for cp_parser_type_id_1.  */
--- 27762,27769 ----
  cp_parser_type_id (cp_parser *parser, cp_parser_flags flags,
  		   location_t *type_location)
  {
!   return cp_parser_type_id_1 (parser, flags, false, false, type_location,
! 			      nullptr);
  }
  
  /* Wrapper for cp_parser_type_id_1.  */
*************** cp_parser_template_type_arg (cp_parser *
*** 26946,26952 ****
      = G_("types may not be defined in template arguments");
    tree r = cp_parser_type_id_1 (parser, CP_PARSER_FLAGS_NONE,
  				/*is_template_arg=*/true,
! 				/*is_trailing_return=*/false, nullptr);
    parser->type_definition_forbidden_message = saved_message;
    /* cp_parser_type_id_1 checks for auto, but only for
       ->auto_is_implicit_function_template_parm_p.  */
--- 27776,27782 ----
      = G_("types may not be defined in template arguments");
    tree r = cp_parser_type_id_1 (parser, CP_PARSER_FLAGS_NONE,
  				/*is_template_arg=*/true,
! 				/*is_trailing_return=*/false, nullptr, nullptr);
    parser->type_definition_forbidden_message = saved_message;
    /* cp_parser_type_id_1 checks for auto, but only for
       ->auto_is_implicit_function_template_parm_p.  */
*************** static tree
*** 26964,26970 ****
  cp_parser_trailing_type_id (cp_parser *parser)
  {
    return cp_parser_type_id_1 (parser, CP_PARSER_FLAGS_TYPENAME_OPTIONAL,
! 			      false, true, NULL);
  }
  
  /* Parse a type-specifier-seq.
--- 27794,27800 ----
  cp_parser_trailing_type_id (cp_parser *parser)
  {
    return cp_parser_type_id_1 (parser, CP_PARSER_FLAGS_TYPENAME_OPTIONAL,
! 			      false, true, nullptr, nullptr);
  }
  
  /* Parse a type-specifier-seq.
*************** cp_parser_base_clause (cp_parser* parser
*** 30874,30887 ****
       public
  
     Returns a TREE_LIST.  The TREE_PURPOSE will be one of
!    ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_[VIRTUAL]_NODE to
!    indicate the specifiers provided.  The TREE_VALUE will be a TYPE
     (or the ERROR_MARK_NODE) indicating the type that was specified.  */
  
  static tree
  cp_parser_base_specifier (cp_parser* parser)
  {
!   cp_token *token;
    bool done = false;
    bool virtual_p = false;
    bool duplicate_virtual_error_issued_p = false;
--- 31704,31720 ----
       public
  
     Returns a TREE_LIST.  The TREE_PURPOSE will be one of
!    ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_NODE to
!    indicate the specifiers provided, or if the base specifier
!    has any annotations, a TREE_LIST with TREE_PURPOSE the
!    ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_NODE and
!    TREE_VALUE the list of annotations.  The TREE_VALUE will be a TYPE
     (or the ERROR_MARK_NODE) indicating the type that was specified.  */
  
  static tree
  cp_parser_base_specifier (cp_parser* parser)
  {
!   cp_token *token, *typename_token = nullptr, *splice_token = nullptr;
    bool done = false;
    bool virtual_p = false;
    bool duplicate_virtual_error_issued_p = false;
*************** cp_parser_base_specifier (cp_parser* par
*** 30891,30900 ****
    tree type;
    location_t attrs_loc = cp_lexer_peek_token (parser->lexer)->location;
    tree std_attrs = cp_parser_std_attribute_spec_seq (parser);
  
!   if (std_attrs != NULL_TREE && any_nonignored_attribute_p (std_attrs))
!     warning_at (attrs_loc, OPT_Wattributes,
! 		"attributes on base specifiers are ignored");
  
    /* Process the optional `virtual' and `access-specifier'.  */
    while (!done)
--- 31724,31751 ----
    tree type;
    location_t attrs_loc = cp_lexer_peek_token (parser->lexer)->location;
    tree std_attrs = cp_parser_std_attribute_spec_seq (parser);
+   tree annotations = NULL_TREE;
  
!   if (std_attrs != NULL_TREE)
!     {
!       tree *pannotations = &annotations;
!       for (tree attr = std_attrs; attr; attr = TREE_CHAIN (attr))
! 	{
! 	  if (annotation_p (attr))
! 	    {
! 	      *pannotations = attr;
! 	      pannotations = &TREE_CHAIN (attr);
! 	    }
! 	  else if (!attribute_ignored_p (attr))
! 	    {
! 	      if (std_attrs)
! 		warning_at (attrs_loc, OPT_Wattributes,
! 			    "attributes on base specifiers are ignored");
! 	      std_attrs = NULL_TREE;
! 	    }
! 	}
!       *pannotations = NULL_TREE;
!     }
  
    /* Process the optional `virtual' and `access-specifier'.  */
    while (!done)
*************** cp_parser_base_specifier (cp_parser* par
*** 30947,30963 ****
      }
    /* It is not uncommon to see programs mechanically, erroneously, use
       the 'typename' keyword to denote (dependent) qualified types
!      as base classes.  */
    if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
      {
!       token = cp_lexer_peek_token (parser->lexer);
!       if (!processing_template_decl)
! 	error_at (token->location,
! 		  "keyword %<typename%> not allowed outside of templates");
!       else
! 	error_at (token->location,
! 		  "keyword %<typename%> not allowed in this context "
! 		  "(the base class is implicitly a type)");
        cp_lexer_consume_token (parser->lexer);
      }
  
--- 31798,31811 ----
      }
    /* It is not uncommon to see programs mechanically, erroneously, use
       the 'typename' keyword to denote (dependent) qualified types
!      as base classes.  The diagnostic is deferred because if typename is
!      be followed by [:, it depends on whether it is splice-scope-specifier
!      or splice-type-specifier.  */
    if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
      {
!       typename_token = cp_lexer_peek_token (parser->lexer);
!       if (cp_parser_next_tokens_start_splice_type_spec_p (parser, true))
! 	splice_token = cp_lexer_peek_nth_token (parser->lexer, 2);
        cp_lexer_consume_token (parser->lexer);
      }
  
*************** cp_parser_base_specifier (cp_parser* par
*** 30985,30994 ****
--- 31833,31867 ----
    class_scope_p = (parser->scope && TYPE_P (parser->scope));
    template_p = class_scope_p && cp_parser_optional_template_keyword (parser);
  
+   if (typename_token && cp_lexer_peek_token (parser->lexer) != splice_token)
+     {
+       /* Emit deferred diagnostics for invalid typename keyword if
+ 	 cp_parser_nested_name_specifier_opt parsed splice-scope-specifier.  */
+       // TODO This error should be removed:
+       // struct A { struct B {}; };
+       // typename A::B b;
+       // is valid.
+       if (!processing_template_decl)
+ 	error_at (typename_token->location,
+ 		  "keyword %<typename%> not allowed outside of templates");
+       else
+ 	error_at (typename_token->location,
+ 		  "keyword %<typename%> not allowed in this context "
+ 		  "(the base class is implicitly a type)");
+     }
+ 
    if (!parser->scope
        && cp_lexer_next_token_is_decltype (parser->lexer))
      /* DR 950 allows decltype as a base-specifier.  */
      type = cp_parser_decltype (parser);
+   else if (!parser->scope
+ 	   && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SPLICE))
+     {
+       /* Parse C++26 splice-type-specifier.  */
+       type = cp_parser_splice_type_specifier (parser);
+       if (type == NULL_TREE)
+ 	return error_mark_node;
+     }
    else
      {
        /* Otherwise, look for the class-name.  */
*************** cp_parser_base_specifier (cp_parser* par
*** 31008,31014 ****
    if (type == error_mark_node)
      return error_mark_node;
  
!   return finish_base_specifier (type, access, virtual_p);
  }
  
  /* Exception handling [gram.exception] */
--- 31881,31887 ----
    if (type == error_mark_node)
      return error_mark_node;
  
!   return finish_base_specifier (type, access, virtual_p, annotations);
  }
  
  /* Exception handling [gram.exception] */
*************** cp_parser_check_std_attribute (location_
*** 32392,32397 ****
--- 33265,33285 ----
    return true;
  }
  
+ /* Parse a C++-26 annotation.
+ 
+   annotation:
+     = constant-expression  */
+ 
+ static tree
+ cp_parser_annotation (cp_parser *parser)
+ {
+   cp_parser_require (parser, CPP_EQ, RT_EQ);
+   auto suppression = make_temp_override (suppress_location_wrappers, 0);
+   return cp_parser_constant_expression (parser, /*allow_non_constant_p=*/false,
+ 					/*non_constant_p=*/nullptr,
+ 					/*strict_p=*/true);
+ }
+ 
  /* Parse a list of standard C++-11 attributes.
  
     attribute-list:
*************** cp_parser_std_attribute_list (cp_parser
*** 32409,32415 ****
  
    while (true)
      {
!       location_t loc = cp_lexer_peek_token (parser->lexer)->location;
        attribute = cp_parser_std_attribute (parser, attr_ns);
        if (attribute == error_mark_node)
  	break;
--- 33297,33318 ----
  
    while (true)
      {
!       token = cp_lexer_peek_token (parser->lexer);
!       location_t loc = token->location;
!       if (token->type == CPP_EQ)
! 	{
! 	  error_at (loc, "mixing annotations and attributes in the same list");
! 	  tree annotation = cp_parser_annotation (parser);
! 	  if (annotation == error_mark_node)
! 	    break;
! 	  if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
! 	    cp_lexer_consume_token (parser->lexer);
! 	  token = cp_lexer_peek_token (parser->lexer);
! 	  if (token->type != CPP_COMMA)
! 	    break;
! 	  cp_lexer_consume_token (parser->lexer);
! 	  continue;
! 	}
        attribute = cp_parser_std_attribute (parser, attr_ns);
        if (attribute == error_mark_node)
  	break;
*************** void cp_parser_late_contract_condition (
*** 32801,32810 ****
--- 33704,33773 ----
      }
  }
  
+ /* 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.
  
     attribute-specifier:
       [ [ attribute-using-prefix [opt] attribute-list ] ]
+      [ [ annotation-list ]]
       contract-attribute-specifier
       alignment-specifier
  
*************** cp_parser_std_attribute_spec (cp_parser
*** 32843,32848 ****
--- 33806,33825 ----
        cp_lexer_consume_token (parser->lexer);
  
        token = cp_lexer_peek_token (parser->lexer);
+       if (token->type == CPP_EQ)
+ 	{
+ 	  if (cxx_dialect < cxx26)
+ 	    pedwarn (token->location, OPT_Wc__26_extensions,
+ 		     "annotations only available with %<-std=c++2c%> "
+ 		     "or %<-std=gnu++2c%>");
+ 	  attributes = cp_parser_annotation_list (parser);
+ 	  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);
+ 	  return attributes;
+ 	}
+ 
        if (token->type == CPP_NAME)
  	{
  	  attr_name = token->u.value;
*************** static size_t
*** 33004,33010 ****
  cp_parser_skip_balanced_tokens (cp_parser *parser, size_t n)
  {
    size_t orig_n = n;
!   int nparens = 0, nbraces = 0, nsquares = 0;
    do
      switch (cp_lexer_peek_nth_token (parser->lexer, n++)->type)
        {
--- 33981,33987 ----
  cp_parser_skip_balanced_tokens (cp_parser *parser, size_t n)
  {
    size_t orig_n = n;
!   int nparens = 0, nbraces = 0, nsquares = 0, nsplices = 0;
    do
      switch (cp_lexer_peek_nth_token (parser->lexer, n++)->type)
        {
*************** cp_parser_skip_balanced_tokens (cp_parse
*** 33024,33029 ****
--- 34001,34009 ----
        case CPP_OPEN_SQUARE:
  	++nsquares;
  	break;
+       case CPP_OPEN_SPLICE:
+ 	++nsplices;
+ 	break;
        case CPP_CLOSE_PAREN:
  	--nparens;
  	break;
*************** cp_parser_skip_balanced_tokens (cp_parse
*** 33033,33042 ****
        case CPP_CLOSE_SQUARE:
  	--nsquares;
  	break;
        default:
  	break;
        }
!   while (nparens || nbraces || nsquares);
    return n;
  }
  
--- 34013,34025 ----
        case CPP_CLOSE_SQUARE:
  	--nsquares;
  	break;
+       case CPP_CLOSE_SPLICE:
+ 	--nsplices;
+ 	break;
        default:
  	break;
        }
!   while (nparens || nbraces || nsquares || nsplices);
    return n;
  }
  
*************** cp_parser_simple_requirement (cp_parser
*** 33850,33861 ****
  
  /* Parse a type requirement
  
!      type-requirement
!          nested-name-specifier [opt] required-type-name ';'
! 
!      required-type-name:
!          type-name
!          'template' [opt] simple-template-id  */
  
  static tree
  cp_parser_type_requirement (cp_parser *parser)
--- 34833,34842 ----
  
  /* Parse a type requirement
  
!      type-requirement:
!        typename nested-name-specifier [opt] type-name ';'
!        typename splice-specifier ';'
!        typename splice-specialization-specifier ';' */
  
  static tree
  cp_parser_type_requirement (cp_parser *parser)
*************** cp_parser_type_requirement (cp_parser *p
*** 33886,33893 ****
        type = make_typename_type (parser->scope, type, typename_type,
                                   /*complain=*/tf_error);
      }
    else
!    type = cp_parser_type_name (parser, /*typename_keyword_p=*/true);
  
    if (TREE_CODE (type) == TYPE_DECL)
      type = TREE_TYPE (type);
--- 34867,34881 ----
        type = make_typename_type (parser->scope, type, typename_type,
                                   /*complain=*/tf_error);
      }
+   else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SPLICE))
+     {
+       /* tsubst_type_requirement wants this to be a type.  */
+       type = cp_parser_splice_type_specifier (parser);
+       if (!type)
+ 	type = error_mark_node;
+     }
    else
!     type = cp_parser_type_name (parser, /*typename_keyword_p=*/true);
  
    if (TREE_CODE (type) == TYPE_DECL)
      type = TREE_TYPE (type);
*************** cp_parser_lookup_name (cp_parser *parser
*** 34159,34166 ****
  	 looking up names in uninstantiated templates.  Even then, we
  	 cannot look up the name if the scope is not a class type; it
  	 might, for example, be a template type parameter.  */
!       dependent_p = (TYPE_P (parser->scope)
! 		     && dependent_scope_p (parser->scope));
        if ((check_dependency || !CLASS_TYPE_P (parser->scope))
  	  && dependent_p)
  	/* Defer lookup.  */
--- 35147,35155 ----
  	 looking up names in uninstantiated templates.  Even then, we
  	 cannot look up the name if the scope is not a class type; it
  	 might, for example, be a template type parameter.  */
!       dependent_p = ((TYPE_P (parser->scope)
! 		      && dependent_scope_p (parser->scope))
! 		     || dependent_namespace_p (parser->scope));
        if ((check_dependency || !CLASS_TYPE_P (parser->scope))
  	  && dependent_p)
  	/* Defer lookup.  */
*************** cp_parser_lookup_name (cp_parser *parser
*** 34212,34219 ****
  
        /* If the scope is a dependent type and either we deferred lookup or
  	 we did lookup but didn't find the name, rememeber the name.  */
!       if (decl == error_mark_node && TYPE_P (parser->scope)
! 	  && dependentish_scope_p (parser->scope))
  	{
  	  if (tag_type)
  	    {
--- 35201,35210 ----
  
        /* If the scope is a dependent type and either we deferred lookup or
  	 we did lookup but didn't find the name, rememeber the name.  */
!       if (decl == error_mark_node
! 	  && ((TYPE_P (parser->scope)
! 	       && dependentish_scope_p (parser->scope))
! 	      || dependent_namespace_p (parser->scope)))
  	{
  	  if (tag_type)
  	    {
*************** cp_parser_lookup_name (cp_parser *parser
*** 34327,34333 ****
  
       During an explicit instantiation, access is not checked at all,
       as per [temp.explicit].  */
!   if (DECL_P (decl))
      check_accessibility_of_qualified_id (decl, object_type, parser->scope,
  					 tf_warning_or_error);
  
--- 35318,35327 ----
  
       During an explicit instantiation, access is not checked at all,
       as per [temp.explicit].  */
!   if (DECL_P (decl)
!       /* One cannot take the reflection of a using-declarator.  Skip this
! 	 check because we are going to report an error anyway.  */
!       && LIKELY (TREE_CODE (decl) != USING_DECL))
      check_accessibility_of_qualified_id (decl, object_type, parser->scope,
  					 tf_warning_or_error);
  
*************** cp_parser_lookup_name (cp_parser *parser
*** 34347,34353 ****
  	  auto_diagnostic_group d;
  	  error_at (name_location, "reference to %qD is ambiguous",
  		    name);
! 	  print_candidates (decl);
  	}
        return error_mark_node;
      }
--- 35341,35347 ----
  	  auto_diagnostic_group d;
  	  error_at (name_location, "reference to %qD is ambiguous",
  		    name);
! 	  print_candidates (name_location, decl);
  	}
        return error_mark_node;
      }
*************** cp_parser_required_error (cp_parser *par
*** 36665,36670 ****
--- 37659,37667 ----
  	  case RT_CLASS_TYPENAME_TEMPLATE:
  	    gmsgid = G_("expected %<class%>, %<typename%>, or %<template%>");
  	    break;
+ 	  case RT_CLOSE_SPLICE:
+ 	    gmsgid = G_("expected %<:]%>");
+ 	    break;
  	  default:
  	    gcc_unreachable ();
  	}
diff -Nrcpad gcc-16-20260111/gcc/cp/pt.cc gcc-16-20260118/gcc/cp/pt.cc
*** gcc-16-20260111/gcc/cp/pt.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/pt.cc	Sun Jan 18 22:32:07 2026
*************** pop_access_scope (tree t)
*** 277,282 ****
--- 277,294 ----
      pop_from_top_level ();
  }
  
+ /* Return current function, ignoring temporary overrides
+    of current_function_decl by push_access_scope.  */
+ 
+ tree
+ current_function_decl_without_access_scope ()
+ {
+   if (vec_safe_length (saved_access_scope))
+     return (*saved_access_scope)[0];
+   else
+     return current_function_decl;
+ }
+ 
  /* Do any processing required when DECL (a member template
     declaration) is finished.  Returns the TEMPLATE_DECL corresponding
     to DECL, unless it is a specialization, in which case the DECL
*************** maybe_begin_member_template_processing (
*** 546,554 ****
    int levels = 0;
    bool nsdmi = TREE_CODE (decl) == FIELD_DECL;
  
!   if (nsdmi)
      {
!       tree ctx = DECL_CONTEXT (decl);
        decl = (CLASSTYPE_TEMPLATE_INFO (ctx)
  	      /* Disregard full specializations (c++/60999).  */
  	      && uses_template_parms (ctx)
--- 558,566 ----
    int levels = 0;
    bool nsdmi = TREE_CODE (decl) == FIELD_DECL;
  
!   if (nsdmi || decl_specialization_friend_p (decl))
      {
!       tree ctx = nsdmi ? DECL_CONTEXT (decl) : DECL_CHAIN (decl);
        decl = (CLASSTYPE_TEMPLATE_INFO (ctx)
  	      /* Disregard full specializations (c++/60999).  */
  	      && uses_template_parms (ctx)
*************** verify_unstripped_args_1 (tree inner)
*** 1221,1227 ****
    for (int i = 0; i < TREE_VEC_LENGTH (inner); ++i)
      {
        tree arg = TREE_VEC_ELT (inner, i);
!       if (TREE_CODE (arg) == TEMPLATE_DECL)
  	/* OK */;
        else if (TYPE_P (arg))
  	gcc_assert (strip_typedefs (arg, NULL) == arg);
--- 1233,1239 ----
    for (int i = 0; i < TREE_VEC_LENGTH (inner); ++i)
      {
        tree arg = TREE_VEC_ELT (inner, i);
!       if (TREE_CODE (arg) == TEMPLATE_DECL || REFLECT_EXPR_P (arg))
  	/* OK */;
        else if (TYPE_P (arg))
  	gcc_assert (strip_typedefs (arg, NULL) == arg);
*************** iterative_hash_template_arg (tree arg, h
*** 1904,1909 ****
--- 1916,1933 ----
  	return val;
        }
  
+     case REFLECT_EXPR:
+       val = iterative_hash_hashval_t (REFLECT_EXPR_KIND (arg), val);
+       if (REFLECT_EXPR_KIND (arg) == REFLECT_BASE)
+ 	{
+ 	  tree binfo = REFLECT_EXPR_HANDLE (arg);
+ 	  val = iterative_hash_template_arg (BINFO_TYPE (binfo), val);
+ 	  val = iterative_hash_template_arg (direct_base_derived (binfo), val);
+ 	  return val;
+ 	}
+       /* Now hash operands as usual.  */
+       break;
+ 
      default:
        break;
      }
*************** iterative_hash_template_arg (tree arg, h
*** 1925,1931 ****
  
        switch (code)
  	{
! 	case  DECLTYPE_TYPE:
  	  val = iterative_hash_template_arg (DECLTYPE_TYPE_EXPR (arg), val);
  	  break;
  
--- 1949,1955 ----
  
        switch (code)
  	{
! 	case DECLTYPE_TYPE:
  	  val = iterative_hash_template_arg (DECLTYPE_TYPE_EXPR (arg), val);
  	  break;
  
*************** explicit_class_specialization_p (tree ty
*** 2038,2087 ****
    return !uses_template_parms (CLASSTYPE_TI_ARGS (type));
  }
  
! /* Print the list of functions at FNS, going through all the overloads
!    for each element of the list.  Alternatively, FNS cannot be a
!    TREE_LIST, in which case it will be printed together with all the
!    overloads.
! 
!    MORE and *STR should respectively be FALSE and NULL when the function
!    is called from the outside.  They are used internally on recursive
!    calls.  print_candidates manages the two parameters and leaves NULL
!    in *STR when it ends.  */
  
  static void
! print_candidates_1 (tree fns, char **str, bool more = false)
  {
    if (TREE_CODE (fns) == TREE_LIST)
      for (; fns; fns = TREE_CHAIN (fns))
!       print_candidates_1 (TREE_VALUE (fns), str, more || TREE_CHAIN (fns));
    else
!     for (lkp_iterator iter (fns); iter;)
!       {
! 	tree cand = *iter;
! 	++iter;
  
! 	const char *pfx = *str;
! 	if (!pfx)
! 	  {
! 	    if (more || iter)
! 	      pfx = _("candidates are:");
! 	    else
! 	      pfx = _("candidate is:");
! 	    *str = get_spaces (pfx);
! 	  }
! 	inform (DECL_SOURCE_LOCATION (cand), "%s %#qD", pfx, cand);
!       }
  }
  
  /* Print the list of candidate FNS in an error message.  FNS can also
!    be a TREE_LIST of non-functions in the case of an ambiguous lookup.  */
  
  void
! print_candidates (tree fns)
  {
!   char *str = NULL;
!   print_candidates_1 (fns, &str);
!   free (str);
  }
  
  /* Get a (possibly) constrained template declaration for the
--- 2062,2131 ----
    return !uses_template_parms (CLASSTYPE_TI_ARGS (type));
  }
  
! /* Populate OUT with the overload set FNS, going through all the
!    overloads for each element of the list.  Alternatively, FNS can be a
!    TREE_LIST, in which case it will be added together with all the
!    overloads.  */
  
  static void
! flatten_candidates (tree fns, auto_vec<tree> &out)
  {
    if (TREE_CODE (fns) == TREE_LIST)
      for (; fns; fns = TREE_CHAIN (fns))
!       flatten_candidates (TREE_VALUE (fns), out);
    else
!     for (tree cand : lkp_range (fns))
!       out.safe_push (cand);
! }
  
! /* Print a note announcing a list of candidates.  */
! 
! void
! inform_num_candidates (location_t loc, int num_candidates)
! {
!   inform_n (loc,
! 	    num_candidates, "there is %i candidate", "there are %i candidates",
! 	    num_candidates);
  }
  
  /* Print the list of candidate FNS in an error message.  FNS can also
!    be a TREE_LIST of non-functions in the case of an ambiguous lookup.
! 
!    If CAND_CTXT is non-null, use it for each candidate to allow for
!    additional per-candidate notes.  */
  
  void
! print_candidates (location_t error_loc,
! 		  tree fns,
! 		  candidate_context *cand_ctxt)
  {
!   auto_vec<tree> candidates;
!   flatten_candidates (fns, candidates);
! 
!   auto_diagnostic_nesting_level sentinel;
! 
!   inform_num_candidates (error_loc, candidates.length ());
! 
!   auto_diagnostic_nesting_level sentinel2;
! 
!   if (candidates.length () == 1)
!     {
!       tree cand = candidates[0];
!       inform (DECL_SOURCE_LOCATION (cand), "candidate is: %#qD", cand);
!       if (cand_ctxt)
! 	cand_ctxt->emit_any_notes_for_candidate (cand);
!     }
!   else
!     {
!       int idx = 0;
!       for (tree cand : candidates)
! 	{
! 	  inform (DECL_SOURCE_LOCATION (cand), "candidate %i: %#qD",
! 		  ++idx, cand);
! 	  if (cand_ctxt)
! 	    cand_ctxt->emit_any_notes_for_candidate (cand);
! 	}
!     }
  }
  
  /* Get a (possibly) constrained template declaration for the
*************** determine_specialization (tree template_
*** 2505,2511 ****
  		"saw %d %<template<>%>, need %d for "
  		"specializing a member function template",
  		header_count, template_count + 1);
!       print_candidates (orig_fns);
        return error_mark_node;
      }
    else if ((templates && TREE_CHAIN (templates))
--- 2549,2555 ----
  		"saw %d %<template<>%>, need %d for "
  		"specializing a member function template",
  		header_count, template_count + 1);
!       print_candidates (DECL_SOURCE_LOCATION (decl), orig_fns);
        return error_mark_node;
      }
    else if ((templates && TREE_CHAIN (templates))
*************** determine_specialization (tree template_
*** 2516,2522 ****
        error ("ambiguous template specialization %qD for %q+D",
  	     template_id, decl);
        candidates = chainon (candidates, templates);
!       print_candidates (candidates);
        return error_mark_node;
      }
  
--- 2560,2566 ----
        error ("ambiguous template specialization %qD for %q+D",
  	     template_id, decl);
        candidates = chainon (candidates, templates);
!       print_candidates (input_location, candidates);
        return error_mark_node;
      }
  
*************** convert_nontype_argument (tree type, tre
*** 7985,7990 ****
--- 8029,8045 ----
        if (expr == error_mark_node)
  	return NULL_TREE;
      }
+   else if (REFLECTION_TYPE_P (type))
+     {
+       if (!REFLECTION_TYPE_P (TREE_TYPE (expr)))
+ 	{
+ 	  if (complain & tf_error)
+ 	    error ("%qE is not a valid template argument for type %qT "
+ 		   "because it is of type %qT", expr, type, TREE_TYPE (expr));
+ 	  return NULL_TREE;
+ 	}
+       return expr;
+     }
    /* A template non-type parameter must be one of the above.  */
    else
      gcc_unreachable ();
*************** for_each_template_parm_r (tree *tp, int
*** 10946,10951 ****
--- 11001,11011 ----
  	return error_mark_node;
        break;
  
+     case SPLICE_SCOPE:
+       WALK_SUBTREE (SPLICE_SCOPE_EXPR (t));
+       *walk_subtrees = 0;
+       break;
+ 
      default:
        break;
      }
*************** instantiate_class_template (tree type)
*** 12750,12769 ****
  	{
  	  tree base;
  	  tree access = BINFO_BASE_ACCESS (pbinfo, i);
            tree expanded_bases = NULL_TREE;
            int idx, len = 1;
  
            if (PACK_EXPANSION_P (BINFO_TYPE (pbase_binfo)))
              {
!               expanded_bases =
! 		tsubst_pack_expansion (BINFO_TYPE (pbase_binfo),
! 				       args, tf_error, NULL_TREE);
                if (expanded_bases == error_mark_node)
                  continue;
  
                len = TREE_VEC_LENGTH (expanded_bases);
              }
  
            for (idx = 0; idx < len; idx++)
              {
                if (expanded_bases)
--- 12810,12840 ----
  	{
  	  tree base;
  	  tree access = BINFO_BASE_ACCESS (pbinfo, i);
+ 	  tree annotations = NULL_TREE;
            tree expanded_bases = NULL_TREE;
            int idx, len = 1;
  
+ 	  if (i + BINFO_BASE_BINFOS (pbinfo)->length ()
+ 	      < vec_safe_length (BINFO_BASE_ACCESSES (pbinfo)))
+ 	    annotations
+ 	      = BINFO_BASE_ACCESS (pbinfo,
+ 				   i + BINFO_BASE_BINFOS (pbinfo)->length ());
+ 
            if (PACK_EXPANSION_P (BINFO_TYPE (pbase_binfo)))
              {
! 	      expanded_bases
! 		= tsubst_pack_expansion (BINFO_TYPE (pbase_binfo),
! 					 args, tf_error, NULL_TREE);
                if (expanded_bases == error_mark_node)
                  continue;
  
                len = TREE_VEC_LENGTH (expanded_bases);
              }
  
+ 	  if (annotations)
+ 	    annotations = tsubst_attributes (annotations, args,
+ 					     tf_warning_or_error, NULL_TREE);
+ 
            for (idx = 0; idx < len; idx++)
              {
                if (expanded_bases)
*************** instantiate_class_template (tree type)
*** 12777,12783 ****
                if (base == error_mark_node)
                  continue;
  
!               base_list = tree_cons (access, base, base_list);
                if (BINFO_VIRTUAL_P (pbase_binfo))
                  TREE_TYPE (base_list) = integer_type_node;
              }
--- 12848,12860 ----
                if (base == error_mark_node)
                  continue;
  
! 	      tree acc = access;
! 	      if (annotations)
! 		/* Make sure each direct base from the pack has its unique
! 		   set of annotations.  */
! 		acc = build_tree_list (access, idx == 0 ? annotations
! 					       : copy_list (annotations));
! 	      base_list = tree_cons (acc, base, base_list);
                if (BINFO_VIRTUAL_P (pbase_binfo))
                  TREE_TYPE (base_list) = integer_type_node;
              }
*************** tsubst_tree_vec (tree t, tree args, tsub
*** 14241,14247 ****
     node if only a partial substitution could be performed, or ERROR_MARK_NODE
     if there was an error.  */
  
! tree
  tsubst_pack_index (tree t, tree args, tsubst_flags_t complain, tree in_decl)
  {
    tree pack = PACK_INDEX_PACK (t);
--- 14318,14324 ----
     node if only a partial substitution could be performed, or ERROR_MARK_NODE
     if there was an error.  */
  
! static tree
  tsubst_pack_index (tree t, tree args, tsubst_flags_t complain, tree in_decl)
  {
    tree pack = PACK_INDEX_PACK (t);
*************** tsubst_decl (tree t, tree args, tsubst_f
*** 16153,16158 ****
--- 16230,16242 ----
        }
        break;
  
+     case NAMESPACE_DECL:
+       if (dependent_namespace_p (t))
+ 	r = tsubst_expr (ORIGINAL_NAMESPACE (t), args, complain, in_decl);
+       else
+ 	r = t;
+       break;
+ 
      default:
        gcc_unreachable ();
      }
*************** tsubst_tree_list (tree t, tree args, tsu
*** 16592,16597 ****
--- 16676,16753 ----
    return chain;
  }
  
+ /* Substitute ARGS into T, which is a splice scope.  */
+ 
+ static tree
+ tsubst_splice_scope (tree t, tree args, tsubst_flags_t complain, tree in_decl)
+ {
+   tree r = tsubst (SPLICE_SCOPE_EXPR (t), args, complain, in_decl);
+   if (r == error_mark_node)
+     return r;
+   if (dependent_splice_p (r))
+     return make_splice_scope (r, SPLICE_SCOPE_TYPE_P (t));
+   if (SPLICE_SCOPE_TYPE_P (t)
+       ? !valid_splice_type_p (r)
+       : !valid_splice_scope_p (r))
+     {
+       if (complain & tf_error)
+ 	{
+ 	  const location_t loc = EXPR_LOCATION (SPLICE_SCOPE_EXPR (t));
+ 	  if (SPLICE_SCOPE_TYPE_P (t))
+ 	    error_at (loc, "%qE is not usable in a splice type", r);
+ 	  else
+ 	    error_at (loc, "%qE is not usable in a splice scope", r);
+ 	}
+       return error_mark_node;
+     }
+ 
+   return r;
+ }
+ 
+ /* Substitute ARGS into T, which is a splice expression.  */
+ 
+ static tree
+ tsubst_splice_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
+ {
+   tree op = tsubst_expr (TREE_OPERAND (t, 0), args, complain, in_decl);
+   if (op == error_mark_node)
+     return error_mark_node;
+   op = splice (op);
+   if (dependent_splice_p (op))
+     {
+       if (SPLICE_EXPR_EXPRESSION_P (t))
+ 	SET_SPLICE_EXPR_EXPRESSION_P (op);
+       if (SPLICE_EXPR_MEMBER_ACCESS_P (t))
+ 	SET_SPLICE_EXPR_MEMBER_ACCESS_P (op, true);
+       if (SPLICE_EXPR_ADDRESS_P (t))
+ 	SET_SPLICE_EXPR_ADDRESS_P (op, true);
+       return op;
+     }
+   if (SPLICE_EXPR_EXPRESSION_P (t)
+       && !check_splice_expr (input_location, UNKNOWN_LOCATION, op,
+ 			     SPLICE_EXPR_ADDRESS_P (t),
+ 			     SPLICE_EXPR_MEMBER_ACCESS_P (t),
+ 			     (complain & tf_error)))
+     return error_mark_node;
+   if (outer_automatic_var_p (op))
+     op = process_outer_var_ref (op, complain);
+   /* Like in cp_parser_splice_expression, for foo.[: bar :]
+      cp_parser_postfix_dot_deref_expression wants to see only
+      certain kind of entities.  */
+   if (SPLICE_EXPR_MEMBER_ACCESS_P (t))
+     gcc_assert (TREE_CODE (op) == FIELD_DECL
+ 		|| VAR_P (op)
+ 		|| TREE_CODE (op) == CONST_DECL
+ 		|| TREE_CODE (op) == FUNCTION_DECL
+ 		|| DECL_FUNCTION_TEMPLATE_P (OVL_FIRST (op))
+ 		|| variable_template_p (op)
+ 		|| BASELINK_P (op)
+ 		|| TREE_CODE (op) == TEMPLATE_ID_EXPR
+ 		|| TREE_CODE (op) == TREE_BINFO);
+ 
+   return op;
+ }
+ 
  /* Take the tree structure T and replace template parameters used
     therein with the argument vector ARGS.  IN_DECL is an associated
     decl for diagnostics.  If an error occurs, returns ERROR_MARK_NODE.
*************** tsubst (tree t, tree args, tsubst_flags_
*** 16619,16625 ****
        || t == void_type_node
        || t == char_type_node
        || t == unknown_type_node
-       || TREE_CODE (t) == NAMESPACE_DECL
        || TREE_CODE (t) == TRANSLATION_UNIT_DECL)
      return t;
  
--- 16775,16780 ----
*************** tsubst (tree t, tree args, tsubst_flags_
*** 16755,16760 ****
--- 16910,16916 ----
      case VECTOR_TYPE:
      case BOOLEAN_TYPE:
      case NULLPTR_TYPE:
+     case META_TYPE:
      case LANG_TYPE:
        return t;
  
*************** tsubst (tree t, tree args, tsubst_flags_
*** 17308,17313 ****
--- 17464,17502 ----
  	if (f == error_mark_node)
  	  return error_mark_node;
  
+ 	/* We had [:X:]:: which was substituted into a NAMESPACE_DECL and not
+ 	   a type.  */
+ 	if (TREE_CODE (ctx) == NAMESPACE_DECL)
+ 	  {
+ 	    if (TREE_CODE (f) == TEMPLATE_ID_EXPR)
+ 	      {
+ 		tree d = TREE_OPERAND (f, 0);
+ 		tree n = TREE_OPERAND (f, 1);
+ 		f = lookup_template_class (d, n, in_decl, ctx, complain);
+ 		if (f == error_mark_node)
+ 		  return error_mark_node;
+ 	      }
+ 	    else
+ 	      {
+ 		gcc_assert (TREE_CODE (f) == IDENTIFIER_NODE);
+ 		tree decl = lookup_qualified_name (ctx, f);
+ 		if (decl == error_mark_node || TREE_CODE (decl) == TREE_LIST)
+ 		  {
+ 		    qualified_name_lookup_error (ctx, f, decl, input_location);
+ 		    return error_mark_node;
+ 		  }
+ 		if (TREE_CODE (decl) == NAMESPACE_DECL)
+ 		  return decl;
+ 		else
+ 		  {
+ 		    gcc_checking_assert (TREE_CODE (decl) == TYPE_DECL);
+ 		    f = TREE_TYPE (decl);
+ 		  }
+ 	      }
+ 	    return cp_build_qualified_type
+ 		    (f, cp_type_quals (f) | cp_type_quals (t), complain);
+ 	  }
+ 
  	if (!MAYBE_CLASS_TYPE_P (ctx))
  	  {
  	    if (complain & tf_error)
*************** tsubst (tree t, tree args, tsubst_flags_
*** 17473,17478 ****
--- 17662,17696 ----
      case PACK_INDEX_TYPE:
        return tsubst_pack_index (t, args, complain, in_decl);
  
+     case SPLICE_SCOPE:
+       return tsubst_splice_scope (t, args, complain, in_decl);
+ 
+     case SPLICE_EXPR:
+       /* We are coming from tsubst_splice_scope for [:R:]
+ 	 where R needs to expand to a type or scope.  */
+       gcc_checking_assert (!SPLICE_EXPR_EXPRESSION_P (t));
+       return tsubst_splice_expr (t, args, complain, in_decl);
+ 
+     case TEMPLATE_ID_EXPR:
+       {
+ 	/* We end up here coming from tsubst_splice_scope for
+ 	   [:R:]<int>.  R needs to expand to a type or scope.  */
+ 	tree templ = TREE_OPERAND (t, 0);
+ 	gcc_assert (TREE_CODE (templ) == SPLICE_EXPR);
+ 	templ = tsubst_splice_expr (templ, args, complain, in_decl);
+ 	if (templ == error_mark_node)
+ 	  return error_mark_node;
+ 	tree targs = TREE_OPERAND (t, 1);
+ 	if (targs)
+ 	  targs = tsubst_template_args (targs, args, complain, in_decl);
+ 	if (targs == error_mark_node)
+ 	  return error_mark_node;
+ 	tree r = finish_template_type (templ, targs, /*entering_scope=*/false);
+ 	if (TREE_CODE (r) == TYPE_DECL)
+ 	  r = TREE_TYPE (r);
+ 	return r;
+       }
+ 
      case VOID_CST:
      case INTEGER_CST:
      case REAL_CST:
*************** tsubst (tree t, tree args, tsubst_flags_
*** 17502,17508 ****
  static tree
  tsubst_scope (tree t, tree args, tsubst_flags_t complain, tree in_decl)
  {
!   gcc_checking_assert (TYPE_P (t));
    return tsubst (t, args, complain | tf_qualifying_scope, in_decl);
  }
  
--- 17720,17726 ----
  static tree
  tsubst_scope (tree t, tree args, tsubst_flags_t complain, tree in_decl)
  {
!   gcc_checking_assert (TYPE_P (t) || TREE_CODE (t) == NAMESPACE_DECL);
    return tsubst (t, args, complain | tf_qualifying_scope, in_decl);
  }
  
*************** tsubst_qualified_id (tree qualified_id,
*** 17795,17801 ****
    else
      expr = name;
  
!   if (dependent_scope_p (scope))
      {
        if (TREE_CODE (expr) == SCOPE_REF)
  	/* We built one in tsubst_baselink.  */
--- 18013,18019 ----
    else
      expr = name;
  
!   if (dependent_scope_p (scope) || dependent_namespace_p (scope))
      {
        if (TREE_CODE (expr) == SCOPE_REF)
  	/* We built one in tsubst_baselink.  */
*************** tsubst_lambda_expr (tree t, tree args, t
*** 20495,20504 ****
  
    tree r = build_lambda_expr ();
  
!   LAMBDA_EXPR_LOCATION (r)
!     = LAMBDA_EXPR_LOCATION (t);
!   LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (r)
!     = LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (t);
    if (tree ti = LAMBDA_EXPR_REGEN_INFO (t))
      LAMBDA_EXPR_REGEN_INFO (r)
        = build_template_info (t, add_to_template_args (TI_ARGS (ti),
--- 20713,20721 ----
  
    tree r = build_lambda_expr ();
  
!   LAMBDA_EXPR_LOCATION (r) = LAMBDA_EXPR_LOCATION (t);
!   LAMBDA_EXPR_CONSTEVAL_BLOCK_P (r) = LAMBDA_EXPR_CONSTEVAL_BLOCK_P (t);
!   LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (r) = LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (t);
    if (tree ti = LAMBDA_EXPR_REGEN_INFO (t))
      LAMBDA_EXPR_REGEN_INFO (r)
        = build_template_info (t, add_to_template_args (TI_ARGS (ti),
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 22124,22130 ****
  	    /* Assume access of this FIELD_DECL has already been checked; we
  	       don't recheck it to avoid bogus access errors when substituting
  	       a reduced constant initializer (97740).  */
! 	    gcc_checking_assert (TREE_CODE (TREE_OPERAND (t, 1)) == FIELD_DECL);
  	    push_deferring_access_checks (dk_deferred);
  	    r = finish_non_static_data_member (member, object, NULL_TREE,
  					       complain);
--- 22341,22348 ----
  	    /* Assume access of this FIELD_DECL has already been checked; we
  	       don't recheck it to avoid bogus access errors when substituting
  	       a reduced constant initializer (97740).  */
! 	    gcc_checking_assert (TREE_CODE (TREE_OPERAND (t, 1)) == FIELD_DECL
! 				 || dependent_splice_p (TREE_OPERAND (t, 1)));
  	    push_deferring_access_checks (dk_deferred);
  	    r = finish_non_static_data_member (member, object, NULL_TREE,
  					       complain);
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 22200,22206 ****
  
  	r = finish_class_member_access_expr (object, member,
  					     /*template_p=*/false,
! 					     complain);
  	if (REF_PARENTHESIZED_P (t))
  	  r = force_paren_expr (r);
  	RETURN (r);
--- 22418,22425 ----
  
  	r = finish_class_member_access_expr (object, member,
  					     /*template_p=*/false,
! 					     complain,
! 					     COMPONENT_REF_SPLICE_P (t));
  	if (REF_PARENTHESIZED_P (t))
  	  r = force_paren_expr (r);
  	RETURN (r);
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 22522,22530 ****
  	}
        RETURN (t);
  
-     case NAMESPACE_DECL:
-       RETURN (t);
- 
      case OVERLOAD:
        if (modules_p ())
  	for (tree ovl : lkp_range (t))
--- 22741,22746 ----
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 22597,22603 ****
        }
  
      case PACK_INDEX_EXPR:
!     RETURN (tsubst_pack_index (t, args, complain, in_decl));
  
      case EXPR_PACK_EXPANSION:
        error ("invalid use of pack expansion expression");
--- 22813,22819 ----
        }
  
      case PACK_INDEX_EXPR:
!       RETURN (tsubst_pack_index (t, args, complain, in_decl));
  
      case EXPR_PACK_EXPANSION:
        error ("invalid use of pack expansion expression");
*************** tsubst_expr (tree t, tree args, tsubst_f
*** 22814,22819 ****
--- 23030,23059 ----
  	RETURN (op);
        }
  
+     case REFLECT_EXPR:
+       {
+ 	tree h = REFLECT_EXPR_HANDLE (t);
+ 	reflect_kind kind = REFLECT_EXPR_KIND (t);
+ 	if (TYPE_P (h) || TREE_CODE (h) == NAMESPACE_DECL)
+ 	  h = tsubst (h, args, complain, in_decl);
+ 	else if (kind == REFLECT_ANNOTATION)
+ 	  /* annotations_of should be called on reflections of already
+ 	     instantiated entities and so no need to tsubst the annotation
+ 	     attribute and we rely on pointer equality of that.  */
+ 	  ;
+ 	else
+ 	  {
+ 	    /* [expr.reflect] The id-expression of a reflect-expression is
+ 	       an unevaluated operand.  */
+ 	    cp_unevaluated u;
+ 	    h = RECUR (h);
+ 	  }
+ 	RETURN (get_reflection (EXPR_LOCATION (t), h, kind));
+       }
+ 
+     case SPLICE_EXPR:
+       RETURN (tsubst_splice_expr (t, args, complain, in_decl));
+ 
      default:
        /* Handle Objective-C++ constructs, if appropriate.  */
        if (tree subst = objcp_tsubst_expr (t, args, complain, in_decl))
*************** unify (tree tparms, tree targs, tree par
*** 26019,26024 ****
--- 26259,26265 ----
      case VOID_TYPE:
      case OPAQUE_TYPE:
      case NULLPTR_TYPE:
+     case META_TYPE:
        if (TREE_CODE (arg) != TREE_CODE (parm))
  	return unify_type_mismatch (explain_p, parm, arg);
  
*************** instantiate_body (tree pattern, tree arg
*** 28144,28149 ****
--- 28385,28392 ----
        if (DECL_OMP_DECLARE_REDUCTION_P (code_pattern))
  	cp_check_omp_declare_reduction (d);
  
+       check_consteval_only_fn (d);
+ 
        if (int errs = errorcount + sorrycount)
  	if (errs > current_tinst_level->errors)
  	  if (function *f = DECL_STRUCT_FUNCTION (d))
*************** tsubst_enum (tree tag, tree newtag, tree
*** 28710,28715 ****
--- 28953,28960 ----
    if (SCOPED_ENUM_P (newtag))
      begin_scope (sk_scoped_enum, newtag);
  
+   ENUM_BEING_DEFINED_P (newtag) = 1;
+ 
    for (e = TYPE_VALUES (tag); e; e = TREE_CHAIN (e))
      {
        tree value;
*************** dependent_type_p_r (tree type)
*** 28990,28995 ****
--- 29235,29245 ----
    if (TREE_CODE (type) == DEPENDENT_OPERATOR_TYPE)
      return true;
  
+   /* A splice-scope-specifier is dependent if its splice-specifier
+      or splice-specialization-specifier is dependent.  */
+   if (TREE_CODE (type) == SPLICE_SCOPE)
+     return true;
+ 
    if (any_dependent_type_attributes_p (TYPE_ATTRIBUTES (type)))
      return true;
  
*************** dependentish_scope_p (tree scope)
*** 29079,29084 ****
--- 29329,29345 ----
    return dependent_scope_p (scope) || any_dependent_bases_p (scope);
  }
  
+ /* Returns TRUE if NS is a dependent namespace, in which we can't do any
+    lookup.  */
+ 
+ bool
+ dependent_namespace_p (tree ns)
+ {
+   if (TREE_CODE (ns) == NAMESPACE_DECL)
+     ns = ORIGINAL_NAMESPACE (ns);
+   return TREE_CODE (ns) == SPLICE_EXPR;
+ }
+ 
  /* T is a SCOPE_REF.  Return whether it represents a non-static member of
     an unknown base of 'this' (and is therefore instantiation-dependent).  */
  
*************** value_dependent_expression_p (tree expre
*** 29357,29362 ****
--- 29618,29641 ----
  	    if (value_dependent_expression_p (op))
  	      return true;
  	  }
+ 	if (flag_reflection && !fn && CALL_EXPR_FN (expression))
+ 	  {
+ 	    fn = MAYBE_BASELINK_FUNCTIONS (CALL_EXPR_FN (expression));
+ 	    if (fn && TREE_CODE (fn) != FUNCTION_DECL)
+ 	      fn = NULL_TREE;
+ 	  }
+ 	/* [meta.reflection.access.context]/8: An invocation of current that
+ 	   appears at a program point P is value-dependent if eval-point(P)
+ 	   is enclosed by a scope corresponding to a templated entity.  */
+ 	if (flag_reflection
+ 	    && fn
+ 	    && metafunction_p (fn)
+ 	    && id_equal (DECL_NAME (fn), "current")
+ 	    && DECL_CLASS_SCOPE_P (fn)
+ 	    && id_equal (TYPE_IDENTIFIER (DECL_CONTEXT (fn)),
+ 			 "access_context"))
+ 	  return true;
+ 
  	return false;
        }
  
*************** value_dependent_expression_p (tree expre
*** 29389,29394 ****
--- 29668,29691 ----
  	      || value_dependent_expression_p (TREE_OPERAND (expression, 2))
  	      || value_dependent_expression_p (TREE_OPERAND (expression, 3)));
  
+     case REFLECT_EXPR:
+       /* [temp.dep.constexpr] A reflect-expression is value-dependent
+ 	 if it contains a dependent nested-name-specifier, type-id,
+ 	 namespace-name, or template-name, or if it contains
+ 	 a value-dependent or type-dependent id-expression.  */
+       if (REFLECT_EXPR_KIND (expression) == REFLECT_BASE)
+ 	/* Direct base relationship isn't value-dependent and calling
+ 	   uses_template_parms on TREE_BINFO leads to ICEs.  */
+ 	return false;
+       if (REFLECT_EXPR_KIND (expression) == REFLECT_DATA_MEMBER_SPEC)
+ 	{
+ 	  /* Data member description is value dependent if the type is
+ 	     dependent, other optional fields shouldn't be ever dependent.  */
+ 	  tree h = REFLECT_EXPR_HANDLE (expression);
+ 	  return dependent_type_p (TREE_VEC_ELT (h, 0));
+ 	}
+       return uses_template_parms (REFLECT_EXPR_HANDLE (expression));
+ 
      default:
        /* A constant expression is value-dependent if any subexpression is
  	 value-dependent.  */
*************** type_dependent_expression_p (tree expres
*** 29478,29484 ****
        || TREE_CODE (expression) == DELETE_EXPR
        || TREE_CODE (expression) == VEC_DELETE_EXPR
        || TREE_CODE (expression) == THROW_EXPR
!       || TREE_CODE (expression) == REQUIRES_EXPR)
      return false;
  
    /* The types of these expressions depends only on the type to which
--- 29775,29782 ----
        || TREE_CODE (expression) == DELETE_EXPR
        || TREE_CODE (expression) == VEC_DELETE_EXPR
        || TREE_CODE (expression) == THROW_EXPR
!       || TREE_CODE (expression) == REQUIRES_EXPR
!       || REFLECT_EXPR_P (expression))
      return false;
  
    /* The types of these expressions depends only on the type to which
*************** finish_expansion_stmt (tree expansion_st
*** 33116,33121 ****
--- 33414,33437 ----
      }
  }
  
+ /* Perform the appropriate conversion of the argument of
+    std::meta::reflect_constant.   EXPR is the argument, TYPE is its type.
+    Mainly, the point is to check that the type is valid in this context
+    and maybe replace the argument with a reference to the corresponding
+    template parameter object.  */
+ 
+ tree
+ convert_reflect_constant_arg (tree type, tree expr)
+ {
+   if (invalid_nontype_parm_type_p (type, tf_none))
+     return error_mark_node;
+ 
+   expr = convert_nontype_argument (type, expr, tf_none);
+   if (!expr)
+     return error_mark_node;
+   return expr;
+ }
+ 
  /* Set up the hash tables for template instantiations.  */
  
  void
diff -Nrcpad gcc-16-20260111/gcc/cp/reflect.cc gcc-16-20260118/gcc/cp/reflect.cc
*** gcc-16-20260111/gcc/cp/reflect.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/cp/reflect.cc	Sun Jan 18 22:32:07 2026
***************
*** 0 ****
--- 1,8602 ----
+ /* C++ reflection code.
+    Copyright (C) 2025-2026 Free Software Foundation, Inc.
+    Written by Marek Polacek <polacek@redhat.com> and
+    Jakub Jelinek <jakub@redhat.com>.
+ 
+ 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.
+ 
+ You should have received a copy of the GNU General Public License
+ 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 "target.h"
+ #include "tm.h"
+ #include "cp-tree.h"
+ #include "stringpool.h" // for get_identifier
+ #include "intl.h"
+ #include "attribs.h"
+ #include "c-family/c-pragma.h" // for parse_in
+ #include "gimplify.h" // for unshare_expr
+ #include "metafns.h"
+ 
+ static tree eval_is_function_type (tree);
+ static tree eval_is_object_type (location_t, tree);
+ static tree eval_reflect_constant (location_t, const constexpr_ctx *, tree,
+ 				   tree, bool *, tree *, tree);
+ static tree eval_is_array_type (location_t, tree);
+ static tree eval_reflect_constant_array (location_t, const constexpr_ctx *,
+ 					 tree, bool *, bool *, tree *, tree);
+ static tree eval_reflect_function (location_t, const constexpr_ctx *, tree,
+ 				   tree, bool *, tree *, tree);
+ struct constexpr_ctx;
+ 
+ /* Return the appropriate tsubst flags for processing a metafunction.  */
+ 
+ static tsubst_flags_t
+ complain_flags (const constexpr_ctx *ctx)
+ {
+   return cxx_constexpr_quiet_p (ctx) ? tf_none : tf_warning_or_error;
+ }
+ 
+ /* Initialize state for reflection; e.g., initialize meta_info_type_node.  */
+ 
+ void
+ init_reflection ()
+ {
+   /* The type std::meta::info is a scalar type for which equality and
+      inequality are meaningful, but for which no ordering relation is
+      defined.  */
+   meta_info_type_node = make_node (META_TYPE);
+   /* Make it a complete type.  */
+   TYPE_SIZE (meta_info_type_node) = bitsize_int (GET_MODE_BITSIZE (ptr_mode));
+   TYPE_SIZE_UNIT (meta_info_type_node) = size_int (GET_MODE_SIZE (ptr_mode));
+   /* Name it.  */
+   record_builtin_type (RID_MAX, "decltype(^^int)", meta_info_type_node);
+ 
+   /* Create the `std::meta' namespace.  */
+   push_namespace (get_identifier ("std"));
+   push_namespace (get_identifier ("meta"), /*inline*/false);
+   std_meta_node = current_namespace;
+   pop_namespace ();
+   pop_namespace ();
+ }
+ 
+ /* Create a REFLECT_EXPR expression of kind KIND around T.  */
+ 
+ static tree
+ get_reflection_raw (location_t loc, tree t, reflect_kind kind = REFLECT_UNDEF)
+ {
+   t = build1_loc (loc, REFLECT_EXPR, meta_info_type_node, t);
+   SET_REFLECT_EXPR_KIND (t, kind);
+   TREE_CONSTANT (t) = true;
+   TREE_READONLY (t) = true;
+   TREE_SIDE_EFFECTS (t) = false;
+   return t;
+ }
+ 
+ /* Return the reflection for T.
+ 
+     [basic.fundamental]: A value of type std::meta::info is called a reflection.
+     There exists a unique null reflection; every other reflection is
+     a representation of
+ 
+     -- a value of scalar type,
+     -- an object with static storage duration,
+     -- a variable,
+     -- a structured binding,
+     -- a function,
+     -- a function parameter,
+     -- an enumerator,
+     -- an annotation,
+     -- a type alias,
+     -- a type,
+     -- a class member,
+     -- an unnamed bit-field,
+     -- a class template,
+     -- a function template,
+     -- a variable template,
+     -- an alias template,
+     -- a concept,
+     -- a namespace alias,
+     -- a namespace,
+     -- a direct base class relationship, or
+     -- a data member description.
+ 
+    KIND is used to distinguish between categories that are represented
+    by the same handle.  */
+ 
+ tree
+ get_reflection (location_t loc, tree t, reflect_kind kind/*=REFLECT_UNDEF*/)
+ {
+   STRIP_ANY_LOCATION_WRAPPER (t);
+ 
+   /* [expr.reflect] If the type-id designates a placeholder type, R is
+      ill-formed.  */
+   if (is_auto (t))
+     {
+       error_at (loc, "%<^^%> cannot be applied to a placeholder type");
+       return error_mark_node;
+     }
+   /* Constant template parameters and pack-index-expressions cannot
+      appear as operands of the reflection operator.  */
+   else if (PACK_INDEX_P (t))
+     {
+       error_at (loc, "%<^^%> cannot be applied to a pack index");
+       return error_mark_node;
+     }
+   else if (TREE_CODE (t) == CONST_DECL && DECL_TEMPLATE_PARM_P (t))
+     {
+       error_at (loc, "%<^^%> cannot be applied to a non-type template "
+ 		"parameter %qD", t);
+       return error_mark_node;
+     }
+   /* If the id-expression denotes a variable declared by an init-capture,
+      R is ill-formed.  */
+   else if (is_capture_proxy (t))
+     {
+       error_at (loc, "%<^^%> cannot be applied to a capture %qD", t);
+       return error_mark_node;
+     }
+   /* If the id-expression denotes a local parameter introduced by
+      a requires-expression, R is ill-formed.  */
+   else if (TREE_CODE (t) == PARM_DECL && CONSTRAINT_VAR_P (t))
+     {
+       error_at (loc, "%<^^%> cannot be applied to a local parameter of "
+ 		"a requires-expression %qD", t);
+       return error_mark_node;
+     }
+   /* If the id-expression denotes a local entity E for which there is
+      a lambda scope that intervenes between R and the point at which E
+      was introduced, R is ill-formed.  */
+   else if (outer_automatic_var_p (t)
+ 	   /* Since outer_automatic_var_p is also true when we are in
+ 	      a local class member function, additionally check that
+ 	      we are in a lambda.  */
+ 	   && ((current_function_decl
+ 		&& LAMBDA_FUNCTION_P (current_function_decl))
+ 	       || parsing_lambda_declarator ()))
+     {
+       auto_diagnostic_group d;
+       error_at (loc, "%<^^%> cannot be applied a local entity for which "
+ 		"there is an intervening lambda expression");
+       inform (DECL_SOURCE_LOCATION (t), "%qD declared here", t);
+       return error_mark_node;
+     }
+   /* If lookup finds a declaration that replaced a using-declarator during
+      a single search, R is ill-formed.  */
+   else if (TREE_CODE (t) == USING_DECL
+ 	   || (TREE_CODE (t) == OVERLOAD && OVL_USING_P (t)))
+     {
+       error_at (loc, "%<^^%> cannot be applied to a using-declaration");
+       return error_mark_node;
+     }
+   /* A concept is fine, but not Concept<arg>.  */
+   else if (concept_check_p (t))
+     {
+       error_at (loc, "%<^^%> cannot be applied to a concept check");
+       return error_mark_node;
+     }
+ 
+   /* Otherwise, if the template-name names a function template F,
+      then the template-name interpreted as an id-expression shall
+      denote an overload set containing only F.  R represents F.
+ 
+      When we have:
+        template<typename T>
+        void foo (T) {}
+        constexpr auto a = ^^foo;
+      we will get an OVERLOAD containing only one function.  */
+   tree r = MAYBE_BASELINK_FUNCTIONS (t);
+   if (OVL_P (r))
+     {
+       if (!OVL_SINGLE_P (r))
+ 	{
+ 	  error_at (loc, "cannot take the reflection of an overload set");
+ 	  return error_mark_node;
+ 	}
+     }
+   /* [expr.reflect] If the id-expression denotes an overload set S,
+      overload resolution for the expression &S with no target shall
+      select a unique function; R represents that function.  */
+   else if (!processing_template_decl && t != unknown_type_node)
+     /* Resolve all TEMPLATE_ID_EXPRs here.  */
+     t = resolve_nondeduced_context_or_error (t, tf_warning_or_error);
+ 
+   /* For injected-class-name, use the main variant so that comparing
+      reflections works (cf. compare3.C).  */
+   if (RECORD_OR_UNION_TYPE_P (t)
+       && TYPE_NAME (t)
+       && DECL_SELF_REFERENCE_P (TYPE_NAME (t)))
+     t = TYPE_MAIN_VARIANT (t);
+ 
+   /* It's annoying to deal with BIT_NOT_EXPR in a reflection later, so
+      look up the FUNCTION_DECL here.  */
+   if (TREE_CODE (t) == BIT_NOT_EXPR
+       && CLASS_TYPE_P (TREE_OPERAND (t, 0))
+       && COMPLETE_TYPE_P (TREE_OPERAND (t, 0)))
+     {
+       r = TREE_OPERAND (t, 0);
+       if (CLASSTYPE_LAZY_DESTRUCTOR (r))
+ 	lazily_declare_fn (sfk_destructor, r);
+       if (tree dtor = CLASSTYPE_DESTRUCTOR (r))
+ 	t = dtor;
+     }
+ 
+   if (t == error_mark_node)
+     return error_mark_node;
+ 
+   return get_reflection_raw (loc, t, kind);
+ }
+ 
+ /* Null reflection shared tree.  */
+ 
+ static GTY(()) tree null_reflection;
+ 
+ /* Return a null reflection value.  */
+ 
+ tree
+ get_null_reflection ()
+ {
+   if (!null_reflection)
+     null_reflection = get_reflection_raw (UNKNOWN_LOCATION, unknown_type_node);
+   return null_reflection;
+ }
+ 
+ /* Do strip_typedefs on T, but only for types.  */
+ 
+ static tree
+ maybe_strip_typedefs (tree t)
+ {
+   if (TYPE_P (t))
+     return strip_typedefs (t);
+   return t;
+ }
+ 
+ /* If PARM_DECL comes from an earlier reflection of a function parameter
+    and function definition is seen after that, DECL_ARGUMENTS is
+    overwritten and so the old PARM_DECL is no longer present in the
+    DECL_ARGUMENTS (DECL_CONTEXT (parm)) chain.  Return corresponding
+    PARM_DECL which is in the chain.  */
+ 
+ static tree
+ maybe_update_function_parm (tree parm)
+ {
+   if (!OLD_PARM_DECL_P (parm))
+     return parm;
+   tree fn = DECL_CONTEXT (parm);
+   int oldlen = list_length (parm);
+   int newlen = list_length (DECL_ARGUMENTS (fn));
+   gcc_assert (newlen >= oldlen);
+   tree ret = DECL_ARGUMENTS (fn);
+   int n = newlen - oldlen;
+   while (n)
+     {
+       ret = DECL_CHAIN (ret);
+       --n;
+     }
+   return ret;
+ }
+ 
+ /* Return true if DECL comes from std::meta.  */
+ 
+ static bool
+ decl_in_std_meta_p (tree decl)
+ {
+   return decl_namespace_context (decl) == std_meta_node;
+ }
+ 
+ /* Returns true if FNDECL, a FUNCTION_DECL, is a call to a metafunction
+    declared in namespace std::meta.  */
+ 
+ bool
+ metafunction_p (tree fndecl)
+ {
+   if (!flag_reflection)
+     return false;
+ 
+   /* Metafunctions are expected to be marked consteval.  */
+   if (!DECL_IMMEDIATE_FUNCTION_P (fndecl))
+     return false;
+ 
+   if (special_function_p (fndecl))
+     return false;
+ 
+   if (!decl_in_std_meta_p (fndecl))
+     return false;
+ 
+   /* They should be user provided and not defined.  */
+   if (!user_provided_p (fndecl)
+       || (DECL_NAMESPACE_SCOPE_P (fndecl) && DECL_DELETED_FN (fndecl)))
+     return false;
+   if (DECL_INITIAL (fndecl))
+     return false;
+ 
+   return true;
+ }
+ 
+ /* Extract the N-th reflection argument from a metafunction call CALL.  */
+ 
+ static tree
+ get_info (const constexpr_ctx *ctx, tree call, int n, bool *non_constant_p,
+ 	  bool *overflow_p, tree *jump_target)
+ {
+   gcc_checking_assert (call_expr_nargs (call) > n);
+   tree info = get_nth_callarg (call, n);
+   gcc_checking_assert (REFLECTION_TYPE_P (TREE_TYPE (info)));
+   info = cxx_eval_constant_expression (ctx, info, vc_prvalue,
+ 				       non_constant_p, overflow_p,
+ 				       jump_target);
+   if (*jump_target)
+     return NULL_TREE;
+   if (!REFLECT_EXPR_P (info))
+     {
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   return info;
+ }
+ 
+ /* Try to get the underlying FUNCTION_DECL from reflection if any,
+    otherwise return R.  */
+ 
+ static tree
+ maybe_get_reflection_fndecl (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   r = OVL_FIRST (r);
+   return r;
+ }
+ 
+ /* Helper function for get_range_elts, called through cp_walk_tree.  */
+ 
+ static tree
+ replace_parm_r (tree *tp, int *walk_subtrees, void *data)
+ {
+   tree *p = (tree *) data;
+   if (*tp == p[0])
+     *tp = p[1];
+   else if (TYPE_P (*tp))
+     *walk_subtrees = 0;
+   return NULL_TREE;
+ }
+ 
+ static tree throw_exception (location_t, const constexpr_ctx *, const char *,
+ 			     tree, bool *, tree *);
+ 
+ /* Kinds for get_range_elts.  */
+ 
+ enum get_range_elts_kind {
+   GET_INFO_VEC,
+   REFLECT_CONSTANT_STRING,
+   REFLECT_CONSTANT_ARRAY
+ };
+ 
+ /* Extract the N-th input_range argument from a metafunction call CALL
+    and return it as TREE_VEC or STRING_CST or CONSTRUCTOR.  Helper function
+    for get_info_vec, eval_reflect_constant_string and
+    eval_reflect_constant_array.  For GET_INFO_VEC kind, <meta> ensures
+    the argument is reference to reflection_range concept and so both
+    range_value_t is info and range_refernce_t is cv info or cv info & or
+    cv info &&.  */
+ 
+ static tree
+ get_range_elts (location_t loc, const constexpr_ctx *ctx, tree call, int n,
+ 		bool *non_constant_p, bool *overflow_p, tree *jump_target,
+ 		get_range_elts_kind kind, tree fun)
+ {
+   gcc_checking_assert (call_expr_nargs (call) > n);
+   tree arg = get_nth_callarg (call, n);
+   tree parm = DECL_ARGUMENTS (cp_get_callee_fndecl_nofold (call));
+   for (int i = 0; i < n; ++i)
+     parm = DECL_CHAIN (parm);
+   tree type = TREE_TYPE (arg);
+   gcc_checking_assert (TYPE_REF_P (type));
+   arg = cxx_eval_constant_expression (ctx, arg, vc_prvalue, non_constant_p,
+ 				      overflow_p, jump_target);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   tree map[2] = { parm, arg };
+   /* To speed things up, check
+      if constexpr (std::ranges::contiguous_range <_R>).  */
+   tree ranges_ns = lookup_qualified_name (std_node, "ranges");
+   if (TREE_CODE (ranges_ns) != NAMESPACE_DECL)
+     {
+       error_at (loc, "%<std::ranges%> is not a namespace");
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   tree contiguous_range
+     = lookup_qualified_name (ranges_ns, "contiguous_range");
+   if (TREE_CODE (contiguous_range) != TEMPLATE_DECL
+       || !concept_definition_p (contiguous_range))
+     contiguous_range = NULL_TREE;
+   else
+     {
+       tree args = make_tree_vec (1);
+       TREE_VEC_ELT (args, 0) = TREE_TYPE (type);
+       contiguous_range = build2_loc (loc, TEMPLATE_ID_EXPR, boolean_type_node,
+ 				     contiguous_range, args);
+       if (!integer_nonzerop (maybe_constant_value (contiguous_range)))
+ 	contiguous_range = NULL_TREE;
+     }
+   tree valuet = meta_info_type_node;
+   tree ret = NULL_TREE;
+   if (kind != GET_INFO_VEC)
+     {
+       tree args = make_tree_vec (1);
+       TREE_VEC_ELT (args, 0) = TREE_TYPE (type);
+       tree inst = lookup_template_class (get_identifier ("range_value_t"),
+ 					 args, /*in_decl*/NULL_TREE,
+ 					 /*context*/ranges_ns,
+ 					 tf_warning_or_error);
+       inst = complete_type (inst);
+       if (inst == error_mark_node)
+ 	{
+ 	  *non_constant_p = true;
+ 	  return NULL_TREE;
+ 	}
+       valuet = TYPE_MAIN_VARIANT (inst);
+       if (kind == REFLECT_CONSTANT_STRING
+ 	  && valuet != char_type_node
+ 	  && valuet != wchar_type_node
+ 	  && valuet != char8_type_node
+ 	  && valuet != char16_type_node
+ 	  && valuet != char32_type_node)
+ 	{
+ 	  if (!cxx_constexpr_quiet_p (ctx))
+ 	    error_at (loc, "%<reflect_constant_string%> called with %qT "
+ 			   "rather than %<char%>, %<wchar_t%>, %<char8_t%>, "
+ 			   "%<char16_t%> or %<char32_t%>", inst);
+ 	  *non_constant_p = true;
+ 	  return NULL_TREE;
+ 	}
+       /* Check for the reflect_object_string special-case, where r
+ 	 refers to a string literal.  In that case CharT() should not
+ 	 be appended.  */
+       if (kind == REFLECT_CONSTANT_STRING
+ 	  && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE
+ 	  && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type))) == valuet
+ 	  && TYPE_DOMAIN (TREE_TYPE (type)))
+ 	{
+ 	  tree a = arg;
+ 	  tree maxv = TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (type)));
+ 	  STRIP_NOPS (a);
+ 	  tree at;
+ 	  if (TREE_CODE (a) == ADDR_EXPR
+ 	      && TREE_CODE (TREE_OPERAND (a, 0)) == STRING_CST
+ 	      && tree_fits_uhwi_p (maxv)
+ 	      && ((unsigned) TREE_STRING_LENGTH (TREE_OPERAND (a, 0))
+ 		  == ((tree_to_uhwi (maxv) + 1)
+ 		       * tree_to_uhwi (TYPE_SIZE_UNIT (valuet))))
+ 	      && (at = TREE_TYPE (TREE_OPERAND (a, 0)))
+ 	      && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type),
+ 							    at))
+ 	    return TREE_OPERAND (a, 0);
+ 	}
+       if (kind == REFLECT_CONSTANT_ARRAY)
+ 	{
+ 	  if (!structural_type_p (valuet))
+ 	    {
+ 	      if (!cxx_constexpr_quiet_p (ctx))
+ 		{
+ 		  auto_diagnostic_group d;
+ 		  error_at (loc, "%<reflect_constant_array%> argument with "
+ 				 "%qT which is not a structural type", inst);
+ 		  structural_type_p (valuet, true);
+ 		}
+ 	      *non_constant_p = true;
+ 	      return NULL_TREE;
+ 	    }
+ 	  TREE_VEC_ELT (args, 0)
+ 	    = build_stub_type (valuet,
+ 			       cp_type_quals (valuet) | TYPE_QUAL_CONST,
+ 			       false);
+ 	  if (!is_xible (INIT_EXPR, valuet, args))
+ 	    {
+ 	      if (!cxx_constexpr_quiet_p (ctx))
+ 		error_at (loc, "%<reflect_constant_array%> argument with %qT "
+ 			       "which is not copy constructible", inst);
+ 	      *non_constant_p = true;
+ 	      return NULL_TREE;
+ 	    }
+ 	  TREE_VEC_ELT (args, 0) = TREE_TYPE (type);
+ 	  tree instr
+ 	    = lookup_template_class (get_identifier ("range_reference_t"),
+ 				     args, /*in_decl*/NULL_TREE,
+ 				     /*context*/ranges_ns,
+ 				     tf_warning_or_error);
+ 	  instr = complete_type (instr);
+ 	  if (instr == error_mark_node)
+ 	    {
+ 	      *non_constant_p = true;
+ 	      return NULL_TREE;
+ 	    }
+ 	  tree referencet = TYPE_MAIN_VARIANT (instr);
+ 	  TREE_VEC_ELT (args, 0) = referencet;
+ 	  if (!is_xible (INIT_EXPR, valuet, args))
+ 	    {
+ 	      if (!cxx_constexpr_quiet_p (ctx))
+ 		error_at (loc, "%<reflect_constant_array%> argument with %qT "
+ 			       "which is not constructible from %qT "
+ 			       "%<std::ranges::range_reference_t%>",
+ 			  inst, referencet);
+ 	      *non_constant_p = true;
+ 	      return NULL_TREE;
+ 	    }
+ 	}
+     }
+   auto_vec<tree, 32> retvec;
+   tree p = convert_from_reference (parm);
+   auto obj_call = [=, &map] (tree obj, tsubst_flags_t complain) {
+     releasing_vec args;
+     vec_safe_push (args, p);
+     tree call = finish_call_expr (obj, &args, true, false, complain);
+     if (call == error_mark_node)
+       return call;
+     cp_walk_tree (&call, replace_parm_r, map, NULL);
+     if (complain != tf_none)
+       return call;
+     call = cxx_eval_constant_expression (ctx, call, vc_prvalue, non_constant_p,
+ 					 overflow_p, jump_target);
+     if (*jump_target || *non_constant_p)
+       return NULL_TREE;
+     return call;
+   };
+   auto ret_retvec = [=, &retvec] () {
+     unsigned HOST_WIDE_INT sz = retvec.length ();
+     for (size_t i = 0; i < sz; ++i)
+       {
+ 	if (INTEGRAL_TYPE_P (valuet))
+ 	  {
+ 	    if (TREE_CODE (retvec[i]) != INTEGER_CST)
+ 	      return throw_exception (loc, ctx,
+ 				      "array element not a constant integer",
+ 				      fun, non_constant_p, jump_target);
+ 	  }
+ 	else
+ 	  {
+ 	    gcc_assert (kind == REFLECT_CONSTANT_ARRAY);
+ 	    tree expr = convert_reflect_constant_arg (valuet, retvec[i]);
+ 	    if (expr == error_mark_node)
+ 	      return throw_exception (loc, ctx, "reflect_constant failed",
+ 				      fun, non_constant_p, jump_target);
+ 	    if (VAR_P (expr))
+ 	      expr = unshare_expr (DECL_INITIAL (expr));
+ 	    retvec[i] = expr;
+ 	  }
+       }
+     if (kind == REFLECT_CONSTANT_ARRAY && sz == 0)
+       {
+ 	/* Return std::array <valuet, 0> {}.  */
+ 	tree args = make_tree_vec (2);
+ 	TREE_VEC_ELT (args, 0) = valuet;
+ 	TREE_VEC_ELT (args, 1) = size_zero_node;
+ 	tree inst = lookup_template_class (get_identifier ("array"), args,
+ 					   /*in_decl*/NULL_TREE,
+ 					   /*context*/std_node,
+ 					   tf_warning_or_error);
+ 	tree type = complete_type (inst);
+ 	if (type == error_mark_node)
+ 	  {
+ 	    *non_constant_p = true;
+ 	    return NULL_TREE;
+ 	  }
+ 	tree ctor = build_constructor (init_list_type_node, nullptr);
+ 	CONSTRUCTOR_IS_DIRECT_INIT (ctor) = true;
+ 	TREE_CONSTANT (ctor) = true;
+ 	TREE_STATIC (ctor) = true;
+ 	tree r = finish_compound_literal (type, ctor, tf_warning_or_error,
+ 					  fcl_functional);
+ 	if (TREE_CODE (r) == TARGET_EXPR)
+ 	  r = TARGET_EXPR_INITIAL (r);
+ 	return r;
+       }
+     unsigned esz = tree_to_uhwi (TYPE_SIZE_UNIT (valuet));
+     unsigned last = kind == REFLECT_CONSTANT_STRING ? esz : 0;
+     tree index = build_index_type (size_int (last ? sz : sz - 1));
+     tree at = build_array_type (valuet, index);
+     at = cp_build_qualified_type (at, TYPE_QUAL_CONST);
+     if (kind == REFLECT_CONSTANT_STRING
+ 	|| ((valuet == char_type_node
+ 	     || valuet == wchar_type_node
+ 	     || valuet == char8_type_node
+ 	     || valuet == char16_type_node
+ 	     || valuet == char32_type_node)
+ 	    && integer_zerop (retvec.last ())))
+       {
+ 	unsigned HOST_WIDE_INT szt = sz * esz;
+ 	char *p;
+ 	if (szt < 4096)
+ 	  p = XALLOCAVEC (char, szt + last);
+ 	else
+ 	  p = XNEWVEC (char, szt + last);
+ 	for (size_t i = 0; i < sz; ++i)
+ 	  native_encode_expr (retvec[i], (unsigned char *) p + i * esz,
+ 			      esz, 0);
+ 	if (last)
+ 	  memset (p + szt, '\0', last);
+ 	tree ret = build_string (szt + last, p);
+ 	TREE_TYPE (ret) = at;
+ 	TREE_CONSTANT (ret) = 1;
+ 	TREE_READONLY (ret) = 1;
+ 	TREE_STATIC (ret) = 1;
+ 	if (szt >= 4096)
+ 	  XDELETEVEC (p);
+ 	return ret;
+       }
+     vec<constructor_elt, va_gc> *elts = nullptr;
+     for (unsigned i = 0; i < sz; ++i)
+       CONSTRUCTOR_APPEND_ELT (elts, bitsize_int (i), retvec[i]);
+     return build_constructor (at, elts);
+   };
+   /* If true, call std::ranges::data (p) and std::ranges::size (p)
+      and if that works out and what the former returns can be handled,
+      grab the elements from the initializer of the decl pointed by the
+      first expression.  p has to be convert_from_reference (PARM_DECL)
+      rather than its value, otherwise it is not considered lvalue.  */
+   if (contiguous_range)
+     {
+       tree data = lookup_qualified_name (ranges_ns, "data");
+       tree size = lookup_qualified_name (ranges_ns, "size");
+       if (TREE_CODE (data) != VAR_DECL || TREE_CODE (size) != VAR_DECL)
+ 	{
+ 	  error_at (loc, "%<std::ranges::data%> or %<std::ranges::size%> "
+ 			 "are not customization point objects");
+ 	  *non_constant_p = true;
+ 	  return NULL_TREE;
+ 	}
+       data = obj_call (data, tf_none);
+       if (error_operand_p (data))
+ 	goto non_contiguous;
+       if (data == NULL_TREE)
+ 	return NULL_TREE;
+       size = obj_call (size, tf_none);
+       if (error_operand_p (size))
+ 	goto non_contiguous;
+       if (size == NULL_TREE)
+ 	return NULL_TREE;
+       if (!tree_fits_uhwi_p (size) || tree_to_uhwi (size) > INT_MAX)
+ 	goto non_contiguous;
+       if (integer_zerop (size))
+ 	{
+ 	  if (kind == GET_INFO_VEC)
+ 	    return make_tree_vec (0);
+ 	  return ret_retvec ();
+ 	}
+       STRIP_NOPS (data);
+       unsigned HOST_WIDE_INT minidx = 0, pplus = 0;
+       if (TREE_CODE (data) == POINTER_PLUS_EXPR
+ 	  && tree_fits_uhwi_p (TREE_OPERAND (data, 1))
+ 	  && !wi::neg_p (wi::to_wide (TREE_OPERAND (data, 1))))
+ 	{
+ 	  pplus = tree_to_uhwi (TREE_OPERAND (data, 1));
+ 	  data = TREE_OPERAND (data, 0);
+ 	  STRIP_NOPS (data);
+ 	}
+       if (TREE_CODE (data) != ADDR_EXPR)
+ 	goto non_contiguous;
+       data = TREE_OPERAND (data, 0);
+       if (TREE_CODE (data) == ARRAY_REF
+ 	  && tree_fits_uhwi_p (TREE_OPERAND (data, 1)))
+ 	{
+ 	  minidx = tree_to_uhwi (TREE_OPERAND (data, 1));
+ 	  data = TREE_OPERAND (data, 0);
+ 	}
+       data = cxx_eval_constant_expression (ctx, data, vc_prvalue,
+ 					   non_constant_p, overflow_p,
+ 					   jump_target);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+       if (TREE_CODE (TREE_TYPE (data)) != ARRAY_TYPE
+ 	  || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (data))) != valuet)
+ 	goto non_contiguous;
+       if (pplus
+ 	  && (pplus % tree_to_uhwi (TYPE_SIZE_UNIT (valuet))) != 0)
+ 	goto non_contiguous;
+       minidx += pplus / tree_to_uhwi (TYPE_SIZE_UNIT (valuet));
+       if (kind != GET_INFO_VEC && TREE_CODE (data) == STRING_CST)
+ 	{
+ 	  unsigned esz = tree_to_uhwi (TYPE_SIZE_UNIT (valuet));
+ 	  unsigned HOST_WIDE_INT sz = tree_to_uhwi (size) * esz;
+ 	  if (minidx > INT_MAX
+ 	      || (unsigned) TREE_STRING_LENGTH (data) < sz + minidx * esz)
+ 	    goto non_contiguous;
+ 	  if (kind == REFLECT_CONSTANT_ARRAY && sz == 0)
+ 	    return ret_retvec ();
+ 	  tree index
+ 	    = build_index_type (size_int ((kind == REFLECT_CONSTANT_ARRAY
+ 					   ? -1 : 0) + tree_to_uhwi (size)));
+ 	  tree at = build_array_type (valuet, index);
+ 	  at = cp_build_qualified_type (at, TYPE_QUAL_CONST);
+ 	  const unsigned char *q
+ 	    = (const unsigned char *) TREE_STRING_POINTER (data);
+ 	  q += minidx * esz;
+ 	  if (kind == REFLECT_CONSTANT_ARRAY)
+ 	    {
+ 	      unsigned HOST_WIDE_INT i;
+ 	      for (i = 0; i < esz; ++i)
+ 		if (q[sz - esz + i])
+ 		  break;
+ 	      if (i != esz)
+ 		{
+ 		  /* Not a NUL terminated string.  Build a CONSTRUCTOR
+ 		     instead.  */
+ 		  for (i = 0; i < sz; i += esz)
+ 		    {
+ 		      tree t = native_interpret_expr (valuet, q + i, sz);
+ 		      retvec.safe_push (t);
+ 		    }
+ 		  return ret_retvec ();
+ 		}
+ 	    }
+ 	  char *p;
+ 	  if (sz < 4096)
+ 	    p = XALLOCAVEC (char, sz + esz);
+ 	  else
+ 	    p = XNEWVEC (char, sz + esz);
+ 	  memcpy (p, q, sz);
+ 	  memset (p + sz, '\0', esz);
+ 	  ret = build_string (sz + (kind == REFLECT_CONSTANT_ARRAY
+ 				    ? 0 : esz), p);
+ 	  TREE_TYPE (ret) = at;
+ 	  TREE_CONSTANT (ret) = 1;
+ 	  TREE_READONLY (ret) = 1;
+ 	  TREE_STATIC (ret) = 1;
+ 	  if (sz >= 4096)
+ 	    XDELETEVEC (p);
+ 	  return ret;
+ 	}
+       if (TREE_CODE (data) != CONSTRUCTOR)
+ 	goto non_contiguous;
+       unsigned sz = tree_to_uhwi (size), i;
+       unsigned HOST_WIDE_INT j = 0;
+       tree *r, null = NULL_TREE;
+       if (kind == GET_INFO_VEC)
+ 	{
+ 	  ret = make_tree_vec (sz);
+ 	  r = TREE_VEC_BEGIN (ret);
+ 	  null = get_null_reflection ();
+ 	}
+       else
+ 	{
+ 	  retvec.safe_grow (sz, true);
+ 	  r = retvec.address ();
+ 	}
+       for (i = 0; i < sz; ++i)
+ 	r[i] = null;
+       tree field, value;
+       FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (data), i, field, value)
+ 	if (field == NULL_TREE)
+ 	  {
+ 	    if (j >= minidx && j - minidx < sz)
+ 	      r[j - minidx] = value;
+ 	    ++j;
+ 	  }
+ 	else if (TREE_CODE (field) == RANGE_EXPR)
+ 	  {
+ 	    tree lo = TREE_OPERAND (field, 0);
+ 	    tree hi = TREE_OPERAND (field, 1);
+ 	    if (!tree_fits_uhwi_p (lo) || !tree_fits_uhwi_p (hi))
+ 	      goto non_contiguous;
+ 	    unsigned HOST_WIDE_INT m = tree_to_uhwi (hi);
+ 	    for (j = tree_to_uhwi (lo); j <= m; ++j)
+ 	      if (j >= minidx && j - minidx < sz)
+ 		r[j - minidx] = value;
+ 	  }
+ 	else if (tree_fits_uhwi_p (field))
+ 	  {
+ 	    j = tree_to_uhwi (field);
+ 	    if (j >= minidx && j - minidx < sz)
+ 	      r[j - minidx] = value;
+ 	    ++j;
+ 	  }
+ 	else
+ 	  goto non_contiguous;
+       if (kind == GET_INFO_VEC)
+ 	return ret;
+       for (i = 0; i < sz; ++i)
+ 	if (r[i] == NULL_TREE || !tree_fits_shwi_p (r[i]))
+ 	  goto non_contiguous;
+       return ret_retvec ();
+     }
+  non_contiguous:
+   /* Otherwise, do it the slower way.  Initialize two temporaries,
+      one to std::ranges::base (p) and another to std::ranges::end (p)
+      and use a loop.  */
+   tree begin = lookup_qualified_name (ranges_ns, "begin");
+   tree end = lookup_qualified_name (ranges_ns, "end");
+   if (TREE_CODE (begin) != VAR_DECL || TREE_CODE (end) != VAR_DECL)
+     {
+       error_at (loc, "missing %<std::ranges::begin%> or %<std::ranges::end%>");
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   begin = obj_call (begin, tf_warning_or_error);
+   if (error_operand_p (begin))
+     {
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   end = obj_call (end, tf_warning_or_error);
+   if (error_operand_p (end))
+     {
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   if (!CLASS_TYPE_P (TREE_TYPE (begin)) && !POINTER_TYPE_P (TREE_TYPE (begin)))
+     {
+       error_at (loc, "incorrect type %qT of %<std::ranges::begin(arg)%>",
+ 		TREE_TYPE (begin));
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   if (VOID_TYPE_P (TREE_TYPE (end)))
+     {
+       error_at (loc, "incorrect type %qT of %<std::ranges::end(arg)%>",
+ 		TREE_TYPE (end));
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   begin = get_target_expr (begin);
+   end = get_target_expr (end);
+   begin = cxx_eval_constant_expression (ctx, begin, vc_glvalue, non_constant_p,
+ 					overflow_p, jump_target);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   end = cxx_eval_constant_expression (ctx, end, vc_glvalue, non_constant_p,
+ 				      overflow_p, jump_target);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   tree cmp = build_new_op (loc, NE_EXPR, LOOKUP_NORMAL, begin, end,
+ 			   tf_warning_or_error);
+   tree deref = build_new_op (loc, INDIRECT_REF, LOOKUP_NORMAL, begin,
+ 			     NULL_TREE, tf_warning_or_error);
+   tree inc = build_new_op (loc, PREINCREMENT_EXPR, LOOKUP_NORMAL, begin,
+ 			   NULL_TREE, tf_warning_or_error);
+   cmp = condition_conversion (cmp);
+   if (error_operand_p (cmp)
+       || error_operand_p (deref)
+       || error_operand_p (inc))
+     {
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   // TODO: For REFLECT_CONSTANT_* handle proxy iterators.
+   if (TYPE_MAIN_VARIANT (TREE_TYPE (deref)) != valuet)
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "unexpected type %qT of iterator dereference",
+ 		  TREE_TYPE (deref));
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   retvec.truncate (0);
+   /* while (begin != end) { push (*begin); ++begin; }  */
+   do
+     {
+       tree t = cxx_eval_constant_expression (ctx, cmp, vc_prvalue,
+ 					     non_constant_p, overflow_p,
+ 					     jump_target);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+       if (integer_zerop (t))
+ 	break;
+       t = cxx_eval_constant_expression (ctx, deref, vc_prvalue, non_constant_p,
+ 					overflow_p, jump_target);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+       retvec.safe_push (t);
+       cxx_eval_constant_expression (ctx, inc, vc_discard, non_constant_p,
+ 				    overflow_p, jump_target);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+     }
+   while (true);
+   if (kind != GET_INFO_VEC)
+     return ret_retvec ();
+   ret = make_tree_vec (retvec.length ());
+   tree v;
+   unsigned int i;
+   FOR_EACH_VEC_ELT (retvec, i, v)
+     TREE_VEC_ELT (ret, i) = v;
+   return ret;
+ }
+ 
+ /* Extract the N-th reflection_range argument from a metafunction call CALL
+    and return it as TREE_VEC.  */
+ 
+ static tree
+ get_info_vec (location_t loc, const constexpr_ctx *ctx, tree call, int n,
+ 	      bool *non_constant_p, bool *overflow_p, tree *jump_target,
+ 	      tree fun)
+ {
+   return get_range_elts (loc, ctx, call, n, non_constant_p, overflow_p,
+ 			 jump_target, GET_INFO_VEC, fun);
+ }
+ 
+ /* Create std::meta::exception{ what, from }.  WHAT is the string for what(),
+    and FROM is the info for from().  */
+ 
+ static tree
+ get_meta_exception_object (location_t loc, const char *what, tree from,
+ 			   bool *non_constant_p)
+ {
+   /* Don't throw in a template.  */
+   // TODO For -fno-exceptions, report an error.
+   if (processing_template_decl)
+     {
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+ 
+   tree type = lookup_qualified_name (std_meta_node, "exception",
+ 				     LOOK_want::TYPE, /*complain*/true);
+   if (TREE_CODE (type) != TYPE_DECL || !CLASS_TYPE_P (TREE_TYPE (type)))
+     {
+       error_at (loc, "couldn%'t throw %qs", "std::meta::exception");
+       return NULL_TREE;
+     }
+   type = TREE_TYPE (type);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   what = _(what);
+   /* Translate what from SOURCE_CHARSET to exec charset.  */
+   cpp_string istr, ostr;
+   istr.len = strlen (what) + 1;
+   istr.text = (const unsigned char *) what;
+   if (!cpp_translate_string (parse_in, &istr, &ostr, CPP_STRING, false))
+     {
+       what = "";
+       ostr.text = NULL;
+     }
+   else
+     what = (const char *) ostr.text;
+   if (TREE_CODE (from) == FUNCTION_DECL && DECL_TEMPLATE_INFO (from))
+     from = DECL_TI_TEMPLATE (from);
+   tree string_lit = build_string (strlen (what) + 1, what);
+   free (const_cast <unsigned char *> (ostr.text));
+   TREE_TYPE (string_lit) = char_array_type_node;
+   string_lit = fix_string_type (string_lit);
+   CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE, string_lit);
+   CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE, get_reflection_raw (loc, from));
+   tree ctor = build_constructor (init_list_type_node, elts);
+   CONSTRUCTOR_IS_DIRECT_INIT (ctor) = true;
+   TREE_CONSTANT (ctor) = true;
+   TREE_STATIC (ctor) = true;
+   return finish_compound_literal (type, ctor, tf_warning_or_error,
+ 				  fcl_functional);
+ }
+ 
+ /* Perform 'throw std::meta::exception{...}'.  MSGID is the string for what(),
+    FROM is the reflection for from().  */
+ 
+ static tree
+ throw_exception (location_t loc, const constexpr_ctx *ctx, const char *msgid,
+ 		 tree from, bool *non_constant_p, tree *jump_target)
+ {
+   if (tree obj = get_meta_exception_object (loc, msgid, from, non_constant_p))
+     *jump_target = cxa_allocate_and_throw_exception (loc, ctx, obj);
+   return NULL_TREE;
+ }
+ 
+ /* Wrapper around throw_exception to complain that the reflection does not
+    represent a type.  */
+ 
+ static tree
+ throw_exception_nontype (location_t loc, const constexpr_ctx *ctx,
+ 			 tree from, bool *non_constant_p, tree *jump_target)
+ {
+   return throw_exception (loc, ctx,
+ 			  "reflection does not represent a type",
+ 			  from, non_constant_p, jump_target);
+ }
+ 
+ /* Wrapper around throw_exception to complain that the reflection does not
+    represent something that satisfies has_template_arguments.  */
+ 
+ static tree
+ throw_exception_notargs (location_t loc, const constexpr_ctx *ctx,
+ 			 tree from, bool *non_constant_p, tree *jump_target)
+ {
+   return throw_exception (loc, ctx,
+ 			  "reflection does not have template arguments",
+ 			  from, non_constant_p, jump_target);
+ }
+ 
+ /* Wrapper around throw_exception to complain that the reflection does not
+    represent a function or a function type.  */
+ 
+ static tree
+ throw_exception_nofn (location_t loc, const constexpr_ctx *ctx,
+ 		      tree from, bool *non_constant_p, tree *jump_target)
+ {
+   return throw_exception (loc, ctx, "reflection does not represent a "
+ 				    "function or function type",
+ 			  from, non_constant_p, jump_target);
+ }
+ 
+ /* The values of std::meta::operators enumerators corresponding to
+    the ovl_op_code and IDENTIFIER_ASSIGN_OP_P pair.  */
+ 
+ static unsigned char meta_operators[2][OVL_OP_MAX];
+ 
+ /* Init the meta_operators table if not yet initialized.  */
+ 
+ static void
+ maybe_init_meta_operators (location_t loc)
+ {
+   if (meta_operators[0][OVL_OP_ERROR_MARK])
+     return;
+   meta_operators[0][OVL_OP_ERROR_MARK] = 1;
+   tree operators = lookup_qualified_name (std_meta_node, "operators");
+   if (TREE_CODE (operators) != TYPE_DECL
+       || TREE_CODE (TREE_TYPE (operators)) != ENUMERAL_TYPE)
+     {
+     fail:
+       error_at (loc, "unexpected %<std::meta::operators%>");
+       return;
+     }
+   char buf[sizeof "op_greater_greater_equals"];
+   memcpy (buf, "op_", 3);
+   for (int i = 0; i < 2; ++i)
+     for (int j = OVL_OP_ERROR_MARK + 1; j < OVL_OP_MAX; ++j)
+       if (ovl_op_info[i][j].meta_name)
+ 	{
+ 	  strcpy (buf + 3, ovl_op_info[i][j].meta_name);
+ 	  tree id = get_identifier (buf);
+ 	  tree t = lookup_enumerator (TREE_TYPE (operators), id);
+ 	  if (t == NULL_TREE || TREE_CODE (t) != CONST_DECL)
+ 	    goto fail;
+ 	  tree v = DECL_INITIAL (t);
+ 	  if (!tree_fits_uhwi_p (v) || tree_to_uhwi (v) > UCHAR_MAX)
+ 	    goto fail;
+ 	  meta_operators[i][j] = tree_to_uhwi (v);
+ 	}
+ }
+ 
+ /* Process std::meta::is_variable.
+    Returns: true if r represents a variable.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_variable (const_tree r, reflect_kind kind)
+ {
+   /* ^^param is a variable but parameters_of(parent_of(^^param))[0] is not.  */
+   if ((TREE_CODE (r) == PARM_DECL && kind != REFLECT_PARM)
+       || (VAR_P (r)
+ 	  && kind == REFLECT_UNDEF
+ 	  /* A structured binding is not a variable.  */
+ 	  && !(DECL_DECOMPOSITION_P (r) && !DECL_DECOMP_IS_BASE (r)))
+       || (VAR_P (r)
+ 	  /* Underlying variable of tuple using structured binding is a
+ 	     variable.  */
+ 	  && kind == REFLECT_VAR
+ 	  && DECL_DECOMPOSITION_P (r)
+ 	  && !DECL_DECOMP_IS_BASE (r)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_type.
+    Returns: true if r represents an entity whose underlying entity is
+    a type.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_type (const_tree r)
+ {
+   /* Null reflection isn't a type.  */
+   if (TYPE_P (r) && r != unknown_type_node)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_type_alias.
+    Returns: true if r represents a type alias.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_type_alias (const_tree r)
+ {
+   if (TYPE_P (r) && typedef_variant_p (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_namespace.
+    Returns: true if r represents an entity whose underlying entity is
+    a namespace.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_namespace (const_tree r)
+ {
+   if (TREE_CODE (r) == NAMESPACE_DECL)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_namespace_alias.
+    Returns: true if r represents a namespace alias.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_namespace_alias (const_tree r)
+ {
+   if (TREE_CODE (r) == NAMESPACE_DECL && DECL_NAMESPACE_ALIAS (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_function.
+    Returns: true if r represents a function.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_function (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+ 
+   if (TREE_CODE (r) == FUNCTION_DECL)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_function_template.
+    Returns: true if r represents a function template.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_function_template (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+ 
+   if (DECL_FUNCTION_TEMPLATE_P (r))
+     return boolean_true_node;
+ 
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_variable_template.
+    Returns: true if r represents a variable template.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_variable_template (tree r)
+ {
+   if (variable_template_p (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_class_template.
+    Returns: true if r represents a class template.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_class_template (const_tree r)
+ {
+   if (DECL_CLASS_TEMPLATE_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_alias_template.
+    Returns: true if r represents an alias template.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_alias_template (const_tree r)
+ {
+   if (DECL_ALIAS_TEMPLATE_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_concept.
+    Returns: true if r represents a concept.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_concept (const_tree r)
+ {
+   if (concept_definition_p (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_object.
+    Returns: true if r represents an object.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_object (reflect_kind kind)
+ {
+   if (kind == REFLECT_OBJECT)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_value.
+    Returns: true if r represents a value.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_value (reflect_kind kind)
+ {
+   if (kind == REFLECT_VALUE)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Like get_info_vec, but throw exception if any of the elements aren't
+    eval_is_type reflections and change their content to the corresponding
+    REFLECT_EXPR_HANDLE.  */
+ 
+ static tree
+ get_type_info_vec (location_t loc, const constexpr_ctx *ctx, tree call, int n,
+ 		   bool *non_constant_p, bool *overflow_p, tree *jump_target,
+ 		   tree fun)
+ {
+   tree vec = get_info_vec (loc, ctx, call, n, non_constant_p, overflow_p,
+ 			   jump_target, fun);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   for (int i = 0; i < TREE_VEC_LENGTH (vec); i++)
+     {
+       tree type = REFLECT_EXPR_HANDLE (TREE_VEC_ELT (vec, i));
+       if (eval_is_type (type) != boolean_true_node)
+ 	return throw_exception_nontype (loc, ctx, fun, non_constant_p,
+ 					jump_target);
+       TREE_VEC_ELT (vec, i) = type;
+     }
+   return vec;
+ }
+ 
+ /* Process std::meta::is_structured_binding.
+    Returns: true if r represents a structured binding.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_structured_binding (const_tree r, reflect_kind kind)
+ {
+   if (DECL_DECOMPOSITION_P (r)
+       && !DECL_DECOMP_IS_BASE (r)
+       && kind != REFLECT_VAR)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_class_member.
+    Returns: true if r represents a class member.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_class_member (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == CONST_DECL)
+     {
+       /* [class.mem.general]/5 - The enumerators of an unscoped enumeration
+ 	 defined in the class are members of the class.  */
+       if (UNSCOPED_ENUM_P (DECL_CONTEXT (r)))
+ 	r = DECL_CONTEXT (r);
+       else
+ 	return boolean_false_node;
+     }
+   else if (TYPE_P (r) && typedef_variant_p (r))
+     r = TYPE_NAME (r);
+   if (DECL_P (r) && DECL_CLASS_SCOPE_P (r))
+     return boolean_true_node;
+   else if (TYPE_P (r) && TYPE_CLASS_SCOPE_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* For direct base class relationship R return the binfo related
+    to the derived type.  */
+ 
+ static tree
+ direct_base_derived_binfo (tree r)
+ {
+   /* Looping needed for multiple virtual inheritance.  */
+   while (BINFO_INHERITANCE_CHAIN (r))
+     r = BINFO_INHERITANCE_CHAIN (r);
+   return r;
+ }
+ 
+ /* For direct base class relationship R return the derived type
+    (i.e. when R is (D, B) it returns D).  */
+ 
+ tree
+ direct_base_derived (tree r)
+ {
+   return BINFO_TYPE (direct_base_derived_binfo (r));
+ }
+ 
+ /* Helper function for eval_is_{public, protected, private}.  */
+ 
+ static tree
+ eval_is_expected_access (tree r, reflect_kind kind, tree expected_access)
+ {
+   if (eval_is_class_member (r) == boolean_true_node)
+     {
+       r = maybe_get_reflection_fndecl (r);
+ 
+       if (TYPE_P (r))
+ 	{
+ 	  if (TYPE_NAME (r) == NULL_TREE || !DECL_P (TYPE_NAME (r)))
+ 	    return boolean_false_node;
+ 	  r = TYPE_NAME (r);
+ 	}
+ 
+       bool matches = false;
+       if (expected_access == access_private_node)
+ 	matches = TREE_PRIVATE (r);
+       else if (expected_access == access_protected_node)
+ 	matches = TREE_PROTECTED (r);
+       else if (expected_access == access_public_node)
+ 	matches = !(TREE_PRIVATE (r) || TREE_PROTECTED (r));
+       else
+ 	gcc_unreachable ();
+ 
+       if (matches)
+ 	return boolean_true_node;
+       else
+ 	return boolean_false_node;
+     }
+ 
+   if (kind == REFLECT_BASE)
+     {
+       gcc_assert (TREE_CODE (r) == TREE_BINFO);
+       tree c = direct_base_derived_binfo (r);
+ 
+       tree base_binfo;
+       for (unsigned ix = 0; BINFO_BASE_ITERATE (c, ix, base_binfo); ix++)
+ 	if (base_binfo == r)
+ 	  {
+ 	    tree access = BINFO_BASE_ACCESS (c, ix);
+ 	    if (access == expected_access)
+ 	      return boolean_true_node;
+ 	    else
+ 	      return boolean_false_node;
+ 	  }
+       gcc_unreachable ();
+     }
+ 
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_public.
+    Returns: true if r represents either:
+    - a class member or unnamed bit-field that is public or
+    - a direct base class relationship (D, B) for which
+    B is a public base class of D.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_public (tree r, reflect_kind kind)
+ {
+   return eval_is_expected_access (r, kind, access_public_node);
+ }
+ 
+ /* Process std::meta::is_protected.
+    Returns: true if r represents either:
+    - a class member or unnamed bit-field that is protected, or
+    - a direct base class relationship (D, B) for which
+    B is a protected base class of D.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_protected (tree r, reflect_kind kind)
+ {
+   return eval_is_expected_access (r, kind, access_protected_node);
+ }
+ 
+ /* Process std::meta::is_private
+    Returns: true if r represents either:
+    - a class member or unnamed bit-field that is private, or
+    - a direct base class relationship (D, B) for which
+    B is a private base class of D.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_private (tree r, reflect_kind kind)
+ {
+   return eval_is_expected_access (r, kind, access_private_node);
+ }
+ 
+ /* Process std::meta::is_virtual.
+    Returns: true if r represents either a virtual member function or a direct
+    base class relationship (D,B) for which B is a virtual base class of D.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_virtual (tree r, reflect_kind kind)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_VIRTUAL_P (r))
+     return boolean_true_node;
+ 
+   if (kind == REFLECT_BASE && BINFO_VIRTUAL_P (r))
+     return boolean_true_node;
+ 
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_pure_virtual.
+    Returns: true if r represents a member function that is pure virtual.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_pure_virtual (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_PURE_VIRTUAL_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Helper function for eval_is_override, return true if FNDECL in TYPE
+    overrides another function.  */
+ 
+ static bool
+ is_override (tree type, tree fndecl)
+ {
+   tree binfo = TYPE_BINFO (type), base_binfo;
+ 
+   for (unsigned ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
+     {
+       tree basetype = BINFO_TYPE (base_binfo);
+       if (TYPE_POLYMORPHIC_P (basetype))
+ 	{
+ 	  if (look_for_overrides_here (basetype, fndecl))
+ 	    return true;
+ 	  if (is_override (basetype, fndecl))
+ 	    return true;
+ 	}
+     }
+   return false;
+ }
+ 
+ /* Process std::meta::is_override.
+    Returns: true if r represents a member function that overrides another
+    member function.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_override (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == FUNCTION_DECL
+       && DECL_VIRTUAL_P (r)
+       && !DECL_STATIC_FUNCTION_P (r)
+       && is_override (DECL_CONTEXT (r), r))
+     return boolean_true_node;
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_namespace_member.
+    Returns: true if r represents a namespace member.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_namespace_member (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == CONST_DECL)
+     {
+       if (UNSCOPED_ENUM_P (DECL_CONTEXT (r)))
+ 	r = DECL_CONTEXT (r);
+       else
+ 	return boolean_false_node;
+     }
+   else if (TYPE_P (r) && typedef_variant_p (r))
+     r = TYPE_NAME (r);
+   if (r == global_namespace || r == unknown_type_node)
+     return boolean_false_node;
+   if (DECL_P (r) && DECL_NAMESPACE_SCOPE_P (r))
+     return boolean_true_node;
+   else if (TYPE_P (r) && TYPE_NAMESPACE_SCOPE_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_nonstatic_data_member.
+    Returns: true if r represents a non-static data member.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_nonstatic_data_member (const_tree r)
+ {
+   if (TREE_CODE (r) == FIELD_DECL && !DECL_UNNAMED_BIT_FIELD (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_static_member.
+    Returns: true if r represents a static member.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_static_member (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   r = STRIP_TEMPLATE (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_STATIC_FUNCTION_P (r))
+     return boolean_true_node;
+   else if (VAR_P (r) && DECL_CLASS_SCOPE_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_base.
+    Returns: true if r represents a direct base class relationship.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_base (tree r, reflect_kind kind)
+ {
+   if (kind == REFLECT_BASE)
+     {
+       gcc_assert (TREE_CODE (r) == TREE_BINFO);
+       return boolean_true_node;
+     }
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_default_member_initializer.
+    Returns: true if r represents a non-static data member that has a default
+    member initializer.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_default_member_initializer (const_tree r)
+ {
+   if (TREE_CODE (r) == FIELD_DECL
+       && !DECL_UNNAMED_BIT_FIELD (r)
+       && DECL_INITIAL (r) != NULL_TREE)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_static_storage_duration.
+    Returns: true if r represents an object or variable that has static
+    storage duration.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_static_storage_duration (const_tree r, reflect_kind kind)
+ {
+   if (eval_is_variable (r, kind) == boolean_true_node
+       && decl_storage_duration (CONST_CAST_TREE (r)) == dk_static)
+     return boolean_true_node;
+   /* This includes DECL_NTTP_OBJECT_P objects.  */
+   else if (eval_is_object (kind) == boolean_true_node)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_thread_storage_duration.
+    Returns: true if r represents an object or variable that has thread
+    storage duration.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_thread_storage_duration (const_tree r, reflect_kind kind)
+ {
+   if (eval_is_variable (r, kind) == boolean_true_node
+       && decl_storage_duration (CONST_CAST_TREE (r)) == dk_thread)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_automatic_storage_duration.
+    Returns: true if r represents an object or variable that has automatic
+    storage duration.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_automatic_storage_duration (const_tree r, reflect_kind kind)
+ {
+   if (eval_is_variable (r, kind) == boolean_true_node
+       && decl_storage_duration (CONST_CAST_TREE (r)) == dk_auto)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_mutable_member.
+    Returns: true if r represents a mutable non-static data member.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_mutable_member (tree r)
+ {
+   if (TREE_CODE (r) == FIELD_DECL
+       && !DECL_UNNAMED_BIT_FIELD (r)
+       && DECL_MUTABLE_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_template.
+    Returns: true if r represents a function template, class template, variable
+    template, alias template, or concept.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_template (tree r)
+ {
+   if (eval_is_function_template (r) == boolean_true_node
+       || eval_is_class_template (r) == boolean_true_node
+       || eval_is_variable_template (r) == boolean_true_node
+       || eval_is_alias_template (r) == boolean_true_node
+       || eval_is_concept (r) == boolean_true_node)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_function_parameter.
+    Returns: true if r represents a function parameter.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_function_parameter (const_tree r, reflect_kind kind)
+ {
+   if (kind == REFLECT_PARM)
+     {
+       gcc_checking_assert (TREE_CODE (r) == PARM_DECL);
+       return boolean_true_node;
+     }
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_data_member_spec.
+    Returns: true if r represents a data member description.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_data_member_spec (const_tree r, reflect_kind kind)
+ {
+   if (kind == REFLECT_DATA_MEMBER_SPEC)
+     {
+       gcc_checking_assert (TREE_CODE (r) == TREE_VEC);
+       return boolean_true_node;
+     }
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_explicit_object_parameter.
+    Returns: true if r represents a function parameter that is an explicit
+    object parameter.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_explicit_object_parameter (const_tree r, reflect_kind kind)
+ {
+   if (eval_is_function_parameter (r, kind) == boolean_true_node
+       && r == DECL_ARGUMENTS (DECL_CONTEXT (r))
+       && DECL_XOBJ_MEMBER_FUNCTION_P (DECL_CONTEXT (r)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_default_argument.
+    Returns: If r represents a parameter P of a function F, then:
+    -- If F is a specialization of a templated function T, then true if there
+       exists a declaration D of T that precedes some point in the evaluation
+       context and D specifies a default argument for the parameter of T
+       corresponding to P.  Otherwise, false.
+    -- Otherwise, if there exists a declaration D of F that precedes some
+       point in the evaluation context and D specifies a default argument
+       for P, then true.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_has_default_argument (tree r, reflect_kind kind)
+ {
+   if (eval_is_function_parameter (r, kind) == boolean_false_node)
+     return boolean_false_node;
+   r = maybe_update_function_parm (r);
+   tree fn = DECL_CONTEXT (r);
+   tree args = FUNCTION_FIRST_USER_PARM (fn);
+   tree types = FUNCTION_FIRST_USER_PARMTYPE (fn);
+   while (r != args)
+     {
+       args = DECL_CHAIN (args);
+       types = TREE_CHAIN (types);
+     }
+   if (TREE_PURPOSE (types))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_ellipsis_parameter.
+    Returns: true if r represents a function or function type that has an
+    ellipsis in its parameter-type-list.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_ellipsis_parameter (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL)
+     r = TREE_TYPE (r);
+   if (FUNC_OR_METHOD_TYPE_P (r) && stdarg_p (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_deleted.
+    Returns: true if r represents a function that is deleted.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_deleted (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_MAYBE_DELETED (r))
+     {
+       ++function_depth;
+       maybe_synthesize_method (r);
+       --function_depth;
+     }
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_DELETED_FN (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_defaulted.
+    Returns: true if r represents a function that is defaulted.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_defaulted (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_DEFAULTED_FN (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_user_provided.
+    Returns: true if r represents a function that is user-provided.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_user_provided (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == FUNCTION_DECL
+       && user_provided_p (r)
+       // TODO: user_provided_p is false for non-members defaulted on
+       // first declaration.
+       && (!DECL_NAMESPACE_SCOPE_P (r) || !DECL_DELETED_FN (r)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_user_declared.
+    Returns: true if r represents a function that is user-declared.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_user_declared (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && !DECL_ARTIFICIAL (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_explicit.
+    Returns: true if r represents
+    a member function that is declared explicit.
+    Otherwise, false.
+    If r represents a member function template
+    that is declared explicit, is_explicit(r)
+    is still false because in general such queries
+    for templates cannot be answered.  */
+ 
+ static tree
+ eval_is_explicit (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+ 
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_NONCONVERTING_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_bit_field.
+    Returns: true if r represents a bit-field, or if r represents a data member
+    description (T,N,A,W,NUA) for which W is not _|_.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_bit_field (const_tree r, reflect_kind kind)
+ {
+   if (TREE_CODE (r) == FIELD_DECL && DECL_C_BIT_FIELD (r))
+     return boolean_true_node;
+   else if (kind == REFLECT_DATA_MEMBER_SPEC && TREE_VEC_ELT (r, 3))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_enumerator.
+    Returns: true if r represents an enumerator.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_enumerator (const_tree r)
+ {
+   /* This doesn't check !DECL_TEMPLATE_PARM_P because such CONST_DECLs
+      would already have been rejected in get_reflection.  */
+   if (TREE_CODE (r) == CONST_DECL)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Get the linkage name for T, or NULL_TREE, if N/A.  */
+ 
+ static tree
+ type_linkage_name (tree t)
+ {
+   if (TYPE_NAME (t) == NULL_TREE
+       || !DECL_P (TYPE_NAME (t))
+       || (!DECL_IMPLICIT_TYPEDEF_P (TYPE_NAME (t))
+ 	  && TYPE_NAME (t) == TYPE_NAME (TYPE_MAIN_VARIANT (t))
+ 	  && !TYPE_MAIN_DECL (t)))
+     return NULL_TREE;
+ 
+   return TYPE_NAME (t);
+ }
+ 
+ /* Process std::meta::has_internal_linkage.
+    Returns: true if r represents a variable, function, type, template, or
+    namespace whose name has internal linkage.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_internal_linkage (tree r, reflect_kind kind)
+ {
+   if (eval_is_variable (r, kind) == boolean_false_node
+       && eval_is_function (r) == boolean_false_node
+       && eval_is_type (r) == boolean_false_node
+       && eval_is_template (r) == boolean_false_node
+       && eval_is_namespace (r) == boolean_false_node)
+     return boolean_false_node;
+   r = maybe_get_reflection_fndecl (r);
+   r = STRIP_TEMPLATE (r);
+   if (TYPE_P (r))
+     {
+       r = type_linkage_name (r);
+       if (!r)
+ 	return boolean_false_node;
+     }
+   if (decl_linkage (r) == lk_internal)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_module_linkage.
+    Returns: true if r represents a variable, function, type, template, or
+    namespace whose name has module linkage.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_module_linkage (tree r, reflect_kind kind)
+ {
+   if (eval_is_variable (r, kind) == boolean_false_node
+       && eval_is_function (r) == boolean_false_node
+       && eval_is_type (r) == boolean_false_node
+       && eval_is_template (r) == boolean_false_node
+       && eval_is_namespace (r) == boolean_false_node)
+     return boolean_false_node;
+   r = maybe_get_reflection_fndecl (r);
+   r = STRIP_TEMPLATE (r);
+   if (TYPE_P (r))
+     {
+       r = type_linkage_name (r);
+       if (!r)
+ 	return boolean_false_node;
+     }
+   if (decl_linkage (r) == lk_external
+       && DECL_LANG_SPECIFIC (r)
+       && DECL_MODULE_ATTACH_P (r)
+       && !DECL_MODULE_EXPORT_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_external_linkage.
+    Returns: true if r represents a variable, function, type, template, or
+    namespace whose name has external linkage.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_external_linkage (tree r, reflect_kind kind)
+ {
+   if (eval_is_variable (r, kind) == boolean_false_node
+       && eval_is_function (r) == boolean_false_node
+       && eval_is_type (r) == boolean_false_node
+       && eval_is_template (r) == boolean_false_node
+       && eval_is_namespace (r) == boolean_false_node)
+     return boolean_false_node;
+   r = maybe_get_reflection_fndecl (r);
+   r = STRIP_TEMPLATE (r);
+   if (TYPE_P (r))
+     {
+       r = type_linkage_name (r);
+       if (!r)
+ 	return boolean_false_node;
+     }
+   if (decl_linkage (r) == lk_external
+       && !(DECL_LANG_SPECIFIC (r)
+ 	   && DECL_MODULE_ATTACH_P (r)
+ 	   && !DECL_MODULE_EXPORT_P (r)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_c_language_linkage
+    Returns: true if r represents a variable, function, or function type with
+    C language linkage. Otherwise, false.  */
+ 
+ static tree
+ eval_has_c_language_linkage (tree r, reflect_kind kind)
+ {
+   if (eval_is_variable (r, kind) == boolean_false_node
+       && eval_is_function (r) == boolean_false_node
+       && eval_is_function_type (r) == boolean_false_node)
+     return boolean_false_node;
+   r = maybe_get_reflection_fndecl (r);
+   r = STRIP_TEMPLATE (r);
+   if (TYPE_P (r))
+     {
+       r = type_linkage_name (r);
+       if (!r)
+ 	return boolean_false_node;
+     }
+   if (decl_linkage (r) != lk_none && DECL_LANGUAGE (r) == lang_c)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_linkage.
+    Returns: true if r represents a variable, function, type, template, or
+    namespace whose name has any linkage.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_linkage (tree r, reflect_kind kind)
+ {
+   if (eval_is_variable (r, kind) == boolean_false_node
+       && eval_is_function (r) == boolean_false_node
+       && eval_is_type (r) == boolean_false_node
+       && eval_is_template (r) == boolean_false_node
+       && eval_is_namespace (r) == boolean_false_node)
+     return boolean_false_node;
+   r = maybe_get_reflection_fndecl (r);
+   r = STRIP_TEMPLATE (r);
+   if (TYPE_P (r))
+     {
+       r = type_linkage_name (r);
+       if (!r)
+ 	return boolean_false_node;
+     }
+   if (decl_linkage (r) != lk_none)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_complete_type.
+    Returns: true if is_type(r) is true and there is some point in the
+    evaluation context from which the type represented by dealias(r) is
+    not an incomplete type.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_complete_type (const_tree r)
+ {
+   if (eval_is_type (r) == boolean_true_node)
+     {
+       complete_type (const_cast<tree> (r));
+       if (COMPLETE_TYPE_P (r))
+ 	return boolean_true_node;
+     }
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_enumerable_type.
+    A type T is enumerable from a point P if either
+    -- T is a class type complete at point P or
+    -- T is an enumeration type defined by a declaration D such that D is
+       reachable from P but P does not occur within an enum-specifier of D.
+   Returns: true if dealias(r) represents a type that is enumerable from some
+   point in the evaluation context.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_enumerable_type (const_tree r)
+ {
+   if (CLASS_TYPE_P (r))
+     {
+       complete_type (const_cast<tree> (r));
+       if (COMPLETE_TYPE_P (r))
+ 	return boolean_true_node;
+      }
+   else if (TREE_CODE (r) == ENUMERAL_TYPE)
+     {
+       r = TYPE_MAIN_VARIANT (r);
+       if (!ENUM_IS_OPAQUE (r) && !ENUM_BEING_DEFINED_P (r))
+ 	return boolean_true_node;
+     }
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_annotation.
+    Returns: true if r represents an annotation.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_annotation (const_tree r, reflect_kind kind)
+ {
+   if (kind == REFLECT_ANNOTATION)
+     {
+       gcc_assert (TREE_CODE (r) == TREE_LIST);
+       return boolean_true_node;
+     }
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_conversion_function.
+    Returns: true if r represents a function that is a conversion function.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_conversion_function (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_CONV_FN_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_operator_function.
+    Returns: true if r represents a function that is an operator function.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_operator_function (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+ 
+   if (TREE_CODE (r) == FUNCTION_DECL
+       && DECL_OVERLOADED_OPERATOR_P (r)
+       && !DECL_CONV_FN_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_literal_operator.
+    Returns: true if r represents a function that is a literal operator.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_literal_operator (const_tree r)
+ {
+   /* No MAYBE_BASELINK_FUNCTIONS here because a literal operator
+      must be a non-member function.  */
+   if (TREE_CODE (r) == FUNCTION_DECL && UDLIT_OPER_P (DECL_NAME (r)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_special_member_function.
+    Returns: true if r represents a function that is a special member function.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_special_member_function (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && special_memfn_p (r) != sfk_none)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_constructor.
+    Returns: true if r represents a function that is a constructor.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_constructor (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_default_constructor.
+    Returns: true if r represents a function that is a default constructor.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_default_constructor (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && default_ctor_p (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_copy_constructor.
+    Returns: true if r represents a function that is a copy constructor.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_copy_constructor (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_COPY_CONSTRUCTOR_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_move_constructor.
+    Returns: true if r represents a function that is a move constructor.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_move_constructor (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL && DECL_MOVE_CONSTRUCTOR_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_assignment.
+    Returns: true if r represents a function that is an assignment operator.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_assignment (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL
+       && DECL_ASSIGNMENT_OPERATOR_P (r)
+       && DECL_OVERLOADED_OPERATOR_IS (r, NOP_EXPR))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_copy_assignment.
+    Returns: true if r represents a function that is a copy assignment
+    operator.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_copy_assignment (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL
+       && special_function_p (r) == sfk_copy_assignment)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_move_assignment.
+    Returns: true if r represents a function that is a move assignment
+    operator.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_move_assignment (tree r)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL
+       && special_function_p (r) == sfk_move_assignment)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_destructor.
+    Returns: true if r represents a function that is a destructor.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_destructor (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (TREE_CODE (r) == FUNCTION_DECL
+       && DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_conversion_function_template.
+    Returns: true if r represents a conversion function template.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_conversion_function_template (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+ 
+   if (DECL_FUNCTION_TEMPLATE_P (r) && DECL_CONV_FN_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_operator_function_template.
+    Returns: true if r represents an operator function template.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_operator_function_template (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+ 
+   if (DECL_FUNCTION_TEMPLATE_P (r))
+     {
+       r = STRIP_TEMPLATE (r);
+       if (DECL_OVERLOADED_OPERATOR_P (r) && !DECL_CONV_FN_P (r))
+ 	return boolean_true_node;
+     }
+ 
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_literal_operator_template.
+    Returns: true if r represents a literal operator template.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_literal_operator_template (tree r)
+ {
+   /* No MAYBE_BASELINK_FUNCTIONS here because a literal operator
+      template must be a non-member function template.  */
+   r = OVL_FIRST (r);
+ 
+   if (DECL_FUNCTION_TEMPLATE_P (r) && UDLIT_OPER_P (DECL_NAME (r)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_constructor_template.
+    Returns: true if r represents a function that is an operator function
+    template.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_constructor_template (tree r)
+ {
+   r = maybe_get_reflection_fndecl (r);
+ 
+   if (DECL_FUNCTION_TEMPLATE_P (r) && DECL_CONSTRUCTOR_P (r))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::operator_of.
+    Returns: The value of the enumerator from the operators whose corresponding
+    operator-function-id is the unqualified name of the entity represented by
+    r.
+    Throws: meta::exception unless r represents an operator function or
+    operator function template.  */
+ 
+ static tree
+ eval_operator_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		  bool *non_constant_p, tree *jump_target, tree ret_type,
+ 		  tree fun)
+ {
+   if (eval_is_operator_function (r) == boolean_false_node
+       && eval_is_operator_function_template (r) == boolean_false_node)
+     return throw_exception (loc, ctx,
+ 			    "reflection does not represent an operator "
+ 			    "function or operator function template",
+ 			    fun, non_constant_p, jump_target);
+   r = maybe_get_reflection_fndecl (r);
+   r = STRIP_TEMPLATE (r);
+   maybe_init_meta_operators (loc);
+   int i = IDENTIFIER_ASSIGN_OP_P (DECL_NAME (r)) ? 1 : 0;
+   int j = IDENTIFIER_CP_INDEX (DECL_NAME (r));
+   return build_int_cst (ret_type, meta_operators[i][j]);
+ }
+ 
+ /* Helper to build a string literal containing '\0' terminated NAME.
+    ELT_TYPE must be either char_type_node or char8_type_node, and the
+    function takes care of converting the name from SOURCE_CHARSET
+    to ordinary literal charset resp. UTF-8.  Returns the string
+    literal, or NULL_TREE if the conversion failed.  */
+ 
+ static tree
+ get_string_literal (const char *name, tree elt_type)
+ {
+   cpp_string istr, ostr;
+   istr.len = strlen (name) + 1;
+   istr.text = (const unsigned char *) name;
+   if (!cpp_translate_string (parse_in, &istr, &ostr,
+ 			     elt_type == char_type_node
+ 			     ? CPP_STRING : CPP_UTF8STRING, false))
+     return NULL_TREE;
+   name = (const char *) ostr.text;
+   tree ret = build_string_literal (strlen (name) + 1, name, elt_type);
+   free (const_cast <char *> (name));
+   return ret;
+ }
+ 
+ /* Process std::meta::{,u8}symbol_of.
+    Returns: A string_view or u8string_view containing the characters of the
+    operator symbol name corresponding to op, respectively encoded with the
+    ordinary literal encoding or with UTF-8.
+    Throws: meta::exception unless the value of op corresponds to one of the
+    enumerators in operators.  */
+ 
+ static tree
+ eval_symbol_of (location_t loc, const constexpr_ctx *ctx, tree expr,
+ 		bool *non_constant_p, tree *jump_target, tree elt_type,
+ 		tree ret_type, tree fun)
+ {
+   maybe_init_meta_operators (loc);
+   if (!tree_fits_uhwi_p (expr))
+     {
+     fail:
+       return throw_exception (loc, ctx,
+ 			      "operators argument is not a valid operator",
+ 			      fun, non_constant_p, jump_target);
+     }
+   unsigned HOST_WIDE_INT val = tree_to_uhwi (expr);
+   for (int i = 0; i < 2; ++i)
+     for (int j = OVL_OP_ERROR_MARK + 1; j < OVL_OP_MAX; ++j)
+       if (ovl_op_info[i][j].meta_name && meta_operators[i][j] == val)
+ 	{
+ 	  const char *name = ovl_op_info[i][j].name;
+ 	  char buf[64];
+ 	  if (const char *sp = strchr (name, ' '))
+ 	    {
+ 	      memcpy (buf, name, sp - name);
+ 	      strcpy (buf + (sp - name), sp + 1);
+ 	      name = buf;
+ 	    }
+ 	  tree str = get_string_literal (name, elt_type);
+ 	  /* Basic character set ought to be better convertible
+ 	     into ordinary literal character set and must be always
+ 	     convertible into UTF-8.  */
+ 	  gcc_checking_assert (str);
+ 	  releasing_vec args (make_tree_vector_single (str));
+ 	  tree r = build_special_member_call (NULL_TREE,
+ 					      complete_ctor_identifier,
+ 					      &args, ret_type, LOOKUP_NORMAL,
+ 					      tf_warning_or_error);
+ 	  return build_cplus_new (ret_type, r, tf_warning_or_error);
+ 	}
+   goto fail;
+ }
+ 
+ /* has-type (exposition only).
+    Returns: true if r represents a value, annotation, object, variable,
+    function whose type does not contain an undeduced placeholder type and
+    that is not a constructor or destructor, enumerator, non-static data
+    member, unnamed bit-field, direct base class relationship, data member
+    description, or function parameter.  Otherwise, false.  */
+ 
+ static bool
+ has_type (tree r, reflect_kind kind)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL)
+     {
+       if (DECL_CONSTRUCTOR_P (r) || DECL_DESTRUCTOR_P (r))
+ 	return false;
+       if (undeduced_auto_decl (r))
+ 	return false;
+       return true;
+     }
+   if (CONSTANT_CLASS_P (r)
+       || eval_is_variable (r, kind) == boolean_true_node
+       || eval_is_enumerator (r) == boolean_true_node
+       || TREE_CODE (r) == FIELD_DECL
+       || eval_is_annotation (r, kind) == boolean_true_node
+       || eval_is_function_parameter (r, kind) == boolean_true_node
+       || eval_is_object (kind) == boolean_true_node
+       || eval_is_value (kind) == boolean_true_node
+       || kind == REFLECT_BASE
+       || kind == REFLECT_DATA_MEMBER_SPEC)
+     return true;
+   return false;
+ }
+ 
+ /* Helper function for eval_type_of.  Assuming has_type is true, return
+    the std::meta::type_of type (rather than reflection thereof).  */
+ 
+ static tree
+ type_of (tree r, reflect_kind kind)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == PARM_DECL && kind == REFLECT_PARM)
+     {
+       r = maybe_update_function_parm (r);
+       tree fn = DECL_CONTEXT (r);
+       tree args = FUNCTION_FIRST_USER_PARM (fn);
+       tree type = FUNCTION_FIRST_USER_PARMTYPE (fn);
+       while (r != args)
+ 	{
+ 	  args = DECL_CHAIN (args);
+ 	  type = TREE_CHAIN (type);
+ 	}
+       r = TREE_VALUE (type);
+     }
+   else if (kind == REFLECT_BASE)
+     r = BINFO_TYPE (r);
+   else if (kind == REFLECT_DATA_MEMBER_SPEC)
+     r = TREE_VEC_ELT (r, 0);
+   else if (eval_is_annotation (r, kind) == boolean_true_node)
+     {
+       r = TREE_TYPE (TREE_VALUE (TREE_VALUE (r)));
+       if (CLASS_TYPE_P (r))
+ 	{
+ 	  int quals = cp_type_quals (r);
+ 	  quals |= TYPE_QUAL_CONST;
+ 	  r = cp_build_qualified_type (r, quals);
+ 	}
+     }
+   else if (TREE_CODE (r) == FIELD_DECL && DECL_BIT_FIELD_TYPE (r))
+     r = DECL_BIT_FIELD_TYPE (r);
+   else
+     r = TREE_TYPE (r);
+   return strip_typedefs (r);
+ }
+ 
+ /* Process std::meta::type_of.  Returns:
+    -- If r represents the ith parameter of a function F, then the ith type
+       in the parameter-type-list of F.
+    -- Otherwise, if r represents a value, object, variable, function,
+       non-static data member, or unnamed bit-field, then the type of what is
+       represented by r.
+    -- Otherwise, if r represents an annotation, then type_of(constant_of(r)).
+    -- Otherwise, if r represents an enumerator N of an enumeration E, then:
+       -- If E is defined by a declaration D that precedes a point P in the
+ 	 evaluation context and P does not occur within an enum-specifier of
+ 	 D, then a reflection of E.
+       -- Otherwise, a reflection of the type of N prior to the closing brace
+ 	 of the enum-specifier as specified in [dcl.enum].
+    -- Otherwise, if r represents a direct base class relationship (D,B), then
+       a reflection of B.
+    -- Otherwise, for a data member description (T,N,A,W,NUA), a reflection of
+       the type T.  */
+ 
+ static tree
+ eval_type_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 	      reflect_kind kind, bool *non_constant_p, tree *jump_target,
+ 	      tree fun)
+ {
+   if (!has_type (r, kind))
+     return throw_exception (loc, ctx, "reflection does not have a type",
+ 			    fun, non_constant_p, jump_target);
+   return get_reflection_raw (loc, type_of (r, kind));
+ }
+ 
+ /* Process std::meta::source_location_of.
+    Returns: If r represents a value, a type other than a class type or an
+    enumeration type, the global namespace, or a data member description,
+    then source_location{}.  Otherwise, an implementation-defined
+    source_location value.  */
+ 
+ static tree
+ eval_source_location_of (location_t loc, tree r, reflect_kind kind,
+ 			 tree std_source_location)
+ {
+   if (!NON_UNION_CLASS_TYPE_P (std_source_location))
+     {
+       error_at (loc, "%qT is not a class type", std_source_location);
+       return error_mark_node;
+     }
+   location_t rloc = UNKNOWN_LOCATION;
+   if (kind == REFLECT_BASE)
+     /* We don't track location_t of the base specifiers, so at least
+        for now use location_t of the base parent (i.e. the derived
+        class).  */
+     r = direct_base_derived (r);
+   if (OVERLOAD_TYPE_P (r) || (TYPE_P (r) && typedef_variant_p (r)))
+     rloc = DECL_SOURCE_LOCATION (TYPE_NAME (r));
+   else if (DECL_P (r) && r != global_namespace)
+     rloc = DECL_SOURCE_LOCATION (r);
+   else if (eval_is_annotation (r, kind) == boolean_true_node)
+     rloc = EXPR_LOCATION (TREE_VALUE (TREE_VALUE (r)));
+   tree decl = NULL_TREE, field = NULL_TREE;
+   if (rloc != UNKNOWN_LOCATION)
+     {
+       /* Make sure __builtin_source_location (which depends on
+ 	 std::source_location::__impl) will work without errors.  */
+       tree name = get_identifier ("__impl");
+       decl = lookup_qualified_name (std_source_location, name);
+       if (TREE_CODE (decl) != TYPE_DECL)
+ 	decl = NULL_TREE;
+       else
+ 	{
+ 	  name = get_identifier ("__builtin_source_location");
+ 	  decl = lookup_qualified_name (global_namespace, name);
+ 	  if (TREE_CODE (decl) != FUNCTION_DECL
+ 	      || !fndecl_built_in_p (decl, BUILT_IN_FRONTEND)
+ 	      || DECL_FE_FUNCTION_CODE (decl) != CP_BUILT_IN_SOURCE_LOCATION
+ 	      || !require_deduced_type (decl, tf_warning_or_error))
+ 	    decl = NULL_TREE;
+ 	}
+     }
+   if (decl)
+     {
+       field = TYPE_FIELDS (std_source_location);
+       field = next_aggregate_field (field);
+       /* Make sure std::source_location has exactly a single non-static
+ 	 data member (_M_impl in libstdc++, __ptr_ in libc++) with pointer
+ 	 type.  Return {._M_impl = &*.Lsrc_locN}.  */
+       if (field != NULL_TREE
+ 	  && POINTER_TYPE_P (TREE_TYPE (field))
+ 	  && !next_aggregate_field (DECL_CHAIN (field)))
+ 	{
+ 	  tree call = build_call_nary (TREE_TYPE (TREE_TYPE (decl)), decl, 0);
+ 	  SET_EXPR_LOCATION (call, rloc);
+ 	  call = fold_builtin_source_location (call);
+ 	  return build_constructor_single (std_source_location, field, call);
+ 	}
+     }
+   return build_constructor (std_source_location, nullptr);
+ }
+ 
+ /* If R is (const T &) &foo, get foo.  */
+ 
+ static tree
+ maybe_get_reference_referent (tree r)
+ {
+   if (TREE_CODE (r) == NOP_EXPR
+       && TYPE_REF_P (TREE_TYPE (r))
+       && TREE_CODE (TREE_OPERAND (r, 0)) == ADDR_EXPR)
+     {
+       STRIP_NOPS (r);
+       r = TREE_OPERAND (r, 0);
+     }
+   return r;
+ }
+ 
+ /* Process std::meta::object_of.
+    Returns:
+    -- If r represents an object, then r.
+    -- Otherwise, if r represents a reference, then a reflection of the object
+       referred to by that reference.
+    -- Otherwise, r represents a variable; a reflection of the object declared
+       by that variable.
+    Throws: meta::exception unless r is a reflection representing either
+    -- an object with static storage duration, or
+    -- a variable that either declares or refers to such an object, and if that
+       variable is a reference R, then either
+       -- R is usable in constant expressions, or
+       -- the lifetime of R began within the core constant expression currently
+ 	 under evaluation.  */
+ 
+ static tree
+ eval_object_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		reflect_kind kind, bool *non_constant_p, bool *overflow_p,
+ 		tree *jump_target, tree fun)
+ {
+   tree orig = r;
+   if (TYPE_REF_P (TREE_TYPE (r)))
+     r = cxx_eval_constant_expression (ctx, r, vc_prvalue, non_constant_p,
+ 				      overflow_p, jump_target);
+   r = maybe_get_reference_referent (r);
+   if (eval_has_static_storage_duration (orig, kind) == boolean_false_node
+       && (orig == r
+ 	  || eval_has_static_storage_duration (r, kind) == boolean_false_node))
+     return throw_exception (loc, ctx, "reflection does not represent an"
+ 				      " object with static storage duration,"
+ 				      " or a reference to such an object",
+ 			    fun, non_constant_p, jump_target);
+   return get_reflection_raw (loc, r, REFLECT_OBJECT);
+ }
+ 
+ /* Process std::meta::constant_of.
+    Let R be a constant expression of type info such that R == r is true.
+    If r represents an annotation, then let C be its underlying constant.
+    Effects: Equivalent to:
+      if constexpr (is_annotation(R)) {
+        return C;
+      } else if constexpr (is_array_type(type_of(R)) {
+        return reflect_constant_array([: R :]);
+      } else if constexpr (is_function_type(type_of(R)) {
+        return reflect_function([: R :]);
+      } else {
+        return reflect_constant([: R :]);
+      }
+    Throws: meta::exception unless either r represents an annotation or
+    [: R :] is a valid splice-expression.  */
+ 
+ static tree
+ eval_constant_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		  reflect_kind kind, bool *non_constant_p, bool *overflow_p,
+ 		  tree *jump_target, tree fun)
+ {
+   tree type;
+   if (has_type (r, kind))
+     type = type_of (r, kind);
+   else
+     type = maybe_strip_typedefs (r);
+ 
+   /* So that outer_automatic_var_p works below in check_splice_expr.  */
+   temp_override<tree> ovr (current_function_decl);
+   current_function_decl = cxx_constexpr_caller (ctx);
+ 
+   if (eval_is_annotation (r, kind) == boolean_true_node)
+     r = tree_strip_any_location_wrapper (TREE_VALUE (TREE_VALUE (r)));
+   else if (eval_is_array_type (loc, type) == boolean_true_node)
+     {
+       const tsubst_flags_t complain = complain_flags (ctx);
+       /* Create a call to reflect_constant_array so that we can simply
+ 	 let eval_reflect_constant_array do its job.  */
+       tree name = get_identifier ("reflect_constant_array");
+       tree call = lookup_qualified_name (std_meta_node, name);
+       if (error_operand_p (call) || !is_overloaded_fn (call))
+ 	{
+ 	  if (complain)
+ 	    error_at (loc, "couldn%'t look up %<%D::%D%>", std_meta_node, name);
+ 	  *non_constant_p = true;
+ 	  return NULL_TREE;
+ 	}
+       /* We want the argument to be a CONSTRUCTOR or a STRING_CST.  */
+       r = cxx_eval_constant_expression (ctx, r, vc_prvalue, non_constant_p,
+ 					overflow_p, jump_target);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+       releasing_vec args (make_tree_vector_single (r));
+       call = finish_call_expr (call, &args, /*disallow_virtual=*/true,
+ 			       /*koenig_p=*/false, complain);
+       if (call == error_mark_node)
+ 	{
+ 	  *non_constant_p = true;
+ 	  return NULL_TREE;
+ 	}
+       return eval_reflect_constant_array (loc, ctx, call, non_constant_p,
+ 					  overflow_p, jump_target, fun);
+     }
+   else if (eval_is_function_type (type) == boolean_true_node)
+     return eval_reflect_function (loc, ctx, type, r, non_constant_p,
+ 				  jump_target, fun);
+   else if (!check_splice_expr (loc, UNKNOWN_LOCATION, r,
+ 			       /*address_p=*/false,
+ 			       /*member_access_p=*/false,
+ 			       /*complain_p=*/false)
+ 	   /* One cannot query the value of a function template.
+ 	      ??? But if [:^^X:] where X is a template is OK, should we
+ 	      really throw?  We need an LWG issue.  */
+ 	   || eval_is_template (r) == boolean_true_node)
+     return throw_exception (loc, ctx, "reflection does not represent an "
+ 				      "annotation or a valid argument to "
+ 				      "a splice-expression",
+ 			    fun, non_constant_p, jump_target);
+ 
+   r = cxx_eval_constant_expression (ctx, r, vc_prvalue, non_constant_p,
+ 				    overflow_p, jump_target);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   /* Figure out the type for reflect_constant.  */
+   type = TREE_TYPE (convert_from_reference (r));
+   type = type_decays_to (type);
+   type = cv_unqualified (type);
+ 
+   return eval_reflect_constant (loc, ctx, type, r, non_constant_p, jump_target,
+ 				fun);
+ }
+ 
+ /* Process std::meta::dealias.
+    Returns: If r represents an entity, then a reflection representing the
+    underlying entity of what r represents.  Otherwise, r.
+    This implements LWG 4427 so we do not throw.  */
+ 
+ static tree
+ eval_dealias (location_t loc, tree r, reflect_kind kind)
+ {
+   r = maybe_strip_typedefs (r);
+   if (TREE_CODE (r) == NAMESPACE_DECL)
+     r = ORIGINAL_NAMESPACE (r);
+   return get_reflection_raw (loc, r, kind);
+ }
+ 
+ /* Process std::meta::is_noexcept.
+    Returns: true if r represents a noexcept function type or a function
+    with a non-throwing exception specification ([except.spec]).
+    Otherwise, false.
+    Note: If r represents a function template that is declared noexcept,
+    is_noexcept (r) is still false because in general such queries
+    for templates cannot be answered.  */
+ 
+ static tree
+ eval_is_noexcept (tree r)
+ {
+   if (eval_is_function (r) == boolean_true_node)
+     {
+       r = maybe_get_reflection_fndecl (r);
+       maybe_instantiate_noexcept (r);
+       if (TYPE_NOTHROW_P (TREE_TYPE (r)))
+ 	return boolean_true_node;
+       else
+ 	return boolean_false_node;
+     }
+ 
+   if (eval_is_function_type (r) == boolean_true_node
+       && TYPE_NOTHROW_P (r))
+     return boolean_true_node;
+ 
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_const.
+    Let T be type_of(r) if has-type(r) is true.  Otherwise, let T be dealias(r).
+    Returns: true if T represents a const type, or a const-qualified function
+    type.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_const (tree r, reflect_kind kind)
+ {
+   if (has_type (r, kind))
+     r = type_of (r, kind);
+   else
+     r = maybe_strip_typedefs (r);
+   r = strip_array_types (r);
+   if (TREE_CODE (r) == METHOD_TYPE)
+     {
+       if (type_memfn_quals (r) & TYPE_QUAL_CONST)
+ 	return boolean_true_node;
+     }
+   else if (TYPE_P (r) && TYPE_READONLY (r))
+     return boolean_true_node;
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_volatile.
+    Let T be type_of(r) if has-type(r) is true.  Otherwise, let T be dealias(r).
+    Returns: true if T represents a volatile type, or a volatile-qualified
+    function type.  Otherwise, false.  */
+ 
+ static tree
+ eval_is_volatile (tree r, reflect_kind kind)
+ {
+   if (has_type (r, kind))
+     r = type_of (r, kind);
+   else
+     r = maybe_strip_typedefs (r);
+   r = strip_array_types (r);
+   if (TREE_CODE (r) == METHOD_TYPE)
+     {
+       if (type_memfn_quals (r) & TYPE_QUAL_VOLATILE)
+ 	return boolean_true_node;
+     }
+   else if (TYPE_P (r) && TYPE_VOLATILE (r))
+     return boolean_true_node;
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_template_arguments.
+    Returns: true if r represents a specialization of a function template,
+    variable template, class template, or an alias template.  Otherwise,
+    false.  */
+ 
+ static tree
+ 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;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::template_of.
+    Returns: A reflection of the template of the specialization represented
+    by r.
+    Throws: meta::exception unless has_template_arguments(r) is true.  */
+ 
+ static tree
+ eval_template_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		  bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   if (eval_has_template_arguments (r) != boolean_true_node)
+     return throw_exception_notargs (loc, ctx, fun, non_constant_p, jump_target);
+ 
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TYPE_P (r) && typedef_variant_p (r))
+     r = TI_TEMPLATE (TYPE_ALIAS_TEMPLATE_INFO (r));
+   else if (CLASS_TYPE_P (r) && CLASSTYPE_TEMPLATE_INFO (r))
+     r = CLASSTYPE_TI_TEMPLATE (r);
+   else if (VAR_OR_FUNCTION_DECL_P (r) && DECL_TEMPLATE_INFO (r))
+     r = DECL_TI_TEMPLATE (r);
+   else
+     gcc_assert (false);
+ 
+   gcc_assert (TREE_CODE (r) == TEMPLATE_DECL);
+   return get_reflection_raw (loc, r);
+ }
+ 
+ /* Process std::meta::has_parent
+    Returns:
+    -- If r represents the global namespace, then false.
+    -- Otherwise, if r represents an entity that has C language linkage,
+       then false.
+    -- Otherwise, if r represents an entity that has a language linkage
+       other than C++ language linkage, then an implementation-defined value.
+    -- Otherwise, if r represents a type that is neither a class nor enumeration
+       type, then false.
+    -- Otherwise, if r represents an entity or direct base class relationship,
+       then true.
+    -- Otherwise, false.  */
+ 
+ static tree
+ eval_has_parent (tree r, reflect_kind kind)
+ {
+   if (kind == REFLECT_OBJECT
+       || CONSTANT_CLASS_P (r)
+       || r == global_namespace
+       || kind == REFLECT_DATA_MEMBER_SPEC)
+     return boolean_false_node;
+   if (TYPE_P (r))
+     {
+       if (TYPE_NAME (r)
+ 	  && DECL_P (TYPE_NAME (r))
+ 	  && DECL_LANGUAGE (TYPE_NAME (r)) == lang_c)
+ 	return boolean_false_node;
+       else if (OVERLOAD_TYPE_P (r) || typedef_variant_p (r))
+ 	return boolean_true_node;
+       else
+ 	return boolean_false_node;
+     }
+   r = maybe_get_reflection_fndecl (r);
+   if (kind == REFLECT_BASE)
+     return boolean_true_node;
+   if (!DECL_P (r))
+     return boolean_false_node;
+   if (TREE_CODE (r) != NAMESPACE_DECL && DECL_LANGUAGE (r) == lang_c)
+     return boolean_false_node;
+   return boolean_true_node;
+ }
+ 
+ /* Process std::meta::parent_of.
+    Returns:
+    -- If r represents a non-static data member that is a direct member of an
+       anonymous union, or an unnamed bit-field declared within the
+       member-specification of such a union, then a reflection representing the
+       innermost enclosing anonymous union.
+    -- Otherwise, if r represents an enumerator, then a reflection representing
+       the corresponding enumeration type.
+    -- Otherwise, if r represents a direct base class relationship (D,B), then
+       a reflection representing D.
+    -- Otherwise, let E be a class, function, or namespace whose class scope,
+       function parameter scope, or namespace scope, respectively, is the
+       innermost such scope that either is, or encloses, the target scope of a
+       declaration of what is represented by r.
+       -- If E is the function call operator of a closure type for a
+ 	 consteval-block-declaration, then parent_of(parent_of(^^E)).
+       -- Otherwise, ^^E.  */
+ 
+ static tree
+ eval_parent_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		reflect_kind kind, bool *non_constant_p, tree *jump_target,
+ 		tree fun)
+ {
+   if (eval_has_parent (r, kind) != boolean_true_node)
+     return throw_exception (loc, ctx, "reflection does not represent an "
+ 				      "entity with parent",
+ 			    fun, non_constant_p, jump_target);
+   tree c;
+   r = maybe_get_reflection_fndecl (r);
+   if (TYPE_P (r))
+     {
+       if (TYPE_NAME (r) && DECL_P (TYPE_NAME (r)))
+ 	c = CP_DECL_CONTEXT (TYPE_NAME (r));
+       else
+ 	c = CP_TYPE_CONTEXT (r);
+     }
+   else if (kind == REFLECT_BASE)
+     c = direct_base_derived (r);
+   else
+     c = CP_DECL_CONTEXT (r);
+   tree lam;
+   while (LAMBDA_FUNCTION_P (c)
+ 	 && (lam = CLASSTYPE_LAMBDA_EXPR (CP_DECL_CONTEXT (c)))
+ 	 && LAMBDA_EXPR_CONSTEVAL_BLOCK_P (lam))
+     c = CP_TYPE_CONTEXT (CP_DECL_CONTEXT (c));
+   return get_reflection_raw (loc, c);
+ }
+ 
+ /* Return std::vector<info>.  */
+ 
+ static tree
+ get_vector_info ()
+ {
+   tree args = make_tree_vec (1);
+   TREE_VEC_ELT (args, 0) = meta_info_type_node;
+   tree inst = lookup_template_class (get_identifier ("vector"), args,
+ 				     /*in_decl*/NULL_TREE,
+ 				     /*context*/std_node, tf_none);
+   inst = complete_type (inst);
+   if (inst == error_mark_node || !COMPLETE_TYPE_P (inst))
+     {
+       error ("couldn%'t look up %qs", "std::vector");
+       return NULL_TREE;
+     }
+ 
+   return inst;
+ }
+ 
+ /* Build std::vector<info>{ ELTS }.  */
+ 
+ static tree
+ get_vector_of_info_elts (vec<constructor_elt, va_gc> *elts)
+ {
+   tree ctor = build_constructor (init_list_type_node, elts);
+   CONSTRUCTOR_IS_DIRECT_INIT (ctor) = true;
+   TREE_CONSTANT (ctor) = true;
+   TREE_STATIC (ctor) = true;
+   tree type = get_vector_info ();
+   if (!type)
+     return error_mark_node;
+   tree r = finish_compound_literal (type, ctor, tf_warning_or_error,
+ 				    fcl_functional);
+   if (TREE_CODE (r) == TARGET_EXPR)
+     r = TARGET_EXPR_INITIAL (r);
+   return r;
+ }
+ 
+ /* Process std::meta::parameters_of.
+    Returns:
+    -- If r represents a function F, then a vector containing reflections of
+       the parameters of F, in the order in which they appear in a declaration
+       of F.
+    -- Otherwise, r represents a function type T; a vector containing
+       reflections of the types in parameter-type-list of T, in the order in
+       which they appear in the parameter-type-list.
+ 
+    Throws: meta::exception unless r represents a function or a function
+    type.  */
+ 
+ static tree
+ eval_parameters_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		    bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   if (eval_is_function (r) != boolean_true_node
+       && eval_is_function_type (r) != boolean_true_node)
+     return throw_exception_nofn (loc, ctx, fun, non_constant_p, jump_target);
+ 
+   r = maybe_get_reflection_fndecl (r);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   tree args = (TREE_CODE (r) == FUNCTION_DECL
+ 	       ? FUNCTION_FIRST_USER_PARM (r)
+ 	       : TYPE_ARG_TYPES (r));
+   for (tree arg = args; arg && arg != void_list_node; arg = TREE_CHAIN (arg))
+     CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 			    get_reflection_raw (loc, arg, REFLECT_PARM));
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Process std::meta::variable_of.
+    Returns: The reflection of the parameter variable corresponding to r.
+ 
+    Throws: meta::exception unless
+    -- r represents a parameter of a function F and
+    -- there is a point P in the evaluation context for which the innermost
+       non-block scope enclosing P is the function parameter scope associated
+       with F.  */
+ 
+ static tree
+ eval_variable_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		  reflect_kind kind, bool *non_constant_p, tree *jump_target,
+ 		  tree fun)
+ {
+   if (eval_is_function_parameter (r, kind) == boolean_false_node
+       /* This doesn't consider the points corresponding to injected
+ 	 declarations, but that doesn't seem needed.  */
+       || DECL_CONTEXT (r) != current_function_decl)
+     return throw_exception (loc, ctx, "reflection does not represent "
+ 				      "parameter of current function",
+ 			    fun, non_constant_p, jump_target);
+   r = maybe_update_function_parm (r);
+   return get_reflection_raw (loc, r, REFLECT_UNDEF);
+ }
+ 
+ /* Process std::meta::return_type_of.
+    Returns: The reflection of the return type of the function or function type
+    represented by r.
+ 
+    Throws: meta::exception unless either r represents a function and
+    has-type(r) is true or r represents a function type.  */
+ 
+ static tree
+ eval_return_type_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		     reflect_kind kind, bool *non_constant_p, tree *jump_target,
+ 		     tree fun)
+ {
+   if ((eval_is_function (r) != boolean_true_node || !has_type (r, kind))
+       && eval_is_function_type (r) != boolean_true_node)
+     return throw_exception (loc, ctx, "reflection does not represent a "
+ 			    "function or function type with a return type",
+ 			    fun, non_constant_p, jump_target);
+ 
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (TREE_CODE (r) == FUNCTION_DECL)
+     r = TREE_TYPE (r);
+   r = TREE_TYPE (r);
+   return get_reflection_raw (loc, r, REFLECT_UNDEF);
+ }
+ 
+ /* Process std::meta::offset_of.
+    Let V be the offset in bits from the beginning of a complete object of the
+    type represented by parent_of(r) to the subobject associated with the
+    entity represented by r.
+    Returns: {V / CHAR_BIT, V % CHAR_BIT}.
+    Throws: meta::exception unless r represents a non-static data member,
+    unnamed bit-field, or direct base class relationship (D,B) for which either
+    B is not a virtual base class or D is not an abstract class.  */
+ 
+ static tree
+ eval_offset_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		reflect_kind kind, tree member_offset, bool *non_constant_p,
+ 		tree *jump_target, tree fun)
+ {
+   tree byte_off = NULL_TREE, bit_off = NULL_TREE;
+   if (kind == REFLECT_BASE)
+     {
+       tree d = direct_base_derived (r);
+       if (BINFO_VIRTUAL_P (r) && ABSTRACT_CLASS_TYPE_P (d))
+ 	return throw_exception (loc, ctx,
+ 				"reflection of virtual direct base "
+ 				"relationship with abstract derived "
+ 				"class", fun, non_constant_p, jump_target);
+       byte_off = BINFO_OFFSET (r);
+     }
+   else if (TREE_CODE (r) != FIELD_DECL)
+     return throw_exception (loc, ctx, "reflection unsuitable for offset_of",
+ 			    fun, non_constant_p, jump_target);
+   else
+     bit_off = bit_position (r);
+   if (TREE_CODE (bit_off ? bit_off : byte_off) != INTEGER_CST)
+     return throw_exception (loc, ctx, "non-constant offset for offset_of",
+ 			    fun, non_constant_p, jump_target);
+   if (TREE_CODE (member_offset) != RECORD_TYPE)
+     {
+     fail:
+       error_at (loc, "unexpected return type of %qs", "std::meta::offset_of");
+       return build_zero_cst (member_offset);
+     }
+   tree bytes = next_aggregate_field (TYPE_FIELDS (member_offset));
+   if (!bytes || !INTEGRAL_TYPE_P (TREE_TYPE (bytes)))
+     goto fail;
+   tree bits = next_aggregate_field (DECL_CHAIN (bytes));
+   if (!bits || !INTEGRAL_TYPE_P (TREE_TYPE (bits)))
+     goto fail;
+   if (next_aggregate_field (DECL_CHAIN (bits)))
+     goto fail;
+   tree bytesv;
+   if (byte_off)
+     bytesv = byte_off;
+   else
+     bytesv = size_binop (TRUNC_DIV_EXPR, bit_off, bitsize_unit_node);
+   bytesv = fold_convert (TREE_TYPE (bytes), bytesv);
+   tree bitsv;
+   if (byte_off)
+     bitsv = build_zero_cst (TREE_TYPE (bits));
+   else
+     {
+       bitsv = size_binop (TRUNC_MOD_EXPR, bit_off, bitsize_unit_node);
+       bitsv = fold_convert (TREE_TYPE (bits), bitsv);
+     }
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   CONSTRUCTOR_APPEND_ELT (elts, bytes, bytesv);
+   CONSTRUCTOR_APPEND_ELT (elts, bits, bitsv);
+   return build_constructor (member_offset, elts);
+ }
+ 
+ /* Process std::meta::size_of.
+    Returns: If r represents
+      -- a non-static data member of type T,
+      -- a data member description (T,N,A,W,NUA), or
+      -- dealias(r) represents a type T,
+    then sizeof(T) if T is not a reference type and size_of(add_pointer(^^T))
+    otherwise.  Otherwise, size_of(type_of(r)).
+ 
+    Throws: meta::exception unless all of the following conditions are met:
+      -- dealias(r) is a reflection of a type, object, value, variable of
+ 	non-reference type, non-static data member that is not a bit-field,
+ 	direct base class relationship, or data member description
+ 	(T,N,A,W,NUA) where W is not _|_.
+      -- If dealias(r) represents a type, then is_complete_type(r) is true.  */
+ 
+ static tree
+ eval_size_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 	      reflect_kind kind, tree ret_type, bool *non_constant_p,
+ 	      tree *jump_target, tree fun)
+ {
+   if (eval_is_type (r) != boolean_true_node
+       && eval_is_object (kind) != boolean_true_node
+       && eval_is_value (kind) != boolean_true_node
+       && (eval_is_variable (r, kind) != boolean_true_node
+ 	  || TYPE_REF_P (TREE_TYPE (r)))
+       && (TREE_CODE (r) != FIELD_DECL || DECL_C_BIT_FIELD (r))
+       && kind != REFLECT_BASE
+       && (kind != REFLECT_DATA_MEMBER_SPEC || TREE_VEC_ELT (r, 3)))
+     return throw_exception (loc, ctx, "reflection not suitable for size_of",
+ 			    fun, non_constant_p, jump_target);
+   if (!INTEGRAL_TYPE_P (ret_type))
+     {
+       error_at (loc, "unexpected return type of %qs", "std::meta::size_of");
+       return build_zero_cst (ret_type);
+     }
+   tree type;
+   if (TYPE_P (r))
+     type = r;
+   else
+     type = type_of (r, kind);
+   tree ret;
+   if (!complete_type_or_maybe_complain (type, NULL_TREE, tf_none)
+       /* No special casing of references needed, c_sizeof_or_alignof_type
+ 	 returns the same size for POINTER_TYPE and REFERENCE_TYPE.  */
+       || ((ret = c_sizeof_or_alignof_type (loc, type, true, false, 0))
+ 	  == error_mark_node))
+     return throw_exception (loc, ctx,
+ 			    "reflection with incomplete type in size_of",
+ 			    fun, non_constant_p, jump_target);
+   return fold_convert (ret_type, ret);
+ }
+ 
+ /* Process std::meta::alignment_of.
+    Returns:
+    -- If dealias(r) represents a type T, then alignment_of(add_pointer(r)) if
+       T is a reference type and the alignment requirement of T otherwise.
+    -- Otherwise, if dealias(r) represents a variable or object, then the
+       alignment requirement of the variable or object.
+    -- Otherwise, if r represents a direct base class relationship, then
+       alignment_of(type_of(r)).
+    -- Otherwise, if r represents a non-static data member M of a class C,
+       then the alignment of the direct member subobject corresponding to M of a
+       complete object of type C.
+    -- Otherwise, r represents a data member description (T,N,A,W,NUA).
+       If A is not _|_, then the value A.  Otherwise, alignment_of(^^T).
+    Throws: meta::exception unless all of the following conditions are met:
+    -- dealias(r) is a reflection of a type, object, variable of non-reference
+       type, non-static data member that is not a bit-field, direct base class
+       relationship, or data member description (T,N,A,W,NUA) where W is _|_.
+    -- If dealias(r) represents a type, then is_complete_type(r) is true.  */
+ 
+ static tree
+ eval_alignment_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		   reflect_kind kind, tree ret_type, bool *non_constant_p,
+ 		   tree *jump_target, tree fun)
+ {
+   if (eval_is_type (r) != boolean_true_node
+       && eval_is_object (kind) != boolean_true_node
+       && (eval_is_variable (r, kind) != boolean_true_node
+ 	  || TYPE_REF_P (TREE_TYPE (r)))
+       && (TREE_CODE (r) != FIELD_DECL || DECL_C_BIT_FIELD (r))
+       && kind != REFLECT_BASE
+       && (kind != REFLECT_DATA_MEMBER_SPEC || TREE_VEC_ELT (r, 3)))
+     return throw_exception (loc, ctx, "reflection not suitable for alignment_of",
+ 			    fun, non_constant_p, jump_target);
+   if (!INTEGRAL_TYPE_P (ret_type))
+     {
+       error_at (loc, "unexpected return type of %qs", "std::meta::alignment_of");
+       return build_zero_cst (ret_type);
+     }
+   tree type;
+   if (kind == REFLECT_DATA_MEMBER_SPEC)
+     {
+       if (TREE_VEC_ELT (r, 2))
+ 	return fold_convert (ret_type, TREE_VEC_ELT (r, 2));
+       else
+ 	type = TREE_VEC_ELT (r, 0);
+     }
+   else if (kind == REFLECT_BASE)
+     type = BINFO_TYPE (r);
+   else if (TREE_CODE (r) == FIELD_DECL
+ 	   || eval_is_variable (r, kind) == boolean_true_node
+ 	   || (eval_is_object (kind) == boolean_true_node
+ 	       && ((DECL_P (r) && TREE_CODE (r) != FUNCTION_DECL)
+ 		   || TREE_CODE (r) == COMPONENT_REF)))
+     {
+       if (TREE_CODE (r) == COMPONENT_REF)
+ 	r = TREE_OPERAND (r, 1);
+       return build_int_cst (ret_type, MAX (DECL_ALIGN_UNIT (r), 1));
+     }
+   else if (TYPE_P (r))
+     type = r;
+   else if (eval_is_object (kind) == boolean_true_node)
+     type = TREE_TYPE (r);
+   else
+     gcc_unreachable ();
+   if (TYPE_REF_P (type))
+     type = ptr_type_node;
+   if (FUNC_OR_METHOD_TYPE_P (type))
+     return throw_exception (loc, ctx, "alignment_of on function type",
+ 			    fun, non_constant_p, jump_target);
+   tree ret;
+   if (!complete_type_or_maybe_complain (type, NULL_TREE, tf_none)
+       /* No special casing of references needed, c_sizeof_or_alignof_type
+ 	 returns the same alignment for POINTER_TYPE and REFERENCE_TYPE.  */
+       || ((ret = c_sizeof_or_alignof_type (loc, type, false, true, 0))
+ 	  == error_mark_node))
+     return throw_exception (loc, ctx,
+ 			    "reflection with incomplete type in alignment_of",
+ 			    fun, non_constant_p, jump_target);
+   return fold_convert (ret_type, ret);
+ }
+ 
+ /* Process std::meta::bit_size_of.
+    Returns:
+      -- If r represents an unnamed bit-field or a non-static data member that
+ 	is a bit-field with width W, then W.
+      -- Otherwise, if r represents a data member description (T,N,A,W,NUA)
+ 	and W is not _|_, then W.
+      -- Otherwise, CHAR_BIT * size_of(r).
+ 
+    Throws: meta::exception unless all of the following conditions are met:
+ 
+      -- dealias(r) is a reflection of a type, object, value, variable of
+ 	non-reference type, non-static data member, unnamed bit-field, direct
+ 	base class relationship, or data member description.
+      -- If dealias(r) represents a type T, there is a point within the
+ 	evaluation context from which T is not incomplete.  */
+ 
+ static tree
+ eval_bit_size_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		  reflect_kind kind, tree ret_type, bool *non_constant_p,
+ 		  tree *jump_target, tree fun)
+ {
+   if (eval_is_type (r) != boolean_true_node
+       && eval_is_object (kind) != boolean_true_node
+       && eval_is_value (kind) != boolean_true_node
+       && (eval_is_variable (r, kind) != boolean_true_node
+ 	  || TYPE_REF_P (TREE_TYPE (r)))
+       && TREE_CODE (r) != FIELD_DECL
+       && kind != REFLECT_BASE
+       && kind != REFLECT_DATA_MEMBER_SPEC)
+     return throw_exception (loc, ctx,
+ 			    "reflection not suitable for bit_size_of",
+ 			    fun, non_constant_p, jump_target);
+   if (!INTEGRAL_TYPE_P (ret_type))
+     {
+       error_at (loc, "unexpected return type of %qs",
+ 		"std::meta::bit_size_of");
+       return build_zero_cst (ret_type);
+     }
+   tree type;
+   if (TREE_CODE (r) == FIELD_DECL && DECL_C_BIT_FIELD (r))
+     return fold_convert (ret_type, DECL_SIZE (r));
+   else if (TYPE_P (r))
+     type = r;
+   else if (kind == REFLECT_DATA_MEMBER_SPEC && TREE_VEC_ELT (r, 3))
+     return fold_convert (ret_type, TREE_VEC_ELT (r, 3));
+   else
+     type = type_of (r, kind);
+   tree ret;
+   if (!complete_type_or_maybe_complain (type, NULL_TREE, tf_none)
+       /* No special casing of references needed, c_sizeof_or_alignof_type
+ 	 returns the same size for POINTER_TYPE and REFERENCE_TYPE.  */
+       || ((ret = c_sizeof_or_alignof_type (loc, type, true, false, 0))
+ 	  == error_mark_node))
+     return throw_exception (loc, ctx,
+ 			    "reflection with incomplete type in bit_size_of",
+ 			    fun, non_constant_p, jump_target);
+   ret = size_binop (MULT_EXPR, ret, size_int (BITS_PER_UNIT));
+   return fold_convert (ret_type, ret);
+ }
+ 
+ /* Process std::meta::has_identifier.
+    Returns:
+    -- If r represents an entity that has a typedef name for linkage purposes,
+       then true.
+    -- Otherwise, if r represents an unnamed entity, then false.
+    -- Otherwise, if r represents a type alias, then !has_template_arguments(r).
+    -- Otherwise, if r represents a type, then true if
+       -- r represents a cv-unqualified class type and has_template_arguments(r)
+ 	 is false, or
+       -- r represents a cv-unqualified enumeration type.
+       Otherwise, false.
+    -- Otherwise, if r represents a class type, then !has_template_arguments(r).
+    -- Otherwise, if r represents a function, then true if
+       has_template_arguments(r) is false and the function is not a constructor,
+       destructor, operator function, or conversion function.  Otherwise, false.
+    -- Otherwise, if r represents a template, then true if r does not represent
+       a constructor template, operator function template, or conversion
+       function template.  Otherwise, false.
+    -- Otherwise, if r represents the ith parameter of a function F that is an
+       (implicit or explicit) specialization of a templated function T and the
+       ith parameter of the instantiated declaration of T whose template
+       arguments are those of F would be instantiated from a pack, then false.
+    -- Otherwise, if r represents the parameter P of a function F, then let S
+       be the set of declarations, ignoring any explicit instantiations, that
+       precede some point in the evaluation context and that declare either F
+       or a templated function of which F is a specialization; true if
+       -- there is a declaration D in S that introduces a name N for either P
+ 	 or the parameter corresponding to P in the templated function that
+ 	 D declares and
+       -- no declaration in S does so using any name other than N.
+       Otherwise, false.
+    -- Otherwise, if r represents a variable, then false if the declaration of
+       that variable was instantiated from a function parameter pack.
+       Otherwise, !has_template_arguments(r).
+    -- Otherwise, if r represents a structured binding, then false if the
+       declaration of that structured binding was instantiated from a
+       structured binding pack.  Otherwise, true.
+    -- Otherwise, if r represents an enumerator, non-static-data member,
+       namespace, or namespace alias, then true.
+    -- Otherwise, if r represents a direct base class relationship, then
+       has_identifier(type_of(r)).
+    -- Otherwise, r represents a data member description (T,N,A,W,NUA); true if
+       N is not _|_.  Otherwise, false.  */
+ 
+ static tree
+ eval_has_identifier (tree r, reflect_kind kind)
+ {
+   r = maybe_get_reflection_fndecl (r);
+   if (kind == REFLECT_BASE)
+     {
+       r = type_of (r, kind);
+       kind = REFLECT_UNDEF;
+     }
+   if (DECL_P (r)
+       && kind != REFLECT_PARM
+       && (!DECL_NAME (r) || IDENTIFIER_ANON_P (DECL_NAME (r))))
+     return boolean_false_node;
+   if (TYPE_P (r) && (!TYPE_NAME (r)
+ 		     || (TYPE_ANON_P (r) && !typedef_variant_p (r))
+ 		     || (DECL_P (TYPE_NAME (r))
+ 			 && !DECL_NAME (TYPE_NAME (r)))))
+     return boolean_false_node;
+   if (eval_is_type_alias (r) == boolean_true_node
+       || (CLASS_TYPE_P (r) && !cv_qualified_p (r)))
+     {
+       if (eval_has_template_arguments (r) == boolean_true_node)
+ 	return boolean_false_node;
+       else
+ 	return boolean_true_node;
+     }
+   if (TYPE_P (r))
+     {
+       if (TREE_CODE (r) == ENUMERAL_TYPE && !cv_qualified_p (r))
+ 	return boolean_true_node;
+       else
+ 	return boolean_false_node;
+     }
+   if (eval_is_function (r) == boolean_true_node)
+     {
+       if (eval_has_template_arguments (r) == boolean_true_node
+ 	  || eval_is_constructor (r) == boolean_true_node
+ 	  || eval_is_destructor (r) == boolean_true_node
+ 	  || eval_is_operator_function (r) == boolean_true_node
+ 	  || eval_is_conversion_function (r) == boolean_true_node)
+ 	return boolean_false_node;
+       else
+ 	return boolean_true_node;
+     }
+   if (eval_is_template (r) == boolean_true_node)
+     {
+       if (eval_is_constructor_template (r) == boolean_true_node
+ 	  || eval_is_operator_function_template (r) == boolean_true_node
+ 	  || eval_is_conversion_function_template (r) == boolean_true_node)
+ 	return boolean_false_node;
+       else
+ 	return boolean_true_node;
+     }
+   if (eval_is_function_parameter (r, kind) == boolean_true_node)
+     {
+       r = maybe_update_function_parm (r);
+       if (MULTIPLE_NAMES_PARM_P (r))
+ 	return boolean_false_node;
+       if (DECL_NAME (r))
+ 	{
+ 	  if (strchr (IDENTIFIER_POINTER (DECL_NAME (r)), '#'))
+ 	    return boolean_false_node;
+ 	  else
+ 	    return boolean_true_node;
+ 	}
+       if (lookup_attribute ("old parm name", DECL_ATTRIBUTES (r)))
+ 	return boolean_true_node;
+       else
+ 	return boolean_false_node;
+     }
+   if (eval_is_variable (r, kind) == boolean_true_node)
+     {
+       if (strchr (IDENTIFIER_POINTER (DECL_NAME (r)), '#'))
+ 	return boolean_false_node;
+       if (eval_has_template_arguments (r) == boolean_true_node)
+ 	return boolean_false_node;
+       else
+ 	return boolean_true_node;
+     }
+   if (eval_is_structured_binding (r, kind) == boolean_true_node)
+     {
+       if (strchr (IDENTIFIER_POINTER (DECL_NAME (r)), '#'))
+ 	return boolean_false_node;
+       else
+ 	return boolean_true_node;
+     }
+   if (eval_is_enumerator (r) == boolean_true_node
+       || TREE_CODE (r) == FIELD_DECL
+       || (TREE_CODE (r) == NAMESPACE_DECL && r != global_namespace))
+     return boolean_true_node;
+   if (kind == REFLECT_DATA_MEMBER_SPEC && TREE_VEC_ELT (r, 1))
+     return boolean_true_node;
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::{,u8}identifier_of.
+    Let E be UTF-8 for u8identifier_of, and otherwise the ordinary literal
+    encoding.
+    Returns: An NTMBS, encoded with E, determined as follows:
+    -- If r represents an entity with a typedef name for linkage purposes,
+       then that name.
+    -- Otherwise, if r represents a literal operator or literal operator
+       template, then the ud-suffix of the operator or operator template.
+    -- Otherwise, if r represents the parameter P of a function F, then let S
+       be the set of declarations, ignoring any explicit instantiations, that
+       precede some point in the evaluation context and that declare either F
+       or a templated function of which F is a specialization; the name that
+       was introduced by a declaration in S for the parameter corresponding
+       to P.
+    -- Otherwise, if r represents an entity, then the identifier introduced by
+       the declaration of that entity.
+    -- Otherwise, if r represents a direct base class relationship, then
+       identifier_of(type_of(r)) or u8identifier_of(type_of(r)), respectively.
+    -- Otherwise, r represents a data member description (T,N,A,W,NUA);
+       a string_view or u8string_view, respectively, containing the identifier
+       N.
+    Throws: meta::exception unless has_identifier(r) is true and the identifier
+    that would be returned (see above) is representable by E.  */
+ 
+ static tree
+ eval_identifier_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		    reflect_kind kind, bool *non_constant_p, tree *jump_target,
+ 		    tree elt_type, tree ret_type, tree fun)
+ {
+   if (eval_has_identifier (r, kind) == boolean_false_node)
+     return throw_exception (loc, ctx,
+ 			    "reflection with has_identifier false",
+ 			    fun, non_constant_p, jump_target);
+   r = maybe_get_reflection_fndecl (r);
+   const char *name = NULL;
+   if (kind == REFLECT_BASE)
+     {
+       r = type_of (r, kind);
+       kind = REFLECT_UNDEF;
+     }
+   if (eval_is_function_parameter (r, kind) == boolean_true_node)
+     {
+       r = maybe_update_function_parm (r);
+       if (DECL_NAME (r))
+ 	name = IDENTIFIER_POINTER (DECL_NAME (r));
+       else
+ 	{
+ 	  tree opn = lookup_attribute ("old parm name", DECL_ATTRIBUTES (r));
+ 	  opn = TREE_VALUE (TREE_VALUE (opn));
+ 	  name = IDENTIFIER_POINTER (opn);
+ 	}
+     }
+   else if (DECL_P (r) && UDLIT_OPER_P (DECL_NAME (r)))
+     name = UDLIT_OP_SUFFIX (DECL_NAME (r));
+   else if (DECL_P (r))
+     name = IDENTIFIER_POINTER (DECL_NAME (r));
+   else if (TYPE_P (r))
+     {
+       if (DECL_P (TYPE_NAME (r)))
+ 	name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (r)));
+       else
+ 	name = IDENTIFIER_POINTER (TYPE_NAME (r));
+     }
+   else if (kind == REFLECT_DATA_MEMBER_SPEC)
+     name = IDENTIFIER_POINTER (TREE_VEC_ELT (r, 1));
+   else
+     gcc_unreachable ();
+   tree str = get_string_literal (name, elt_type);
+   if (str == NULL_TREE)
+     {
+       if (elt_type == char_type_node)
+ 	return throw_exception (loc, ctx, "identifier_of not representable"
+ 					  " in ordinary literal encoding",
+ 				fun, non_constant_p, jump_target);
+       else
+ 	return throw_exception (loc, ctx, "u8identifier_of not representable"
+ 					  " in UTF-8",
+ 				fun, non_constant_p, jump_target);
+     }
+   releasing_vec args (make_tree_vector_single (str));
+   tree ret = build_special_member_call (NULL_TREE, complete_ctor_identifier,
+ 					&args, ret_type, LOOKUP_NORMAL,
+ 					tf_warning_or_error);
+   return build_cplus_new (ret_type, ret, tf_warning_or_error);
+ }
+ 
+ /* Process std::meta::{,u8}display_string_of.
+    Returns: An implementation-defined string_view or u8string_view,
+    respectively.
+    Recommended practice: Where possible, implementations should return a
+    string suitable for identifying the represented construct.  */
+ 
+ static tree
+ eval_display_string_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 			reflect_kind kind, bool *non_constant_p,
+ 			tree *jump_target, tree elt_type, tree ret_type,
+ 			tree fun)
+ {
+ #if __GNUC__ >= 10
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wformat"
+ #pragma GCC diagnostic ignored "-Wformat-diag"
+ #endif
+   r = maybe_get_reflection_fndecl (r);
+   pretty_printer pp, *refpp = global_dc->get_reference_printer ();
+   pp_format_decoder (&pp) = pp_format_decoder (refpp);
+   pp.set_format_postprocessor (pp_format_postprocessor (refpp)->clone ());
+   if (r == unknown_type_node)
+     pp_printf (&pp, "<null reflection>");
+   else if (TYPE_P (r))
+     pp_printf (&pp, "%T", r);
+   else if (kind == REFLECT_PARM)
+     {
+       r = maybe_update_function_parm (r);
+       tree fn = DECL_CONTEXT (r);
+       if (DECL_NAME (r))
+ 	pp_printf (&pp, "<parameter %D of %D>", r, fn);
+       else
+ 	{
+ 	  int idx = 1;
+ 	  for (tree args = FUNCTION_FIRST_USER_PARM (fn);
+ 	       r != args; args = DECL_CHAIN (args))
+ 	    ++idx;
+ 	  pp_printf (&pp, "<unnamed parameter %d of %D>", idx, fn);
+ 	}
+     }
+   else if (kind == REFLECT_VALUE || kind == REFLECT_OBJECT)
+     pp_printf (&pp, "%E", r);
+   else if (DECL_P (r) && (DECL_NAME (r) || TREE_CODE (r) == NAMESPACE_DECL))
+     pp_printf (&pp, "%D", r);
+   else if (TREE_CODE (r) == FIELD_DECL)
+     pp_printf (&pp, "%T::<unnamed bit-field>", DECL_CONTEXT (r));
+   else if (kind == REFLECT_BASE)
+     {
+       tree d = direct_base_derived (r);
+       pp_printf (&pp, "%T: %T", d, BINFO_TYPE (r));
+     }
+   else if (kind == REFLECT_DATA_MEMBER_SPEC)
+     pp_printf (&pp, "(%T, %E, %E, %E, %s)", TREE_VEC_ELT (r, 0),
+ 	       TREE_VEC_ELT (r, 1), TREE_VEC_ELT (r, 2), TREE_VEC_ELT (r, 3),
+ 	       TREE_VEC_ELT (r, 4) == boolean_true_node
+ 	       ? "true" : "false");
+   else if (eval_is_annotation (r, kind) == boolean_true_node)
+     pp_printf (&pp, "[[=%E]]",
+ 	       tree_strip_any_location_wrapper (TREE_VALUE (TREE_VALUE (r))));
+   else
+     pp_string (&pp, "<unsupported reflection>");
+ #if __GNUC__ >= 10
+ #pragma GCC diagnostic pop
+ #endif
+   tree str = get_string_literal (pp_formatted_text (&pp), elt_type);
+   if (str == NULL_TREE)
+     {
+       if (elt_type == char_type_node)
+ 	return throw_exception (loc, ctx, "identifier_of not representable"
+ 					  " in ordinary literal encoding",
+ 				fun, non_constant_p, jump_target);
+       else
+ 	return throw_exception (loc, ctx, "u8identifier_of not representable"
+ 					  " in UTF-8", fun, non_constant_p,
+ 					  jump_target);
+     }
+   releasing_vec args (make_tree_vector_single (str));
+   tree ret = build_special_member_call (NULL_TREE, complete_ctor_identifier,
+ 					&args, ret_type, LOOKUP_NORMAL,
+ 					tf_warning_or_error);
+   return build_cplus_new (ret_type, ret, tf_warning_or_error);
+ }
+ 
+ /* Determine the reflection kind for R.  */
+ 
+ static reflect_kind
+ get_reflection_kind (tree r)
+ {
+   if (eval_is_type (r) == boolean_true_node
+       || eval_is_template (r) == boolean_true_node
+       || eval_is_function (r) == boolean_true_node)
+     return REFLECT_UNDEF;
+   return obvalue_p (r) ? REFLECT_OBJECT : REFLECT_VALUE;
+ }
+ 
+ /* Get the reflection of template argument ARG as per
+    std::meta::template_arguments_of.  */
+ 
+ static tree
+ get_reflection_of_targ (tree arg)
+ {
+   const location_t loc = location_of (arg);
+   /* canonicalize_type_argument already strip_typedefs.  */
+   arg = STRIP_REFERENCE_REF (arg);
+   arg = maybe_get_reference_referent (arg);
+   return get_reflection_raw (loc, arg, get_reflection_kind (arg));
+ }
+ 
+ /* Process std::meta::template_arguments_of.
+    Returns: A vector containing reflections of the template arguments of the
+    template specialization represented by r, in the order in which they appear
+    in the corresponding template argument list.
+    For a given template argument A, its corresponding reflection R is
+    determined as follows:
+ 
+    -- If A denotes a type or type alias, then R is a reflection representing
+       the underlying entity of A.
+    -- Otherwise, if A denotes a class template, variable template, concept,
+       or alias template, then R is a reflection representing A.
+    -- Otherwise, A is a constant template argument.  Let P be the
+       corresponding template parameter.
+       -- If P has reference type, then R is a reflection representing the
+ 	 object or function referred to by A.
+       -- Otherwise, if P has class type, then R represents the corresponding
+ 	 template parameter object.
+       -- Otherwise, R is a reflection representing the value of A.
+ 
+    Throws: meta::exception unless has_template_arguments(r) is true.  */
+ 
+ static tree
+ eval_template_arguments_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 			    bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   if (eval_has_template_arguments (r) != boolean_true_node)
+     return throw_exception_notargs (loc, ctx, fun, non_constant_p, jump_target);
+ 
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   tree args = NULL_TREE;
+   if (TYPE_P (r) && typedef_variant_p (r))
+     {
+       if (tree tinfo = TYPE_ALIAS_TEMPLATE_INFO (r))
+ 	args = INNERMOST_TEMPLATE_ARGS (TI_ARGS (tinfo));
+     }
+   else
+     args = get_template_innermost_arguments (r);
+   gcc_assert (args);
+   for (tree arg : tree_vec_range (args))
+     {
+       if (ARGUMENT_PACK_P (arg))
+ 	{
+ 	  tree pargs = ARGUMENT_PACK_ARGS (arg);
+ 	  for (tree a : tree_vec_range (pargs))
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				    get_reflection_of_targ (a));
+ 	}
+       else
+ 	CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE, get_reflection_of_targ (arg));
+     }
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Helper for eval_remove_const to build non-const type.  */
+ 
+ static tree
+ remove_const (tree type)
+ {
+   return cp_build_qualified_type (type,
+ 				  cp_type_quals (type) & ~TYPE_QUAL_CONST);
+ }
+ 
+ /* Process std::meta::annotations_of and annotations_of_with_type.
+    Let E be
+    -- the corresponding base-specifier if item represents a direct base class
+       relationship,
+    -- otherwise, the entity represented by item.
+    Returns: A vector containing all of the reflections R representing each
+    annotation applying to each declaration of E that precedes either some
+    point in the evaluation context or a point immediately following the
+    class-specifier of the outermost class for which such a point is in a
+    complete-class context.
+    For any two reflections R1 and R2 in the returned vector, if the annotation
+    represented by R1 precedes the annotation represented by R2, then R1
+    appears before R2.
+    If R1 and R2 represent annotations from the same translation unit T, any
+    element in the returned vector between R1 and R2 represents an annotation
+    from T.
+ 
+    Throws: meta::exception unless item represents a type, type alias,
+    variable, function, namespace, enumerator, direct base class relationship,
+    or non-static data member.  */
+ 
+ static tree
+ eval_annotations_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		     reflect_kind kind, tree type, bool *non_constant_p,
+ 		     tree *jump_target, tree fun)
+ {
+   if (!(eval_is_type (r) == boolean_true_node
+ 	|| eval_is_type_alias (r) == boolean_true_node
+ 	|| eval_is_variable (r, kind) == boolean_true_node
+ 	|| eval_is_function (r) == boolean_true_node
+ 	|| eval_is_namespace (r) == boolean_true_node
+ 	|| eval_is_enumerator (r) == boolean_true_node
+ 	|| eval_is_base (r, kind) == boolean_true_node
+ 	|| eval_is_nonstatic_data_member (r) == boolean_true_node))
+     return throw_exception (loc, ctx,
+ 			    "reflection does not represent a type,"
+ 			    " type alias, variable, function, namespace,"
+ 			    " enumerator, direct base class relationship,"
+ 			    " or non-static data member",
+ 			    fun, non_constant_p, jump_target);
+ 
+   if (type)
+     {
+       type = maybe_strip_typedefs (type);
+       if (!TYPE_P (type)
+ 	  || !complete_type_or_maybe_complain (type, NULL_TREE, tf_none))
+ 	return throw_exception (loc, ctx,
+ 				"reflection does not represent a complete"
+ 				" type or type alias", fun, non_constant_p,
+ 				jump_target);
+       type = remove_const (type);
+     }
+ 
+   if (kind == REFLECT_BASE)
+     {
+       gcc_assert (TREE_CODE (r) == TREE_BINFO);
+       tree c = direct_base_derived_binfo (r), binfo = r, base_binfo;
+ 
+       r = NULL_TREE;
+       for (unsigned ix = 0; BINFO_BASE_ITERATE (c, ix, base_binfo); ix++)
+ 	if (base_binfo == binfo)
+ 	  {
+ 	    if (ix + BINFO_BASE_BINFOS (c)->length ()
+ 		< vec_safe_length (BINFO_BASE_ACCESSES (c)))
+ 	      r = BINFO_BASE_ACCESS (c, ix + BINFO_BASE_BINFOS (c)->length ());
+ 	    break;
+ 	  }
+     }
+   else if (TYPE_P (r))
+     r = TYPE_ATTRIBUTES (r);
+   else if (DECL_P (r))
+     r = DECL_ATTRIBUTES (r);
+   else
+     gcc_unreachable ();
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   for (tree a = r; (a = lookup_attribute ("internal ", "annotation ", a));
+        a = TREE_CHAIN (a))
+     {
+       gcc_checking_assert (TREE_CODE (TREE_VALUE (a)) == TREE_LIST);
+       tree val = TREE_VALUE (TREE_VALUE (a));
+       if (type)
+ 	{
+ 	  tree at = TREE_TYPE (val);
+ 	  if (at != type && !same_type_p (remove_const (at), type))
+ 	    continue;
+ 	}
+       CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 			      get_reflection_raw (loc, a, REFLECT_ANNOTATION));
+     }
+   if (elts)
+     {
+       /* Reverse the order.  */
+       unsigned l = elts->length ();
+       constructor_elt *ptr = elts->address ();
+ 
+       for (unsigned i = 0; i < l / 2; i++)
+ 	std::swap (ptr[i], ptr[l - i - 1]);
+     }
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Process std::meta::reflect_constant.
+    Mandates: is_copy_constructible_v<T> is true and T is a cv-unqualified
+    structural type that is not a reference type.
+    Let V be:
+    -- if T is a class type, then an object that is template-argument-equivalent
+       to the value of expr;
+    -- otherwise, the value of expr.
+    Returns: template_arguments_of(^^TCls<V>)[0], with TCls as defined below.
+    Throws: meta::exception unless the template-id TCls<V> would be valid given
+    the invented template
+      template<T P> struct TCls;  */
+ 
+ static tree
+ eval_reflect_constant (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		       tree expr, bool *non_constant_p, tree *jump_target,
+ 		       tree fun)
+ {
+   if (!structural_type_p (type)
+       || CP_TYPE_VOLATILE_P (type)
+       || CP_TYPE_CONST_P (type)
+       || TYPE_REF_P (type))
+     {
+       error_at (loc, "%qT must be a cv-unqualified structural type that is "
+ 		"not a reference type", type);
+       return error_mark_node;
+     }
+   expr = convert_reflect_constant_arg (type, convert_from_reference (expr));
+   if (expr == error_mark_node)
+     return throw_exception (loc, ctx, "reflect_constant failed", fun,
+ 			    non_constant_p, jump_target);
+   return get_reflection_raw (loc, expr, get_reflection_kind (expr));
+ }
+ 
+ /* Process std::meta::reflect_object.
+    Mandates: T is an object type.
+    Returns: A reflection of the object designated by expr.
+    Throws: meta::exception unless expr is suitable for use as a constant
+    template argument for a constant template parameter of type T&.  */
+ 
+ static tree
+ eval_reflect_object (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		     tree expr, bool *non_constant_p, tree *jump_target,
+ 		     tree fun)
+ {
+   if (eval_is_object_type (loc, type) != boolean_true_node)
+     {
+       error_at (loc, "%qT must be an object type", TREE_TYPE (type));
+       return error_mark_node;
+     }
+   type = cp_build_reference_type (type, /*rval=*/false);
+   tree e = convert_reflect_constant_arg (type, convert_from_reference (expr));
+   if (e == error_mark_node)
+     return throw_exception (loc, ctx, "reflect_object failed", fun,
+ 			    non_constant_p, jump_target);
+   /* We got (const T &) &foo.  Get the referent, since we want the object
+      designated by EXPR.  */
+   expr = maybe_get_reference_referent (expr);
+   return get_reflection_raw (loc, expr, REFLECT_OBJECT);
+ }
+ 
+ /* Process std::meta::reflect_function.
+    Mandates: T is a function type.
+    Returns: A reflection of the function designated by fn.
+    Throws: meta::exception unless fn is suitable for use as a constant
+    template argument for a constant template parameter of type T&.  */
+ 
+ static tree
+ eval_reflect_function (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		       tree expr, bool *non_constant_p, tree *jump_target,
+ 		       tree fun)
+ {
+   if (eval_is_function_type (type) != boolean_true_node)
+     {
+       error_at (loc, "%qT must be a function type", TREE_TYPE (type));
+       return error_mark_node;
+     }
+   type = cp_build_reference_type (type, /*rval=*/false);
+   tree e = convert_reflect_constant_arg (type, convert_from_reference (expr));
+   if (e == error_mark_node)
+     return throw_exception (loc, ctx, "reflect_function failed", fun,
+ 			    non_constant_p, jump_target);
+   /* We got (void (&<Ta885>) (void)) fn.  Get the function.  */
+   expr = maybe_get_reference_referent (expr);
+   return get_reflection_raw (loc, expr);
+ }
+ 
+ /* Reflection type traits [meta.reflection.traits].
+ 
+    Every function and function template declared in this subclause throws
+    an exception of type meta::exception unless the following conditions are
+    met:
+    -- For every parameter p of type info, is_type(p) is true.
+    -- For every parameter r whose type is constrained on reflection_range,
+       ranges::all_of(r, is_type) is true.  */
+ 
+ /* Evaluate reflection type traits for which we have corresponding built-in
+    traits.  KIND says which trait we are interested in; TYPE1 and TYPE2 are
+    arguments to the trait.  */
+ 
+ static tree
+ eval_type_trait (location_t loc, tree type1, tree type2, cp_trait_kind kind)
+ {
+   tree r = finish_trait_expr (loc, kind, type1, type2);
+   STRIP_ANY_LOCATION_WRAPPER (r);
+   return r;
+ }
+ 
+ /* Like above, but for type traits that take only one type.  */
+ 
+ static tree
+ eval_type_trait (location_t loc, tree type, cp_trait_kind kind)
+ {
+   return eval_type_trait (loc, type, NULL_TREE, kind);
+ }
+ 
+ /* Process std::meta::is_function_type.  */
+ 
+ static tree
+ eval_is_function_type (tree type)
+ {
+   if (FUNC_OR_METHOD_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_void_type.  */
+ 
+ static tree
+ eval_is_void_type (tree type)
+ {
+   if (VOID_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_null_pointer_type.  */
+ 
+ static tree
+ eval_is_null_pointer_type (tree type)
+ {
+   if (NULLPTR_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_integral_type.  */
+ 
+ static tree
+ eval_is_integral_type (tree type)
+ {
+   if (CP_INTEGRAL_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_floating_point_type.  */
+ 
+ static tree
+ eval_is_floating_point_type (tree type)
+ {
+   if (FLOAT_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_array_type.  */
+ 
+ static tree
+ eval_is_array_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_ARRAY);
+ }
+ 
+ /* Process std::meta::is_pointer_type.  */
+ 
+ static tree
+ eval_is_pointer_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_POINTER);
+ }
+ 
+ /* Process std::meta::is_lvalue_reference_type.  */
+ 
+ static tree
+ eval_is_lvalue_reference_type (tree type)
+ {
+   if (TYPE_REF_P (type) && !TYPE_REF_IS_RVALUE (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_rvalue_reference_type.  */
+ 
+ static tree
+ eval_is_rvalue_reference_type (tree type)
+ {
+   if (TYPE_REF_P (type) && TYPE_REF_IS_RVALUE (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_member_object_pointer_type.  */
+ 
+ static tree
+ eval_is_member_object_pointer_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_MEMBER_OBJECT_POINTER);
+ }
+ 
+ /* Process std::meta::is_member_function_pointer_type.  */
+ 
+ static tree
+ eval_is_member_function_pointer_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_MEMBER_FUNCTION_POINTER);
+ }
+ 
+ /* Process std::meta::is_enum_type.  */
+ 
+ static tree
+ eval_is_enum_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_ENUM);
+ }
+ 
+ /* Process std::meta::is_union_type.  */
+ 
+ static tree
+ eval_is_union_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_UNION);
+ }
+ 
+ /* Process std::meta::is_class_type.  */
+ 
+ static tree
+ eval_is_class_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_CLASS);
+ }
+ 
+ /* Process std::meta::is_reflection_type.  */
+ 
+ static tree
+ eval_is_reflection_type (tree type)
+ {
+   if (REFLECTION_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_reference_type.  */
+ 
+ static tree
+ eval_is_reference_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_REFERENCE);
+ }
+ 
+ /* Process std::meta::is_arithmetic_type.  */
+ 
+ static tree
+ eval_is_arithmetic_type (tree type)
+ {
+   if (ARITHMETIC_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_object_type.  */
+ 
+ static tree
+ eval_is_object_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_OBJECT);
+ }
+ 
+ /* Process std::meta::is_scalar_type.  */
+ 
+ static tree
+ eval_is_scalar_type (tree type)
+ {
+   if (SCALAR_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_fundamental_type.  */
+ 
+ static tree
+ eval_is_fundamental_type (tree type)
+ {
+   if (ARITHMETIC_TYPE_P (type)
+       || VOID_TYPE_P (type)
+       || NULLPTR_TYPE_P (type)
+       || REFLECTION_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_compound_type.  */
+ 
+ static tree
+ eval_is_compound_type (tree type)
+ {
+   if (eval_is_fundamental_type (type) == boolean_false_node)
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_member_pointer_type.  */
+ 
+ static tree
+ eval_is_member_pointer_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_MEMBER_POINTER);
+ }
+ 
+ /* Process std::meta::is_const_type.  */
+ 
+ static tree
+ eval_is_const_type (tree type)
+ {
+   if (CP_TYPE_CONST_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_volatile_type.  */
+ 
+ static tree
+ eval_is_volatile_type (tree type)
+ {
+   if (CP_TYPE_VOLATILE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_trivially_copyable_type.  */
+ 
+ static tree
+ eval_is_trivially_copyable_type (tree type)
+ {
+   if (trivially_copyable_p (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_standard_layout_type.  */
+ 
+ static tree
+ eval_is_standard_layout_type (tree type)
+ {
+   if (std_layout_type_p (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_empty_type.  */
+ 
+ static tree
+ eval_is_empty_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_EMPTY);
+ }
+ 
+ /* Process std::meta::is_polymorphic_type.  */
+ 
+ static tree
+ eval_is_polymorphic_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_POLYMORPHIC);
+ }
+ 
+ /* Process std::meta::is_abstract_type.  */
+ 
+ static tree
+ eval_is_abstract_type (tree type)
+ {
+   if (ABSTRACT_CLASS_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_final_type.  */
+ 
+ static tree
+ eval_is_final_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_FINAL);
+ }
+ 
+ /* Process std::meta::is_final.
+    Returns: true if r represents a final class or a final member function.
+    Otherwise, false.  */
+ 
+ static tree
+ eval_is_final (tree r)
+ {
+   if (eval_is_function (r) == boolean_true_node)
+     {
+       r = maybe_get_reflection_fndecl (r);
+       if (TREE_CODE (r) == FUNCTION_DECL && DECL_FINAL_P (r))
+ 	return boolean_true_node;
+       else
+ 	return boolean_false_node;
+     }
+ 
+   if (eval_is_type (r) == boolean_true_node
+       && CLASS_TYPE_P (r)
+       && CLASSTYPE_FINAL (r))
+     return boolean_true_node;
+ 
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_aggregate_type.  */
+ 
+ static tree
+ eval_is_aggregate_type (tree type)
+ {
+   if (CP_AGGREGATE_TYPE_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_consteval_only_type.  */
+ 
+ static tree
+ eval_is_consteval_only_type (tree type)
+ {
+   if (consteval_only_p (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_signed_type.  */
+ 
+ static tree
+ eval_is_signed_type (tree type)
+ {
+   if (ARITHMETIC_TYPE_P (type) && !TYPE_UNSIGNED (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_unsigned_type.  */
+ 
+ static tree
+ eval_is_unsigned_type (tree type)
+ {
+   if (ARITHMETIC_TYPE_P (type) && TYPE_UNSIGNED (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_bounded_array_type.  */
+ 
+ static tree
+ eval_is_bounded_array_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_BOUNDED_ARRAY);
+ }
+ 
+ /* Process std::meta::is_unbounded_array_type.  */
+ 
+ static tree
+ eval_is_unbounded_array_type (tree type)
+ {
+   if (array_of_unknown_bound_p (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_scoped_enum_type.  */
+ 
+ static tree
+ eval_is_scoped_enum_type (tree type)
+ {
+   if (SCOPED_ENUM_P (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_constructible_type.  */
+ 
+ static tree
+ eval_is_constructible_type (tree type, tree tvec)
+ {
+   if (is_xible (INIT_EXPR, type, tvec))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_default_constructible_type.  */
+ 
+ static tree
+ eval_is_default_constructible_type (tree type)
+ {
+   if (is_xible (INIT_EXPR, type, make_tree_vec (0)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_copy_constructible_type.  */
+ 
+ static tree
+ eval_is_copy_constructible_type (tree type)
+ {
+   tree arg = make_tree_vec (1);
+   TREE_VEC_ELT (arg, 0)
+     = build_stub_type (type, cp_type_quals (type) | TYPE_QUAL_CONST, false);
+   if (is_xible (INIT_EXPR, type, arg))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_move_constructible_type.  */
+ 
+ static tree
+ eval_is_move_constructible_type (tree type)
+ {
+   tree arg = make_tree_vec (1);
+   TREE_VEC_ELT (arg, 0) = cp_build_reference_type (type, /*rval=*/true);
+   if (is_xible (INIT_EXPR, type, arg))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_assignable_type.  */
+ 
+ static tree
+ eval_is_assignable_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_ASSIGNABLE);
+ }
+ 
+ /* Process std::meta::is_copy_assignable_type.  */
+ 
+ static tree
+ eval_is_copy_assignable_type (tree type)
+ {
+   tree type1 = cp_build_reference_type (type, /*rval=*/false);
+   tree type2 = build_stub_type (type, cp_type_quals (type) | TYPE_QUAL_CONST,
+ 				false);
+   if (is_xible (MODIFY_EXPR, type1, type2))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_move_assignable_type.  */
+ 
+ static tree
+ eval_is_move_assignable_type (tree type)
+ {
+   tree type1 = cp_build_reference_type (type, /*rval=*/false);
+   tree type2 = cp_build_reference_type (type, /*rval=*/true);
+   if (is_xible (MODIFY_EXPR, type1, type2))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_destructible_type.  */
+ 
+ static tree
+ eval_is_destructible_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_DESTRUCTIBLE);
+ }
+ 
+ /* Process std::meta::is_trivially_constructible_type.  */
+ 
+ static tree
+ eval_is_trivially_constructible_type (tree type, tree tvec)
+ {
+   if (is_trivially_xible (INIT_EXPR, type, tvec))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_trivially_default_constructible_type.  */
+ 
+ static tree
+ eval_is_trivially_default_constructible_type (tree type)
+ {
+   if (is_trivially_xible (INIT_EXPR, type, make_tree_vec (0)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_trivially_copy_constructible_type.  */
+ 
+ static tree
+ eval_is_trivially_copy_constructible_type (tree type)
+ {
+   tree arg = make_tree_vec (1);
+   TREE_VEC_ELT (arg, 0)
+     = build_stub_type (type, cp_type_quals (type) | TYPE_QUAL_CONST, false);
+   if (is_trivially_xible (INIT_EXPR, type, arg))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_trivially_move_constructible_type.  */
+ 
+ static tree
+ eval_is_trivially_move_constructible_type (tree type)
+ {
+   tree arg = make_tree_vec (1);
+   TREE_VEC_ELT (arg, 0) = cp_build_reference_type (type, /*rval=*/true);
+   if (is_trivially_xible (INIT_EXPR, type, arg))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_trivially_assignable_type.  */
+ 
+ static tree
+ eval_is_trivially_assignable_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_TRIVIALLY_ASSIGNABLE);
+ }
+ 
+ /* Process std::meta::is_trivially_copy_assignable_type.  */
+ 
+ static tree
+ eval_is_trivially_copy_assignable_type (tree type)
+ {
+   tree type1 = cp_build_reference_type (type, /*rval=*/false);
+   tree type2 = build_stub_type (type, cp_type_quals (type) | TYPE_QUAL_CONST,
+ 				false);
+   if (is_trivially_xible (MODIFY_EXPR, type1, type2))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_trivially_move_assignable_type.  */
+ 
+ static tree
+ eval_is_trivially_move_assignable_type (tree type)
+ {
+   tree type1 = cp_build_reference_type (type, /*rval=*/false);
+   tree type2 = cp_build_reference_type (type, /*rval=*/true);
+   if (is_trivially_xible (MODIFY_EXPR, type1, type2))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_trivially_destructible_type.  */
+ 
+ static tree
+ eval_is_trivially_destructible_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_TRIVIALLY_DESTRUCTIBLE);
+ }
+ 
+ /* Process std::meta::is_nothrow_constructible_type.  */
+ 
+ static tree
+ eval_is_nothrow_constructible_type (tree type, tree tvec)
+ {
+   if (is_nothrow_xible (INIT_EXPR, type, tvec))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_nothrow_default_constructible_type.  */
+ 
+ static tree
+ eval_is_nothrow_default_constructible_type (tree type)
+ {
+   if (is_nothrow_xible (INIT_EXPR, type, make_tree_vec (0)))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_nothrow_copy_constructible_type.  */
+ 
+ static tree
+ eval_is_nothrow_copy_constructible_type (tree type)
+ {
+   tree arg = make_tree_vec (1);
+   TREE_VEC_ELT (arg, 0)
+     = build_stub_type (type, cp_type_quals (type) | TYPE_QUAL_CONST, false);
+   if (is_nothrow_xible (INIT_EXPR, type, arg))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_nothrow_move_constructible_type.  */
+ 
+ static tree
+ eval_is_nothrow_move_constructible_type (tree type)
+ {
+   tree arg = make_tree_vec (1);
+   TREE_VEC_ELT (arg, 0) = cp_build_reference_type (type, /*rval=*/true);
+   if (is_nothrow_xible (INIT_EXPR, type, arg))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_nothrow_assignable_type.  */
+ 
+ static tree
+ eval_is_nothrow_assignable_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_NOTHROW_ASSIGNABLE);
+ }
+ 
+ /* Process std::meta::is_nothrow_copy_assignable_type.  */
+ 
+ static tree
+ eval_is_nothrow_copy_assignable_type (tree type)
+ {
+   tree type1 = cp_build_reference_type (type, /*rval=*/false);
+   tree type2 = build_stub_type (type, cp_type_quals (type) | TYPE_QUAL_CONST,
+ 				false);
+   if (is_nothrow_xible (MODIFY_EXPR, type1, type2))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_nothrow_move_assignable_type.  */
+ 
+ static tree
+ eval_is_nothrow_move_assignable_type (tree type)
+ {
+   tree type1 = cp_build_reference_type (type, /*rval=*/false);
+   tree type2 = cp_build_reference_type (type, /*rval=*/true);
+   if (is_nothrow_xible (MODIFY_EXPR, type1, type2))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::is_nothrow_destructible_type.  */
+ 
+ static tree
+ eval_is_nothrow_destructible_type (location_t loc, tree type)
+ {
+   return eval_type_trait (loc, type, CPTK_IS_NOTHROW_DESTRUCTIBLE);
+ }
+ 
+ /* Process std::meta::is_implicit_lifetime_type.  */
+ 
+ static tree
+ eval_is_implicit_lifetime_type (tree type)
+ {
+   if (implicit_lifetime_type_p (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_virtual_destructor.  */
+ 
+ static tree
+ eval_has_virtual_destructor (tree type)
+ {
+   if (type_has_virtual_destructor (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::has_unique_object_representations.  */
+ 
+ static tree
+ eval_has_unique_object_representations (tree type)
+ {
+   if (type_has_unique_obj_representations (type))
+     return boolean_true_node;
+   else
+     return boolean_false_node;
+ }
+ 
+ /* Process std::meta::reference_constructs_from_temporary.  */
+ 
+ static tree
+ eval_reference_constructs_from_temporary (location_t loc, tree type1,
+ 					  tree type2)
+ {
+   return eval_type_trait (loc, type1, type2,
+ 			  CPTK_REF_CONSTRUCTS_FROM_TEMPORARY);
+ }
+ 
+ /* Process std::meta::reference_converts_from_temporary.  */
+ 
+ static tree
+ eval_reference_converts_from_temporary (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_REF_CONVERTS_FROM_TEMPORARY);
+ }
+ 
+ /* Process std::meta::rank.  */
+ 
+ static tree
+ eval_rank (tree type)
+ {
+   size_t rank = 0;
+   for (; TREE_CODE (type) == ARRAY_TYPE; type = TREE_TYPE (type))
+     ++rank;
+   return build_int_cst (size_type_node, rank);
+ }
+ 
+ /* Process std::meta::extent.  */
+ 
+ static tree
+ eval_extent (location_t loc, tree type, tree i)
+ {
+   size_t rank = tree_to_uhwi (i);
+   while (rank && TREE_CODE (type) == ARRAY_TYPE)
+     {
+       --rank;
+       type = TREE_TYPE (type);
+     }
+   if (rank
+       || TREE_CODE (type) != ARRAY_TYPE
+       || eval_is_bounded_array_type (loc, type) == boolean_false_node)
+      return size_zero_node;
+   return size_binop (PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
+ 		     size_one_node);
+ }
+ 
+ /* Process std::meta::is_same_type.  */
+ 
+ static tree
+ eval_is_same_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_SAME);
+ }
+ 
+ /* Process std::meta::is_base_of_type.  */
+ 
+ static tree
+ eval_is_base_of_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_BASE_OF);
+ }
+ 
+ /* Process std::meta::is_virtual_base_of_type.  */
+ 
+ static tree
+ eval_is_virtual_base_of_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_VIRTUAL_BASE_OF);
+ }
+ 
+ /* Process std::meta::is_convertible_type.  */
+ 
+ static tree
+ eval_is_convertible_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_CONVERTIBLE);
+ }
+ 
+ /* Process std::meta::is_nothrow_convertible_type.  */
+ 
+ static tree
+ eval_is_nothrow_convertible_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_NOTHROW_CONVERTIBLE);
+ }
+ 
+ /* Process std::meta::is_layout_compatible_type.  */
+ 
+ static tree
+ eval_is_layout_compatible_type (location_t loc, tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2, CPTK_IS_LAYOUT_COMPATIBLE);
+ }
+ 
+ /* Process std::meta::is_pointer_interconvertible_base_of_type.  */
+ 
+ static tree
+ eval_is_pointer_interconvertible_base_of_type (location_t loc,
+ 					       tree type1, tree type2)
+ {
+   return eval_type_trait (loc, type1, type2,
+ 			  CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF);
+ }
+ 
+ /* Process std::meta::is_invocable_type.  */
+ 
+ static tree
+ eval_is_invocable_type (location_t loc, tree type, tree tvec)
+ {
+   tree r = finish_trait_expr (loc, CPTK_IS_INVOCABLE, type, tvec);
+   STRIP_ANY_LOCATION_WRAPPER (r);
+   return r;
+ }
+ 
+ /* Helper for various eval_* type trait functions which can't use builtin
+    trait and have to instantiate std::NAME<ARGS>::value.  */
+ 
+ static tree
+ finish_library_value_trait (location_t loc, const constexpr_ctx *ctx,
+ 			    const char *name, tree args, tree call,
+ 			    bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   tree inst = lookup_template_class (get_identifier (name), args,
+ 				     /*in_decl*/NULL_TREE, /*context*/std_node,
+ 				     tf_warning_or_error);
+   inst = complete_type (inst);
+   if (inst == error_mark_node
+       || !COMPLETE_TYPE_P (inst)
+       || !CLASS_TYPE_P (inst))
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "couldn%'t instantiate %<std::%s<%T>%>",
+ 		  name, args);
+       *non_constant_p = true;
+       return call;
+     }
+   tree val = lookup_qualified_name (inst, value_identifier,
+ 				    LOOK_want::NORMAL, /*complain*/false);
+   if (val == error_mark_node)
+     return throw_exception (loc, ctx, "value member missing",
+ 			    fun, non_constant_p, jump_target);
+   if (VAR_P (val) || TREE_CODE (val) == CONST_DECL)
+     val = maybe_constant_value (val, NULL_TREE, mce_true);
+   if (TREE_CODE (TREE_TYPE (call)) == BOOLEAN_TYPE)
+     {
+       if (integer_zerop (val))
+ 	return boolean_false_node;
+       else if (integer_nonzerop (val))
+ 	return boolean_true_node;
+       else
+ 	return throw_exception (loc, ctx, "unexpected value of value member",
+ 				fun, non_constant_p, jump_target);
+     }
+   else if (TREE_CODE (val) == INTEGER_CST)
+     {
+       val = build_converted_constant_expr (TREE_TYPE (call), val, tf_none);
+       if (TREE_CODE (val) == INTEGER_CST)
+ 	return val;
+     }
+   return throw_exception (loc, ctx, "unexpected value of value member",
+ 			  fun, non_constant_p, jump_target);
+ }
+ 
+ /* Process std::meta::is_{,nothrow_}invocable_r_type.  */
+ 
+ static tree
+ eval_is_invocable_r_type (location_t loc, const constexpr_ctx *ctx,
+ 			  tree tres, tree type, tree tvec, tree call,
+ 			  bool *non_constant_p, tree *jump_target, tree fun,
+ 			  const char *name)
+ {
+   /* Create std::is_invocable_r<TYPE>::value.  */
+   tree args = make_tree_vec (TREE_VEC_LENGTH (tvec) + 2);
+   TREE_VEC_ELT (args, 0) = tres;
+   TREE_VEC_ELT (args, 1) = type;
+   for (int i = 0; i < TREE_VEC_LENGTH (tvec); ++i)
+     TREE_VEC_ELT (args, i + 2) = TREE_VEC_ELT (tvec, i);
+   return finish_library_value_trait (loc, ctx, name, args, call,
+ 				     non_constant_p, jump_target, fun);
+ }
+ 
+ /* Process std::meta::is_nothrow_invocable_type.  */
+ 
+ static tree
+ eval_is_nothrow_invocable_type (location_t loc, tree type, tree tvec)
+ {
+   tree r = finish_trait_expr (loc, CPTK_IS_NOTHROW_INVOCABLE, type, tvec);
+   STRIP_ANY_LOCATION_WRAPPER (r);
+   return r;
+ }
+ 
+ /* Process std::meta::is_{,nothrow_}swappable_with_type.  */
+ 
+ static tree
+ eval_is_swappable_with_type (location_t loc, const constexpr_ctx *ctx,
+ 			     tree type1, tree type2, tree call,
+ 			     bool *non_constant_p, tree *jump_target, tree fun,
+ 			     const char *name)
+ {
+   /* Create std::is_swappable_with<TYPE>::value.  */
+   tree args = make_tree_vec (2);
+   TREE_VEC_ELT (args, 0) = type1;
+   TREE_VEC_ELT (args, 1) = type2;
+   return finish_library_value_trait (loc, ctx, name, args, call,
+ 				     non_constant_p, jump_target, fun);
+ }
+ 
+ /* Process std::meta::is_{,nothrow_}swappable_type.  */
+ 
+ static tree
+ eval_is_swappable_type (location_t loc, const constexpr_ctx *ctx,
+ 			tree type, tree call, bool *non_constant_p,
+ 			tree *jump_target, tree fun, const char *name)
+ {
+   /* Create std::is_swappable<TYPE>::value.  */
+   tree args = make_tree_vec (1);
+   TREE_VEC_ELT (args, 0) = type;
+   return finish_library_value_trait (loc, ctx, name, args, call,
+ 				     non_constant_p, jump_target, fun);
+ }
+ 
+ /* Process std::meta::remove_cvref.  */
+ 
+ static tree
+ eval_remove_cvref (location_t loc, tree type)
+ {
+   if (TYPE_REF_P (type))
+     type = TREE_TYPE (type);
+   type = finish_trait_type (CPTK_REMOVE_CV, type, NULL_TREE, tf_none);
+   type = strip_typedefs (type);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::decay.  */
+ 
+ static tree
+ eval_decay (location_t loc, tree type)
+ {
+   type = finish_trait_type (CPTK_DECAY, type, NULL_TREE, tf_none);
+   type = strip_typedefs (type);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Helper for various eval_* type trait functions which can't use builtin
+    trait and have to instantiate std::NAME<ARGS>::type.  */
+ 
+ static tree
+ finish_library_type_trait (location_t loc, const constexpr_ctx *ctx,
+ 			   const char *name, tree args, tree call,
+ 			   bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   tree inst = lookup_template_class (get_identifier (name), args,
+ 				     /*in_decl*/NULL_TREE,
+ 				     /*context*/std_node,
+ 				     tf_warning_or_error);
+   if (inst == error_mark_node)
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "couldn%'t instantiate %<std::%s<%T>%>",
+ 		  name, args);
+       *non_constant_p = true;
+       return call;
+     }
+   tree type = make_typename_type (inst, type_identifier,
+ 				  none_type, tf_none);
+   if (type == error_mark_node)
+     return throw_exception (loc, ctx, "type member missing",
+ 			    fun, non_constant_p, jump_target);
+   type = strip_typedefs (type);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::common_{type,reference}.  */
+ 
+ static tree
+ eval_common_type (location_t loc, const constexpr_ctx *ctx, tree tvec,
+ 		  tree call, bool *non_constant_p, tree *jump_target, tree fun,
+ 		  const char *name)
+ {
+   return finish_library_type_trait (loc, ctx, name, tvec, call,
+ 				    non_constant_p, jump_target, fun);
+ }
+ 
+ /* Process std::meta::underlying_type.  */
+ 
+ static tree
+ eval_underlying_type (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		      bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   if (TREE_CODE (type) != ENUMERAL_TYPE || !COMPLETE_TYPE_P (type))
+     return throw_exception (loc, ctx, "reflection does not represent "
+ 				      "a complete enumeration type",
+ 			    fun, non_constant_p, jump_target);
+   type = finish_underlying_type (type);
+   type = strip_typedefs (type);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::invoke_result.  */
+ 
+ static tree
+ eval_invoke_result (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		    tree tvec, tree call, bool *non_constant_p,
+ 		    tree *jump_target, tree fun)
+ {
+   tree args = make_tree_vec (TREE_VEC_LENGTH (tvec) + 1);
+   TREE_VEC_ELT (args, 0) = type;
+   for (int i = 0; i < TREE_VEC_LENGTH (tvec); ++i)
+     TREE_VEC_ELT (args, i + 1) = TREE_VEC_ELT (tvec, i);
+   return finish_library_type_trait (loc, ctx, "invoke_result", args, call,
+ 				    non_constant_p, jump_target, fun);
+ }
+ 
+ /* Process std::meta::unwrap_{reference,ref_decay}.  */
+ 
+ static tree
+ eval_unwrap_reference (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		       tree call, bool *non_constant_p, tree *jump_target,
+ 		       tree fun, const char *name)
+ {
+   tree args = make_tree_vec (1);
+   TREE_VEC_ELT (args, 0) = type;
+   return finish_library_type_trait (loc, ctx, name, args, call,
+ 				    non_constant_p, jump_target, fun);
+ }
+ 
+ /* Process std::meta::type_order.  */
+ 
+ static tree
+ eval_type_order (tree type1, tree type2)
+ {
+   return type_order_value (strip_typedefs (type1), strip_typedefs (type2));
+ }
+ 
+ /* Process std::meta::enumerators_of.
+    Returns: A vector containing the reflections of each enumerator of the
+    enumeration represented by dealias(type_enum), in the order in which they
+    are declared.
+    Throws: meta::exception unless dealias(type_enum) represents an enumeration
+    type, and is_enumerable_type(type_enum) is true.  */
+ 
+ static tree
+ eval_enumerators_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		     bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   if (TREE_CODE (r) != ENUMERAL_TYPE
+       || eval_is_enumerable_type (r) == boolean_false_node)
+     return throw_exception (loc, ctx, "reflection does not represent an "
+ 				      "enumerable enumeration type", fun,
+ 			    non_constant_p, jump_target);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   for (tree t = TYPE_VALUES (r); t; t = TREE_CHAIN (t))
+     {
+       tree e = TREE_VALUE (t);
+       CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE, get_reflection_raw (loc, e));
+     }
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Process std::meta::remove_const.
+    Returns: a reflection representing the type denoted by
+    std::remove_const_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_remove_const (location_t loc, tree type)
+ {
+   return get_reflection_raw (loc, remove_const (strip_typedefs (type)));
+ }
+ 
+ /* Process std::meta::remove_volatile.
+    Returns: a reflection representing the type denoted by
+    std::remove_volatile_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_remove_volatile (location_t loc, tree type)
+ {
+   type = strip_typedefs (type);
+   int quals = cp_type_quals (type);
+   quals &= ~TYPE_QUAL_VOLATILE;
+   type = cp_build_qualified_type (type, quals);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::remove_cv.
+    Returns: a reflection representing the type denoted by
+    std::remove_cv_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_remove_cv (location_t loc, tree type)
+ {
+   type = strip_typedefs (type);
+   type = finish_trait_type (CPTK_REMOVE_CV, type, NULL_TREE, tf_none);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::add_const.
+    Returns: a reflection representing the type denoted by
+    std::add_const_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_add_const (location_t loc, tree type)
+ {
+   type = strip_typedefs (type);
+   if (!TYPE_REF_P (type) && !FUNC_OR_METHOD_TYPE_P (type))
+     {
+       int quals = cp_type_quals (type);
+       quals |= TYPE_QUAL_CONST;
+       type = cp_build_qualified_type (type, quals);
+     }
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::add_volatile.
+    Returns: a reflection representing the type denoted by
+    std::add_volatile_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_add_volatile (location_t loc, tree type)
+ {
+   type = strip_typedefs (type);
+   if (!TYPE_REF_P (type) && !FUNC_OR_METHOD_TYPE_P (type))
+     {
+       int quals = cp_type_quals (type);
+       quals |= TYPE_QUAL_VOLATILE;
+       type = cp_build_qualified_type (type, quals);
+     }
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::add_cv.
+    Returns: a reflection representing the type denoted by
+    std::add_cv_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_add_cv (location_t loc, tree type)
+ {
+   type = strip_typedefs (type);
+   if (!TYPE_REF_P (type) && !FUNC_OR_METHOD_TYPE_P (type))
+     {
+       int quals = cp_type_quals (type);
+       quals |= (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
+       type = cp_build_qualified_type (type, quals);
+     }
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::remove_reference.
+    Returns: a reflection representing the type denoted by
+    std::remove_reference_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_remove_reference (location_t loc, tree type)
+ {
+   if (TYPE_REF_P (type))
+     type = TREE_TYPE (type);
+   type = strip_typedefs (type);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::add_lvalue_reference.
+    Returns: a reflection representing the type denoted by
+    std::add_lvalue_reference_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_add_lvalue_reference (location_t loc, tree type)
+ {
+   type = strip_typedefs (type);
+   type = finish_trait_type (CPTK_ADD_LVALUE_REFERENCE, type, NULL_TREE, tf_none);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::add_rvalue_reference.
+    Returns: a reflection representing the type denoted by
+    std::add_rvalue_reference_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_add_rvalue_reference (location_t loc, tree type)
+ {
+   type = strip_typedefs (type);
+   type = finish_trait_type (CPTK_ADD_RVALUE_REFERENCE, type, NULL_TREE, tf_none);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::make_signed and std::meta::make_unsigned.
+    Returns: a reflection representing the type denoted by
+    std::make_signed_t<T> or std::make_unsigned_t<T>, respectively, where T is
+    the type or type alias represented by type.  */
+ 
+ static tree
+ eval_make_signed (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		  bool unsignedp, bool *non_constant_p, tree *jump_target,
+ 		  tree fun)
+ {
+   if (!INTEGRAL_TYPE_P (type) || TREE_CODE (type) == BOOLEAN_TYPE)
+     return throw_exception (loc, ctx, "reflection represents non-integral "
+ 				      "or bool type", fun, non_constant_p,
+ 				      jump_target);
+   tree ret = type;
+   if (TREE_CODE (type) == ENUMERAL_TYPE
+       || TYPE_MAIN_VARIANT (type) == wchar_type_node
+       || TYPE_MAIN_VARIANT (type) == char8_type_node
+       || TYPE_MAIN_VARIANT (type) == char16_type_node
+       || TYPE_MAIN_VARIANT (type) == char32_type_node)
+     {
+       tree unit = TYPE_SIZE_UNIT (type);
+       tree types[] = {
+ 	signed_char_type_node,
+ 	short_integer_type_node,
+ 	integer_type_node,
+ 	long_integer_type_node,
+ 	long_long_integer_type_node };
+       ret = NULL_TREE;
+       for (unsigned i = 0; i < ARRAY_SIZE (types); ++i)
+ 	if (tree_int_cst_equal (TYPE_SIZE_UNIT (types[i]), unit))
+ 	  {
+ 	    ret = c_common_signed_or_unsigned_type (unsignedp, types[i]);
+ 	    break;
+ 	  }
+       if (!ret)
+ 	ret = c_common_type_for_size (TYPE_PRECISION (type), unsignedp);
+     }
+   else if (TYPE_MAIN_VARIANT (type) == char_type_node)
+     ret = unsignedp ? unsigned_char_type_node : signed_char_type_node;
+   else if (unsignedp ^ (!!TYPE_UNSIGNED (type)))
+     ret = c_common_signed_or_unsigned_type (unsignedp, type);
+   if (ret != type)
+     {
+       int quals = cp_type_quals (type);
+       quals &= (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
+       ret = cp_build_qualified_type (ret, quals);
+     }
+   else
+     ret = strip_typedefs (type);
+   return get_reflection_raw (loc, ret);
+ }
+ 
+ /* Process std::meta::remove_extent.
+    Returns: a reflection representing the type denoted by
+    std::remove_extent_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_remove_extent (location_t loc, tree type)
+ {
+   if (TREE_CODE (type) == ARRAY_TYPE)
+     type = TREE_TYPE (type);
+   type = strip_typedefs (type);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::remove_all_extents.
+    Returns: a reflection representing the type denoted by
+    std::remove_all_extents_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_remove_all_extents (location_t loc, tree type)
+ {
+   type = strip_array_types (type);
+   type = strip_typedefs (type);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::remove_pointer.
+    Returns: a reflection representing the type denoted by
+    std::remove_pointer_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_remove_pointer (location_t loc, tree type)
+ {
+   if (TYPE_PTR_P (type))
+     type = TREE_TYPE (type);
+   type = strip_typedefs (type);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::add_pointer.
+    Returns: a reflection representing the type denoted by
+    std::add_pointer_t<T>, where T is the type or type alias
+    represented by type.  */
+ 
+ static tree
+ eval_add_pointer (location_t loc, tree type)
+ {
+   type = strip_typedefs (type);
+   type = finish_trait_type (CPTK_ADD_POINTER, type, NULL_TREE, tf_none);
+   return get_reflection_raw (loc, type);
+ }
+ 
+ /* Process std::meta::is_lvalue_reference_qualified and
+    std::meta::is_rvalue_reference_qualified.
+    Let T be type_of(r) if has-type(r) is true.  Otherwise, let T be
+    dealias(r).
+    Returns: true if T represents an lvalue- or rvalue-qualified
+    function type, respectively.  Otherwise, false.
+    RVALUE_P is true if we're processing is_rvalue_*, false if we're
+    processing is_lvalue_*.  */
+ 
+ static tree
+ eval_is_lrvalue_reference_qualified (tree r, reflect_kind kind,
+ 				     bool rvalue_p)
+ {
+   if (has_type (r, kind))
+     r = type_of (r, kind);
+   else
+     r = maybe_strip_typedefs (r);
+   if (FUNC_OR_METHOD_TYPE_P (r)
+       && FUNCTION_REF_QUALIFIED (r)
+       && rvalue_p == FUNCTION_RVALUE_QUALIFIED (r))
+     return boolean_true_node;
+ 
+   return boolean_false_node;
+ }
+ 
+ /* Process std::meta::can_substitute.
+    Let Z be the template represented by templ and let Args... be a sequence of
+    prvalue constant expressions that compute the reflections held by the
+    elements of arguments, in order.
+    Returns: true if Z<[:Args:]...> is a valid template-id that does not name
+    a function whose type contains an undeduced placeholder type.
+    Otherwise, false.
+    Throws: meta::exception unless templ represents a template, and every
+    reflection in arguments represents a construct usable as a template
+    argument.  */
+ 
+ static tree
+ eval_can_substitute (location_t loc, const constexpr_ctx *ctx,
+ 		     tree r, tree rvec, bool *non_constant_p, tree *jump_target,
+ 		     tree fun)
+ {
+   if (eval_is_template (r) != boolean_true_node)
+     return throw_exception (loc, ctx,
+ 			    "reflection does not represent a template",
+ 			    fun, non_constant_p, jump_target);
+   for (int i = 0; i < TREE_VEC_LENGTH (rvec); ++i)
+     {
+       tree ra = TREE_VEC_ELT (rvec, i);
+       tree a = REFLECT_EXPR_HANDLE (ra);
+       reflect_kind kind = REFLECT_EXPR_KIND (ra);
+       // TODO: It is unclear on what kinds of reflections we should throw
+       // and what kinds of exceptions should merely result in can_substitute
+       // returning false.
+       if (a == unknown_type_node
+ 	  || kind == REFLECT_PARM
+ 	  || eval_is_namespace (a) == boolean_true_node
+ 	  || eval_is_constructor (a) == boolean_true_node
+ 	  || eval_is_destructor (a) == boolean_true_node
+ 	  || eval_is_annotation (a, kind) == boolean_true_node
+ 	  || (TREE_CODE (a) == FIELD_DECL && !DECL_UNNAMED_BIT_FIELD (a))
+ 	  || kind == REFLECT_DATA_MEMBER_SPEC
+ 	  || kind == REFLECT_BASE
+ 	  || (!TYPE_P (a)
+ 	      && eval_is_template (a) == boolean_false_node
+ 	      && !has_type (a, kind)))
+ 	return throw_exception (loc, ctx,
+ 				"invalid argument to can_substitute",
+ 				fun, non_constant_p, jump_target);
+       a = resolve_nondeduced_context (a, tf_warning_or_error);
+       TREE_VEC_ELT (rvec, i) = a;
+     }
+   if (DECL_TYPE_TEMPLATE_P (r) || DECL_TEMPLATE_TEMPLATE_PARM_P (r))
+     {
+       tree type = lookup_template_class (r, rvec, NULL_TREE, NULL_TREE,
+ 					 tf_none);
+       if (type == error_mark_node)
+ 	return boolean_false_node;
+       else
+ 	return boolean_true_node;
+     }
+   else if (concept_definition_p (r))
+     {
+       tree c = build_concept_check (r, rvec, tf_none);
+       if (c == error_mark_node)
+ 	return boolean_false_node;
+       else
+ 	return boolean_true_node;
+     }
+   else if (variable_template_p (r))
+     {
+       tree var = lookup_template_variable (r, rvec, tf_none);
+       if (var == error_mark_node)
+ 	return boolean_false_node;
+       var = finish_template_variable (var, tf_none);
+       if (var == error_mark_node)
+ 	return boolean_false_node;
+       else
+ 	return boolean_true_node;
+     }
+   else
+     {
+       tree fn = lookup_template_function (r, rvec);
+       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;
+     }
+ }
+ 
+ /* Process std::meta::substitute.
+    Let Z be the template represented by templ and let Args... be a sequence of
+    prvalue constant expressions that compute the reflections held by the
+    elements of arguments, in order.
+    Returns: ^^Z<[:Args:]...>.
+    Throws: meta::exception unless can_substitute(templ, arguments) is true.  */
+ 
+ static tree
+ eval_substitute (location_t loc, const constexpr_ctx *ctx,
+ 		 tree r, tree rvec, bool *non_constant_p, tree *jump_target,
+ 		 tree fun)
+ {
+   tree cs = eval_can_substitute (loc, ctx, r, rvec, non_constant_p, jump_target,
+ 				 fun);
+   if (*jump_target)
+     return cs;
+   if (cs == boolean_false_node)
+     return throw_exception (loc, ctx, "can_substitute returned false",
+ 			    fun, non_constant_p, jump_target);
+   tree ret = NULL_TREE;
+   if (DECL_TYPE_TEMPLATE_P (r) || DECL_TEMPLATE_TEMPLATE_PARM_P (r))
+     ret = lookup_template_class (r, rvec, NULL_TREE, NULL_TREE, tf_none);
+   else if (concept_definition_p (r))
+     {
+       ret = build_concept_check (r, rvec, tf_none);
+       ret = evaluate_concept_check (ret);
+       return get_reflection_raw (loc, ret, REFLECT_VALUE);
+     }
+   else if (variable_template_p (r))
+     {
+       ret = lookup_template_variable (r, rvec, tf_none);
+       ret = finish_template_variable (ret, tf_none);
+     }
+   else
+     ret = lookup_template_function (r, rvec);
+   return get_reflection_raw (loc, ret);
+ }
+ 
+ /* Process std::meta::tuple_size.
+    Returns: tuple_size_v<T>, where T is the type represented by
+    dealias(type).  */
+ 
+ static tree
+ eval_tuple_size (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		 tree call, bool *non_constant_p, tree *jump_target,
+ 		 tree fun)
+ {
+   /* Create std::tuple_size<TYPE>::value.  */
+   tree args = make_tree_vec (1);
+   TREE_VEC_ELT (args, 0) = type;
+   return finish_library_value_trait (loc, ctx, "tuple_size", args, call,
+ 				     non_constant_p, jump_target, fun);
+ }
+ 
+ /* Process std::meta::tuple_element.
+    Returns: A reflection representing the type denoted by
+    tuple_element_t<I, T>, where T is the type represented by dealias(type)
+    and I is a constant equal to index.  */
+ 
+ static tree
+ eval_tuple_element (location_t loc, const constexpr_ctx *ctx, tree i,
+ 		    tree type, tree call, bool *non_constant_p,
+ 		    tree *jump_target, tree fun)
+ {
+   /* Create std::tuple_element<I,TYPE>::type.  */
+   tree args = make_tree_vec (2);
+   TREE_VEC_ELT (args, 0) = i;
+   TREE_VEC_ELT (args, 1) = type;
+   return finish_library_type_trait (loc, ctx, "tuple_element",
+ 				    args, call, non_constant_p, jump_target,
+ 				    fun);
+ }
+ 
+ /* Process std::meta::variant_size.
+    Returns: variant_size_v<T>, where T is the type represented by
+    dealias(type).  */
+ 
+ static tree
+ eval_variant_size (location_t loc, const constexpr_ctx *ctx, tree type,
+ 		   tree call, bool *non_constant_p, tree *jump_target,
+ 		   tree fun)
+ {
+   /* Create std::variant_size<TYPE>::value.  */
+   tree args = make_tree_vec (1);
+   TREE_VEC_ELT (args, 0) = type;
+   return finish_library_value_trait (loc, ctx, "variant_size", args, call,
+ 				     non_constant_p, jump_target, fun);
+ }
+ 
+ /* Process std::meta::variant_alternative.
+    Returns: A reflection representing the type denoted by
+    variant_alternative_t<I, T>, where T is the type represented by
+    dealias(type) and I is a constant equal to index.  */
+ 
+ static tree
+ eval_variant_alternative (location_t loc, const constexpr_ctx *ctx, tree i,
+ 			  tree type, tree call, bool *non_constant_p,
+ 			  tree *jump_target, tree fun)
+ {
+   /* Create std::variant_alternative<I,TYPE>::type.  */
+   tree args = make_tree_vec (2);
+   TREE_VEC_ELT (args, 0) = i;
+   TREE_VEC_ELT (args, 1) = type;
+   return finish_library_type_trait (loc, ctx, "variant_alternative",
+ 				    args, call, non_constant_p, jump_target,
+ 				    fun);
+ }
+ 
+ /* Process std::meta::data_member_spec.
+    Returns: A reflection of a data member description (T,N,A,W,NUA) where
+    -- T is the type represented by dealias(type),
+    -- N is either the identifier encoded by options.name or _|_ if
+       options.name does not contain a value,
+    -- A is either the alignment value held by options.alignment or _|_ if
+       options.alignment does not contain a value,
+    -- W is either the value held by options.bit_width or _|_ if
+       options.bit_width does not contain a value, and
+    -- NUA is the value held by options.no_unique_address.
+    Throws: meta::exception unless the following conditions are met:
+    -- dealias(type) represents either an object type or a reference type;
+    -- if options.name contains a value, then:
+       -- holds_alternative<u8string>(options.name->contents) is true and
+ 	 get<u8string>(options.name->contents) contains a valid identifier
+ 	 that is not a keyword when interpreted with UTF-8, or
+       -- holds_alternative<string>(options.name->contents) is true and
+ 	 get<string>(options.name->contents) contains a valid identifier
+ 	 that is not a keyword when interpreted with the ordinary literal
+ 	 encoding;
+    -- if options.name does not contain a value, then options.bit_width
+       contains a value;
+    -- if options.bit_width contains a value V, then
+       -- is_integral_type(type) || is_enum_type(type) is true,
+       -- options.alignment does not contain a value,
+       -- options.no_unique_address is false,
+       -- V is not negative, and
+       -- if V equals 0, then options.name does not contain a value; and
+    -- if options.alignment contains a value, it is an alignment value not less
+       than alignment_of(type).  */
+ 
+ static tree
+ eval_data_member_spec (location_t loc, const constexpr_ctx *ctx,
+ 		       tree type, tree opts, bool *non_constant_p,
+ 		       bool *overflow_p, tree *jump_target, tree fun)
+ {
+   type = strip_typedefs (type);
+   if (!TYPE_OBJ_P (type) && !TYPE_REF_P (type))
+     return throw_exception (loc, ctx, "type is not object or reference type",
+ 			    fun, non_constant_p, jump_target);
+   opts = convert_from_reference (opts);
+   if (!CLASS_TYPE_P (TREE_TYPE (opts)))
+     {
+     fail:
+       error_at (loc, "unexpected %<data_member_options%> argument");
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   tree args[5] = { type, NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE };
+   for (tree field = next_aggregate_field (TYPE_FIELDS (TREE_TYPE (opts)));
+        field; field = next_aggregate_field (DECL_CHAIN (field)))
+     if (tree name = DECL_NAME (field))
+       {
+ 	if (id_equal (name, "name"))
+ 	  args[1] = field;
+ 	else if (id_equal (name, "alignment"))
+ 	  args[2] = field;
+ 	else if (id_equal (name, "bit_width"))
+ 	  args[3] = field;
+ 	else if (id_equal (name, "no_unique_address"))
+ 	  args[4] = field;
+       }
+   for (int i = 1; i < 5; ++i)
+     {
+       if (args[i] == NULL_TREE)
+ 	goto fail;
+       tree opt = build3 (COMPONENT_REF, TREE_TYPE (args[i]), opts, args[i],
+ 			 NULL_TREE);
+       if (i == 4)
+ 	{
+ 	  /* The no_unique_address handling is simple.  */
+ 	  if (TREE_CODE (TREE_TYPE (opt)) != BOOLEAN_TYPE)
+ 	    goto fail;
+ 	  opt = cxx_eval_constant_expression (ctx, opt, vc_prvalue,
+ 					      non_constant_p, overflow_p,
+ 					      jump_target);
+ 	  if (*jump_target || *non_constant_p)
+ 	    return NULL_TREE;
+ 	  if (TREE_CODE (opt) != INTEGER_CST)
+ 	    goto fail;
+ 	  if (integer_zerop (opt))
+ 	    args[i] = boolean_false_node;
+ 	  else
+ 	    args[i] = boolean_true_node;
+ 	  continue;
+ 	}
+       /* Otherwise the member is optional<something>.  */
+       if (!CLASS_TYPE_P (TREE_TYPE (opt)))
+ 	goto fail;
+       tree has_value = build_static_cast (loc, boolean_type_node, opt,
+ 					  tf_warning_or_error);
+       if (error_operand_p (has_value))
+ 	goto fail;
+       has_value = cxx_eval_constant_expression (ctx, has_value, vc_prvalue,
+ 						non_constant_p, overflow_p,
+ 						jump_target);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+       if (TREE_CODE (has_value) != INTEGER_CST)
+ 	goto fail;
+       if (integer_zerop (has_value))
+ 	{
+ 	  /* If it doesn't have value, store NULL_TREE.  */
+ 	  args[i] = NULL_TREE;
+ 	  continue;
+ 	}
+       tree deref = build_new_op (loc, INDIRECT_REF, LOOKUP_NORMAL, opt,
+ 				 NULL_TREE, tf_warning_or_error);
+       if (error_operand_p (deref))
+ 	goto fail;
+       if (i != 1)
+ 	{
+ 	  /* For alignment and bit_width otherwise it should be int.  */
+ 	  if (TYPE_MAIN_VARIANT (TREE_TYPE (deref)) != integer_type_node)
+ 	    goto fail;
+ 	  deref = cxx_eval_constant_expression (ctx, deref, vc_prvalue,
+ 						non_constant_p, overflow_p,
+ 						jump_target);
+ 	  if (*jump_target || *non_constant_p)
+ 	    return NULL_TREE;
+ 	  if (TREE_CODE (deref) != INTEGER_CST)
+ 	    goto fail;
+ 	  args[i] = deref;
+ 	  continue;
+ 	}
+       /* Otherwise it is a name.  */
+       if (!CLASS_TYPE_P (TREE_TYPE (deref)))
+ 	goto fail;
+       tree fields[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
+       for (tree field = next_aggregate_field (TYPE_FIELDS (TREE_TYPE (deref)));
+ 	   field; field = next_aggregate_field (DECL_CHAIN (field)))
+ 	if (tree name = DECL_NAME (field))
+ 	  {
+ 	    if (id_equal (name, "_M_is_u8"))
+ 	      fields[0] = field;
+ 	    else if (id_equal (name, "_M_u8s"))
+ 	      fields[1] = field;
+ 	    else if (id_equal (name, "_M_s"))
+ 	      fields[2] = field;
+ 	  }
+       for (int j = 0; j < 3; ++j)
+ 	{
+ 	  if (fields[j] == NULL_TREE)
+ 	    goto fail;
+ 	  if (j && j == (fields[0] == boolean_true_node ? 2 : 1))
+ 	    continue;
+ 	  tree f = build3 (COMPONENT_REF, TREE_TYPE (fields[j]), deref,
+ 			   fields[j], NULL_TREE);
+ 	  if (j == 0)
+ 	    {
+ 	      /* The _M_is_u8 handling is simple.  */
+ 	      if (TREE_CODE (TREE_TYPE (f)) != BOOLEAN_TYPE)
+ 		goto fail;
+ 	      f = cxx_eval_constant_expression (ctx, f, vc_prvalue,
+ 						non_constant_p, overflow_p,
+ 						jump_target);
+ 	      if (*jump_target || *non_constant_p)
+ 		return NULL_TREE;
+ 	      if (TREE_CODE (f) != INTEGER_CST)
+ 		goto fail;
+ 	      if (integer_zerop (f))
+ 		fields[0] = boolean_false_node;
+ 	      else
+ 		fields[0] = boolean_true_node;
+ 	      continue;
+ 	    }
+ 	  /* _M_u8s/_M_s handling is the same except for encoding.  */
+ 	  if (!CLASS_TYPE_P (TREE_TYPE (f)))
+ 	    goto fail;
+ 	  tree fns = lookup_qualified_name (TREE_TYPE (f),
+ 					    get_identifier ("c_str"));
+ 	  if (error_operand_p (fns))
+ 	    goto fail;
+ 	  f = build_new_method_call (f, fns, NULL, NULL_TREE, LOOKUP_NORMAL,
+ 				     NULL, tf_warning_or_error);
+ 	  if (error_operand_p (f))
+ 	    goto fail;
+ 	  f = cxx_eval_constant_expression (ctx, f, vc_prvalue,
+ 					    non_constant_p, overflow_p,
+ 					    jump_target);
+ 	  if (*jump_target || *non_constant_p)
+ 	    return NULL_TREE;
+ 	  STRIP_NOPS (f);
+ 	  if (TREE_CODE (f) != ADDR_EXPR)
+ 	    goto fail;
+ 	  f = TREE_OPERAND (f, 0);
+ 	  f = cxx_eval_constant_expression (ctx, f, vc_prvalue,
+ 					    non_constant_p, overflow_p,
+ 					    jump_target);
+ 	  if (*jump_target || *non_constant_p)
+ 	    return NULL_TREE;
+ 	  if (TREE_CODE (f) != CONSTRUCTOR
+ 	      || TREE_CODE (TREE_TYPE (f)) != ARRAY_TYPE)
+ 	    goto fail;
+ 	  tree eltt = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (f)));
+ 	  if (eltt != (j == 1 ? char8_type_node : char_type_node))
+ 	    goto fail;
+ 	  tree field, value;
+ 	  unsigned k;
+ 	  unsigned HOST_WIDE_INT l = 0;
+ 	  bool ntmbs = false;
+ 	  FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (f), k, field, value)
+ 	    if (!tree_fits_shwi_p (value))
+ 	      goto fail;
+ 	    else if (field == NULL_TREE)
+ 	      {
+ 		if (integer_zerop (value))
+ 		  {
+ 		    ntmbs = true;
+ 		    break;
+ 		  }
+ 		++l;
+ 	      }
+ 	    else if (TREE_CODE (field) == RANGE_EXPR)
+ 	      {
+ 		tree lo = TREE_OPERAND (field, 0);
+ 		tree hi = TREE_OPERAND (field, 1);
+ 		if (!tree_fits_uhwi_p (lo) || !tree_fits_uhwi_p (hi))
+ 		  goto fail;
+ 		if (integer_zerop (value))
+ 		  {
+ 		    l = tree_to_uhwi (lo);
+ 		    ntmbs = true;
+ 		    break;
+ 		  }
+ 		l = tree_to_uhwi (hi) + 1;
+ 	      }
+ 	    else if (tree_fits_uhwi_p (field))
+ 	      {
+ 		l = tree_to_uhwi (field);
+ 		if (integer_zerop (value))
+ 		  {
+ 		    ntmbs = true;
+ 		    break;
+ 		  }
+ 		++l;
+ 	      }
+ 	    else
+ 	      goto fail;
+ 	  if (!ntmbs || l > INT_MAX - 1)
+ 	    goto fail;
+ 	  char *namep;
+ 	  unsigned len = l;
+ 	  if (l < 64)
+ 	    namep = XALLOCAVEC (char, l + 1);
+ 	  else
+ 	    namep = XNEWVEC (char, l + 1);
+ 	  memset (namep, 0, l + 1);
+ 	  l = 0;
+ 	  FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (f), k, field, value)
+ 	    if (field == NULL_TREE)
+ 	      {
+ 		if (integer_zerop (value))
+ 		  break;
+ 		namep[l] = tree_to_shwi (value);
+ 		++l;
+ 	      }
+ 	    else if (TREE_CODE (field) == RANGE_EXPR)
+ 	      {
+ 		tree lo = TREE_OPERAND (field, 0);
+ 		tree hi = TREE_OPERAND (field, 1);
+ 		if (integer_zerop (value))
+ 		  break;
+ 		unsigned HOST_WIDE_INT m = tree_to_uhwi (hi);
+ 		for (l = tree_to_uhwi (lo); l <= m; ++l)
+ 		  namep[l] = tree_to_shwi (value);
+ 	      }
+ 	    else
+ 	      {
+ 		l = tree_to_uhwi (field);
+ 		namep[l++] = tree_to_shwi (value);
+ 	      }
+ 	  namep[len] = '\0';
+ 	  /* Convert namep from execution charset to SOURCE_CHARSET.  */
+ 	  cpp_string istr, ostr;
+ 	  istr.len = strlen (namep) + 1;
+ 	  istr.text = (const unsigned char *) namep;
+ 	  if (!cpp_translate_string (parse_in, &istr, &ostr,
+ 				     j == 2 ? CPP_STRING : CPP_UTF8STRING,
+ 				     true))
+ 	    {
+ 	      if (len >= 64)
+ 		XDELETEVEC (namep);
+ 	      if (j == 1)
+ 		return throw_exception (loc, ctx,
+ 					"conversion from ordinary literal "
+ 					"encoding to source charset "
+ 					"failed", fun, non_constant_p,
+ 					jump_target);
+ 	      else
+ 		return throw_exception (loc, ctx,
+ 					"conversion from UTF-8 encoding to "
+ 					"source charset failed",
+ 					fun, non_constant_p, jump_target);
+ 	    }
+ 	  if (len >= 64)
+ 	    XDELETEVEC (namep);
+ 	  if (!cpp_valid_identifier (parse_in, ostr.text))
+ 	    return throw_exception (loc, ctx,
+ 				    "name is not a valid identifier",
+ 				    fun, non_constant_p, jump_target);
+ 	  args[i] = get_identifier ((const char *) ostr.text);
+ 	  switch (get_identifier_kind (args[i]))
+ 	    {
+ 	    case cik_keyword:
+ 	      return throw_exception (loc, ctx, "name is a keyword",
+ 				      fun, non_constant_p, jump_target);
+ 	    case cik_trait:
+ 	      return throw_exception (loc, ctx, "name is a built-in trait",
+ 				      fun, non_constant_p, jump_target);
+ 	    default:
+ 	      break;
+ 	    }
+ 	}
+     }
+   if (args[1] == NULL_TREE && args[3] == NULL_TREE)
+     return throw_exception (loc, ctx,
+ 			    "neither name nor bit_width specified",
+ 			    fun, non_constant_p, jump_target);
+   if (args[3])
+     {
+       if (!CP_INTEGRAL_TYPE_P (type) && TREE_CODE (type) != ENUMERAL_TYPE)
+ 	return throw_exception (loc, ctx,
+ 				"bit_width specified with non-integral "
+ 				"and non-enumeration type",
+ 				fun, non_constant_p, jump_target);
+       if (args[2])
+ 	return throw_exception (loc, ctx,
+ 				"both alignment and bit_width specified",
+ 				fun, non_constant_p, jump_target);
+       if (args[4] == boolean_true_node)
+ 	return throw_exception (loc, ctx,
+ 				"bit_width specified with "
+ 				"no_unique_address true",
+ 				fun, non_constant_p, jump_target);
+       if (integer_zerop (args[3]) && args[1])
+ 	return throw_exception (loc, ctx,
+ 				"bit_width 0 with specified name",
+ 				fun, non_constant_p, jump_target);
+       if (tree_int_cst_sgn (args[3]) < 0)
+ 	return throw_exception (loc, ctx, "bit_width is negative",
+ 				fun, non_constant_p, jump_target);
+     }
+   if (args[2])
+     {
+       if (!integer_pow2p (args[2]))
+ 	return throw_exception (loc, ctx,
+ 				"alignment is not power of two",
+ 				fun, non_constant_p, jump_target);
+       if (tree_int_cst_sgn (args[2]) < 0)
+ 	return throw_exception (loc, ctx, "alignment is negative",
+ 				fun, non_constant_p, jump_target);
+       tree al = cxx_sizeof_or_alignof_type (loc, type, ALIGNOF_EXPR, true,
+ 					    tf_none);
+       if (TREE_CODE (al) == INTEGER_CST
+ 	  && wi::to_widest (al) > wi::to_widest (args[2]))
+ 	return throw_exception (loc, ctx,
+ 				"alignment is smaller than alignment_of",
+ 				fun, non_constant_p, jump_target);
+     }
+   tree ret = make_tree_vec (5);
+   for (int i = 0; i < 5; ++i)
+     TREE_VEC_ELT (ret, i) = args[i];
+   return get_reflection_raw (loc, ret, REFLECT_DATA_MEMBER_SPEC);
+ }
+ 
+ /* Process std::meta::define_aggregate.
+    Let C be the type represented by class_type and r_K be the Kth reflection
+    value in mdescrs.
+    For every r_K in mdescrs, let (T_K,N_K,A_K,W_K,NUA_K) be the corresponding
+    data member description represented by r_K.
+    Constant When:
+    -- class_type represents a cv-unqualified class type;
+    -- C is incomplete from every point in the evaluation context;
+    -- is_data_member_spec(r_K) is true for every r_K;
+    -- is_complete_type(T_K) is true for every r_K; and
+    -- for every pair (r_K,r_L) where K<L, if N_K is not _|_ and N_L is not
+       _|_, then either:
+       -- N_K is not the same identifier as N_L or
+       -- N_K is the identifier _ (U+005F LOW LINE).
+    Effects: Produces an injected declaration D that defines C and has
+    properties as follows:
+    -- The target scope of D is the scope to which C belongs.
+    -- The locus of D follows immediately after the core constant expression
+       currently under evaluation.
+    -- The characteristic sequence of D is the sequence of reflection values
+       r_K.
+    -- If C is a specialization of a templated class T, and C is not a local
+       class, then D is an explicit specialization of T.
+    -- For each r_K, there is a corresponding entity M_K with public access
+       belonging to the class scope of D with the following properties:
+       -- If N_K is _|_, M_K is an unnamed bit-field.
+ 	 Otherwise, M_K is a non-static data member whose name is the
+ 	 identifier N_K.
+       -- The type of M_K is T_K.
+       -- M_K is declared with the attribute [[no_unique_address]] if and only
+ 	 if NUA_K is true.
+       -- If W_K is not _|_, M_K is a bit-field whose width is that value.
+ 	 Otherwise, M_K is not a bit-field.
+       -- If A_K is not _|_, M_K has the alignment-specifier alignas(A_K).
+ 	 Otherwise, M_K has no alignment-specifier.
+    -- For every r_L in mdescrs such that K<L, the declaration corresponding to
+       r_K precedes the declaration corresponding to r_L.
+    Returns: class_type.
+    Remarks: If C is a specialization of a templated class and it has not been
+    instantiated, C is treated as an explicit specialization.  */
+ 
+ static tree
+ eval_define_aggregate (location_t loc, const constexpr_ctx *ctx,
+ 		       tree type, tree rvec, tree call, bool *non_constant_p)
+ {
+   tree orig_type = type;
+   if (!CLASS_TYPE_P (type))
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "first %<define_aggregate%> argument is not a class "
+ 		       "type reflection");
+       *non_constant_p = true;
+       return call;
+     }
+   if (typedef_variant_p (type))
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "first %<define_aggregate%> argument is a reflection "
+ 		       "of a type alias");
+       *non_constant_p = true;
+       return call;
+     }
+   if (cv_qualified_p (type))
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "first %<define_aggregate%> argument is a "
+ 		       "cv-qualified class type reflection");
+       *non_constant_p = true;
+       return call;
+     }
+   if (COMPLETE_TYPE_P (type))
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "first %<define_aggregate%> argument is a complete "
+ 		       "class type reflection");
+       *non_constant_p = true;
+       return call;
+     }
+   hash_set<tree> nameset;
+   for (int i = 0; i < TREE_VEC_LENGTH (rvec); ++i)
+     {
+       tree ra = TREE_VEC_ELT (rvec, i);
+       tree a = REFLECT_EXPR_HANDLE (ra);
+       if (REFLECT_EXPR_KIND (ra) != REFLECT_DATA_MEMBER_SPEC)
+ 	{
+ 	  if (!cxx_constexpr_quiet_p (ctx))
+ 	    error_at (loc, "%<define_aggregate%> argument not a data member "
+ 			   "description");
+ 	  *non_constant_p = true;
+ 	  return call;
+ 	}
+       if (eval_is_complete_type (TREE_VEC_ELT (a, 0)) != boolean_true_node)
+ 	{
+ 	  if (!cxx_constexpr_quiet_p (ctx))
+ 	    error_at (loc, "%<define_aggregate%> argument data member "
+ 			   "description without complete type");
+ 	  *non_constant_p = true;
+ 	  return call;
+ 	}
+       if (TREE_VEC_ELT (a, 1)
+ 	  && !id_equal (TREE_VEC_ELT (a, 1), "_")
+ 	  && nameset.add (TREE_VEC_ELT (a, 1)))
+ 	{
+ 	  if (!cxx_constexpr_quiet_p (ctx))
+ 	    error_at (loc, "name %qD used in multiple data member "
+ 			   "descriptions", TREE_VEC_ELT (a, 1));
+ 	  *non_constant_p = true;
+ 	  return call;
+ 	}
+       if (TYPE_WARN_IF_NOT_ALIGN (type)
+ 	  && TREE_VEC_ELT (a, 3))
+ 	{
+ 	  if (!cxx_constexpr_quiet_p (ctx))
+ 	    error_at (loc, "cannot declare bit-field in "
+ 			   "%<warn_if_not_aligned%> type");
+ 	  *non_constant_p = true;
+ 	  return call;
+ 	}
+     }
+   tree consteval_block = cxx_constexpr_consteval_block (ctx);
+   if (consteval_block == NULL_TREE)
+     {
+       if (!cxx_constexpr_quiet_p (ctx))
+ 	error_at (loc, "%<define_aggregate%> not evaluated from "
+ 		       "%<consteval%> block");
+       *non_constant_p = true;
+       return call;
+     }
+   iloc_sentinel ils = loc;
+   type = TYPE_MAIN_VARIANT (type);
+   type = strip_typedefs (type);
+   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)
+ 	{
+ 	  auto_diagnostic_group d;
+ 	  error_at (loc, "%<define_aggregate%> evaluated from "
+ 			 "%<consteval%> block which encloses %qT being "
+ 			 "defined", type);
+ 	  inform (DECL_SOURCE_LOCATION (consteval_block),
+ 		  "%<consteval%> block defined here");
+ 	  return get_reflection_raw (loc, orig_type);
+ 	}
+       if (tscope == NULL_TREE
+ 	  && (TYPE_P (c) || TREE_CODE (c) == FUNCTION_DECL))
+ 	tscope = c;
+     }
+   if (cscope != tscope)
+     {
+       auto_diagnostic_group d;
+       if (cscope && tscope)
+ 	{
+ 	  for (tree c = tscope; c; c = get_containing_scope (c))
+ 	    if (c == cscope)
+ 	      {
+ 		if (DECL_P (tscope))
+ 		  error_at (loc, "%qD intervenes between %qT scope and "
+ 				 "%<consteval%> block %<define_aggregate%> "
+ 				 "is evaluated from", tscope, type);
+ 		else
+ 		  error_at (loc, "%qT intervenes between %qT scope and "
+ 				 "%<consteval%> block %<define_aggregate%> "
+ 				 "is evaluated from", tscope, type);
+ 		cscope = NULL_TREE;
+ 		tscope = NULL_TREE;
+ 		break;
+ 	      }
+ 	  for (tree c = cscope; c; c = get_containing_scope (c))
+ 	    if (c == tscope)
+ 	      {
+ 		if (DECL_P (cscope))
+ 		  error_at (loc, "%qD intervenes between %<consteval%> block "
+ 				 "%<define_aggregate%> is evaluated from and "
+ 				 "%qT scope", cscope, type);
+ 		else
+ 		  error_at (loc, "%qT intervenes between %<consteval%> block "
+ 				 "%<define_aggregate%> is evaluated from and "
+ 				 "%qT scope", cscope, type);
+ 		cscope = NULL_TREE;
+ 		tscope = NULL_TREE;
+ 		break;
+ 	      }
+ 	  if (cscope && tscope)
+ 	    {
+ 	      if (DECL_P (cscope) && DECL_P (tscope))
+ 		error_at (loc, "%<define_aggregate%> evaluated from "
+ 			       "%<consteval%> block enclosed by %qD while "
+ 			       "%qT type being defined is enclosed by %qD",
+ 			  cscope, type, tscope);
+ 	      else if (DECL_P (cscope))
+ 		error_at (loc, "%<define_aggregate%> evaluated from "
+ 			       "%<consteval%> block enclosed by %qD while "
+ 			       "%qT type being defined is enclosed by %qT",
+ 			  cscope, type, tscope);
+ 	      else if (DECL_P (tscope))
+ 		error_at (loc, "%<define_aggregate%> evaluated from "
+ 			       "%<consteval%> block enclosed by %qT while "
+ 			       "%qT type being defined is enclosed by %qD",
+ 			  cscope, type, tscope);
+ 	      else if (tscope)
+ 		error_at (loc, "%<define_aggregate%> evaluated from "
+ 			       "%<consteval%> block enclosed by %qT while "
+ 			       "%qT type being defined is enclosed by %qT",
+ 			  cscope, type, tscope);
+ 	    }
+ 	}
+       else if (cscope && DECL_P (cscope))
+ 	error_at (loc, "%qD intervenes between %<consteval%> block "
+ 		       "%<define_aggregate%> is evaluated from and %qT scope",
+ 		  cscope, type);
+       else if (cscope)
+ 	error_at (loc, "%qT intervenes between %<consteval%> block "
+ 		       "%<define_aggregate%> is evaluated from and %qT scope",
+ 		  cscope, type);
+       else if (tscope && DECL_P (tscope))
+ 	error_at (loc, "%qD intervenes between %qT scope and %<consteval%> "
+ 		       "block %<define_aggregate%> is evaluated from",
+ 		  tscope, type);
+       else
+ 	error_at (loc, "%qT intervenes between %qT scope and %<consteval%> "
+ 		       "block %<define_aggregate%> is evaluated from",
+ 		  tscope, type);
+       inform (DECL_SOURCE_LOCATION (consteval_block),
+ 	      "%<consteval%> block defined here");
+       return get_reflection_raw (loc, orig_type);
+     }
+   if (primary_template_specialization_p (type))
+     {
+       type = maybe_process_partial_specialization (type);
+       if (type == error_mark_node)
+ 	{
+ 	  *non_constant_p = true;
+ 	  return call;
+ 	}
+     }
+   if (!TYPE_BINFO (type))
+     xref_basetypes (type, NULL_TREE);
+   pushclass (type);
+   gcc_assert (!TYPE_FIELDS (type));
+   tree fields = NULL_TREE;
+   for (int i = 0; i < TREE_VEC_LENGTH (rvec); ++i)
+     {
+       tree ra = TREE_VEC_ELT (rvec, i);
+       tree a = REFLECT_EXPR_HANDLE (ra);
+       tree f = build_decl (cp_expr_loc_or_input_loc (ra), FIELD_DECL,
+ 			   TREE_VEC_ELT (a, 1), TREE_VEC_ELT (a, 0));
+       DECL_CHAIN (f) = fields;
+       DECL_IN_AGGR_P (f) = 1;
+       DECL_CONTEXT (f) = type;
+       TREE_PUBLIC (f) = 1;
+       /* Bit-field.  */
+       if (TREE_VEC_ELT (a, 3))
+ 	{
+ 	  /* Temporarily stash the width in DECL_BIT_FIELD_REPRESENTATIVE.
+ 	     check_bitfield_decl picks it from there later and sets DECL_SIZE
+ 	     accordingly.  */
+ 	  DECL_BIT_FIELD_REPRESENTATIVE (f) = TREE_VEC_ELT (a, 3);
+ 	  SET_DECL_C_BIT_FIELD (f);
+ 	  DECL_NONADDRESSABLE_P (f) = 1;
+ 	  /* If this bit-field is unnamed, it's padding.  */
+ 	  if (!TREE_VEC_ELT (a, 1))
+ 	    DECL_PADDING_P (f) = 1;
+ 	}
+       else if (TREE_VEC_ELT (a, 2))
+ 	{
+ 	  SET_DECL_ALIGN (f, tree_to_uhwi (TREE_VEC_ELT (a, 2))
+ 			      * BITS_PER_UNIT);
+ 	  DECL_USER_ALIGN (f) = 1;
+ 	}
+       if (TREE_VEC_ELT (a, 4) == boolean_true_node)
+ 	{
+ 	  tree attr = build_tree_list (NULL_TREE,
+ 				       get_identifier ("no_unique_address"));
+ 	  attr = build_tree_list (attr, NULL_TREE);
+ 	  cplus_decl_attributes (&f, attr, 0);
+ 	}
+       fields = f;
+     }
+   TYPE_FIELDS (type) = fields;
+   finish_struct (type, NULL_TREE);
+   return get_reflection_raw (loc, orig_type);
+ }
+ 
+ /* Implement std::meta::reflect_constant_string.
+    Let CharT be ranges::range_value_t<R>.
+    Mandates: CharT is one of char, wchar_t, char8_t, char16_t, char32_t.
+    Let V be the pack of values of type CharT whose elements are the
+    corresponding elements of r, except that if r refers to a string literal
+    object, then V does not include the trailing null terminator of r.
+    Let P be the template parameter object of type
+    const CharT[sizeof...(V) + 1] initialized with {V..., CharT()}.
+    Returns: ^^P.  */
+ 
+ static tree
+ eval_reflect_constant_string (location_t loc, const constexpr_ctx *ctx,
+ 			      tree call, bool *non_constant_p,
+ 			      bool *overflow_p, tree *jump_target, tree fun)
+ {
+   tree str = get_range_elts (loc, ctx, call, 0, non_constant_p, overflow_p,
+ 			     jump_target, REFLECT_CONSTANT_STRING, fun);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   tree decl = get_template_parm_object (str,
+ 					mangle_template_parm_object (str));
+   DECL_MERGEABLE (decl) = 1;
+   return get_reflection_raw (loc, decl);
+ }
+ 
+ /* Implement std::meta::reflect_constant_array.
+    Let T be ranges::range_value_t<R>.
+    Mandates: T is a structural type,
+    is_constructible_v<T, ranges::range_reference_t<R>> is true, and
+    is_copy_constructible_v<T> is true.
+    Let V be the pack of values of type info of the same size as r, where the
+    ith element is reflect_constant(e_i), where e_i is the ith element of r.
+    Let P be
+    -- If sizeof...(V) > 0 is true, then the template parameter object of type
+       const T[sizeof...(V)] initialized with {[:V:]...}.
+    -- Otherwise, the template parameter object of type array<T, 0> initialized
+       with {}.
+    Returns: ^^P.  */
+ 
+ static tree
+ eval_reflect_constant_array (location_t loc, const constexpr_ctx *ctx,
+ 			     tree call, bool *non_constant_p,
+ 			     bool *overflow_p, tree *jump_target, tree fun)
+ {
+   tree str = get_range_elts (loc, ctx, call, 0, non_constant_p, overflow_p,
+ 			     jump_target, REFLECT_CONSTANT_ARRAY, fun);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   tree decl = get_template_parm_object (str,
+ 					mangle_template_parm_object (str));
+   DECL_MERGEABLE (decl) = 1;
+   return get_reflection_raw (loc, decl);
+ }
+ 
+ /* Process std::meta::access_context::current.  */
+ 
+ static tree
+ eval_access_context_current (location_t loc, const constexpr_ctx *ctx,
+ 			     tree call, bool *non_constant_p)
+ {
+   tree scope = cxx_constexpr_caller (ctx);
+   /* Ignore temporary current_function_decl changes caused by
+      push_access_scope.  */
+   if (scope == NULL_TREE && current_function_decl)
+     scope = current_function_decl_without_access_scope ();
+   /* [meta.reflection.access.context]/(5.1.2): Otherwise, if an initialization
+      by an inherited constructor is using I, a point whose immediate scope is
+      the class scope corresponding to C.  */
+   if (scope && DECL_INHERITED_CTOR (scope))
+     scope = DECL_CONTEXT (scope);
+   if (scope == NULL_TREE)
+     {
+       if (cxx_constexpr_manifestly_const_eval (ctx) != mce_true)
+ 	{
+ 	  /* Outside of functions limit this to manifestly constant-evaluation
+ 	     so that we don't fold it prematurely.  */
+ 	  if (!cxx_constexpr_quiet_p (ctx))
+ 	    error_at (loc, "%<access_context::current%> used outside of "
+ 			   "manifestly constant-evaluation");
+ 	  *non_constant_p = true;
+ 	  return call;
+ 	}
+       if (current_class_type)
+ 	scope = current_class_type;
+       else if (current_namespace)
+ 	scope = current_namespace;
+       else
+ 	scope = global_namespace;
+     }
+   tree lam;
+   while (LAMBDA_FUNCTION_P (scope)
+ 	 && (lam = CLASSTYPE_LAMBDA_EXPR (CP_DECL_CONTEXT (scope)))
+ 	 && LAMBDA_EXPR_CONSTEVAL_BLOCK_P (lam))
+     scope = CP_TYPE_CONTEXT (CP_DECL_CONTEXT (scope));
+   tree access_context = TREE_TYPE (call);
+   if (TREE_CODE (access_context) != RECORD_TYPE)
+     {
+     fail:
+       error_at (loc, "unexpected return type of %qs",
+ 		"std::meta::access_context::current");
+       return build_zero_cst (access_context);
+     }
+   tree scopef = next_aggregate_field (TYPE_FIELDS (access_context));
+   if (!scopef || !REFLECTION_TYPE_P (TREE_TYPE (scopef)))
+     goto fail;
+   tree classf = next_aggregate_field (DECL_CHAIN (scopef));
+   if (!classf || !REFLECTION_TYPE_P (TREE_TYPE (classf)))
+     goto fail;
+   if (next_aggregate_field (DECL_CHAIN (classf)))
+     goto fail;
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   CONSTRUCTOR_APPEND_ELT (elts, scopef, get_reflection_raw (loc, scope));
+   CONSTRUCTOR_APPEND_ELT (elts, classf, get_null_reflection ());
+   return build_constructor (access_context, elts);
+ }
+ 
+ /* Helper function to extract scope and designating class from
+    access_context ACTX.  */
+ 
+ static bool
+ extract_access_context (location_t loc, tree actx, tree *scope,
+ 			tree *designating_class)
+ {
+   if (TREE_CODE (actx) != CONSTRUCTOR
+       || CONSTRUCTOR_NELTS (actx) != 2
+       || !REFLECT_EXPR_P (CONSTRUCTOR_ELT (actx, 0)->value)
+       || !REFLECT_EXPR_P (CONSTRUCTOR_ELT (actx, 1)->value))
+     {
+       error_at (loc, "invalid %<access_context%> argument");
+       return false;
+     }
+   *scope = REFLECT_EXPR_HANDLE (CONSTRUCTOR_ELT (actx, 0)->value);
+   *designating_class = REFLECT_EXPR_HANDLE (CONSTRUCTOR_ELT (actx, 1)->value);
+   if (*scope == unknown_type_node)
+     *scope = NULL_TREE;
+   else if (TREE_CODE (*scope) != FUNCTION_DECL
+ 	   && TREE_CODE (*scope) != NAMESPACE_DECL
+ 	   && !CLASS_TYPE_P (*scope))
+     {
+       error_at (loc, "unexpected %<access_context::scope()%>");
+       return false;
+     }
+   else if (CLASS_TYPE_P (*scope))
+     *scope = TYPE_MAIN_VARIANT (*scope);
+   if (*designating_class == unknown_type_node)
+     *designating_class = NULL_TREE;
+   else if (!CLASS_TYPE_P (*designating_class)
+ 	   || !COMPLETE_TYPE_P (*designating_class))
+     {
+       error_at (loc, "unexpected %<access_context::designating_class()%>");
+       return false;
+     }
+   else
+     *designating_class = TYPE_MAIN_VARIANT (*designating_class);
+   return true;
+ }
+ 
+ /* Process std::meta::is_accessible.
+    Let PARENT-CLS(r) be:
+    -- If parent_of(r) represents a class C, then C.
+    -- Otherwise, PARENT-CLS(parent_of(r)).
+    Let DESIGNATING-CLS(r, ctx) be:
+    -- If ctx.designating_class() represents a class C, then C.
+    -- Otherwise, PARENT-CLS(r).
+    Returns:
+    -- If r represents an unnamed bit-field F, then is_accessible(r_H, ctx),
+       where r_H represents a hypothetical non-static data member of the class
+       represented by PARENT-CLS(r) with the same access as F.
+    -- Otherwise, if r does not represent a class member or a direct base class
+       relationship, then true.
+    -- Otherwise, if r represents
+       -- a class member that is not a (possibly indirect or variant) member of
+ 	 DESIGNATING-CLS(r, ctx) or
+       -- a direct base class relationship such that parent_of(r) does not
+ 	 represent DESIGNATING-CLS(r, ctx) or a (direct or indirect) base
+ 	 class thereof,
+       then false.
+    -- Otherwise, if ctx.scope() is the null reflection, then true.
+    -- Otherwise, letting P be a program point whose immediate scope is the
+       function parameter scope, class scope, or namespace scope corresponding
+       to the function, class, or namespace represented by ctx.scope():
+       -- If r represents a direct base class relationship (D,B), then true if
+ 	 base class B of DESIGNATING-CLS(r, ctx) is accessible at P;
+ 	 otherwise false.
+       -- Otherwise, r represents a class member M; true if M would be
+ 	 accessible at P with the designating class (as DESIGNATING-CLS(r, ctx)
+ 	 if the effect of any using-declarations were ignored.  Otherwise,
+ 	 false.
+    Throws: meta::exception if r represents a class member for which
+    PARENT-CLS(r) is an incomplete class.  */
+ 
+ static tree
+ eval_is_accessible (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		    reflect_kind kind, tree actx, tree call,
+ 		    bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   tree scope = NULL_TREE, designating_class = NULL_TREE, c;
+   if (!extract_access_context (loc, actx, &scope, &designating_class))
+     {
+       *non_constant_p = true;
+       return call;
+     }
+ 
+   if (eval_is_class_member (r) == boolean_true_node)
+     {
+       r = maybe_get_reflection_fndecl (r);
+       c = r;
+       if (TREE_CODE (r) == CONST_DECL && UNSCOPED_ENUM_P (DECL_CONTEXT (r)))
+ 	c = DECL_CONTEXT (r);
+       if (TYPE_P (c))
+ 	{
+ 	  if (TYPE_NAME (c) && DECL_P (TYPE_NAME (c)))
+ 	    c = CP_DECL_CONTEXT (TYPE_NAME (c));
+ 	  else
+ 	    c = CP_TYPE_CONTEXT (c);
+ 	}
+       else
+ 	c = CP_DECL_CONTEXT (r);
+     }
+   else if (kind == REFLECT_BASE)
+     {
+       c = direct_base_derived (r);
+       r = BINFO_TYPE (r);
+     }
+   else
+     return boolean_true_node;
+   if (!CLASS_TYPE_P (c) || !COMPLETE_TYPE_P (c))
+     return throw_exception (loc, ctx,
+ 			    "incomplete parent class",
+ 			    fun, non_constant_p, jump_target);
+   if (designating_class)
+     {
+       tree p = c;
+       while (ANON_AGGR_TYPE_P (p) && p != designating_class)
+ 	p = CP_TYPE_CONTEXT (p);
+       if (p != designating_class
+ 	  && (!CLASS_TYPE_P (p)
+ 	      || !DERIVED_FROM_P (p, designating_class)))
+ 	return boolean_false_node;
+     }
+   if (scope == NULL_TREE)
+     return boolean_true_node;
+   if (designating_class == NULL_TREE)
+     designating_class = c;
+   if (TREE_CODE (scope) == NAMESPACE_DECL)
+     push_to_top_level ();
+   else if (TYPE_P (scope))
+     push_access_scope (TYPE_NAME (scope));
+   else
+     push_access_scope (scope);
+   tree ret = boolean_false_node;
+   if (kind == REFLECT_BASE)
+     {
+       if (accessible_base_p (designating_class, r, /*consider_local_p=*/true))
+ 	ret = boolean_true_node;
+     }
+   else
+     {
+       tree o = TYPE_P (r) ? TYPE_NAME (r) : r;
+       if (accessible_p (TYPE_BINFO (designating_class), o,
+ 			/*consider_local_p=*/true))
+ 	ret = boolean_true_node;
+     }
+   if (TREE_CODE (scope) == NAMESPACE_DECL)
+     pop_from_top_level ();
+   else if (TYPE_P (scope))
+     pop_access_scope (TYPE_NAME (scope));
+   else
+     pop_access_scope (scope);
+   return ret;
+ }
+ 
+ /* Returns true if R is C-members-of-representable from
+    current point P.  */
+ 
+ static bool
+ members_of_representable_p (tree c, tree r)
+ {
+   if (TREE_CODE (r) == CONST_DECL)
+     return false;
+   if (LAMBDA_TYPE_P (c) && !LAMBDA_FUNCTION_P (r))
+     return false;
+   if (TYPE_P (r))
+     {
+       if (CP_DECL_CONTEXT (TYPE_NAME (r)) != c)
+ 	return false;
+       if (LAMBDA_TYPE_P (r))
+ 	return false;
+       if (OVERLOAD_TYPE_P (r))
+ 	return true;
+       if (typedef_variant_p (r))
+ 	return true;
+     }
+   else if (DECL_P (r))
+     {
+       if (CP_DECL_CONTEXT (r) != c)
+ 	return false;
+       if (DECL_CLASS_TEMPLATE_P (r)
+ 	  || DECL_FUNCTION_TEMPLATE_P (r)
+ 	  || variable_template_p (r)
+ 	  || DECL_ALIAS_TEMPLATE_P (r)
+ 	  || concept_definition_p (r)
+ 	  || TREE_CODE (r) == FIELD_DECL
+ 	  || TREE_CODE (r) == NAMESPACE_DECL)
+ 	return true;
+       if (VAR_OR_FUNCTION_DECL_P (r) && !undeduced_auto_decl (r))
+ 	return true;
+     }
+   return false;
+ }
+ 
+ /* Callback for vector qsort to compare members by ascending DECL_UID.  */
+ 
+ static int
+ members_cmp (const void *a, const void *b)
+ {
+   const constructor_elt *ea = (const constructor_elt *) a;
+   const constructor_elt *eb = (const constructor_elt *) b;
+   tree vala = REFLECT_EXPR_HANDLE (ea->value);
+   tree valb = REFLECT_EXPR_HANDLE (eb->value);
+   if (TYPE_P (vala))
+     vala = TYPE_NAME (vala);
+   if (TYPE_P (valb))
+     valb = TYPE_NAME (valb);
+   if (DECL_UID (vala) < DECL_UID (valb))
+     return -1;
+   if (DECL_UID (vala) > DECL_UID (valb))
+     return 1;
+   gcc_assert (ea == eb);
+   return 0;
+ }
+ 
+ /* Enumerate members of namespace NS for eval_members_of.  */
+ 
+ static vec<constructor_elt, va_gc> *
+ namespace_members_of (location_t loc, tree ns)
+ {
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   hash_set<tree> *seen = nullptr;
+   for (tree o : *DECL_NAMESPACE_BINDINGS (ns))
+     {
+       if (TREE_CODE (o) == OVERLOAD && OVL_LOOKUP_P (o))
+ 	{
+ 	  if (TREE_TYPE (o))
+ 	    {
+ 	      tree m = TREE_TYPE (TREE_TYPE (o));
+ 	      if (members_of_representable_p (ns, m))
+ 		CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 					get_reflection_raw (loc, m));
+ 	    }
+ 	  if (OVL_DEDUP_P (o) || !OVL_FUNCTION (o))
+ 	    continue;
+ 	  o = OVL_FUNCTION (o);
+ 	}
+       for (ovl_iterator iter (o); iter; ++iter)
+ 	{
+ 	  if (iter.hidden_p ())
+ 	    continue;
+ 	  tree b = *iter;
+ 	  tree m = b;
+ 
+ 	  if (VAR_P (b) && DECL_ANON_UNION_VAR_P (b))
+ 	    {
+ 	      /* TODO: This doesn't handle namespace N { static union {}; }
+ 		 but we pedwarn on that, so perhaps it doesn't need to be
+ 		 handled.  */
+ 	      tree v = DECL_VALUE_EXPR (b);
+ 	      gcc_assert (v && TREE_CODE (v) == COMPONENT_REF);
+ 	      tree var = TREE_OPERAND (v, 0);
+ 	      tree type = TREE_TYPE (var);
+ 	      if (!seen)
+ 		seen = new hash_set<tree>;
+ 	      if (members_of_representable_p (ns, type) && !seen->add (type))
+ 		CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 					get_reflection_raw (loc, type));
+ 	      if (members_of_representable_p (ns, var) && !seen->add (var))
+ 		CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 					get_reflection_raw (loc, var));
+ 	      continue;
+ 	    }
+ 	  if (TREE_CODE (b) == TYPE_DECL)
+ 	    m = TREE_TYPE (b);
+ 	  if (!members_of_representable_p (ns, m))
+ 	    continue;
+ 	  if (DECL_DECOMPOSITION_P (m) && !DECL_DECOMP_IS_BASE (m))
+ 	    {
+ 	      tree base = DECL_DECOMP_BASE (m);
+ 	      if (!seen)
+ 		seen = new hash_set<tree>;
+ 	      if (members_of_representable_p (ns, base) && !seen->add (base))
+ 		CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 					get_reflection_raw (loc, base));
+ 	      if (!DECL_HAS_VALUE_EXPR_P (m))
+ 		CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 					get_reflection_raw (loc, m,
+ 							    REFLECT_VAR));
+ 	      continue;
+ 	    }
+ 	  /* eval_is_accessible should be always true for namespace members,
+ 	     so don't bother calling it here.  */
+ 	  CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				  get_reflection_raw (loc, m));
+ 	}
+     }
+   delete seen;
+   if (elts)
+     elts->qsort (members_cmp);
+   return elts;
+ }
+ 
+ /* Enumerate members of class R for eval_*members_of.  KIND is
+    one of METAFN_{,{,NON}STATIC_DATA_}MEMBERS_OF or
+    METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS.
+    For the last kind don't append any elts except for the first one for
+    which is_accessible returned false.  */
+ 
+ static vec<constructor_elt, va_gc> *
+ class_members_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		  tree actx, tree call, bool *non_constant_p,
+ 		  tree *jump_target, enum metafn_code kind, tree fun)
+ {
+   if (kind == METAFN_MEMBERS_OF)
+     {
+       if (modules_p ())
+ 	lazy_load_pendings (TYPE_NAME (r));
+       if (CLASSTYPE_LAZY_DEFAULT_CTOR (r))
+ 	lazily_declare_fn (sfk_constructor, r);
+       if (CLASSTYPE_LAZY_COPY_CTOR (r))
+ 	lazily_declare_fn (sfk_copy_constructor, r);
+       if (CLASSTYPE_LAZY_MOVE_CTOR (r))
+ 	lazily_declare_fn (sfk_move_constructor, r);
+       if (CLASSTYPE_LAZY_DESTRUCTOR (r))
+ 	lazily_declare_fn (sfk_destructor, r);
+       if (CLASSTYPE_LAZY_COPY_ASSIGN (r))
+ 	lazily_declare_fn (sfk_copy_assignment, r);
+       if (CLASSTYPE_LAZY_MOVE_ASSIGN (r))
+ 	lazily_declare_fn (sfk_move_assignment, r);
+     }
+   auto_vec <tree, 8> implicitly_declared;
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   for (tree field = TYPE_FIELDS (r); field; field = DECL_CHAIN (field))
+     {
+       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)
+ 	m = TREE_TYPE (field);
+       else if (TREE_CODE (field) == FUNCTION_DECL)
+ 	{
+ 	  /* Ignore cloned cdtors.  */
+ 	  if (DECL_CLONED_FUNCTION_P (field))
+ 	    continue;
+ 	  /* Ignore functions with unsatisfied constraints.  */
+ 	  if (!constraints_satisfied_p (field))
+ 	    continue;
+ 	  if (DECL_MAYBE_DELETED (field))
+ 	    {
+ 	      ++function_depth;
+ 	      maybe_synthesize_method (field);
+ 	      --function_depth;
+ 	    }
+ 	}
+       if (members_of_representable_p (r, m))
+ 	{
+ 	  if (kind == METAFN_STATIC_DATA_MEMBERS_OF
+ 	      && eval_is_variable (m, REFLECT_UNDEF) != boolean_true_node)
+ 	    continue; /* For static_data_members_of only include
+ 			 is_variable.  */
+ 	  else if ((kind == METAFN_NONSTATIC_DATA_MEMBERS_OF
+ 		    || kind == METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS)
+ 		   && eval_is_nonstatic_data_member (m) != boolean_true_node)
+ 	    continue; /* For nonstatic_data_members_of only include
+ 			 is_nonstatic_data_member.  */
+ 	  tree a = eval_is_accessible (loc, ctx, m, REFLECT_UNDEF, actx, call,
+ 				       non_constant_p, jump_target, fun);
+ 	  if (*jump_target || *non_constant_p)
+ 	    return nullptr;
+ 	  if (a == boolean_false_node)
+ 	    {
+ 	      if (kind == METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS
+ 		  && elts == nullptr)
+ 		CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE, boolean_true_node);
+ 	      continue;
+ 	    }
+ 	  gcc_assert (a == boolean_true_node);
+ 	  if (kind == METAFN_MEMBERS_OF
+ 	      && TREE_CODE (m) == FUNCTION_DECL
+ 	      && DECL_ARTIFICIAL (m))
+ 	    {
+ 	      /* Implicitly-declared special members or operator== members
+ 		 appear after any user declared members.  */
+ 	      implicitly_declared.safe_push (m);
+ 	      continue;
+ 	    }
+ 	  else if (kind == METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS)
+ 	    continue;
+ 	  CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				  get_reflection_raw (loc, m));
+ 	}
+     }
+   /* TYPE_DECLs in TYPE_FIELDS come after other decls, so for members_of
+      the declaration order is not preserved.  */
+   if (kind == METAFN_MEMBERS_OF && elts)
+     elts->qsort (members_cmp);
+   if (kind == METAFN_MEMBERS_OF && !implicitly_declared.is_empty ())
+     {
+       gcc_assert (implicitly_declared.length () <= 8);
+       for (tree m : implicitly_declared)
+ 	if (default_ctor_p (m))
+ 	  {
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				    get_reflection_raw (loc, m));
+ 	    break;
+ 	  }
+       for (tree m : implicitly_declared)
+ 	if (DECL_COPY_CONSTRUCTOR_P (m))
+ 	  {
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				    get_reflection_raw (loc, m));
+ 	    break;
+ 	  }
+       for (tree m : implicitly_declared)
+ 	if (special_function_p (m) == sfk_copy_assignment)
+ 	  {
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				    get_reflection_raw (loc, m));
+ 	    break;
+ 	  }
+       for (tree m : implicitly_declared)
+ 	if (DECL_MOVE_CONSTRUCTOR_P (m))
+ 	  {
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				    get_reflection_raw (loc, m));
+ 	    break;
+ 	  }
+       for (tree m : implicitly_declared)
+ 	if (special_function_p (m) == sfk_move_assignment)
+ 	  {
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				    get_reflection_raw (loc, m));
+ 	    break;
+ 	  }
+       for (tree m : implicitly_declared)
+ 	if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (m))
+ 	  {
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				    get_reflection_raw (loc, m));
+ 	    break;
+ 	  }
+       for (tree m : implicitly_declared)
+ 	if (DECL_OVERLOADED_OPERATOR_IS (m, EQ_EXPR))
+ 	  {
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 				    get_reflection_raw (loc, m));
+ 	    break;
+ 	  }
+     }
+   return elts;
+ }
+ 
+ /* Enumerate bases of class R for eval_*of.  KIND is METAFN_BASES_OF
+    or METAFN_HAS_INACCESSIBLE_BASES.  */
+ 
+ static vec<constructor_elt, va_gc> *
+ class_bases_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		tree actx, tree call, bool *non_constant_p,
+ 		tree *jump_target, enum metafn_code kind, tree fun)
+ {
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   tree binfo = TYPE_BINFO (r), base_binfo;
+   for (unsigned i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
+     {
+       tree a = eval_is_accessible (loc, ctx, base_binfo, REFLECT_BASE, actx,
+ 				   call, non_constant_p, jump_target, fun);
+       if (*jump_target || *non_constant_p)
+ 	return nullptr;
+       if (a == boolean_false_node)
+ 	{
+ 	  if (kind == METAFN_HAS_INACCESSIBLE_BASES && elts == nullptr)
+ 	    CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE, boolean_true_node);
+ 	  continue;
+ 	}
+       gcc_assert (a == boolean_true_node);
+       if (kind == METAFN_HAS_INACCESSIBLE_BASES)
+ 	continue;
+       CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
+ 			      get_reflection_raw (loc, base_binfo,
+ 						  REFLECT_BASE));
+     }
+   return elts;
+ }
+ 
+ /* Implement std::meta::members_of.
+    A declaration D members-of-precedes a point P if D precedes either P or the
+    point immediately following the class-specifier of the outermost class for
+    which P is in a complete-class context.
+    A declaration D of a member M of a class or namespace Q is
+    Q-members-of-eligible if
+    -- the host scope of D is the class scope or namespace scope associated
+       with Q,
+    -- D is not a friend declaration,
+    -- M is not a closure type,
+    -- M is not a specialization of a template,
+    -- if Q is a class that is not a closure type, then M is a direct member of
+       Q that is not a variant member of a nested anonymous union of Q, and
+    -- if Q is a closure type, then M is a function call operator or function
+       call operator template.
+    It is implementation-defined whether declarations of other members of a
+    closure type Q are Q-members-of-eligible.
+    A member M of a class or namespace Q is Q-members-of-representable from a
+    point P if a Q-members-of-eligible declaration of M members-of-precedes P,
+    and M is
+    -- a class or enumeration type
+    -- a type alias
+    -- a class template, function template, variable template, alias template,
+       or concept,
+    -- a variable or reference V for which the type of V does not contain an
+       undeduced placeholder type,
+    -- a function F for which
+       -- the type of F does not contain an undeduced placeholder type,
+       -- the constraints (if any) of F are satisfied, and
+       -- if F is a prospective destructor, F is the selected destructor,
+    -- a non-static data member,
+    -- a namespace, or
+    -- a namespace alias.
+    Returns: A vector containing reflections of all members M of the entity Q
+    represented by dealias(r) for which
+    -- M is Q-members-of-representable from some point in the evaluation
+       context and
+    -- is_accessible(^^M, ctx) is true.
+    If dealias(r) represents a class C, then the vector also contains
+    reflections representing all unnamed bit-fields B whose declarations
+    inhabit the class scope corresponding to C for which
+    is_accessible(^^B, ctx) is true.
+    Reflections of class members and unnamed bit-fields that are declared
+    appear in the order in which they are declared.
+    Throws: meta::exception unless dealias(r) is a reflection representing
+    either a class type that is complete from some point in the evaluation
+    context or a namespace.  */
+ 
+ static tree
+ eval_members_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		 tree actx, tree call, bool *non_constant_p,
+ 		 tree *jump_target, tree fun)
+ {
+   r = maybe_strip_typedefs (r);
+   if (TREE_CODE (r) == NAMESPACE_DECL)
+     r = ORIGINAL_NAMESPACE (r);
+   vec<constructor_elt, va_gc> *elts;
+   if (TREE_CODE (r) == NAMESPACE_DECL)
+     elts = namespace_members_of (loc, r);
+   else if (CLASS_TYPE_P (r)
+ 	   && complete_type_or_maybe_complain (r, NULL_TREE, tf_none))
+     {
+       elts = class_members_of (loc, ctx, r, actx, call, non_constant_p,
+ 			       jump_target, METAFN_MEMBERS_OF, fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+     }
+   else
+     return throw_exception (loc, ctx,
+ 			    "neither complete class type nor namespace",
+ 			    fun, non_constant_p, jump_target);
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Implement std::meta::bases_of.
+    Returns: Let C be the class represented by dealias(type).
+    A vector containing the reflections of all the direct base class
+    relationships B, if any, of C such that is_accessible(^^B, ctx) is true.
+    The direct base class relationships appear in the order in which the
+    corresponding base classes appear in the base-specifier-list of C.
+    Throws: meta::exception unless dealias(type) represents a class type that
+    is complete from some point in the evaluation context.  */
+ 
+ static tree
+ eval_bases_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 	       tree actx, tree call, bool *non_constant_p,
+ 	       tree *jump_target, tree fun)
+ {
+   r = maybe_strip_typedefs (r);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   if (CLASS_TYPE_P (r)
+       && complete_type_or_maybe_complain (r, NULL_TREE, tf_none))
+     {
+       elts = class_bases_of (loc, ctx, r, actx, call, non_constant_p,
+ 			     jump_target, METAFN_BASES_OF, fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+     }
+   else
+     return throw_exception (loc, ctx, "not a complete class type",
+ 			    fun, non_constant_p, jump_target);
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Implement std::meta::static_data_members_of.
+    Returns: A vector containing each element e of members_of(type, ctx) such
+    that is_variable(e) is true, preserving their order.
+    Throws: meta::exception unless dealias(type) represents a class type that
+    is complete from some point in the evaluation context.  */
+ 
+ static tree
+ eval_static_data_members_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 			     tree actx, tree call, bool *non_constant_p,
+ 			     tree *jump_target, tree fun)
+ {
+   r = maybe_strip_typedefs (r);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   if (CLASS_TYPE_P (r)
+       && complete_type_or_maybe_complain (r, NULL_TREE, tf_none))
+     {
+       elts = class_members_of (loc, ctx, r, actx, call, non_constant_p,
+ 			       jump_target, METAFN_STATIC_DATA_MEMBERS_OF,
+ 			       fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+     }
+   else
+     return throw_exception (loc, ctx, "not a complete class type",
+ 			    fun, non_constant_p, jump_target);
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Implement std::meta::nonstatic_data_members_of.
+    Returns: A vector containing each element e of members_of(type, ctx) such
+    that is_nonstatic_data_member(e) is true, preserving their order.
+    Throws: meta::exception unless dealias(type) represents a class type that
+    is complete from some point in the evaluation context.  */
+ 
+ static tree
+ eval_nonstatic_data_members_of (location_t loc, const constexpr_ctx *ctx,
+ 				tree r, tree actx, tree call,
+ 				bool *non_constant_p, tree *jump_target,
+ 				tree fun)
+ {
+   r = maybe_strip_typedefs (r);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   if (CLASS_TYPE_P (r)
+       && complete_type_or_maybe_complain (r, NULL_TREE, tf_none))
+     {
+       elts = class_members_of (loc, ctx, r, actx, call, non_constant_p,
+ 			       jump_target, METAFN_NONSTATIC_DATA_MEMBERS_OF,
+ 			       fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+     }
+   else
+     return throw_exception (loc, ctx, "not a complete class type",
+ 			    fun, non_constant_p, jump_target);
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Implement std::meta::subobjects_of.
+    Returns: A vector containing each element of bases_of(type, ctx) followed
+    by each element of nonstatic_data_members_of(type, ctx), preserving their
+    order.
+    Throws: meta::exception unless dealias(type) represents a class type that
+    is complete from some point in the evaluation context.  */
+ 
+ static tree
+ eval_subobjects_of (location_t loc, const constexpr_ctx *ctx, tree r,
+ 		    tree actx, tree call, bool *non_constant_p,
+ 		    tree *jump_target, tree fun)
+ {
+   r = maybe_strip_typedefs (r);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   if (CLASS_TYPE_P (r)
+       && complete_type_or_maybe_complain (r, NULL_TREE, tf_none))
+     {
+       elts = class_bases_of (loc, ctx, r, actx, call, non_constant_p,
+ 			     jump_target, METAFN_BASES_OF, fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+       vec<constructor_elt, va_gc> *elts2
+ 	= class_members_of (loc, ctx, r, actx, call, non_constant_p,
+ 			    jump_target, METAFN_NONSTATIC_DATA_MEMBERS_OF,
+ 			    fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+       if (elts == nullptr)
+ 	elts = elts2;
+       else if (elts2)
+ 	vec_safe_splice (elts, elts2);
+     }
+   else
+     return throw_exception (loc, ctx, "not a complete class type",
+ 			    fun, non_constant_p, jump_target);
+   return get_vector_of_info_elts (elts);
+ }
+ 
+ /* Implement std::meta::has_inaccessible_nonstatic_data_members.
+    Returns: true if is_accessible(R, ctx) is false for any R in
+    nonstatic_data_members_of(r, access_context::unchecked()).
+    Otherwise, false.
+    Throws: meta::exception if
+    -- the evaluation of
+       nonstatic_data_members_of(r, access_context::unchecked()) would exit via
+       an exception and or
+    -- r represents a closure type.  */
+ 
+ static tree
+ eval_has_inaccessible_nonstatic_data_members (location_t loc,
+ 					      const constexpr_ctx *ctx,
+ 					      tree r, tree actx, tree call,
+ 					      bool *non_constant_p,
+ 					      tree *jump_target, tree fun)
+ {
+   r = maybe_strip_typedefs (r);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   if (CLASS_TYPE_P (r)
+       && complete_type_or_maybe_complain (r, NULL_TREE, tf_none))
+     {
+       if (LAMBDA_TYPE_P (r))
+ 	return throw_exception (loc, ctx, "closure type", fun,
+ 				non_constant_p, jump_target);
+       elts = class_members_of (loc, ctx, r, actx, call, non_constant_p,
+ 			       jump_target,
+ 			       METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS,
+ 			       fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+     }
+   else
+     return throw_exception (loc, ctx, "not a complete class type",
+ 			    fun, non_constant_p, jump_target);
+   if (elts == nullptr)
+     return boolean_false_node;
+   else
+     return boolean_true_node;
+ }
+ 
+ /* Implement std::meta::has_inaccessible_bases.
+    Returns: true if is_accessible(R, ctx) is false for any R in
+    bases_of(r, access_context::unchecked()).  Otherwise, false.
+    Throws: meta::exception if the evaluation of
+    bases_of(r, access_context::unchecked()) would exit via an exception.  */
+ 
+ static tree
+ eval_has_inaccessible_bases (location_t loc, const constexpr_ctx *ctx,
+ 			     tree r, tree actx, tree call,
+ 			     bool *non_constant_p, tree *jump_target,
+ 			     tree fun)
+ {
+   r = maybe_strip_typedefs (r);
+   vec<constructor_elt, va_gc> *elts = nullptr;
+   if (CLASS_TYPE_P (r)
+       && complete_type_or_maybe_complain (r, NULL_TREE, tf_none))
+     {
+       elts = class_bases_of (loc, ctx, r, actx, call, non_constant_p,
+ 			     jump_target, METAFN_HAS_INACCESSIBLE_BASES, fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+     }
+   else
+     return throw_exception (loc, ctx, "not a complete class type",
+ 			    fun, non_constant_p, jump_target);
+   if (elts == nullptr)
+     return boolean_false_node;
+   else
+     return boolean_true_node;
+ }
+ 
+ /* Implement std::meta::has_inaccessible_subobjects.
+    Effects: Equivalent to:
+    return has_inaccessible_bases(r, ctx)
+ 	  || has_inaccessible_nonstatic_data_members(r, ctx);  */
+ 
+ static tree
+ eval_has_inaccessible_subobjects (location_t loc, const constexpr_ctx *ctx,
+ 				  tree r, tree actx, tree call,
+ 				  bool *non_constant_p, tree *jump_target,
+ 				  tree fun)
+ {
+   tree b = eval_has_inaccessible_bases (loc, ctx, r, actx, call,
+ 					non_constant_p, jump_target, fun);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   if (b == boolean_true_node)
+     return b;
+   return eval_has_inaccessible_nonstatic_data_members (loc, ctx, r, actx,
+ 						       call, non_constant_p,
+ 						       jump_target, fun);
+ }
+ 
+ /* Implement std::meta::exception::_S_exception_cvt_to_utf8 and
+    std::meta::exception::_S_exception_cvt_from_utf8.  This is
+    an implementation specific metafunction which translates string_view
+    into u8string_view resp. u8string_view into string_view for use in
+    std::meta::exception constructors.  On translation failure returns an empty
+    {u8,}string_view.  TO_UTF8 is true for _S_exception_cvt_to_utf8 and false
+    for _S_exception_cvt_from_utf8.  */
+ 
+ static tree
+ eval_exception__S_exception_cvt_tofrom_utf8 (location_t loc,
+ 					     const constexpr_ctx *ctx,
+ 					     tree call, bool *non_constant_p,
+ 					     bool *overflow_p,
+ 					     tree *jump_target, tree fun,
+ 					     bool to_utf8)
+ {
+   tree str = get_range_elts (loc, ctx, call, 0, non_constant_p, overflow_p,
+ 			     jump_target, REFLECT_CONSTANT_STRING, fun);
+   if (*jump_target || *non_constant_p)
+     return NULL_TREE;
+   if (TREE_CODE (str) != STRING_CST
+       || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (str)))
+ 	  != (to_utf8 ? char_type_node : char8_type_node)))
+     {
+       error_at (loc, "unexpected argument to %qs",
+ 		to_utf8 ? "_S_exception_cvt_to_utf8"
+ 		: "_S_exception_cvt_from_utf8");
+       *non_constant_p = true;
+       return call;
+     }
+   /* We need to translate the string twice for the theoretical case
+      of non-UTF8 SOURCE_CHARSET.  First translate from {exec charset,UTF-8} to
+      SOURCE_CHARSET...  */
+   cpp_string istr, ostr;
+   istr.len = TREE_STRING_LENGTH (str) + 1;
+   istr.text = (const unsigned char *) TREE_STRING_POINTER (str);
+   const char *name;
+   if (!cpp_translate_string (parse_in, &istr, &ostr,
+ 			     to_utf8 ? CPP_STRING : CPP_UTF8STRING, true))
+     {
+       ostr.text = NULL;
+       name = "";
+     }
+   else
+     name = (const char *) ostr.text;
+   /* And then let get_string_literal translate from SOURCE_CHARSET to
+      {UTF-8,exec charset}.  */
+   tree dchar_type = to_utf8 ? char8_type_node : char_type_node;
+   str = get_string_literal (name, dchar_type);
+   free (const_cast <unsigned char *> (ostr.text));
+   if (str == NULL_TREE)
+     {
+       str = get_string_literal ("", dchar_type);
+       gcc_assert (str);
+     }
+   releasing_vec args (make_tree_vector_single (str));
+   tree ret = build_special_member_call (NULL_TREE, complete_ctor_identifier,
+ 					&args, TREE_TYPE (call), LOOKUP_NORMAL,
+ 					tf_warning_or_error);
+   return build_cplus_new (TREE_TYPE (call), ret, tf_warning_or_error);
+ }
+ 
+ /* Helper for eval_extract, extracting a reference type T.
+    Returns: If r represents an object O, then a reference to O.
+    Otherwise, a reference to the object declared, or referred to, by the
+    variable represented by r.
+    Throws: meta::exception unless
+    -- r represents a variable or object of type U,
+    -- is_convertible_v<remove_reference_t<U>(*)[],
+       remove_reference_t<T>(*)[]> is true, and
+    -- If r represents a variable, then either that variable is usable in
+       constant expressions or its lifetime began within the core constant
+       expression currently under evaluation.  */
+ 
+ static tree
+ extract_ref (location_t loc, const constexpr_ctx *ctx, tree T, tree r,
+ 	     reflect_kind kind, bool *non_constant_p, tree *jump_target,
+ 	     tree fun)
+ {
+   auto adjust_type = [](tree type) -> tree
+     {
+       if (TYPE_REF_P (type))
+ 	type = TREE_TYPE (type);
+       type = build_cplus_array_type (type, NULL_TREE);
+       return build_pointer_type (type);
+     };
+ 
+   const bool var_p = eval_is_variable (r, kind) == boolean_true_node;
+   if (var_p || eval_is_object (kind) == boolean_true_node)
+     {
+       /* The wording is saying that U is the type of r.  */
+       tree U = TREE_TYPE (r);
+       if (is_convertible (adjust_type (U), adjust_type (T))
+ 	  && (!var_p || is_constant_expression (r)))
+ 	{
+ 	  if (TYPE_REF_P (TREE_TYPE (r)))
+ 	    {
+ 	      r = DECL_INITIAL (r);
+ 	      r = maybe_get_reference_referent (r);
+ 	      gcc_checking_assert (!TYPE_REF_P (TREE_TYPE (r)));
+ 	    }
+ 	  return build_address (r);
+ 	}
+     }
+ 
+   return throw_exception (loc, ctx, "value cannot be extracted", fun,
+ 			  non_constant_p, jump_target);
+ }
+ 
+ /* Helper for extract_value.  Return true iff we can extract value of
+    type U using type T.  */
+ 
+ static bool
+ can_extract_value_p (tree T, tree U)
+ {
+   if (POINTER_TYPE_P (U)
+       && (similar_type_p (T, U)
+ 	  || (FUNCTION_POINTER_TYPE_P (T) && FUNCTION_POINTER_TYPE_P (U)))
+       && is_convertible (U, T))
+     return true;
+   else if (same_type_ignoring_top_level_qualifiers_p (T, U))
+     return true;
+   else if (TREE_CODE (U) == ARRAY_TYPE
+ 	   && POINTER_TYPE_P (T)
+ 	   && is_convertible (U, T))
+     {
+       /* remove_extent_t<U> */
+       U = TREE_TYPE (U);
+       U = strip_typedefs (U);
+       /* remove_extent_t<U>* */
+       U = build_pointer_type (U);
+       return similar_type_p (T, U);
+     }
+   else if (LAMBDA_TYPE_P (U)
+ 	   && FUNCTION_POINTER_TYPE_P (T)
+ 	   && is_convertible (U, T))
+     return true;
+   return false;
+ }
+ 
+ /* Helper for eval_extract, extracting a value.
+    Let U be the type of the value or object that r represents.
+    Returns: static_cast<T>([:R:]), where R is a constant expression of
+    type info such that R == r is true.
+    Throws: meta::exception unless
+    -- U is a pointer type, T and U are either similar or both function pointer
+       types, and is_convertible_v<U, T> is true,
+    -- U is not a pointer type and the cv-unqualified types of T and U are the
+       same,
+    -- U is an array type, T is a pointer type, remove_extent_t<U>* and T are
+       similar types, and the value r represents is convertible to T, or
+    -- U is a closure type, T is a function pointer type, and the value that r
+       represents is convertible to T.  */
+ 
+ static tree
+ extract_value (location_t loc, const constexpr_ctx *ctx, tree T, tree r,
+ 	       bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   if (REFLECT_EXPR_P (r))
+     {
+       r = REFLECT_EXPR_HANDLE (r);
+       if (can_extract_value_p (T, TREE_TYPE (r)))
+ 	return build_static_cast (loc, T, r, tf_none);
+     }
+   return throw_exception (loc, ctx, "value cannot be extracted", fun,
+ 			  non_constant_p, jump_target);
+ }
+ 
+ /* Helper for extract_member_or_function.  Return true iff we can
+    extract an NSDM or function R of kind KIND using type T.  */
+ 
+ static bool
+ can_extract_member_or_function_p (tree T, tree r, reflect_kind kind)
+ {
+   if (eval_is_nonstatic_data_member (r) == boolean_true_node)
+     {
+       if (eval_is_bit_field (r, kind) == boolean_true_node)
+ 	return false;
+       /* static union { int m; }; extract<int>(^^m); is invalid.  */
+       if (TREE_CODE (r) == FIELD_DECL
+ 	  && ANON_UNION_TYPE_P (DECL_CONTEXT (r)))
+ 	{
+ 	  tree c = CP_TYPE_CONTEXT (DECL_CONTEXT (r));
+ 	  while (ANON_UNION_TYPE_P (c))
+ 	    c = CP_TYPE_CONTEXT (c);
+ 	  if (!TYPE_P (c))
+ 	    return false;
+ 	}
+       /* Create the X C::* type.  */
+       tree type = build_offset_type (CP_DECL_CONTEXT (r), TREE_TYPE (r));
+       if (similar_type_p (type, T) && is_convertible (type, T))
+ 	return true;
+       return false;
+     }
+   else if (DECL_IOBJ_MEMBER_FUNCTION_P (r))
+     {
+       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;
+     }
+   else if (TREE_CODE (r) == FUNCTION_DECL)
+     {
+       tree F = TREE_TYPE (r);
+       F = build_pointer_type (F);
+       if (same_type_p (T, F))
+ 	return true;
+       return false;
+     }
+ 
+   return false;
+ }
+ 
+ /* Helper for eval_extract, extracting a NSDM or function.
+    Returns:
+    -- If T is a pointer type, then a pointer value pointing to the function
+       represented by r.
+    -- Otherwise, a pointer-to-member value designating the non-static data
+       member or function represented by r.
+    Throws: meta::exception unless
+    -- r represents a non-static data member with type X, that is not
+       a bit-field, that is a direct member of class C, T and X C::*
+       are similar types, and is_convertible_v<X C::*, T> is true;
+    -- r represents an implicit object member function with type F or
+       F noexcept that is a direct member of a class C, and T is F C::*; or
+    -- r represents a non-member function, static member function, or
+       explicit object member function of function type F or F noexcept, and
+       T is F*.  */
+ 
+ static tree
+ extract_member_or_function (location_t loc, const constexpr_ctx *ctx,
+ 			    tree T, tree r, reflect_kind kind,
+ 			    bool *non_constant_p, tree *jump_target, tree fun)
+ {
+   r = MAYBE_BASELINK_FUNCTIONS (r);
+   if (!can_extract_member_or_function_p (T, r, kind))
+     return throw_exception (loc, ctx, "value cannot be extracted", fun,
+ 			    non_constant_p, jump_target);
+ 
+   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))
+ 	{
+ 	  *non_constant_p = true;
+ 	  return NULL_TREE;
+ 	}
+       r = build_offset_ref (DECL_CONTEXT (r), r, /*address_p=*/true, complain);
+       r = cp_build_addr_expr (r, complain);
+       r = cp_convert (T, r, complain);
+       return r;
+     }
+ }
+ 
+ /* Process std::meta::extract.
+    Let U be remove_cv_t<T>.
+    Effects: Equivalent to:
+      if constexpr (is_reference_type(^^T)) {
+        return extract-ref<T>(r);
+      } else if constexpr (is_nonstatic_data_member(r) || is_function(r)) {
+        return extract-member-or-function<U>(r);
+      } else {
+        return extract-value<U>(constant_of(r));
+      }
+   */
+ 
+ static tree
+ eval_extract (location_t loc, const constexpr_ctx *ctx, tree type, tree r,
+ 	      reflect_kind kind, bool *non_constant_p, bool *overflow_p,
+ 	      tree *jump_target, tree fun)
+ {
+   if (eval_is_reference_type (loc, type) == boolean_true_node)
+     return extract_ref (loc, ctx, type, r, kind, non_constant_p, jump_target,
+ 			fun);
+   type = cv_unqualified (type);
+   if (eval_is_nonstatic_data_member (r) == boolean_true_node
+       || eval_is_function (r) == boolean_true_node)
+     return extract_member_or_function (loc, ctx, type, r, kind, non_constant_p,
+ 				       jump_target, fun);
+   else
+     {
+       r = eval_constant_of (loc, ctx, r, kind, non_constant_p, overflow_p,
+ 			    jump_target, fun);
+       if (*jump_target || *non_constant_p)
+ 	return NULL_TREE;
+       return extract_value (loc, ctx, type, r, non_constant_p, jump_target,
+ 			    fun);
+     }
+ }
+ 
+ /* Expand a call to a metafunction FUN.  CALL is the CALL_EXPR.
+    JUMP_TARGET is set if we are throwing std::meta::exception.  */
+ 
+ tree
+ process_metafunction (const constexpr_ctx *ctx, tree fun, tree call,
+ 		      bool *non_constant_p, bool *overflow_p,
+ 		      tree *jump_target)
+ {
+   tree name = DECL_NAME (fun);
+   const char *ident = IDENTIFIER_POINTER (name);
+   const location_t loc = cp_expr_loc_or_input_loc (call);
+   const metafn_info *minfo
+     = metafn_lookup::find (ident, IDENTIFIER_LENGTH (name));
+   if (minfo == NULL)
+     {
+     not_found:
+       error_at (loc, "unknown metafunction %qD", fun);
+       *non_constant_p = true;
+       return NULL_TREE;
+     }
+   tree h = NULL_TREE, h1 = NULL_TREE, hvec = NULL_TREE, expr = NULL_TREE;
+   tree type = NULL_TREE, ht, info;
+   reflect_kind kind = REFLECT_UNDEF;
+   for (int argno = 0; argno < 3; ++argno)
+     switch ((minfo->kind >> ((argno + 1) * METAFN_KIND_SHIFT))
+ 	    & METAFN_KIND_MASK)
+       {
+       case METAFN_KIND_ARG_VOID:
+ 	break;
+       case METAFN_KIND_ARG_INFO:
+       case METAFN_KIND_ARG_TINFO:
+ 	gcc_assert (argno < 2);
+ 	info = get_info (ctx, call, argno, non_constant_p, overflow_p,
+ 			 jump_target);
+ 	if (*jump_target || *non_constant_p)
+ 	  return NULL_TREE;
+ 	ht = REFLECT_EXPR_HANDLE (info);
+ 	if (((minfo->kind >> ((argno + 1) * METAFN_KIND_SHIFT))
+ 	     & METAFN_KIND_MASK) == METAFN_KIND_ARG_TINFO)
+ 	  {
+ 	    if (eval_is_type (ht) != boolean_true_node)
+ 	      return throw_exception_nontype (loc, ctx, fun, non_constant_p,
+ 					      jump_target);
+ 	  }
+ 	if (argno == 0)
+ 	  {
+ 	    kind = REFLECT_EXPR_KIND (info);
+ 	    h = ht;
+ 	  }
+ 	else
+ 	  h1 = ht;
+ 	break;
+       case METAFN_KIND_ARG_REFLECTION_RANGE:
+ 	gcc_assert (argno == 1);
+ 	hvec = get_info_vec (loc, ctx, call, argno, non_constant_p,
+ 			     overflow_p, jump_target, fun);
+ 	if (*jump_target || *non_constant_p)
+ 	  return NULL_TREE;
+ 	break;
+       case METAFN_KIND_ARG_REFLECTION_RANGET:
+ 	hvec = get_type_info_vec (loc, ctx, call, argno, non_constant_p,
+ 				overflow_p, jump_target, fun);
+ 	if (*jump_target || *non_constant_p)
+ 	  return NULL_TREE;
+ 	break;
+       case METAFN_KIND_ARG_INPUT_RANGE:
+ 	/* Handled in eval_reflect_constant_*.  */
+ 	gcc_assert (argno == 0);
+ 	break;
+       case METAFN_KIND_ARG_TEMPLATE_PARM:
+       case METAFN_KIND_ARG_TEMPLATE_PARM_REF:
+ 	type = TREE_VEC_ELT (get_template_innermost_arguments (fun), 0);
+ 	/* FALLTHRU */
+       case METAFN_KIND_ARG_SIZE_T:
+       case METAFN_KIND_ARG_OPERATORS:
+ 	gcc_assert (argno == 0);
+ 	expr = get_nth_callarg (call, 0);
+ 	expr = cxx_eval_constant_expression (ctx, expr, vc_prvalue,
+ 					     non_constant_p, overflow_p,
+ 					     jump_target);
+ 	if (*jump_target || *non_constant_p)
+ 	  return NULL_TREE;
+ 	break;
+       case METAFN_KIND_ARG_UNSIGNED:
+       case METAFN_KIND_ARG_ACCESS_CONTEXT:
+       case METAFN_KIND_ARG_DATA_MEMBER_OPTIONS:
+ 	gcc_assert (argno == 1);
+ 	expr = get_nth_callarg (call, argno);
+ 	expr = cxx_eval_constant_expression (ctx, expr, vc_prvalue,
+ 					     non_constant_p, overflow_p,
+ 					     jump_target);
+ 	if (*jump_target || *non_constant_p)
+ 	  return NULL_TREE;
+ 	break;
+       default:
+ 	gcc_unreachable ();
+       }
+ 
+   switch (minfo->code)
+     {
+     case METAFN_OPERATOR_OF:
+       return eval_operator_of (loc, ctx, h, non_constant_p, jump_target,
+ 			       TREE_TYPE (call), fun);
+     case METAFN_SYMBOL_OF:
+       return eval_symbol_of (loc, ctx, expr, non_constant_p, jump_target,
+ 			     char_type_node, TREE_TYPE (call), fun);
+     case METAFN_U8SYMBOL_OF:
+       return eval_symbol_of (loc, ctx, expr, non_constant_p, jump_target,
+ 			     char8_type_node, TREE_TYPE (call), fun);
+     case METAFN_HAS_IDENTIFIER:
+       return eval_has_identifier (h, kind);
+     case METAFN_IDENTIFIER_OF:
+       return eval_identifier_of (loc, ctx, h, kind, non_constant_p, jump_target,
+ 				 char_type_node, TREE_TYPE (call), fun);
+     case METAFN_U8IDENTIFIER_OF:
+       return eval_identifier_of (loc, ctx, h, kind, non_constant_p, jump_target,
+ 				 char8_type_node, TREE_TYPE (call), fun);
+     case METAFN_DISPLAY_STRING_OF:
+       return eval_display_string_of (loc, ctx, h, kind, non_constant_p,
+ 				     jump_target, char_type_node,
+ 				     TREE_TYPE (call), fun);
+     case METAFN_U8DISPLAY_STRING_OF:
+       return eval_display_string_of (loc, ctx, h, kind, non_constant_p,
+ 				     jump_target, char8_type_node,
+ 				     TREE_TYPE (call), fun);
+     case METAFN_SOURCE_LOCATION_OF:
+       return eval_source_location_of (loc, h, kind, TREE_TYPE (call));
+     case METAFN_TYPE_OF:
+       return eval_type_of (loc, ctx, h, kind, non_constant_p, jump_target, fun);
+     case METAFN_OBJECT_OF:
+       return eval_object_of (loc, ctx, h, kind, non_constant_p, overflow_p,
+ 			     jump_target, fun);
+     case METAFN_CONSTANT_OF:
+       return eval_constant_of (loc, ctx, h, kind, non_constant_p, overflow_p,
+ 			       jump_target, fun);
+     case METAFN_IS_PUBLIC:
+       return eval_is_public (h, kind);
+     case METAFN_IS_PROTECTED:
+       return eval_is_protected (h, kind);
+     case METAFN_IS_PRIVATE:
+       return eval_is_private (h, kind);
+     case METAFN_IS_VIRTUAL:
+       return eval_is_virtual (h, kind);
+     case METAFN_IS_PURE_VIRTUAL:
+       return eval_is_pure_virtual (h);
+     case METAFN_IS_OVERRIDE:
+       return eval_is_override (h);
+     case METAFN_IS_FINAL:
+       return eval_is_final (h);
+     case METAFN_IS_DELETED:
+       return eval_is_deleted (h);
+     case METAFN_IS_DEFAULTED:
+       return eval_is_defaulted (h);
+     case METAFN_IS_USER_PROVIDED:
+       return eval_is_user_provided (h);
+     case METAFN_IS_USER_DECLARED:
+       return eval_is_user_declared (h);
+     case METAFN_IS_EXPLICIT:
+       return eval_is_explicit (h);
+     case METAFN_IS_NOEXCEPT:
+       return eval_is_noexcept (h);
+     case METAFN_IS_BIT_FIELD:
+       return eval_is_bit_field (h, kind);
+     case METAFN_IS_ENUMERATOR:
+       return eval_is_enumerator (h);
+     case METAFN_IS_ANNOTATION:
+       return eval_is_annotation (h, kind);
+     case METAFN_IS_CONST:
+       return eval_is_const (h, kind);
+     case METAFN_IS_VOLATILE:
+       return eval_is_volatile (h, kind);
+     case METAFN_IS_MUTABLE_MEMBER:
+       return eval_is_mutable_member (h);
+     case METAFN_IS_LVALUE_REFERENCE_QUALIFIED:
+       return eval_is_lrvalue_reference_qualified (h, kind, /*rvalue_p=*/false);
+     case METAFN_IS_RVALUE_REFERENCE_QUALIFIED:
+       return eval_is_lrvalue_reference_qualified (h, kind, /*rvalue_p=*/true);
+     case METAFN_HAS_STATIC_STORAGE_DURATION:
+       return eval_has_static_storage_duration (h, kind);
+     case METAFN_HAS_THREAD_STORAGE_DURATION:
+       return eval_has_thread_storage_duration (h, kind);
+     case METAFN_HAS_AUTOMATIC_STORAGE_DURATION:
+       return eval_has_automatic_storage_duration (h, kind);
+     case METAFN_HAS_INTERNAL_LINKAGE:
+       return eval_has_internal_linkage (h, kind);
+     case METAFN_HAS_MODULE_LINKAGE:
+       return eval_has_module_linkage (h, kind);
+     case METAFN_HAS_EXTERNAL_LINKAGE:
+       return eval_has_external_linkage (h, kind);
+     case METAFN_HAS_C_LANGUAGE_LINKAGE:
+       return eval_has_c_language_linkage (h, kind);
+     case METAFN_HAS_LINKAGE:
+       return eval_has_linkage (h, kind);
+     case METAFN_IS_COMPLETE_TYPE:
+       return eval_is_complete_type (h);
+     case METAFN_IS_ENUMERABLE_TYPE:
+       return eval_is_enumerable_type (h);
+     case METAFN_IS_VARIABLE:
+       return eval_is_variable (h, kind);
+     case METAFN_IS_TYPE:
+       return eval_is_type (h);
+     case METAFN_IS_NAMESPACE:
+       return eval_is_namespace (h);
+     case METAFN_IS_TYPE_ALIAS:
+       return eval_is_type_alias (h);
+     case METAFN_IS_NAMESPACE_ALIAS:
+       return eval_is_namespace_alias (h);
+     case METAFN_IS_FUNCTION:
+       return eval_is_function (h);
+     case METAFN_IS_CONVERSION_FUNCTION:
+       return eval_is_conversion_function (h);
+     case METAFN_IS_OPERATOR_FUNCTION:
+       return eval_is_operator_function (h);
+     case METAFN_IS_LITERAL_OPERATOR:
+       return eval_is_literal_operator (h);
+     case METAFN_IS_SPECIAL_MEMBER_FUNCTION:
+       return eval_is_special_member_function (h);
+     case METAFN_IS_CONSTRUCTOR:
+       return eval_is_constructor (h);
+     case METAFN_IS_DEFAULT_CONSTRUCTOR:
+       return eval_is_default_constructor (h);
+     case METAFN_IS_COPY_CONSTRUCTOR:
+       return eval_is_copy_constructor (h);
+     case METAFN_IS_MOVE_CONSTRUCTOR:
+       return eval_is_move_constructor (h);
+     case METAFN_IS_ASSIGNMENT:
+       return eval_is_assignment (h);
+     case METAFN_IS_COPY_ASSIGNMENT:
+       return eval_is_copy_assignment (h);
+     case METAFN_IS_MOVE_ASSIGNMENT:
+       return eval_is_move_assignment (h);
+     case METAFN_IS_DESTRUCTOR:
+       return eval_is_destructor (h);
+     case METAFN_IS_FUNCTION_PARAMETER:
+       return eval_is_function_parameter (h, kind);
+     case METAFN_IS_EXPLICIT_OBJECT_PARAMETER:
+       return eval_is_explicit_object_parameter (h, kind);
+     case METAFN_HAS_DEFAULT_ARGUMENT:
+       return eval_has_default_argument (h, kind);
+     case METAFN_HAS_ELLIPSIS_PARAMETER:
+       return eval_has_ellipsis_parameter (h);
+     case METAFN_IS_TEMPLATE:
+       return eval_is_template (h);
+     case METAFN_IS_FUNCTION_TEMPLATE:
+       return eval_is_function_template (h);
+     case METAFN_IS_VARIABLE_TEMPLATE:
+       return eval_is_variable_template (h);
+     case METAFN_IS_CLASS_TEMPLATE:
+       return eval_is_class_template (h);
+     case METAFN_IS_ALIAS_TEMPLATE:
+       return eval_is_alias_template (h);
+     case METAFN_IS_CONVERSION_FUNCTION_TEMPLATE:
+       return eval_is_conversion_function_template (h);
+     case METAFN_IS_OPERATOR_FUNCTION_TEMPLATE:
+       return eval_is_operator_function_template (h);
+     case METAFN_IS_LITERAL_OPERATOR_TEMPLATE:
+       return eval_is_literal_operator_template (h);
+     case METAFN_IS_CONSTRUCTOR_TEMPLATE:
+       return eval_is_constructor_template (h);
+     case METAFN_IS_CONCEPT:
+       return eval_is_concept (h);
+     case METAFN_IS_VALUE:
+       return eval_is_value (kind);
+     case METAFN_IS_OBJECT:
+       return eval_is_object (kind);
+     case METAFN_IS_STRUCTURED_BINDING:
+       return eval_is_structured_binding (h, kind);
+     case METAFN_IS_CLASS_MEMBER:
+       return eval_is_class_member (h);
+     case METAFN_IS_NAMESPACE_MEMBER:
+       return eval_is_namespace_member (h);
+     case METAFN_IS_NONSTATIC_DATA_MEMBER:
+       return eval_is_nonstatic_data_member (h);
+     case METAFN_IS_STATIC_MEMBER:
+       return eval_is_static_member (h);
+     case METAFN_IS_BASE:
+       return eval_is_base (h, kind);
+     case METAFN_HAS_DEFAULT_MEMBER_INITIALIZER:
+       return eval_has_default_member_initializer (h);
+     case METAFN_HAS_PARENT:
+       return eval_has_parent (h, kind);
+     case METAFN_PARENT_OF:
+       return eval_parent_of (loc, ctx, h, kind, non_constant_p, jump_target,
+ 			     fun);
+     case METAFN_DEALIAS:
+       return eval_dealias (loc, h, kind);
+     case METAFN_HAS_TEMPLATE_ARGUMENTS:
+       return eval_has_template_arguments (h);
+     case METAFN_TEMPLATE_OF:
+       return eval_template_of (loc, ctx, h, non_constant_p, jump_target, fun);
+     case METAFN_TEMPLATE_ARGUMENTS_OF:
+       return eval_template_arguments_of (loc, ctx, h, non_constant_p,
+ 					 jump_target, fun);
+     case METAFN_PARAMETERS_OF:
+       return eval_parameters_of (loc, ctx, h, non_constant_p, jump_target,
+ 				 fun);
+     case METAFN_VARIABLE_OF:
+       return eval_variable_of (loc, ctx, h, kind, non_constant_p, jump_target,
+ 			       fun);
+     case METAFN_RETURN_TYPE_OF:
+       return eval_return_type_of (loc, ctx, h, kind, non_constant_p,
+ 				  jump_target, fun);
+     case METAFN_IS_ACCESSIBLE:
+       return eval_is_accessible (loc, ctx, h, kind, expr, call,
+ 				 non_constant_p, jump_target, fun);
+     case METAFN_HAS_INACCESSIBLE_NONSTATIC_DATA_MEMBERS:
+       return eval_has_inaccessible_nonstatic_data_members (loc, ctx, h, expr,
+ 							   call,
+ 							   non_constant_p,
+ 							   jump_target, fun);
+     case METAFN_HAS_INACCESSIBLE_BASES:
+       return eval_has_inaccessible_bases (loc, ctx, h, expr, call,
+ 					  non_constant_p, jump_target, fun);
+     case METAFN_HAS_INACCESSIBLE_SUBOBJECTS:
+       return eval_has_inaccessible_subobjects (loc, ctx, h, expr, call,
+ 					       non_constant_p, jump_target,
+ 					       fun);
+     case METAFN_MEMBERS_OF:
+       return eval_members_of (loc, ctx, h, expr, call, non_constant_p,
+ 			      jump_target, fun);
+     case METAFN_BASES_OF:
+       return eval_bases_of (loc, ctx, h, expr, call, non_constant_p,
+ 			    jump_target, fun);
+     case METAFN_STATIC_DATA_MEMBERS_OF:
+       return eval_static_data_members_of (loc, ctx, h, expr, call,
+ 					  non_constant_p, jump_target,
+ 					  fun);
+     case METAFN_NONSTATIC_DATA_MEMBERS_OF:
+       return eval_nonstatic_data_members_of (loc, ctx, h, expr, call,
+ 					     non_constant_p, jump_target,
+ 					     fun);
+     case METAFN_SUBOBJECTS_OF:
+       return eval_subobjects_of (loc, ctx, h, expr, call, non_constant_p,
+ 				 jump_target, fun);
+     case METAFN_ENUMERATORS_OF:
+       return eval_enumerators_of (loc, ctx, h, non_constant_p, jump_target,
+ 				  fun);
+     case METAFN_OFFSET_OF:
+       return eval_offset_of (loc, ctx, h, kind, TREE_TYPE (call),
+ 			     non_constant_p, jump_target, fun);
+     case METAFN_SIZE_OF:
+       return eval_size_of (loc, ctx, h, kind, TREE_TYPE (call), non_constant_p,
+ 			   jump_target, fun);
+     case METAFN_ALIGNMENT_OF:
+       return eval_alignment_of (loc, ctx, h, kind, TREE_TYPE (call),
+ 				non_constant_p, jump_target, fun);
+     case METAFN_BIT_SIZE_OF:
+       return eval_bit_size_of (loc, ctx, h, kind, TREE_TYPE (call),
+ 			       non_constant_p, jump_target, fun);
+     case METAFN_EXTRACT:
+       {
+ 	type = TREE_VEC_ELT (get_template_innermost_arguments (fun), 0);
+ 	return eval_extract (loc, ctx, type, h, kind, non_constant_p,
+ 			     overflow_p, jump_target, fun);
+       }
+     case METAFN_CAN_SUBSTITUTE:
+       return eval_can_substitute (loc, ctx, h, hvec, non_constant_p,
+ 				  jump_target, fun);
+     case METAFN_SUBSTITUTE:
+       return eval_substitute (loc, ctx, h, hvec, non_constant_p, jump_target,
+ 			      fun);
+     case METAFN_REFLECT_CONSTANT:
+       return eval_reflect_constant (loc, ctx, type, expr, non_constant_p,
+ 				    jump_target, fun);
+     case METAFN_REFLECT_OBJECT:
+       return eval_reflect_object (loc, ctx, type, expr, non_constant_p,
+ 				  jump_target, fun);
+     case METAFN_REFLECT_FUNCTION:
+       return eval_reflect_function (loc, ctx, type, expr, non_constant_p,
+ 				    jump_target, fun);
+     case METAFN_REFLECT_CONSTANT_STRING:
+       return eval_reflect_constant_string (loc, ctx, call, non_constant_p,
+ 					   overflow_p, jump_target, fun);
+     case METAFN_REFLECT_CONSTANT_ARRAY:
+       return eval_reflect_constant_array (loc, ctx, call, non_constant_p,
+ 					  overflow_p, jump_target, fun);
+     case METAFN_DATA_MEMBER_SPEC:
+       return eval_data_member_spec (loc, ctx, h, expr, non_constant_p,
+ 				    overflow_p, jump_target, fun);
+     case METAFN_IS_DATA_MEMBER_SPEC:
+       return eval_is_data_member_spec (h, kind);
+     case METAFN_DEFINE_AGGREGATE:
+       return eval_define_aggregate (loc, ctx, h, hvec, call, non_constant_p);
+     case METAFN_IS_VOID_TYPE:
+       return eval_is_void_type (h);
+     case METAFN_IS_NULL_POINTER_TYPE:
+       return eval_is_null_pointer_type (h);
+     case METAFN_IS_INTEGRAL_TYPE:
+       return eval_is_integral_type (h);
+     case METAFN_IS_FLOATING_POINT_TYPE:
+       return eval_is_floating_point_type (h);
+     case METAFN_IS_ARRAY_TYPE:
+       return eval_is_array_type (loc, h);
+     case METAFN_IS_POINTER_TYPE:
+       return eval_is_pointer_type (loc, h);
+     case METAFN_IS_LVALUE_REFERENCE_TYPE:
+       return eval_is_lvalue_reference_type (h);
+     case METAFN_IS_RVALUE_REFERENCE_TYPE:
+       return eval_is_rvalue_reference_type (h);
+     case METAFN_IS_MEMBER_OBJECT_POINTER_TYPE:
+       return eval_is_member_object_pointer_type (loc, h);
+     case METAFN_IS_MEMBER_FUNCTION_POINTER_TYPE:
+       return eval_is_member_function_pointer_type (loc, h);
+     case METAFN_IS_ENUM_TYPE:
+       return eval_is_enum_type (loc, h);
+     case METAFN_IS_UNION_TYPE:
+       return eval_is_union_type (loc, h);
+     case METAFN_IS_CLASS_TYPE:
+       return eval_is_class_type (loc, h);
+     case METAFN_IS_FUNCTION_TYPE:
+       return eval_is_function_type (h);
+     case METAFN_IS_REFLECTION_TYPE:
+       return eval_is_reflection_type (h);
+     case METAFN_IS_REFERENCE_TYPE:
+       return eval_is_reference_type (loc, h);
+     case METAFN_IS_ARITHMETIC_TYPE:
+       return eval_is_arithmetic_type (h);
+     case METAFN_IS_FUNDAMENTAL_TYPE:
+       return eval_is_fundamental_type (h);
+     case METAFN_IS_OBJECT_TYPE:
+       return eval_is_object_type (loc, h);
+     case METAFN_IS_SCALAR_TYPE:
+       return eval_is_scalar_type (h);
+     case METAFN_IS_COMPOUND_TYPE:
+       return eval_is_compound_type (h);
+     case METAFN_IS_MEMBER_POINTER_TYPE:
+       return eval_is_member_pointer_type (loc, h);
+     case METAFN_IS_CONST_TYPE:
+       return eval_is_const_type (h);
+     case METAFN_IS_VOLATILE_TYPE:
+       return eval_is_volatile_type (h);
+     case METAFN_IS_TRIVIALLY_COPYABLE_TYPE:
+       return eval_is_trivially_copyable_type (h);
+     case METAFN_IS_STANDARD_LAYOUT_TYPE:
+       return eval_is_standard_layout_type (h);
+     case METAFN_IS_EMPTY_TYPE:
+       return eval_is_empty_type (loc, h);
+     case METAFN_IS_POLYMORPHIC_TYPE:
+       return eval_is_polymorphic_type (loc, h);
+     case METAFN_IS_ABSTRACT_TYPE:
+       return eval_is_abstract_type (h);
+     case METAFN_IS_FINAL_TYPE:
+       return eval_is_final_type (loc, h);
+     case METAFN_IS_AGGREGATE_TYPE:
+       return eval_is_aggregate_type (h);
+     case METAFN_IS_CONSTEVAL_ONLY_TYPE:
+       return eval_is_consteval_only_type (h);
+     case METAFN_IS_SIGNED_TYPE:
+       return eval_is_signed_type (h);
+     case METAFN_IS_UNSIGNED_TYPE:
+       return eval_is_unsigned_type (h);
+     case METAFN_IS_BOUNDED_ARRAY_TYPE:
+       return eval_is_bounded_array_type (loc, h);
+     case METAFN_IS_UNBOUNDED_ARRAY_TYPE:
+       return eval_is_unbounded_array_type (h);
+     case METAFN_IS_SCOPED_ENUM_TYPE:
+       return eval_is_scoped_enum_type (h);
+     case METAFN_IS_CONSTRUCTIBLE_TYPE:
+       return eval_is_constructible_type (h, hvec);
+     case METAFN_IS_DEFAULT_CONSTRUCTIBLE_TYPE:
+       return eval_is_default_constructible_type (h);
+     case METAFN_IS_COPY_CONSTRUCTIBLE_TYPE:
+       return eval_is_copy_constructible_type (h);
+     case METAFN_IS_MOVE_CONSTRUCTIBLE_TYPE:
+       return eval_is_move_constructible_type (h);
+     case METAFN_IS_ASSIGNABLE_TYPE:
+       return eval_is_assignable_type (loc, h, h1);
+     case METAFN_IS_COPY_ASSIGNABLE_TYPE:
+       return eval_is_copy_assignable_type (h);
+     case METAFN_IS_MOVE_ASSIGNABLE_TYPE:
+       return eval_is_move_assignable_type (h);
+     case METAFN_IS_SWAPPABLE_WITH_TYPE:
+       return eval_is_swappable_with_type (loc, ctx, h, h1, call,
+ 					  non_constant_p, jump_target, fun,
+ 					  "is_swappable_with");
+     case METAFN_IS_SWAPPABLE_TYPE:
+       return eval_is_swappable_type (loc, ctx, h, call, non_constant_p,
+ 				     jump_target, fun, "is_swappable");
+     case METAFN_IS_DESTRUCTIBLE_TYPE:
+       return eval_is_destructible_type (loc, h);
+     case METAFN_IS_TRIVIALLY_CONSTRUCTIBLE_TYPE:
+       return eval_is_trivially_constructible_type (h, hvec);
+     case METAFN_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE_TYPE:
+       return eval_is_trivially_default_constructible_type (h);
+     case METAFN_IS_TRIVIALLY_COPY_CONSTRUCTIBLE_TYPE:
+       return eval_is_trivially_copy_constructible_type (h);
+     case METAFN_IS_TRIVIALLY_MOVE_CONSTRUCTIBLE_TYPE:
+       return eval_is_trivially_move_constructible_type (h);
+     case METAFN_IS_TRIVIALLY_ASSIGNABLE_TYPE:
+       return eval_is_trivially_assignable_type (loc, h, h1);
+     case METAFN_IS_TRIVIALLY_COPY_ASSIGNABLE_TYPE:
+       return eval_is_trivially_copy_assignable_type (h);
+     case METAFN_IS_TRIVIALLY_MOVE_ASSIGNABLE_TYPE:
+       return eval_is_trivially_move_assignable_type (h);
+     case METAFN_IS_TRIVIALLY_DESTRUCTIBLE_TYPE:
+       return eval_is_trivially_destructible_type (loc, h);
+     case METAFN_IS_NOTHROW_CONSTRUCTIBLE_TYPE:
+       return eval_is_nothrow_constructible_type (h, hvec);
+     case METAFN_IS_NOTHROW_DEFAULT_CONSTRUCTIBLE_TYPE:
+       return eval_is_nothrow_default_constructible_type (h);
+     case METAFN_IS_NOTHROW_COPY_CONSTRUCTIBLE_TYPE:
+       return eval_is_nothrow_copy_constructible_type (h);
+     case METAFN_IS_NOTHROW_MOVE_CONSTRUCTIBLE_TYPE:
+       return eval_is_nothrow_move_constructible_type (h);
+     case METAFN_IS_NOTHROW_ASSIGNABLE_TYPE:
+       return eval_is_nothrow_assignable_type (loc, h, h1);
+     case METAFN_IS_NOTHROW_COPY_ASSIGNABLE_TYPE:
+       return eval_is_nothrow_copy_assignable_type (h);
+     case METAFN_IS_NOTHROW_MOVE_ASSIGNABLE_TYPE:
+       return eval_is_nothrow_move_assignable_type (h);
+     case METAFN_IS_NOTHROW_SWAPPABLE_WITH_TYPE:
+       return eval_is_swappable_with_type (loc, ctx, h, h1, call,
+ 					  non_constant_p, jump_target, fun,
+ 					  "is_nothrow_swappable_with");
+     case METAFN_IS_NOTHROW_SWAPPABLE_TYPE:
+       return eval_is_swappable_type (loc, ctx, h, call, non_constant_p,
+ 				     jump_target, fun, "is_nothrow_swappable");
+     case METAFN_IS_NOTHROW_DESTRUCTIBLE_TYPE:
+       return eval_is_nothrow_destructible_type (loc, h);
+     case METAFN_IS_IMPLICIT_LIFETIME_TYPE:
+       return eval_is_implicit_lifetime_type (h);
+     case METAFN_HAS_VIRTUAL_DESTRUCTOR:
+       return eval_has_virtual_destructor (h);
+     case METAFN_HAS_UNIQUE_OBJECT_REPRESENTATIONS:
+       return eval_has_unique_object_representations (h);
+     case METAFN_REFERENCE_CONSTRUCTS_FROM_TEMPORARY:
+       return eval_reference_constructs_from_temporary (loc, h, h1);
+     case METAFN_REFERENCE_CONVERTS_FROM_TEMPORARY:
+       return eval_reference_converts_from_temporary (loc, h, h1);
+     case METAFN_RANK:
+       return eval_rank (h);
+     case METAFN_EXTENT:
+       return eval_extent (loc, h, expr);
+     case METAFN_IS_SAME_TYPE:
+       return eval_is_same_type (loc, h, h1);
+     case METAFN_IS_BASE_OF_TYPE:
+       return eval_is_base_of_type (loc, h, h1);
+     case METAFN_IS_VIRTUAL_BASE_OF_TYPE:
+       return eval_is_virtual_base_of_type (loc, h, h1);
+     case METAFN_IS_CONVERTIBLE_TYPE:
+       return eval_is_convertible_type (loc, h, h1);
+     case METAFN_IS_NOTHROW_CONVERTIBLE_TYPE:
+       return eval_is_nothrow_convertible_type (loc, h, h1);
+     case METAFN_IS_LAYOUT_COMPATIBLE_TYPE:
+       return eval_is_layout_compatible_type (loc, h, h1);
+     case METAFN_IS_POINTER_INTERCONVERTIBLE_BASE_OF_TYPE:
+       return eval_is_pointer_interconvertible_base_of_type (loc, h, h1);
+     case METAFN_IS_INVOCABLE_TYPE:
+       return eval_is_invocable_type (loc, h, hvec);
+     case METAFN_IS_INVOCABLE_R_TYPE:
+       return eval_is_invocable_r_type (loc, ctx, h, h1, hvec, call,
+ 				       non_constant_p, jump_target, fun,
+ 				       "is_invocable_r");
+     case METAFN_IS_NOTHROW_INVOCABLE_TYPE:
+       return eval_is_nothrow_invocable_type (loc, h, hvec);
+     case METAFN_IS_NOTHROW_INVOCABLE_R_TYPE:
+       return eval_is_invocable_r_type (loc, ctx, h, h1, hvec, call,
+ 				       non_constant_p, jump_target, fun,
+ 				       "is_nothrow_invocable_r");
+     case METAFN_REMOVE_CONST:
+       return eval_remove_const (loc, h);
+     case METAFN_REMOVE_VOLATILE:
+       return eval_remove_volatile (loc, h);
+     case METAFN_REMOVE_CV:
+       return eval_remove_cv (loc, h);
+     case METAFN_ADD_CONST:
+       return eval_add_const (loc, h);
+     case METAFN_ADD_VOLATILE:
+       return eval_add_volatile (loc, h);
+     case METAFN_ADD_CV:
+       return eval_add_cv (loc, h);
+     case METAFN_REMOVE_REFERENCE:
+       return eval_remove_reference (loc, h);
+     case METAFN_ADD_LVALUE_REFERENCE:
+       return eval_add_lvalue_reference (loc, h);
+     case METAFN_ADD_RVALUE_REFERENCE:
+       return eval_add_rvalue_reference (loc, h);
+     case METAFN_MAKE_SIGNED:
+       return eval_make_signed (loc, ctx, h, false, non_constant_p, jump_target,
+ 			       fun);
+     case METAFN_MAKE_UNSIGNED:
+       return eval_make_signed (loc, ctx, h, true, non_constant_p, jump_target,
+ 			       fun);
+     case METAFN_REMOVE_EXTENT:
+       return eval_remove_extent (loc, h);
+     case METAFN_REMOVE_ALL_EXTENTS:
+       return eval_remove_all_extents (loc, h);
+     case METAFN_REMOVE_POINTER:
+       return eval_remove_pointer (loc, h);
+     case METAFN_ADD_POINTER:
+       return eval_add_pointer (loc, h);
+     case METAFN_REMOVE_CVREF:
+       return eval_remove_cvref (loc, h);
+     case METAFN_DECAY:
+       return eval_decay (loc, h);
+     case METAFN_COMMON_TYPE:
+       return eval_common_type (loc, ctx, hvec, call, non_constant_p,
+ 			       jump_target, fun, ident);
+     case METAFN_COMMON_REFERENCE:
+       return eval_common_type (loc, ctx, hvec, call, non_constant_p,
+ 			       jump_target, fun, ident);
+     case METAFN_UNDERLYING_TYPE:
+       return eval_underlying_type (loc, ctx, h, non_constant_p, jump_target,
+ 				   fun);
+     case METAFN_INVOKE_RESULT:
+       return eval_invoke_result (loc, ctx, h, hvec, call, non_constant_p,
+ 				 jump_target, fun);
+     case METAFN_UNWRAP_REFERENCE:
+       return eval_unwrap_reference (loc, ctx, h, call, non_constant_p,
+ 				    jump_target, fun, ident);
+     case METAFN_UNWRAP_REF_DECAY:
+       return eval_unwrap_reference (loc, ctx, h, call, non_constant_p,
+ 				    jump_target, fun, ident);
+     case METAFN_TUPLE_SIZE:
+       return eval_tuple_size (loc, ctx, h, call, non_constant_p, jump_target,
+ 			      fun);
+     case METAFN_TUPLE_ELEMENT:
+       return eval_tuple_element (loc, ctx, expr, h1, call,
+ 				 non_constant_p, jump_target, fun);
+     case METAFN_VARIANT_SIZE:
+       return eval_variant_size (loc, ctx, h, call, non_constant_p,
+ 				jump_target, fun);
+     case METAFN_VARIANT_ALTERNATIVE:
+       return eval_variant_alternative (loc, ctx, expr, h1, call,
+ 				       non_constant_p, jump_target, fun);
+     case METAFN_TYPE_ORDER:
+       return eval_type_order (h, h1);
+     case METAFN_ANNOTATIONS_OF:
+       return eval_annotations_of (loc, ctx, h, kind, NULL_TREE, non_constant_p,
+ 				  jump_target, fun);
+     case METAFN_ANNOTATIONS_OF_WITH_TYPE:
+       return eval_annotations_of (loc, ctx, h, kind, h1, non_constant_p,
+ 				  jump_target, fun);
+     /* Special metafunctions.  */
+     case METAFN_ACCESS_CONTEXT_CURRENT:
+       if (DECL_CLASS_SCOPE_P (fun)
+ 	  && TYPE_NAME (DECL_CONTEXT (fun))
+ 	  && TREE_CODE (TYPE_NAME (DECL_CONTEXT (fun))) == TYPE_DECL
+ 	  && DECL_NAME (TYPE_NAME (DECL_CONTEXT (fun)))
+ 	  && id_equal (DECL_NAME (TYPE_NAME (DECL_CONTEXT (fun))),
+ 		       "access_context"))
+ 	return eval_access_context_current (loc, ctx, call, non_constant_p);
+       goto not_found;
+     case METAFN_EXCEPTION__S_EXCEPTION_CVT_TO_UTF8:
+     case METAFN_EXCEPTION__S_EXCEPTION_CVT_FROM_UTF8:
+       if (DECL_CLASS_SCOPE_P (fun)
+ 	  && TYPE_NAME (DECL_CONTEXT (fun))
+ 	  && TREE_CODE (TYPE_NAME (DECL_CONTEXT (fun))) == TYPE_DECL
+ 	  && DECL_NAME (TYPE_NAME (DECL_CONTEXT (fun)))
+ 	  && id_equal (DECL_NAME (TYPE_NAME (DECL_CONTEXT (fun))),
+ 		       "exception"))
+ 	{
+ 	  bool to_utf8
+ 	    = minfo->code == METAFN_EXCEPTION__S_EXCEPTION_CVT_TO_UTF8;
+ 	  return eval_exception__S_exception_cvt_tofrom_utf8 (loc, ctx, call,
+ 							      non_constant_p,
+ 							      overflow_p,
+ 							      jump_target,
+ 							      fun, to_utf8);
+ 	}
+       goto not_found;
+     }
+   goto not_found;
+ }
+ 
+ /* Splice reflection REFL; i.e., return its entity.  */
+ 
+ tree
+ splice (tree refl)
+ {
+   if (refl == error_mark_node)
+     return error_mark_node;
+ 
+   /* Who in the world am I?  That's the great puzzle and we have to wait
+      until instantiation to find out.  */
+   if (instantiation_dependent_expression_p (refl))
+     return build_nt (SPLICE_EXPR, refl);
+ 
+   /* [basic.splice] "The constant-expression of a splice-specifier shall
+      be a converted constant expression of type std::meta::info."  */
+   refl = build_converted_constant_expr (meta_info_type_node, refl,
+ 					tf_warning_or_error);
+ 
+   if (processing_template_decl)
+     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.  */
+   if (!mark_used (REFLECT_EXPR_HANDLE (refl)))
+     return error_mark_node;
+ 
+   refl = REFLECT_EXPR_HANDLE (refl);
+   /* Function templates are wrapped in OVERLOAD from name lookup
+      and a lot of places assume that.  Furthermore, if reflection comes
+      from ^^fntmpl, it is wrapped with OVERLOAD already, only when
+      it comes from e.g. members_of it is not.  */
+   if (DECL_FUNCTION_TEMPLATE_P (refl))
+     refl = ovl_make (refl, NULL_TREE);
+ 
+   return refl;
+ }
+ 
+ /* A walker for consteval_only_p.  It cannot be a lambda, because we
+    have to call this recursively, sigh.  */
+ 
+ static tree
+ consteval_only_type_r (tree *tp, int *walk_subtrees, void *data)
+ {
+   tree t = *tp;
+   /* Types can contain themselves recursively, hence this.  */
+   auto visited = static_cast<hash_set<tree> *>(data);
+ 
+   if (!TYPE_P (t))
+     return NULL_TREE;
+ 
+   if (REFLECTION_TYPE_P (t))
+     return t;
+ 
+   if (typedef_variant_p (t))
+     /* Tell cp_walk_subtrees to look through typedefs.  */
+     *walk_subtrees = 2;
+ 
+   if (RECORD_OR_UNION_TYPE_P (t))
+     {
+       /* Don't walk template arguments; A<info>::type isn't a consteval-only
+ 	 type.  */
+       *walk_subtrees = 0;
+       /* So we have to walk the fields manually.  */
+       for (tree member = TYPE_FIELDS (t);
+ 	   member; member = DECL_CHAIN (member))
+ 	if (TREE_CODE (member) == FIELD_DECL)
+ 	  if (tree r = cp_walk_tree (&TREE_TYPE (member),
+ 				     consteval_only_type_r, visited, visited))
+ 	    return r;
+     }
+ 
+   return NULL_TREE;
+ }
+ 
+ /* True if T is a consteval-only type as per [basic.types.general]:
+    "A type is consteval-only if it is either std::meta::info or a type
+    compounded from a consteval-only type", or something that has
+    a consteval-only type.  */
+ 
+ bool
+ consteval_only_p (tree t)
+ {
+   if (!flag_reflection)
+     return false;
+ 
+   if (!TYPE_P (t))
+     t = TREE_TYPE (t);
+ 
+   if (!t)
+     return false;
+ 
+   /* We need the complete type otherwise we'd have no fields for class
+      templates and thus come up with zilch for things like
+        template<typename T>
+        struct X : T { };
+      which could be consteval-only, depending on T.  */
+   t = complete_type (t);
+ 
+   /* Classes with std::meta::info members are also consteval-only.  */
+   hash_set<tree> visited;
+   return !!cp_walk_tree (&t, consteval_only_type_r, &visited, &visited);
+ }
+ 
+ /* Detect if a consteval-only expression EXPR or a consteval-only
+    variable EXPR not declared constexpr/constinit is used outside
+    a manifestly constant-evaluated context.  E.g.:
+ 
+      void f() {
+        constexpr auto r = ^^int;  // OK
+        [: r :] i = 42;  // still OK
+        auto z = r;  // bad
+      }
+ 
+    But
+ 
+      consteval void g() {
+        constexpr auto r = ^^int;
+        auto z = r;
+      }
+ 
+    is OK.  If COMPLAIN, emit an error; otherwise we're in the search-only
+    mode.  Return true if we found a problematic expression.  */
+ 
+ bool
+ check_out_of_consteval_use (tree expr, bool complain/*=true*/)
+ {
+   if (!flag_reflection || in_immediate_context ())
+     return false;
+ 
+   auto walker = [](tree *tp, int *walk_subtrees, void *) -> tree
+     {
+       tree t = *tp;
+ 
+       /* No need to look into types or unevaluated operands.  */
+       if (TYPE_P (t)
+ 	  || unevaluated_p (TREE_CODE (t))
+ 	  /* Don't walk INIT_EXPRs, because we'd emit bogus errors about
+ 	     member initializers.  */
+ 	  || TREE_CODE (t) == INIT_EXPR
+ 	  /* Don't walk BIND_EXPR_VARS.  */
+ 	  || TREE_CODE (t) == BIND_EXPR
+ 	  /* And don't recurse on DECL_EXPRs.  */
+ 	  || TREE_CODE (t) == DECL_EXPR)
+ 	{
+ 	  *walk_subtrees = false;
+ 	  return NULL_TREE;
+ 	}
+ 
+       /* A subexpression of a manifestly constant-evaluated expression is
+ 	 an immediate function context.  For example,
+ 
+ 	   consteval void foo (std::meta::info) { }
+ 	   void g() { foo (^^void); }
+ 
+ 	 is all good.  */
+       if (tree decl = cp_get_callee_fndecl_nofold (t))
+ 	if (immediate_invocation_p (decl))
+ 	  {
+ 	    *walk_subtrees = false;
+ 	    return NULL_TREE;
+ 	  }
+ 
+       if (VAR_P (t)
+ 	  && (DECL_DECLARED_CONSTEXPR_P (t) || DECL_DECLARED_CONSTINIT_P (t)))
+ 	/* This is fine, don't bother checking the type.  */
+ 	return NULL_TREE;
+ 
+       /* Now check the type to see if we are dealing with a consteval-only
+ 	 expression.  */
+       if (!consteval_only_p (t))
+ 	return NULL_TREE;
+ 
+       if (current_function_decl
+ 	  /* Already escalated.  */
+ 	  && (DECL_IMMEDIATE_FUNCTION_P (current_function_decl)
+ 	      /* These functions are magic.  */
+ 	      || is_std_allocator_allocate (current_function_decl)))
+ 	{
+ 	  *walk_subtrees = false;
+ 	  return NULL_TREE;
+ 	}
+ 
+       /* We might have to escalate if we are in an immediate-escalating
+ 	 function.  */
+       if (immediate_escalating_function_p (current_function_decl))
+ 	{
+ 	  promote_function_to_consteval (current_function_decl);
+ 	  *walk_subtrees = false;
+ 	  return NULL_TREE;
+ 	}
+ 
+       *walk_subtrees = false;
+       return t;
+     };
+ 
+   if (tree t = cp_walk_tree_without_duplicates (&expr, walker, nullptr))
+     {
+       if (complain)
+ 	{
+ 	  if (VAR_P (t))
+ 	    {
+ 	      auto_diagnostic_group d;
+ 	      error_at (cp_expr_loc_or_input_loc (t),
+ 			"consteval-only variable %qD not declared %<constexpr%> "
+ 			"used outside a constant-evaluated context", t);
+ 	      if (TREE_STATIC (t) || CP_DECL_THREAD_LOCAL_P (t))
+ 		inform (DECL_SOURCE_LOCATION (t), "add %<constexpr%> or "
+ 			"%<constinit%>");
+ 	      else
+ 		inform (DECL_SOURCE_LOCATION (t), "add %<constexpr%>");
+ 	    }
+ 	  else
+ 	    error_at (cp_expr_loc_or_input_loc (t),
+ 		      "consteval-only expressions are only allowed in "
+ 		      "a constant-evaluated context");
+ 	}
+       return true;
+     }
+ 
+   return false;
+ }
+ 
+ /* Return true if the reflections LHS and RHS are equal.  */
+ 
+ bool
+ compare_reflections (tree lhs, tree rhs)
+ {
+   reflect_kind lkind;
+   do
+     {
+       lkind = REFLECT_EXPR_KIND (lhs);
+       if (lkind != REFLECT_EXPR_KIND (rhs))
+ 	return false;
+       lhs = REFLECT_EXPR_HANDLE (lhs);
+       rhs = REFLECT_EXPR_HANDLE (rhs);
+     }
+   while (REFLECT_EXPR_P (lhs) && REFLECT_EXPR_P (rhs));
+ 
+   lhs = resolve_nondeduced_context (lhs, tf_warning_or_error);
+   rhs = resolve_nondeduced_context (rhs, tf_warning_or_error);
+ 
+   /* TEMPLATE_DECLs are wrapped in an OVERLOAD.  When we have
+ 
+        template_of (^^fun_tmpl<int>) == ^^fun_tmpl
+ 
+      the RHS will be OVERLOAD<TEMPLATE_DECL> but the LHS will
+      only be TEMPLATE_DECL.  They should compare equal, though.  */
+   // ??? Can we do something better?
+   lhs = maybe_get_reflection_fndecl (lhs);
+   rhs = maybe_get_reflection_fndecl (rhs);
+   if (lkind == REFLECT_PARM)
+     {
+       lhs = maybe_update_function_parm (lhs);
+       rhs = maybe_update_function_parm (rhs);
+     }
+   else if (lkind == REFLECT_DATA_MEMBER_SPEC)
+     return (TREE_VEC_ELT (lhs, 0) == TREE_VEC_ELT (rhs, 0)
+ 	    && TREE_VEC_ELT (lhs, 1) == TREE_VEC_ELT (rhs, 1)
+ 	    && tree_int_cst_equal (TREE_VEC_ELT (lhs, 2),
+ 				   TREE_VEC_ELT (rhs, 2))
+ 	    && tree_int_cst_equal (TREE_VEC_ELT (lhs, 3),
+ 				   TREE_VEC_ELT (rhs, 3))
+ 	    && TREE_VEC_ELT (lhs, 4) == TREE_VEC_ELT (rhs, 4));
+ 
+   if (lhs == rhs)
+     return true;
+ 
+   /* Some trees are not shared.  */
+   if (TREE_CODE (lhs) == TREE_CODE (rhs))
+     switch (TREE_CODE (lhs))
+       {
+       case ARRAY_REF:
+       case COMPONENT_REF:
+       case REAL_CST:
+ 	return cp_tree_equal (lhs, rhs);
+       default:
+ 	break;
+       }
+ 
+   if (TYPE_P (lhs) && TYPE_P (rhs))
+     if (!typedef_variant_p (lhs) && !typedef_variant_p (rhs))
+       return same_type_p (lhs, rhs);
+ 
+   return false;
+ }
+ 
+ /* Return true if T is a valid splice-type-specifier.
+    [dcl.type.splice]: For a splice-type-specifier of the form
+    "typename[opt] splice-specifier", the splice-specifier shall designate
+    a type, a class template, or an alias template.
+    For a splice-type-specifier of the form
+    "typename[opt] splice-specialization-specifier", the splice-specifier
+    of the splice-specialization-specifier shall designate a template T
+    that is either a class template or an alias template.  */
+ 
+ bool
+ valid_splice_type_p (const_tree t)
+ {
+   return TYPE_P (t);
+ }
+ 
+ /* Return true if T is a valid splice-scope-specifier.
+    [basic.lookup.qual.general]: If a splice-scope-specifier is followed
+    by a ::, it shall either be a dependent splice-scope-specifier or it
+    shall designate a namespace, class, enumeration, or dependent type.  */
+ 
+ bool
+ valid_splice_scope_p (const_tree t)
+ {
+   return (CLASS_TYPE_P (t)
+ 	  || TREE_CODE (t) == ENUMERAL_TYPE
+ 	  || TREE_CODE (t) == NAMESPACE_DECL);
+ }
+ 
+ /* Check a function DECL for CWG 3115: Every function of consteval-only
+    type shall be an immediate function.  */
+ 
+ void
+ check_consteval_only_fn (tree decl)
+ {
+   if (!DECL_IMMEDIATE_FUNCTION_P (decl)
+       && consteval_only_p (decl)
+       /* But if the function can be escalated, merrily we roll along.  */
+       && !immediate_escalating_function_p (decl)
+       && !is_std_allocator_allocate (decl))
+     error_at (DECL_SOURCE_LOCATION (decl),
+ 	      "function of consteval-only type must be declared %qs",
+ 	      "consteval");
+ }
+ 
+ /* Check if T is a valid result of splice-expression.  ADDRESS_P is true if
+    we are taking the address of the splice.  MEMBER_ACCESS_P is true if this
+    splice is used in foo.[: bar :] or foo->[: bar :] context.  COMPLAIN_P is
+    true if any errors should be emitted.  Returns true is no problems are
+    found, false otherwise.  */
+ 
+ bool
+ check_splice_expr (location_t loc, location_t start_loc, tree t,
+ 		   bool address_p, bool member_access_p, bool complain_p)
+ {
+   /* We may not have gotten an expression.  */
+   if (TREE_CODE (t) == TYPE_DECL
+       || TREE_CODE (t) == NAMESPACE_DECL
+       || TYPE_P (t))
+     {
+       if (complain_p)
+ 	{
+ 	  if (TYPE_P (t))
+ 	    {
+ 	      auto_diagnostic_group d;
+ 	      error_at (loc, "expected a reflection of an expression instead "
+ 			"of type %qT", t);
+ 	      if (start_loc != UNKNOWN_LOCATION)
+ 		{
+ 		  rich_location richloc (line_table, start_loc);
+ 		  richloc.add_fixit_insert_before (start_loc, "typename");
+ 		  inform (&richloc, "add %<typename%> to denote a type "
+ 			  "outside a type-only context");
+ 		}
+ 	      else
+ 		inform (loc, "add %<typename%> to denote a type outside "
+ 			"a type-only context");
+ 	    }
+ 	  else
+ 	    error_at (loc, "expected a reflection of an expression instead "
+ 		      "of %qD", t);
+ 	}
+       return false;
+     }
+   /* [expr.prim.splice]/2 For a splice-expression of the form
+      splice-specifier, the expression is ill-formed if it is:  */
+   /* -- a constructor or a destructor  */
+   if (TREE_CODE (t) == FUNCTION_DECL
+       && (DECL_CONSTRUCTOR_P (t) || DECL_DESTRUCTOR_P (t)))
+     {
+       if (complain_p)
+ 	error_at (loc, "cannot use constructor or destructor %qD in a splice "
+ 		  "expression", t);
+       return false;
+     }
+   /* -- an unnamed bit-field  */
+   if (TREE_CODE (t) == FIELD_DECL && DECL_UNNAMED_BIT_FIELD (t))
+     {
+       if (complain_p)
+ 	error_at (loc, "cannot use an unnamed bit-field %qD in a splice "
+ 		  "expression", t);
+       return false;
+     }
+   /* Class members may not be implicitly referenced through a splice.
+      But taking the address is fine, and so is class member access a la
+      foo.[: ^^S::bar :].  */
+   if (!address_p
+       && !member_access_p
+       && DECL_P (t)
+       && DECL_NONSTATIC_MEMBER_P (t))
+     {
+       if (complain_p)
+ 	error_at (loc, "cannot implicitly reference a class member %qD "
+ 		  "through a splice", t);
+       return false;
+     }
+   /* [expr.unary.op]/3.1 "If the operand [of unary &] is a qualified-id or
+      splice-expression designating a non-static member m, other than an
+      explicit object member function, m shall be a direct member of some
+      class C that is not an anonymous union."  */
+   if (address_p
+       && TREE_CODE (t) == FIELD_DECL
+       && ANON_UNION_TYPE_P (DECL_CONTEXT (t))
+       && !TYPE_P (context_for_name_lookup (t)))
+     {
+       if (complain_p)
+ 	error_at (loc, "unary %<&%> applied to an anonymous union member "
+ 		       "%qD that is not a direct member of a named class", t);
+       return false;
+     }
+ 
+   /* [expr.prim.splice]/2: "The expression is ill-formed if S [the construct
+      designated by splice-specifier] is
+      -- 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),
+      so do it the suboptimal way.  */
+   if (TREE_CODE (t) == TREE_LIST && annotation_p (t))
+     {
+       if (complain_p)
+ 	error_at (loc, "cannot use an annotation %qE in a splice expression",
+ 		  t);
+       return false;
+     }
+ 
+   /* Same, but with REFLECT_DATA_MEMBER_SPEC.  */
+   if (TREE_CODE (t) == TREE_VEC)
+     {
+       if (complain_p)
+ 	error_at (loc, "cannot use a data member specification in a "
+ 		  "splice expression");
+       return false;
+     }
+ 
+   return true;
+ }
+ 
+ /* Create a new SPLICE_SCOPE tree.  EXPR is its SPLICE_SCOPE_EXPR, and
+    TYPE_P says if it should have SPLICE_SCOPE_TYPE_P set.  */
+ 
+ tree
+ make_splice_scope (tree expr, bool type_p)
+ {
+   tree t = cxx_make_type (SPLICE_SCOPE);
+   SPLICE_SCOPE_EXPR (t) = expr;
+   SPLICE_SCOPE_TYPE_P (t) = type_p;
+   return t;
+ }
+ 
+ /* Return true if T is a splice expression; that is, it is either [:T:] or
+    [:T:]<arg>.  */
+ 
+ bool
+ dependent_splice_p (const_tree t)
+ {
+   return (TREE_CODE (t) == SPLICE_EXPR
+ 	  || (TREE_CODE (t) == TEMPLATE_ID_EXPR
+ 	      && TREE_CODE (TREE_OPERAND (t, 0)) == SPLICE_EXPR));
+ }
+ 
+ /* Annotation index for mangling.  */
+ 
+ static GTY(()) int annotation_idx;
+ 
+ /* Helper function for mangle.cc (write_reflection).
+    Determine 2 letter mangling prefix and store it into prefix.
+    Additionally return the reflection handle possibly adjusted so that
+    write_reflection can mangle the operands of it if any are needed.  */
+ 
+ tree
+ reflection_mangle_prefix (tree refl, char prefix[3])
+ {
+   tree h = REFLECT_EXPR_HANDLE (refl);
+   reflect_kind kind = REFLECT_EXPR_KIND (refl);
+   if (h == unknown_type_node)
+     {
+       strcpy (prefix, "nu");
+       return NULL_TREE;
+     }
+   if (eval_is_value (kind) == boolean_true_node)
+     {
+       strcpy (prefix, "vl");
+       if (VAR_P (h) && DECL_NTTP_OBJECT_P (h))
+ 	h = tparm_object_argument (h);
+       return h;
+     }
+   if (eval_is_object (kind) == boolean_true_node)
+     {
+       strcpy (prefix, "ob");
+       return h;
+     }
+   if (eval_is_variable (h, kind) == boolean_true_node)
+     {
+       strcpy (prefix, "vr");
+       return h;
+     }
+   if (eval_is_structured_binding (h, kind) == boolean_true_node)
+     {
+       strcpy (prefix, "sb");
+       return h;
+     }
+   if (eval_is_function (h) == boolean_true_node)
+     {
+       strcpy (prefix, "fn");
+       return maybe_get_reflection_fndecl (h);
+     }
+   if (eval_is_function_parameter (h, kind) == boolean_true_node)
+     {
+       strcpy (prefix, "pa");
+       return maybe_update_function_parm (h);
+     }
+   if (eval_is_enumerator (h) == boolean_true_node)
+     {
+       strcpy (prefix, "en");
+       return h;
+     }
+   if (eval_is_annotation (h, kind) == boolean_true_node)
+     {
+       strcpy (prefix, "an");
+       if (TREE_PURPOSE (TREE_VALUE (h)) == NULL_TREE)
+ 	TREE_PURPOSE (TREE_VALUE (h))
+ 	  = build_int_cst (integer_type_node, annotation_idx++);
+       return TREE_PURPOSE (TREE_VALUE (h));
+     }
+   if (eval_is_type_alias (h) == boolean_true_node)
+     {
+       strcpy (prefix, "ta");
+       return h;
+     }
+   if (eval_is_type (h) == boolean_true_node)
+     {
+       strcpy (prefix, "ty");
+       return h;
+     }
+   if (eval_is_nonstatic_data_member (h) == boolean_true_node)
+     {
+       strcpy (prefix, "dm");
+       return h;
+     }
+   if (TREE_CODE (h) == FIELD_DECL && DECL_UNNAMED_BIT_FIELD (h))
+     {
+       strcpy (prefix, "un");
+       return h;
+     }
+   if (eval_is_class_template (h) == boolean_true_node)
+     {
+       strcpy (prefix, "ct");
+       return h;
+     }
+   if (eval_is_function_template (h) == boolean_true_node)
+     {
+       strcpy (prefix, "ft");
+       h = maybe_get_reflection_fndecl (h);
+       return h;
+     }
+   if (eval_is_variable_template (h) == boolean_true_node)
+     {
+       strcpy (prefix, "vt");
+       return h;
+     }
+   if (eval_is_alias_template (h) == boolean_true_node)
+     {
+       strcpy (prefix, "at");
+       return h;
+     }
+   if (eval_is_concept (h) == boolean_true_node)
+     {
+       strcpy (prefix, "co");
+       return h;
+     }
+   if (eval_is_namespace_alias (h) == boolean_true_node)
+     {
+       strcpy (prefix, "na");
+       return h;
+     }
+   if (eval_is_namespace (h) == boolean_true_node)
+     {
+       if (h == global_namespace)
+ 	{
+ 	  strcpy (prefix, "ng");
+ 	  return NULL_TREE;
+ 	}
+       strcpy (prefix, "ns");
+       return h;
+     }
+   if (eval_is_base (h, kind) == boolean_true_node)
+     {
+       strcpy (prefix, "ba");
+       return h;
+     }
+   if (eval_is_data_member_spec (h, kind) == boolean_true_node)
+     {
+       strcpy (prefix, "ds");
+       return h;
+     }
+   gcc_unreachable ();
+ }
+ 
+ #include "gt-cp-reflect.h"
diff -Nrcpad gcc-16-20260111/gcc/cp/search.cc gcc-16-20260118/gcc/cp/search.cc
*** gcc-16-20260111/gcc/cp/search.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/search.cc	Sun Jan 18 22:32:07 2026
*************** lookup_member (tree xbasetype, tree name
*** 1243,1249 ****
  	    {
  	      auto_diagnostic_group d;
  	      error ("request for member %qD is ambiguous", name);
! 	      print_candidates (lfi.ambiguous);
  	    }
  	  return error_mark_node;
  	}
--- 1243,1249 ----
  	    {
  	      auto_diagnostic_group d;
  	      error ("request for member %qD is ambiguous", name);
! 	      print_candidates (input_location, lfi.ambiguous);
  	    }
  	  return error_mark_node;
  	}
*************** check_final_overrider (tree overrider, t
*** 2123,2133 ****
        return 0;
      }
  
!   /* A consteval virtual function shall not override a virtual function that is
!      not consteval. A consteval virtual function shall not be overridden by a
!      virtual function that is not consteval.  */
!   if (DECL_IMMEDIATE_FUNCTION_P (overrider)
!       != DECL_IMMEDIATE_FUNCTION_P (basefn))
      {
        auto_diagnostic_group d;
        if (DECL_IMMEDIATE_FUNCTION_P (overrider))
--- 2123,2137 ----
        return 0;
      }
  
!   /* A class with a consteval virtual function that overrides a virtual
!      function that is not consteval shall have consteval-only type (CWG 3117).
!      A consteval virtual function shall not be overridden by a virtual
!      function that is not consteval.  */
!   if ((DECL_IMMEDIATE_FUNCTION_P (basefn)
!        && !DECL_IMMEDIATE_FUNCTION_P (overrider))
!       || (!DECL_IMMEDIATE_FUNCTION_P (basefn)
! 	  && DECL_IMMEDIATE_FUNCTION_P (overrider)
! 	  && !consteval_only_p (overrider)))
      {
        auto_diagnostic_group d;
        if (DECL_IMMEDIATE_FUNCTION_P (overrider))
diff -Nrcpad gcc-16-20260111/gcc/cp/semantics.cc gcc-16-20260118/gcc/cp/semantics.cc
*** gcc-16-20260111/gcc/cp/semantics.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/semantics.cc	Sun Jan 18 22:32:07 2026
*************** finish_template_type (tree name, tree ar
*** 4456,4470 ****
      return TYPE_NAME (type);
  }
  
! /* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER.
!    Return a TREE_LIST containing the ACCESS_SPECIFIER and the
!    BASE_CLASS, or NULL_TREE if an error occurred.  The
     ACCESS_SPECIFIER is one of
!    access_{default,public,protected_private}_node.  For a virtual base
     we set TREE_TYPE.  */
  
  tree
! finish_base_specifier (tree base, tree access, bool virtual_p)
  {
    tree result;
  
--- 4456,4473 ----
      return TYPE_NAME (type);
  }
  
! /* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER
!    and ANNOTATIONS.
!    Return a TREE_LIST containing the ACCESS_SPECIFIER (or if there are
!    ANNOTATIONS, TREE_LIST containing the ACCESS_SPECIFIER and ANNOTATIONS)
!    and the BASE_CLASS, or NULL_TREE if an error occurred.  The
     ACCESS_SPECIFIER is one of
!    access_{default,public,protected,private}_node.  For a virtual base
     we set TREE_TYPE.  */
  
  tree
! finish_base_specifier (tree base, tree access, bool virtual_p,
! 		       tree annotations)
  {
    tree result;
  
*************** finish_base_specifier (tree base, tree a
*** 4486,4491 ****
--- 4489,4496 ----
  	     class type?  */
  	  base = TYPE_MAIN_VARIANT (base);
  	}
+       if (annotations)
+ 	access = build_tree_list (access, nreverse (annotations));
        result = build_tree_list (access, base);
        if (virtual_p)
  	TREE_TYPE (result) = integer_type_node;
*************** baselink_for_fns (tree fns)
*** 4524,4530 ****
  
  /* Returns true iff we are currently parsing a lambda-declarator.  */
  
! static bool
  parsing_lambda_declarator ()
  {
    cp_binding_level *b = current_binding_level;
--- 4529,4535 ----
  
  /* Returns true iff we are currently parsing a lambda-declarator.  */
  
! bool
  parsing_lambda_declarator ()
  {
    cp_binding_level *b = current_binding_level;
*************** finish_id_expression_1 (tree id_expressi
*** 4774,4779 ****
--- 4779,4785 ----
  	{
  	  /* Name lookup failed.  */
  	  if (scope
+ 	      && !dependent_namespace_p (scope)
  	      && (!TYPE_P (scope)
  		  || (!dependentish_scope_p (scope)
  		      && !(identifier_p (id_expression)
*************** finish_id_expression_1 (tree id_expressi
*** 4934,4940 ****
  	  auto_diagnostic_group d;
  	  error ("request for member %qD is ambiguous in "
  		 "multiple inheritance lattice", id_expression);
! 	  print_candidates (decl);
  	  return error_mark_node;
  	}
  
--- 4940,4946 ----
  	  auto_diagnostic_group d;
  	  error ("request for member %qD is ambiguous in "
  		 "multiple inheritance lattice", id_expression);
! 	  print_candidates (input_location, decl);
  	  return error_mark_node;
  	}
  
*************** fold_builtin_is_corresponding_member (lo
*** 13654,13659 ****
--- 13660,13716 ----
  				   fold_convert (TREE_TYPE (arg1), arg2)));
  }
  
+ /* Fold __builtin_is_string_literal call.  */
+ 
+ tree
+ fold_builtin_is_string_literal (location_t loc, int nargs, tree *args)
+ {
+   /* Unless users call the builtin directly, the following 3 checks should be
+      ensured from std::is_string_literal overloads.  */
+   if (nargs != 1)
+     {
+       error_at (loc, "%<__builtin_is_string_literal%> needs a single "
+ 		"argument");
+       return boolean_false_node;
+     }
+   tree arg = args[0];
+   if (error_operand_p (arg))
+     return boolean_false_node;
+   if (!TYPE_PTR_P (TREE_TYPE (arg))
+       || !TYPE_READONLY (TREE_TYPE (TREE_TYPE (arg)))
+       || TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (arg))))
+     {
+     arg_invalid:
+       error_at (loc, "%<__builtin_is_string_literal%> "
+ 		     "argument is not %<const char*%>, %<const wchar_t*%>, "
+ 		     "%<const char8_t*%>, %<const char16_t*%> or "
+ 		     "%<const char32_t*%>");
+       return boolean_false_node;
+     }
+   tree chart = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (arg)));
+   if (chart != char_type_node
+       && chart != wchar_type_node
+       && chart != char8_type_node
+       && chart != char16_type_node
+       && chart != char32_type_node)
+     goto arg_invalid;
+ 
+   STRIP_NOPS (arg);
+   while (TREE_CODE (arg) == POINTER_PLUS_EXPR)
+     {
+       arg = TREE_OPERAND (arg, 0);
+       STRIP_NOPS (arg);
+     }
+   if (TREE_CODE (arg) != ADDR_EXPR)
+     return boolean_false_node;
+   arg = TREE_OPERAND (arg, 0);
+   if (TREE_CODE (arg) == ARRAY_REF)
+     arg = TREE_OPERAND (arg, 0);
+   if (TREE_CODE (arg) != STRING_CST)
+     return boolean_false_node;
+   return boolean_true_node;
+ }
+ 
  /* [basic.types] 8.  True iff TYPE is an object type.  */
  
  static bool
*************** trait_expr_value (cp_trait_kind kind, tr
*** 13913,13918 ****
--- 13970,13978 ----
      case CPTK_IS_DEDUCIBLE:
        return type_targs_deducible_from (type1, type2);
  
+     case CPTK_IS_CONSTEVAL_ONLY:
+       return consteval_only_p (type1);
+ 
      /* __array_rank, __builtin_type_order and __builtin_structured_binding_size
         are handled in finish_trait_expr.  */
      case CPTK_RANK:
*************** finish_trait_expr (location_t loc, cp_tr
*** 14093,14098 ****
--- 14153,14159 ----
      case CPTK_IS_STD_LAYOUT:
      case CPTK_IS_TRIVIAL:
      case CPTK_IS_TRIVIALLY_COPYABLE:
+     case CPTK_IS_CONSTEVAL_ONLY:
      case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
        if (!check_trait_type (type1, /* kind = */ 2))
  	return error_mark_node;
diff -Nrcpad gcc-16-20260111/gcc/cp/tree.cc gcc-16-20260118/gcc/cp/tree.cc
*** gcc-16-20260111/gcc/cp/tree.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/tree.cc	Sun Jan 18 22:32:07 2026
*************** static tree handle_init_priority_attribu
*** 48,53 ****
--- 48,54 ----
  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 *);
  
  /* If REF is an lvalue, returns the kind of lvalue that REF is.
     Otherwise, returns clk_none.  */
*************** builtin_valid_in_constant_expr_p (const_
*** 568,573 ****
--- 569,575 ----
  	  case CP_BUILT_IN_IS_CORRESPONDING_MEMBER:
  	  case CP_BUILT_IN_IS_POINTER_INTERCONVERTIBLE_WITH_CLASS:
  	  case CP_BUILT_IN_EH_PTR_ADJUST_REF:
+ 	  case CP_BUILT_IN_IS_STRING_LITERAL:
  	    return true;
  	  default:
  	    break;
*************** cp_tree_equal (tree t1, tree t2)
*** 4508,4513 ****
--- 4510,4521 ----
  	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))
+ 	return false;
+       return true;
+ 
      default:
        break;
      }
*************** const scoped_attribute_specs std_attribu
*** 5603,5609 ****
  static const attribute_spec internal_attributes[] =
  {
    { "aligned", 0, 1, false, false, false, false,
!     handle_alignas_attribute, attr_aligned_exclusions }
  };
  
  const scoped_attribute_specs internal_attribute_table =
--- 5611,5619 ----
  static const attribute_spec internal_attributes[] =
  {
    { "aligned", 0, 1, false, false, false, false,
!     handle_alignas_attribute, attr_aligned_exclusions },
!   { "annotation ", 1, 1, false, false, false, false,
!     handle_annotation_attribute, NULL }
  };
  
  const scoped_attribute_specs internal_attribute_table =
*************** handle_no_dangling_attribute (tree *node
*** 5891,5896 ****
--- 5901,5978 ----
    return NULL_TREE;
  }
  
+ /* Perform checking for annotations.  */
+ 
+ tree
+ handle_annotation_attribute (tree *node, tree ARG_UNUSED (name),
+ 			     tree args, int ARG_UNUSED (flags),
+ 			     bool *no_add_attrs)
+ {
+   if (TYPE_P (*node)
+       && TREE_CODE (*node) != ENUMERAL_TYPE
+       && TREE_CODE (*node) != RECORD_TYPE
+       && TREE_CODE (*node) != UNION_TYPE)
+     {
+       error ("annotation on a type other than class or enumeration "
+ 	     "definition");
+       *no_add_attrs = true;
+       return NULL_TREE;
+     }
+   if (TREE_CODE (*node) == LABEL_DECL)
+     {
+       error ("annotation applied to a label");
+       *no_add_attrs = true;
+       return NULL_TREE;
+     }
+   if (TREE_CODE (*node) == FIELD_DECL && DECL_UNNAMED_BIT_FIELD (*node))
+     {
+       error ("annotation on unnamed bit-field");
+       *no_add_attrs = true;
+       return NULL_TREE;
+     }
+   if (!type_dependent_expression_p (TREE_VALUE (args)))
+     {
+       if (!structural_type_p (TREE_TYPE (TREE_VALUE (args))))
+ 	{
+ 	  auto_diagnostic_group d;
+ 	  error ("annotation does not have structural type");
+ 	  structural_type_p (TREE_TYPE (TREE_VALUE (args)), true);
+ 	  *no_add_attrs = true;
+ 	  return NULL_TREE;
+ 	}
+       if (CLASS_TYPE_P (TREE_TYPE (TREE_VALUE (args))))
+ 	{
+ 	  tree arg = make_tree_vec (1);
+ 	  tree type = TREE_TYPE (TREE_VALUE (args));
+ 	  tree ctype
+ 	    = cp_build_qualified_type (type, cp_type_quals (type)
+ 					     | TYPE_QUAL_CONST);
+ 	  TREE_VEC_ELT (arg, 0)
+ 	    = cp_build_reference_type (ctype, /*rval=*/false);
+ 	  if (!is_xible (INIT_EXPR, type, arg))
+ 	    {
+ 	      auto_diagnostic_group d;
+ 	      error ("annotation does not have copy constructible type");
+ 	      is_xible (INIT_EXPR, type, arg, /*explain=*/true);
+ 	      *no_add_attrs = true;
+ 	      return NULL_TREE;
+ 	    }
+ 	}
+     }
+   if (!processing_template_decl)
+     {
+       location_t loc = EXPR_LOCATION (TREE_VALUE (args));
+       TREE_VALUE (args) = cxx_constant_value (TREE_VALUE (args));
+       if (error_operand_p (TREE_VALUE (args)))
+         *no_add_attrs = true;
+       auto suppression
+ 	= make_temp_override (suppress_location_wrappers, 0);
+       TREE_VALUE (args) = maybe_wrap_with_location (TREE_VALUE (args), loc);
+     }
+   ATTR_UNIQUE_VALUE_P (args) = 1;
+   return NULL_TREE;
+ }
+ 
  /* Return a new PTRMEM_CST of the indicated TYPE.  The MEMBER is the
     thing pointed to by the constant.  */
  
*************** decl_linkage (tree decl)
*** 6358,6367 ****
      {
        /* But this could be a typedef name for linkage purposes, in which
  	 case we're interested in the linkage of the main decl.  */
!       if (decl == TYPE_NAME (TYPE_MAIN_VARIANT (TREE_TYPE (decl)))
! 	  /* Likewise for the injected-class-name.  */
! 	  || DECL_SELF_REFERENCE_P (decl))
! 	decl = TYPE_MAIN_DECL (TREE_TYPE (decl));
        else
  	return lk_none;
      }
--- 6440,6452 ----
      {
        /* But this could be a typedef name for linkage purposes, in which
  	 case we're interested in the linkage of the main decl.  */
!       tree type = TREE_TYPE (decl);
!       if (type == error_mark_node)
! 	return lk_none;
!       else if (decl == TYPE_NAME (TYPE_MAIN_VARIANT (type))
! 	       /* Likewise for the injected-class-name.  */
! 	       || DECL_SELF_REFERENCE_P (decl))
! 	decl = TYPE_MAIN_DECL (type);
        else
  	return lk_none;
      }
*************** maybe_adjust_arg_pos_for_attribute (cons
*** 6811,6816 ****
--- 6896,6909 ----
    return n > 0 ? n - 1 : 0;
  }
  
+ /* True if ATTR is annotation.  */
+ 
+ bool
+ annotation_p (tree attr)
+ {
+   return is_attribute_p ("annotation ", get_attribute_name (attr));
+ }
+ 
  
  /* Release memory we no longer need after parsing.  */
  void
diff -Nrcpad gcc-16-20260111/gcc/cp/typeck.cc gcc-16-20260118/gcc/cp/typeck.cc
*** gcc-16-20260111/gcc/cp/typeck.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/cp/typeck.cc	Sun Jan 18 22:32:07 2026
*************** complain_about_unrecognized_member (tree
*** 3466,3481 ****
  
  /* This function is called by the parser to process a class member
     access expression of the form OBJECT.NAME.  NAME is a node used by
!    the parser to represent a name; it is not yet a DECL.  It may,
!    however, be a BASELINK where the BASELINK_FUNCTIONS is a
!    TEMPLATE_ID_EXPR.  Templates must be looked up by the parser, and
     there is no reason to do the lookup twice, so the parser keeps the
     BASELINK.  TEMPLATE_P is true iff NAME was explicitly declared to
!    be a template via the use of the "A::template B" syntax.  */
  
  tree
  finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
! 				 tsubst_flags_t complain)
  {
    tree expr;
    tree object_type;
--- 3466,3483 ----
  
  /* This function is called by the parser to process a class member
     access expression of the form OBJECT.NAME.  NAME is a node used by
!    the parser to represent a name; it is not yet a DECL, except when
!    SPLICE_P.  It may, however, be a BASELINK where the BASELINK_FUNCTIONS
!    is a TEMPLATE_ID_EXPR.  Templates must be looked up by the parser, and
     there is no reason to do the lookup twice, so the parser keeps the
     BASELINK.  TEMPLATE_P is true iff NAME was explicitly declared to
!    be a template via the use of the "A::template B" syntax.  SPLICE_P
!    is true if NAME was designated by a splice-expression.  */
  
  tree
  finish_class_member_access_expr (cp_expr object, tree name, bool template_p,
! 				 tsubst_flags_t complain,
! 				 bool splice_p/*=false*/)
  {
    tree expr;
    tree object_type;
*************** finish_class_member_access_expr (cp_expr
*** 3511,3521 ****
  	     lookup until we instantiate the T.  */
  	  || (TREE_CODE (name) == IDENTIFIER_NODE
  	      && IDENTIFIER_CONV_OP_P (name)
! 	      && dependent_type_p (TREE_TYPE (name))))
  	{
  	dependent:
! 	  return build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF,
  				   orig_object, orig_name, NULL_TREE);
  	}
      }
    else if (c_dialect_objc ()
--- 3513,3530 ----
  	     lookup until we instantiate the T.  */
  	  || (TREE_CODE (name) == IDENTIFIER_NODE
  	      && IDENTIFIER_CONV_OP_P (name)
! 	      && dependent_type_p (TREE_TYPE (name)))
! 	  /* This is OBJECT.[:R:], which is dependent.  */
! 	  || dependent_splice_p (name)
! 	  /* This is OBJECT.[:T::R:], which is dependent.  */
! 	  || (TREE_CODE (name) == SCOPE_REF
! 	      && dependent_splice_p (TREE_OPERAND (name, 1))))
  	{
  	dependent:
! 	  expr = build_min_nt_loc (UNKNOWN_LOCATION, COMPONENT_REF,
  				   orig_object, orig_name, NULL_TREE);
+ 	  COMPONENT_REF_SPLICE_P (expr) = splice_p;
+ 	  return expr;
  	}
      }
    else if (c_dialect_objc ()
*************** finish_class_member_access_expr (cp_expr
*** 3549,3554 ****
--- 3558,3573 ----
    if (BASELINK_P (name))
      /* A member function that has already been looked up.  */
      member = name;
+   else if (TREE_CODE (name) == TREE_BINFO)
+     {
+       /* Splicing a base class subobject.  We can only get here via
+ 	 e1.[:e2:].  */
+       expr = build_base_path (PLUS_EXPR, object, name, /*nonnull=*/true,
+ 			      complain);
+       if (expr == error_mark_node && (complain & tf_error))
+ 	error_not_base_type (BINFO_TYPE (name), object_type);
+       return expr;
+     }
    else
      {
        bool is_template_id = false;
*************** finish_class_member_access_expr (cp_expr
*** 3575,3580 ****
--- 3594,3606 ----
  	      return error_mark_node;
  	    }
  	}
+       else if (splice_p
+ 	       && (TREE_CODE (name) == FIELD_DECL
+ 		   || VAR_P (name)
+ 		   || TREE_CODE (name) == CONST_DECL
+ 		   || TREE_CODE (name) == FUNCTION_DECL
+ 		   || DECL_FUNCTION_TEMPLATE_P (OVL_FIRST (name))))
+ 	scope = DECL_CONTEXT (OVL_FIRST (name));
  
        if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
  	{
*************** finish_class_member_access_expr (cp_expr
*** 3582,3588 ****
  	  template_args = TREE_OPERAND (name, 1);
  	  name = TREE_OPERAND (name, 0);
  
! 	  if (!identifier_p (name))
  	    name = OVL_NAME (name);
  	}
  
--- 3608,3618 ----
  	  template_args = TREE_OPERAND (name, 1);
  	  name = TREE_OPERAND (name, 0);
  
! 	  if (splice_p
! 	      && (DECL_FUNCTION_TEMPLATE_P (OVL_FIRST (name))
! 		  || variable_template_p (name)))
! 	    scope = DECL_CONTEXT (OVL_FIRST (name));
! 	  else if (!identifier_p (name))
  	    name = OVL_NAME (name);
  	}
  
*************** finish_class_member_access_expr (cp_expr
*** 3600,3606 ****
  			   scope, name, object_type);
  		  return error_mark_node;
  		}
! 	      tree val = lookup_enumerator (scope, name);
  	      if (!val)
  		{
  		  if (complain & tf_error)
--- 3630,3640 ----
  			   scope, name, object_type);
  		  return error_mark_node;
  		}
! 	      tree val;
! 	      if (splice_p && TREE_CODE (name) == CONST_DECL)
! 		val = name;
! 	      else
! 		val = lookup_enumerator (scope, name);
  	      if (!val)
  		{
  		  if (complain & tf_error)
*************** finish_class_member_access_expr (cp_expr
*** 3615,3621 ****
  	    }
  
  	  gcc_assert (CLASS_TYPE_P (scope));
! 	  gcc_assert (identifier_p (name) || TREE_CODE (name) == BIT_NOT_EXPR);
  
  	  if (constructor_name_p (name, scope))
  	    {
--- 3649,3664 ----
  	    }
  
  	  gcc_assert (CLASS_TYPE_P (scope));
! 	  gcc_assert (identifier_p (name)
! 		      || TREE_CODE (name) == BIT_NOT_EXPR
! 		      || (splice_p
! 			  && (TREE_CODE (name) == FIELD_DECL
! 			      || VAR_P (name)
! 			      || TREE_CODE (name) == CONST_DECL
! 			      || TREE_CODE (name) == FUNCTION_DECL
! 			      || DECL_FUNCTION_TEMPLATE_P
! 						(OVL_FIRST (name))
! 			      || variable_template_p (name))));
  
  	  if (constructor_name_p (name, scope))
  	    {
*************** finish_class_member_access_expr (cp_expr
*** 3629,3636 ****
  	     one copy of the data member that is shared by all the objects of
  	     the class.  So NAME can be unambiguously referred to even if
  	     there are multiple indirect base classes containing NAME.  */
! 	  const base_access ba = [scope, name] ()
  	    {
  	      if (identifier_p (name))
  		{
  		  tree m = lookup_member (scope, name, /*protect=*/0,
--- 3672,3684 ----
  	     one copy of the data member that is shared by all the objects of
  	     the class.  So NAME can be unambiguously referred to even if
  	     there are multiple indirect base classes containing NAME.  */
! 	  const base_access ba = [scope, name, splice_p] ()
  	    {
+ 	      /* [class.access.base]/5: A member m is accessible at the
+ 		 point R when designated in class N if
+ 		 -- m is designated by a splice-expression  */
+ 	      if (splice_p)
+ 		return ba_unique;
  	      if (identifier_p (name))
  		{
  		  tree m = lookup_member (scope, name, /*protect=*/0,
*************** finish_class_member_access_expr (cp_expr
*** 3662,3667 ****
--- 3710,3734 ----
  	    goto dependent;
  	  member = lookup_destructor (object, scope, name, complain);
  	}
+       else if (splice_p && (TREE_CODE (name) == FIELD_DECL
+ 			    || VAR_P (name)
+ 			    || TREE_CODE (name) == CONST_DECL
+ 			    || TREE_CODE (name) == FUNCTION_DECL
+ 			    || DECL_FUNCTION_TEMPLATE_P (OVL_FIRST (name))
+ 			    || variable_template_p (name)))
+ 	{
+ 	  member = name;
+ 	  name = OVL_FIRST (name);
+ 	  if (any_dependent_type_attributes_p (DECL_ATTRIBUTES (name)))
+ 	    /* Dependent type attributes on the decl mean that the TREE_TYPE is
+ 	       wrong, so don't use it.  */
+ 	    goto dependent;
+ 	  if (is_overloaded_fn (name))
+ 	    member
+ 	      = build_baselink (access_path, TYPE_BINFO (object_type), member,
+ 				IDENTIFIER_CONV_OP_P (DECL_NAME (name))
+ 				? TREE_TYPE (DECL_NAME (name)) : NULL_TREE);
+ 	}
        else
  	{
  	  /* Look up the member.  */
*************** finish_class_member_access_expr (cp_expr
*** 3741,3749 ****
  	    BASELINK_QUALIFIED_P (member) = 1;
  	  orig_name = member;
  	}
!       return build_min_non_dep (COMPONENT_REF, expr,
  				orig_object, orig_name,
  				NULL_TREE);
      }
  
    return expr;
--- 3808,3817 ----
  	    BASELINK_QUALIFIED_P (member) = 1;
  	  orig_name = member;
  	}
!       expr = build_min_non_dep (COMPONENT_REF, expr,
  				orig_object, orig_name,
  				NULL_TREE);
+       COMPONENT_REF_SPLICE_P (STRIP_REFERENCE_REF (expr)) = splice_p;
      }
  
    return expr;
*************** cp_build_binary_op (const op_location_t
*** 5790,5796 ****
  	  if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
  	    tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
  
! 	  if (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE))
  	    resultcode = RDIV_EXPR;
  	  else
  	    {
--- 5858,5867 ----
  	  if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
  	    tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
  
! 	  if (!((tcode0 == INTEGER_TYPE
! 		 || (tcode0 == ENUMERAL_TYPE && code0 == VECTOR_TYPE))
! 		&& (tcode1 == INTEGER_TYPE
! 		    || (tcode1 == ENUMERAL_TYPE && code1 == VECTOR_TYPE))))
  	    resultcode = RDIV_EXPR;
  	  else
  	    {
*************** cp_build_binary_op (const op_location_t
*** 6279,6284 ****
--- 6350,6359 ----
  	  return cp_build_binary_op (location,
  				     EQ_EXPR, e, integer_zero_node, complain);
  	}
+       /* [expr.eq]: "If both operands are of type std::meta::info,
+ 	 comparison is defined as follows..."  */
+       else if (code0 == META_TYPE && code1 == META_TYPE)
+ 	result_type = type0;
        else
  	{
  	  gcc_assert (!TYPE_PTRMEMFUNC_P (type0)
*************** check_return_expr (tree retval, bool *no
*** 11714,11719 ****
--- 11789,11800 ----
  	*dangling = true;
      }
  
+   if (check_out_of_consteval_use (retval))
+     {
+       current_function_return_value = error_mark_node;
+       return error_mark_node;
+     }
+ 
    /* A naive attempt to reduce the number of -Wdangling-reference false
       positives: if we know that this function can return a variable with
       static storage duration rather than one of its parameters, suppress
diff -Nrcpad gcc-16-20260111/gcc/defaults.h gcc-16-20260118/gcc/defaults.h
*** gcc-16-20260111/gcc/defaults.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/defaults.h	Sun Jan 18 22:32:07 2026
*************** see the files COPYING3 and COPYING.RUNTI
*** 390,396 ****
  /* Provide defaults for stuff that may not be defined when using
     sjlj exceptions.  */
  #ifndef EH_RETURN_DATA_REGNO
! #define EH_RETURN_DATA_REGNO(N) INVALID_REGNUM
  #endif
  
  /* Offset between the eh handler address and entry in eh tables.  */
--- 390,396 ----
  /* Provide defaults for stuff that may not be defined when using
     sjlj exceptions.  */
  #ifndef EH_RETURN_DATA_REGNO
! #define EH_RETURN_DATA_REGNO(N) (void (N), INVALID_REGNUM)
  #endif
  
  /* Offset between the eh handler address and entry in eh tables.  */
diff -Nrcpad gcc-16-20260111/gcc/doc/extend.texi gcc-16-20260118/gcc/doc/extend.texi
*** gcc-16-20260111/gcc/doc/extend.texi	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/doc/extend.texi	Sun Jan 18 22:32:07 2026
*************** asm ("" : "=r" (x));
*** 13544,13549 ****
--- 13544,13553 ----
  
  are not supported for hard register constraints.  This might be lifted.
  
+ Multiple hard register constraints in one alternative are also not supported.
+ Furthermore, combinations of hard register constraints and regular register
+ constraints in one alternative are not supported, too.
+ 
  @node Size of an asm
  @subsection Size of an @code{asm}
  
diff -Nrcpad gcc-16-20260111/gcc/doc/invoke.texi gcc-16-20260118/gcc/doc/invoke.texi
*** gcc-16-20260111/gcc/doc/invoke.texi	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/doc/invoke.texi	Sun Jan 18 22:32:07 2026
*************** in the following sections.
*** 252,258 ****
  -fnew-ttp-matching
  -fno-nonansi-builtins  -fnothrow-opt  -fno-operator-names
  -fno-optional-diags
! -fno-pretty-templates  -frange-for-ext-temps
  -fno-rtti  -fsized-deallocation
  -fstrict-enums  -fstrong-eval-order@r{[}=@var{kind}@r{]}
  -ftemplate-backtrace-limit=@var{n}
--- 252,258 ----
  -fnew-ttp-matching
  -fno-nonansi-builtins  -fnothrow-opt  -fno-operator-names
  -fno-optional-diags
! -fno-pretty-templates  -frange-for-ext-temps  -freflection
  -fno-rtti  -fsized-deallocation
  -fstrict-enums  -fstrong-eval-order@r{[}=@var{kind}@r{]}
  -ftemplate-backtrace-limit=@var{n}
*************** Objective-C and Objective-C++ Dialects}.
*** 1275,1289 ****
  -mhwmult=@var{type}  -minrt  -mtiny-printf  -mmax-inline-shift=@var{n}}
  
  @emph{NDS32 Options} (@ref{NDS32 Options})
! @gccoptlist{-mbig-endian  -mlittle-endian
  -mreduced-regs  -mfull-regs
! -mcmov  -mext-perf  -mext-perf2
! -mext-string  -mv3push  -m16bit
! -misr-vector-size=@var{num}
  -mcache-block-size=@var{num}
! -march=@var{arch}
  -mcmodel=@var{code-model}
! -mctor-dtor  -mrelax}
  
  @emph{Nvidia PTX Options} (@ref{Nvidia PTX Options})
  @gccoptlist{-m64  -march=@var{arch}  -misa=@var{arch}  -march-map=@var{arch}
--- 1275,1297 ----
  -mhwmult=@var{type}  -minrt  -mtiny-printf  -mmax-inline-shift=@var{n}}
  
  @emph{NDS32 Options} (@ref{NDS32 Options})
! @gccoptlist{-mbig-endian  -mlittle-endian  -EB  -EL
! -mabi=@var{name}  -mfloat-abi=@var{name}
  -mreduced-regs  -mfull-regs
! -malways-align  -malign-functions
! -mfp-as-gp  -mcmov  -mhw-abs
! -mext-perf  -mext-perf2  -mext-string  -mext-dsp
! -mext-fpu-fma  -mext-fpu-sp  -mext-fpu-dp
! -mv3push  -m16-bit  -mvh
! -misr-vector-size=@var{num}  -misr-secure=@var{num}
  -mcache-block-size=@var{num}
! -march=@var{arch}  -mcpu=@var{cpu}
! -mconfig-fpu=@var{num}  -mconfig-mul=@var{type}
! -mconfig-register-ports=@var{kind}
  -mcmodel=@var{code-model}
! -mctor-dtor  -mrelax  -mrelax-hint
! -msched-prolog-epilog  -mno-ret-in-naked-func
! -malways-save-lp   -munaligned-access  -minline-asm-r15}
  
  @emph{Nvidia PTX Options} (@ref{Nvidia PTX Options})
  @gccoptlist{-m64  -march=@var{arch}  -misa=@var{arch}  -march-map=@var{arch}
*************** See RS/6000 and PowerPC Options.
*** 1336,1367 ****
  -madjust-lmul-cost  -mmax-vectorization  -mno-autovec-segment}
  
  @emph{RL78 Options} (@ref{RL78 Options})
! @gccoptlist{-msim  -mmul=none  -mmul=g13  -mmul=g14  -mallregs
! -mcpu=g10  -mcpu=g13  -mcpu=g14  -mg10  -mg13  -mg14
! -m64bit-doubles  -m32bit-doubles  -msave-mduc-in-interrupts}
  
  @emph{RS/6000 and PowerPC Options} (@ref{RS/6000 and PowerPC Options})
  @gccoptlist{-mcpu=@var{cpu-type}
  -mtune=@var{cpu-type}
  -mcmodel=@var{code-model}
  -mpowerpc64
! -maltivec  -mno-altivec
! -mpowerpc-gpopt  -mno-powerpc-gpopt
! -mpowerpc-gfxopt  -mno-powerpc-gfxopt
! -mmfcrf  -mno-mfcrf  -mpopcntb  -mno-popcntb  -mpopcntd  -mno-popcntd
! -mfprnd  -mno-fprnd
! -mcmpb  -mno-cmpb  -mhard-dfp  -mno-hard-dfp
! -mfull-toc   -mminimal-toc  -mno-fp-in-toc  -mno-sum-in-toc
! -m64  -m32  -mxl-compat  -mno-xl-compat  -mpe
  -malign-power  -malign-natural
! -msoft-float  -mhard-float  -mmultiple  -mno-multiple
! -mupdate  -mno-update
! -mavoid-indexed-addresses  -mno-avoid-indexed-addresses
! -mfused-madd  -mno-fused-madd  -mbit-align  -mno-bit-align
! -mstrict-align  -mno-strict-align  -mrelocatable
! -mno-relocatable  -mrelocatable-lib  -mno-relocatable-lib
! -mtoc  -mno-toc  -mlittle  -mlittle-endian  -mbig  -mbig-endian
! -mdynamic-no-pic  -mswdiv  -msingle-pic-base
  -mprioritize-restricted-insns=@var{priority}
  -msched-costly-dep=@var{dependence_type}
  -minsert-sched-nops=@var{scheme}
--- 1344,1372 ----
  -madjust-lmul-cost  -mmax-vectorization  -mno-autovec-segment}
  
  @emph{RL78 Options} (@ref{RL78 Options})
! @gccoptlist{-msim  -mallregs  -mrelax  -mes0
! -mmul=none  -mmul=g13  -mmul=g14  -mmul=rl78
! -mcpu=g10  -mcpu=g13  -mcpu=g14  -mcpu=rl78
! -mg10  -mg13  -mg14  -mrl78
! -msave-mduc-in-interrupts}
  
  @emph{RS/6000 and PowerPC Options} (@ref{RS/6000 and PowerPC Options})
  @gccoptlist{-mcpu=@var{cpu-type}
  -mtune=@var{cpu-type}
  -mcmodel=@var{code-model}
  -mpowerpc64
! -maltivec
! -mpowerpc-gpopt  -mpowerpc-gfxopt  -mmfcrf  -mpopcntb  -mpopcntd
! -mfprnd  -mcmpb  -mhard-dfp
! -mfull-toc  -mminimal-toc  -mno-fp-in-toc  -mno-sum-in-toc
! -maix64  -maix32  -m64  -m32  -mxl-compat  -mpe
  -malign-power  -malign-natural
! -msoft-float  -mhard-float  -mmultiple  -mupdate
! -mavoid-indexed-addresses
! -mfused-madd  -mbit-align
! -mstrict-align  -mrelocatable  -mrelocatable-lib
! -mlittle  -mlittle-endian  -mbig  -mbig-endian
! -mdynamic-no-pic  -msingle-pic-base
  -mprioritize-restricted-insns=@var{priority}
  -msched-costly-dep=@var{dependence_type}
  -minsert-sched-nops=@var{scheme}
*************** See RS/6000 and PowerPC Options.
*** 1372,1504 ****
  -maix-struct-return  -msvr4-struct-return
  -mabi=@var{abi-type}  -msecure-plt  -mbss-plt
  -msplit-patch-nops
! -mlongcall  -mno-longcall  -mpltseq  -mno-pltseq
  -mblock-move-inline-limit=@var{num}
  -mblock-compare-inline-limit=@var{num}
  -mblock-compare-inline-loop-limit=@var{num}
! -mno-block-ops-unaligned-vsx
  -mstring-compare-inline-limit=@var{num}
! -misel  -mno-isel
! -mvrsave  -mno-vrsave
! -mmulhw  -mno-mulhw
! -mdlmzb  -mno-dlmzb
! -mprototype  -mno-prototype
! -msim  -mmvme  -mads  -myellowknife  -memb  -msdata
  -msdata=@var{opt}  -mreadonly-in-sdata  -mvxworks  -G @var{num}
  -mrecip  -mrecip=@var{opt}  -mno-recip  -mrecip-precision
! -mno-recip-precision
! -mveclibabi=@var{type}  -mfriz  -mno-friz
! -mpointers-to-nested-functions  -mno-pointers-to-nested-functions
! -msave-toc-indirect  -mno-save-toc-indirect
! -mpower8-fusion  -mno-mpower8-fusion
! -mcrypto  -mno-crypto  -mhtm  -mno-htm
! -mquad-memory  -mno-quad-memory
! -mquad-memory-atomic  -mno-quad-memory-atomic
! -mcompat-align-parm  -mno-compat-align-parm
! -mfloat128  -mno-float128  -mfloat128-hardware  -mno-float128-hardware
! -mgnu-attribute  -mno-gnu-attribute
! -mstack-protector-guard=@var{guard} -mstack-protector-guard-reg=@var{reg}
! -mstack-protector-guard-offset=@var{offset} -mprefixed -mno-prefixed
! -mpcrel -mno-pcrel -mmma -mno-mmma -mrop-protect -mno-rop-protect
! -mprivileged -mno-privileged}
  
  @emph{RX Options} (@ref{RX Options})
  @gccoptlist{-m64bit-doubles  -m32bit-doubles  -fpu  -nofpu
! -mcpu=
  -mbig-endian-data  -mlittle-endian-data
! -msmall-data
! -msim  -mno-sim
! -mas100-syntax  -mno-as100-syntax
! -mrelax
! -mmax-constant-size=
! -mint-register=
! -mpid
! -mallow-string-insns  -mno-allow-string-insns
! -mjsr
! -mno-warn-multiple-fast-interrupts
! -msave-acc-in-interrupts}
  
  @emph{S/390 and zSeries Options} (@ref{S/390 and zSeries Options})
  @gccoptlist{-mtune=@var{cpu-type}  -march=@var{cpu-type}
! -mhard-float  -msoft-float  -mhard-dfp  -mno-hard-dfp
  -mlong-double-64  -mlong-double-128
! -mbackchain  -mno-backchain  -mpacked-stack  -mno-packed-stack
! -msmall-exec  -mno-small-exec  -mmvcle  -mno-mvcle
! -m64  -m31  -mdebug  -mno-debug  -mesa  -mzarch
  -mhtm  -mvx  -mzvector
! -mtpf-trace  -mno-tpf-trace  -mtpf-trace-skip  -mno-tpf-trace-skip
  -mfused-madd  -mno-fused-madd
! -mwarn-framesize  -mwarn-dynamicstack  -mstack-size  -mstack-guard
! -mhotpatch=@var{halfwords},@var{halfwords}}
  
  @emph{SH Options} (@ref{SH Options})
  @gccoptlist{-m1  -m2  -m2e
! -m2a-nofpu  -m2a-single-only  -m2a-single  -m2a
  -m3  -m3e
! -m4-nofpu  -m4-single-only  -m4-single  -m4
! -m4a-nofpu  -m4a-single-only  -m4a-single  -m4a  -m4al
  -mb  -ml  -mdalign  -mrelax
! -mbigtable  -mfmovd  -mrenesas  -mno-renesas  -mnomacsave
! -mieee  -mno-ieee  -mbitops  -misize  -minline-ic_invalidate  -mpadstruct
  -mprefergot  -musermode  -multcost=@var{number}  -mdiv=@var{strategy}
  -mdivsi3_libfunc=@var{name}  -mfixed-range=@var{register-range}
  -maccumulate-outgoing-args
  -matomic-model=@var{atomic-model}
! -mbranch-cost=@var{num}  -mzdcbranch  -mno-zdcbranch
  -mcbranch-force-delay-slot
! -mfused-madd  -mno-fused-madd  -mfsca  -mno-fsca  -mfsrra  -mno-fsrra
! -mpretend-cmove  -mtas}
  
  @emph{Solaris 2 Options} (@ref{Solaris 2 Options})
  @gccoptlist{-mclear-hwcap  -mno-clear-hwcap  -mimpure-text  -mno-impure-text
! -gsctf -pthreads}
  
  @emph{SPARC Options} (@ref{SPARC Options})
  @gccoptlist{-mcpu=@var{cpu-type}
  -mtune=@var{cpu-type}
  -mcmodel=@var{code-model}
  -mmemory-model=@var{mem-model}
! -m32  -m64  -mapp-regs  -mno-app-regs
! -mfaster-structs  -mno-faster-structs  -mflat  -mno-flat
! -mfpu  -mno-fpu  -mhard-float  -msoft-float
  -mhard-quad-float  -msoft-quad-float
! -mstack-bias  -mno-stack-bias
! -mstd-struct-return  -mno-std-struct-return
! -munaligned-doubles  -mno-unaligned-doubles
! -muser-mode  -mno-user-mode
! -mv8plus  -mno-v8plus  -mvis  -mno-vis
! -mvis2  -mno-vis2
! -mvis3  -mno-vis3  -mvis3b  -mno-vis3b
! -mvis4  -mno-vis4  -mvis4b  -mno-vis4b
! -mcbcond  -mno-cbcond  -mfmaf  -mno-fmaf  -mfsmuld  -mno-fsmuld
! -mpopc  -mno-popc  -msubxc  -mno-subxc
  -mfix-at697f  -mfix-ut699  -mfix-ut700  -mfix-gr712rc}
  
  @emph{System V Options} (@ref{System V Options})
  @gccoptlist{-YP,@var{paths}  -Ym,@var{dir}}
  
  @emph{V850 Options} (@ref{V850 Options})
! @gccoptlist{-mlong-calls  -mno-long-calls  -mep  -mno-ep
! -mprolog-function  -mno-prolog-function  -mspace
  -mtda=@var{n}  -msda=@var{n}  -mzda=@var{n}
! -mapp-regs  -mno-app-regs
! -mdisable-callt  -mno-disable-callt
! -mv850e2v3  -mv850e2  -mv850e1  -mv850es
! -mv850e  -mv850  -mv850e3v5
! -mloop
! -mrelax
! -mlong-jumps
! -msoft-float
! -mhard-float
! -mgcc-abi
! -mrh850-abi
! -mbig-switch}
  
  @emph{VAX Options} (@ref{VAX Options})
! @gccoptlist{-munix  -mgnu  -md  -md-float  -mg  -mg-float  -mlra}
  
  @emph{Visium Options} (@ref{Visium Options})
! @gccoptlist{-mdebug  -msim  -mfpu  -mno-fpu  -mhard-float  -msoft-float
  -mcpu=@var{cpu-type}  -mtune=@var{cpu-type}  -msv-mode  -muser-mode}
  
  @emph{VMS Options} (@ref{VMS Options})
--- 1377,1501 ----
  -maix-struct-return  -msvr4-struct-return
  -mabi=@var{abi-type}  -msecure-plt  -mbss-plt
  -msplit-patch-nops
! -mregnames  -mlongcall  -mpltseq  -mtls-markers
  -mblock-move-inline-limit=@var{num}
  -mblock-compare-inline-limit=@var{num}
  -mblock-compare-inline-loop-limit=@var{num}
! -mblock-ops-unaligned-vsx
  -mstring-compare-inline-limit=@var{num}
! -misel  -mvsx  -mvrsave  -mmulhw  -mdlmzb  -mprototype
! -msim  -mmvme  -mads  -myellowknife  -memb  -meabi  -msdata
  -msdata=@var{opt}  -mreadonly-in-sdata  -mvxworks  -G @var{num}
  -mrecip  -mrecip=@var{opt}  -mno-recip  -mrecip-precision
! -mveclibabi=@var{type}  -mfriz
! -mpointers-to-nested-functions  -msave-toc-indirect  -mpower8-fusion
! -mcrypto  -mhtm  -mquad-memory  -mquad-memory-atomic
! -mcompat-align-parm
! -mfloat128  -mfloat128-hardware
! -mgnu-attribute
! -mstack-protector-guard=@var{guard}  -mstack-protector-guard-reg=@var{reg}
! -mstack-protector-guard-offset=@var{offset}  -mprefixed
! -mpcrel  -mmma  -mrop-protect  -mprivileged}
  
  @emph{RX Options} (@ref{RX Options})
  @gccoptlist{-m64bit-doubles  -m32bit-doubles  -fpu  -nofpu
! -mcpu=@var{name}
  -mbig-endian-data  -mlittle-endian-data
! -msmall-data-limit=@var{N}
! -msim  -mas100-syntax  -mrelax
! -mmax-constant-size=@var{N}  -mint-register=@var{N}
! -mpid  -mno-allow-string-insns  -mjsr
! -mno-warn-multiple-fast-interrupts  -msave-acc-in-interrupts
! -mlra}
  
  @emph{S/390 and zSeries Options} (@ref{S/390 and zSeries Options})
  @gccoptlist{-mtune=@var{cpu-type}  -march=@var{cpu-type}
! -mhard-float  -msoft-float  -mhard-dfp
  -mlong-double-64  -mlong-double-128
! -mbackchain  -mpacked-stack
! -msmall-exec  -mmvcle
! -m64  -m31  -mdebug  -mesa  -mzarch
  -mhtm  -mvx  -mzvector
! -mtpf-trace  -mtpf-trace-skip  -mmain
  -mfused-madd  -mno-fused-madd
! -mwarn-framesize=@var{framesize}  -mwarn-dynamicstack
! -mstack-size=@var{stack-size}  -mno-stack-size
! -mstack-guard=@var{stack-guard}  -mno-stack-guard
! -mstack-protector-guard=@var{guard}
! -mstack-protector-guard-record
! -mhotpatch=@var{pre-halfwords},@var{post-halfwords}
! -mno-pic-data-is-text-relative
! -mindirect-branch=@var{choice}
! -mindirect-branch-jump=@var{choice}  -mindirect-branch-call=@var{choice}
! -mfunction-return=@var{choice}
! -mfunction-return-mem=@var{choice}  -mfunction-return-reg=@var{choice}
! -mindirect-branch-table
! -mfentry  -mrecord-mcount  -mnop-mcount
! -mpreserve-args  -munaliged-symbols}
  
  @emph{SH Options} (@ref{SH Options})
  @gccoptlist{-m1  -m2  -m2e
! -m2a  -m2a-nofpu  -m2a-single  -m2a-single-only
  -m3  -m3e
! -m4  -m4-nofpu  -m4-single  -m4-single-only
! -m4-100  -m4-100-nofpu  -m4-100-single  -m4-100-single-only
! -m4-200  -m4-200-nofpu  -m4-200-single  -m4-200-single-only
! -m4-300  -m4-300-nofpu  -m4-300-single  -m4-300-single-only
! -m4-340  -m4-400  -m4-500
! -m4a  -m4al  -m4a-nofpu  -m4a-single  -m4a-single-only
  -mb  -ml  -mdalign  -mrelax
! -mbigtable  -mbitops  -mfmovd  -mrenesas  -mnomacsave
! -mieee  -misize  -minline-ic_invalidate
  -mprefergot  -musermode  -multcost=@var{number}  -mdiv=@var{strategy}
  -mdivsi3_libfunc=@var{name}  -mfixed-range=@var{register-range}
  -maccumulate-outgoing-args
  -matomic-model=@var{atomic-model}
! -mbranch-cost=@var{num}  -mzdcbranch
  -mcbranch-force-delay-slot
! -mfsca  -mfsrra
! -mpretend-cmove  -mfdpic  -mtas  -mlra}
  
  @emph{Solaris 2 Options} (@ref{Solaris 2 Options})
  @gccoptlist{-mclear-hwcap  -mno-clear-hwcap  -mimpure-text  -mno-impure-text
! -gsctf  -pthread  -pthreads}
  
  @emph{SPARC Options} (@ref{SPARC Options})
  @gccoptlist{-mcpu=@var{cpu-type}
  -mtune=@var{cpu-type}
  -mcmodel=@var{code-model}
  -mmemory-model=@var{mem-model}
! -m32  -m64  -mptr32  -mptr64  -mapp-regs
! -mfaster-structs  -mflat
! -mfpu  -mhard-float  -msoft-float
  -mhard-quad-float  -msoft-quad-float
! -mstack-bias  -mstd-struct-return
! -munaligned-doubles  -muser-mode
! -mv8plus  -mvis
! -mvis2  -mvis3  -mvis3b  -mvis4  -mvis4b
! -mcbcond  -mfmaf  -mfsmuld  -mpopc  -msubxc
  -mfix-at697f  -mfix-ut699  -mfix-ut700  -mfix-gr712rc}
  
  @emph{System V Options} (@ref{System V Options})
  @gccoptlist{-YP,@var{paths}  -Ym,@var{dir}}
  
  @emph{V850 Options} (@ref{V850 Options})
! @gccoptlist{-mlong-calls  -mep
! -mprolog-function  -mspace
  -mtda=@var{n}  -msda=@var{n}  -mzda=@var{n}
! -mv850  -mv850e3v5  -m850e2v4  -mv850e2v3
! -mv850e2  -mv850e1  -mv850es  -mv850e
! -mdisable-callt  -mrelax  -mlong-jumps
! -msoft-float  -mhard-float  -mloop
! -mrh850-abi  -mghs  -mgcc-abi
! -m8byte-align  -mbig-switch  -mapp-regs  -msmall-sld
! -mno-strict-align  -mjump-tables-in-data-section}
  
  @emph{VAX Options} (@ref{VAX Options})
! @gccoptlist{-munix  -mgnu  -md  -md-float  -mg  -mg-float  -mlra
! -mvaxc-alignment  -mqmath}
  
  @emph{Visium Options} (@ref{Visium Options})
! @gccoptlist{-mdebug  -msim  -mfpu  -mhard-float  -msoft-float
  -mcpu=@var{cpu-type}  -mtune=@var{cpu-type}  -msv-mode  -muser-mode}
  
  @emph{VMS Options} (@ref{VMS Options})
*************** See RS/6000 and PowerPC Options.
*** 1506,1512 ****
  -mpointer-size=@var{size}}
  
  @emph{VxWorks Options} (@ref{VxWorks Options})
! @gccoptlist{-mrtp  -msmp  -non-static  -Bstatic  -Bdynamic
  -Xbind-lazy  -Xbind-now}
  
  @emph{x86 Options} (@ref{x86 Options})
--- 1503,1509 ----
  -mpointer-size=@var{size}}
  
  @emph{VxWorks Options} (@ref{VxWorks Options})
! @gccoptlist{-mrtp  -msmp  -mvthreads  -non-static  -Bstatic  -Bdynamic
  -Xbind-lazy  -Xbind-now}
  
  @emph{x86 Options} (@ref{x86 Options})
*************** See RS/6000 and PowerPC Options.
*** 1514,1528 ****
  -mtune-ctrl=@var{feature-list}  -mdump-tune-features  -mno-default
  -mfpmath=@var{unit}
  -masm=@var{dialect}  -mno-fancy-math-387
! -mno-fp-ret-in-387  -m80387  -mhard-float  -msoft-float
! -mno-wide-multiply  -mrtd  -malign-double
  -mpreferred-stack-boundary=@var{num}
  -mincoming-stack-boundary=@var{num}
! -mcld  -mcx16  -msahf  -mmovbe  -mcrc32 -mmwait
  -mrecip  -mrecip=@var{opt}
! -mvzeroupper  -mprefer-avx128  -mprefer-vector-width=@var{opt}
  -mpartial-vector-fp-math
! -mmove-max=@var{bits} -mstore-max=@var{bits}
  -mnoreturn-no-callee-saved-registers
  -mmmx  -msse  -msse2  -msse3  -mssse3  -msse4.1  -msse4.2  -msse4  -mavx
  -mavx2  -mavx512f  -mavx512cd  -mavx512vl
--- 1511,1525 ----
  -mtune-ctrl=@var{feature-list}  -mdump-tune-features  -mno-default
  -mfpmath=@var{unit}
  -masm=@var{dialect}  -mno-fancy-math-387
! -mno-fp-ret-in-387  -m80387  -mhard-float  -msoft-float  -mieee-fp
! -mrtd  -malign-double
  -mpreferred-stack-boundary=@var{num}
  -mincoming-stack-boundary=@var{num}
! -mcld  -mcx16  -msahf  -mmovbe  -mcrc32  -mmwait
  -mrecip  -mrecip=@var{opt}
! -mvzeroupper  -mstv  -mprefer-avx128  -mprefer-vector-width=@var{opt}
  -mpartial-vector-fp-math
! -mmove-max=@var{bits}  -mstore-max=@var{bits}
  -mnoreturn-no-callee-saved-registers
  -mmmx  -msse  -msse2  -msse3  -mssse3  -msse4.1  -msse4.2  -msse4  -mavx
  -mavx2  -mavx512f  -mavx512cd  -mavx512vl
*************** See RS/6000 and PowerPC Options.
*** 1531,1570 ****
  -mptwrite  -mclflushopt  -mclwb  -mxsavec  -mxsaves
  -msse4a  -m3dnow  -m3dnowa  -mpopcnt  -mabm  -mbmi  -mtbm  -mfma4  -mxop
  -madx  -mlzcnt  -mbmi2  -mfxsr  -mxsave  -mxsaveopt  -mrtm  -mhle  -mlwp
! -mmwaitx  -mclzero  -mpku  -mthreads  -mgfni  -mvaes  -mwaitpkg
! -mshstk -mmanual-endbr -mcet-switch -mforce-indirect-call
! -mavx512vbmi2 -mavx512bf16 -menqcmd
  -mvpclmulqdq  -mavx512bitalg  -mmovdiri  -mmovdir64b  -mavx512vpopcntdq
  -mavx512vnni  -mprfchw  -mrdpid
! -mrdseed  -msgx -mavx512vp2intersect -mserialize -mtsxldtrk
! -mamx-tile  -mamx-int8  -mamx-bf16 -muintr -mhreset -mavxvnni -mamx-fp8
! -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16
! -mprefetchi -mraoint -mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mapxf
! -musermsr -mavx10.1 -mavx10.2 -mamx-avx512 -mamx-tf32 -mmovrs -mamx-movrs
! -mavx512bmm -mcldemote -mms-bitfields -mno-align-stringops -minline-all-stringops
  -minline-stringops-dynamically  -mstringop-strategy=@var{alg}
! -mkl -mwidekl
  -mmemcpy-strategy=@var{strategy}  -mmemset-strategy=@var{strategy}
  -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double
  -m96bit-long-double  -mlong-double-64  -mlong-double-80  -mlong-double-128
  -mregparm=@var{num}  -msseregparm
  -mveclibabi=@var{type}  -mvect8-ret-in-mem
! -mpc32  -mpc64  -mpc80  -mdaz-ftz -mstackrealign
  -momit-leaf-frame-pointer  -mno-red-zone  -mno-tls-direct-seg-refs
  -mcmodel=@var{code-model}  -mabi=@var{name}  -maddress-mode=@var{mode}
  -m32  -m64  -mx32  -m16  -miamcu  -mlarge-data-threshold=@var{num}
  -msse2avx  -mfentry  -mrecord-mcount  -mnop-mcount  -m8bit-idiv
! -minstrument-return=@var{type} -mfentry-name=@var{name} -mfentry-section=@var{name}
  -mavx256-split-unaligned-load  -mavx256-split-unaligned-store
  -malign-data=@var{type}  -mstack-protector-guard=@var{guard}
  -mstack-protector-guard-reg=@var{reg}
  -mstack-protector-guard-offset=@var{offset}
  -mstack-protector-guard-symbol=@var{symbol}
! -mgeneral-regs-only  -mcall-ms2sysv-xlogues -mrelax-cmpxchg-loop
  -mindirect-branch=@var{choice}  -mfunction-return=@var{choice}
! -mindirect-branch-register -mharden-sls=@var{choice}
! -mindirect-branch-cs-prefix -mneeded -mno-direct-extern-access
! -munroll-only-small-loops -mlam=@var{choice}}
  
  @emph{x86 Windows Options}
  See Cygwin and MinGW Options.
--- 1528,1574 ----
  -mptwrite  -mclflushopt  -mclwb  -mxsavec  -mxsaves
  -msse4a  -m3dnow  -m3dnowa  -mpopcnt  -mabm  -mbmi  -mtbm  -mfma4  -mxop
  -madx  -mlzcnt  -mbmi2  -mfxsr  -mxsave  -mxsaveopt  -mrtm  -mhle  -mlwp
! -mmwaitx  -mclzero  -mpku  -mgfni  -mvaes  -mwaitpkg
! -mshstk  -mmanual-endbr  -mcet-switch  -mforce-indirect-call
! -mavx512vbmi2  -mavx512bf16  -menqcmd
  -mvpclmulqdq  -mavx512bitalg  -mmovdiri  -mmovdir64b  -mavx512vpopcntdq
  -mavx512vnni  -mprfchw  -mrdpid
! -mrdseed  -msgx  -mavx512vp2intersect  -mserialize  -mtsxldtrk
! -mamx-tile  -mamx-int8  -mamx-bf16  -muintr  -mhreset
! -mavxvnni  -mamx-fp8  -mavx512fp16  -mavxifma  -mavxvnniint8
! -mavxneconvert  -mcmpccxadd  -mamx-fp16  -mprefetchi  -mraoint
! -mamx-complex  -mavxvnniint16  -msm3  -msha512  -msm4  -mapxf
! -musermsr  -mavx10.1  -mavx10.2  -mamx-avx512  -mamx-tf32  -mmovrs
! -mamx-movrs  -mavx512bmm  -mcldemote  -mms-bitfields
! -mno-align-stringops  -minline-all-stringops
  -minline-stringops-dynamically  -mstringop-strategy=@var{alg}
! -mkl  -mwidekl
  -mmemcpy-strategy=@var{strategy}  -mmemset-strategy=@var{strategy}
  -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double
  -m96bit-long-double  -mlong-double-64  -mlong-double-80  -mlong-double-128
  -mregparm=@var{num}  -msseregparm
  -mveclibabi=@var{type}  -mvect8-ret-in-mem
! -mpc32  -mpc64  -mpc80  -mdaz-ftz  -mstackrealign  -mstack-arg-probe
  -momit-leaf-frame-pointer  -mno-red-zone  -mno-tls-direct-seg-refs
  -mcmodel=@var{code-model}  -mabi=@var{name}  -maddress-mode=@var{mode}
  -m32  -m64  -mx32  -m16  -miamcu  -mlarge-data-threshold=@var{num}
  -msse2avx  -mfentry  -mrecord-mcount  -mnop-mcount  -m8bit-idiv
! -minstrument-return=@var{type}  -mrecord-return
! -mfentry-name=@var{name}  -mfentry-section=@var{name}
! -mskip-rax-setup
  -mavx256-split-unaligned-load  -mavx256-split-unaligned-store
  -malign-data=@var{type}  -mstack-protector-guard=@var{guard}
  -mstack-protector-guard-reg=@var{reg}
  -mstack-protector-guard-offset=@var{offset}
  -mstack-protector-guard-symbol=@var{symbol}
! -mgeneral-regs-only  -mcall-ms2sysv-xlogues  -mtls-dialect=@var{type}
! -mrelax-cmpxchg-loop
  -mindirect-branch=@var{choice}  -mfunction-return=@var{choice}
! -mindirect-branch-register  -mharden-sls=@var{choice}
! -mindirect-branch-cs-prefix  -mapx-inline-asm-use-gpr32
! -mgather  -mscatter
! -mneeded  -mno-direct-extern-access
! -munroll-only-small-loops  -mdispatch-scheduler  -mlam=@var{choice}}
  
  @emph{x86 Windows Options}
  See Cygwin and MinGW Options.
*************** See Cygwin and MinGW Options.
*** 1573,1589 ****
  @gccoptlist{-msim}
  
  @emph{Xtensa Options} (@ref{Xtensa Options})
! @gccoptlist{-mconst16  -mno-const16
! -mfused-madd  -mno-fused-madd
! -mforce-no-pic
! -mserialize-volatile  -mno-serialize-volatile
! -mtext-section-literals  -mno-text-section-literals
! -mauto-litpools  -mno-auto-litpools
! -mtarget-align  -mno-target-align
! -mlongcalls  -mno-longcalls
! -mabi=@var{abi-type}
! -mextra-l32r-costs=@var{cycles}
! -mstrict-align  -mno-strict-align}
  
  @emph{zSeries Options}
  See S/390 and zSeries Options.
--- 1577,1586 ----
  @gccoptlist{-msim}
  
  @emph{Xtensa Options} (@ref{Xtensa Options})
! @gccoptlist{-mconst16  -mforce-no-pic  -mno-serialize-volatile
! -mtext-section-literals  -mauto-litpools  -mno-target-align
! -mlongcalls  -mabi=@var{abi-type}
! -mextra-l32r-costs=@var{cycles}  -mstrict-align}
  
  @emph{zSeries Options}
  See S/390 and zSeries Options.
*************** so lifetime of the temporaries is extend
*** 3682,3687 ****
--- 3679,3688 ----
  by default.  This option allows enabling that behavior also
  in earlier versions of the standard.
  
+ @opindex freflection
+ @item -freflection
+ Enable experimental C++26 Reflection.
+ 
  @opindex fno-rtti
  @opindex frtti
  @item -fno-rtti
*************** specifies that the @code{dllimport} attr
*** 26821,26828 ****
  
  @opindex mthreads
  @item -mthreads
! This option is available for MinGW targets. It specifies
! that MinGW-specific thread support is to be used.
  
  @opindex municode
  @opindex mno-unicode
--- 26822,26832 ----
  
  @opindex mthreads
  @item -mthreads
! Support thread-safe exception handling on MinGW.  Programs that rely
! on thread-safe exception handling must compile and link all code with the
! @option{-mthreads} option.  When compiling, @option{-mthreads} defines
! @option{-D_MT}; when linking, it links in a special thread helper library
! @option{-lmingwthrd} which cleans up per-thread exception-handling data.
  
  @opindex municode
  @opindex mno-unicode
*************** These options are defined for NDS32 impl
*** 31522,31534 ****
--- 31526,31552 ----
  @table @gcctabopt
  
  @opindex mbig-endian
+ @opindex EB
  @item -mbig-endian
+ @itemx -EB
  Generate code in big-endian mode.
  
  @opindex mlittle-endian
+ @opindex EL
  @item -mlittle-endian
+ @itemx -EL
  Generate code in little-endian mode.
  
+ @opindex mabi
+ @opindex mfloat-abi
+ @item -mabi=2
+ @itemx -mfloat-abi=soft
+ Use the soft floating-point ABI.
+ 
+ @item -mabi=2fp+
+ @itemx -mfloat-abi=hard
+ Use the hard floating-point ABI.
+ 
  @opindex mreduced-regs
  @item -mreduced-regs
  Use reduced-set registers for register allocation.
*************** Use reduced-set registers for register a
*** 31537,31548 ****
--- 31555,31588 ----
  @item -mfull-regs
  Use full-set registers for register allocation.
  
+ @opindex malways-align
+ @opindex mno-always-align
+ @item -malways-align
+ Always align function entry, jump targets, and return address.
+ 
+ @opindex malign-functions
+ @opindex mno-align-functions
+ @item -malign-functions
+ Align function entry to 4 bytes.
+ 
+ @opindex mfp-as-gp
+ @opindex mno-fp-as-gp
+ @item -mfp-as-gp
+ @itemx -mno-fp-as-gp
+ Enable/disable fp-as-gp optimization.
+ 
  @opindex mcmov
  @opindex mno-cmov
  @item -mcmov
  @itemx -mno-cmov
  Enable/disable generation of conditional move instructions.
  
+ @opindex mhw-abs
+ @opindex mno-hw-abs
+ @item -mhw-abs
+ @itemx -mno-hw-abs
+ Enable/disable generation of hardware abs instructions.
+ 
  @opindex mext-perf
  @opindex mno-ext-perf
  @item -mext-perf
*************** Enable/disable generation of performance
*** 31561,31566 ****
--- 31601,31630 ----
  @itemx -mno-ext-string
  Enable/disable generation of string extension instructions.
  
+ @opindex mext-dsp
+ @opindex mno-ext-dsp
+ @item -mext-dsp
+ @itemx -mno-ext-dsp
+ Enable/disable generation of DSP extension instructions.
+ 
+ @opindex mext-fpu-fma
+ @opindex mno-ext-fpu-fma
+ @item -mext-fpu-fma
+ @itemx -mno-ext-fpu-fma
+ Enable/disable generation of floating-point multiply-accumulation instructions.
+ 
+ @opindex mext-fpu-sp
+ @opindex mno-ext-fpu-sp
+ @item -mext-fpu-sp
+ @itemx -mno-ext-fpu-sp
+ Enable/disable generation of single-precision floating-point instructions.
+ 
+ @opindex mext-fpu-dp
+ @opindex mno-ext-fpu-dp
+ @item -mext-fpu-dp
+ @itemx -mno-ext-fpu-dp
+ Enable/disable generation of double-precision floating-point instructions.
+ 
  @opindex mv3push
  @opindex mno-v3push
  @item -mv3push
*************** Enable/disable generation of v3 push25/p
*** 31573,31594 ****
  @itemx -mno-16-bit
  Enable/disable generation of 16-bit instructions.
  
  @opindex misr-vector-size
  @item -misr-vector-size=@var{num}
  Specify the size of each interrupt vector, which must be 4 or 16.
  
  @opindex mcache-block-size
  @item -mcache-block-size=@var{num}
  Specify the size of each cache block,
  which must be a power of 2 between 4 and 512.
  
! @opindex march
  @item -march=@var{arch}
! Specify the name of the target architecture.
  
  @opindex mcmodel=
  @item -mcmodel=@var{code-model}
! Set the code model to one of
  @table @asis
  @item @samp{small}
  All the data and read-only data segments must be within 512KB addressing space.
--- 31637,31699 ----
  @itemx -mno-16-bit
  Enable/disable generation of 16-bit instructions.
  
+ @opindex mvh
+ @opindex mno-vh
+ @item -mvh
+ @itemx -mno-vh
+ Enable/disable Virtual Hosting support.
+ 
  @opindex misr-vector-size
  @item -misr-vector-size=@var{num}
  Specify the size of each interrupt vector, which must be 4 or 16.
  
+ @opindex misr-secure
+ @item -misr-secure=@var{num}
+ Specify the security level of c-isr for the whole file.
+ 
  @opindex mcache-block-size
  @item -mcache-block-size=@var{num}
  Specify the size of each cache block,
  which must be a power of 2 between 4 and 512.
  
! @opindex march=
  @item -march=@var{arch}
! Specify the target architecture.  @var{arch} may be one of
! @samp{v2}, @samp{v3}, @samp{v3j}, @samp{v3m}, @samp{v3f}, or @samp{v3s}.
! 
! @opindex mcpu=
! @item -mcpu=@var{cpu}
! Specify the CPU to compile for.  @var{cpu} may be one of
! @samp{n6}, @samp{n650}, @samp{n7}, @samp{n705}, @samp{n8}, @samp{n801},
! @samp{sn8}, @samp{sn801}, @samp{s8}, @samp{s801}, @samp{e8}, @samp{e801},
! @samp{n820}, @samp{s830}, @samp{e830}, @samp{n9}, @samp{n903}, @samp{n903a},
! @samp{n968}, @samp{n968a}, @samp{n10}, @samp{n1033}, @samp{n1033a},
! @samp{n1033-fpu}, @samp{n1033-spu}, @samp{n1068}, @samp{n1068a},
! @samp{n1068-fpu}, @samp{n1068a-fpu}, @samp{d10}, @samp{d1088},
! @samp{d1088-fpu}, @samp{d1088-spu}, @samp{n15}, @samp{d15}, @samp{n15s},
! @samp{d15s}, @samp{n15f}, @samp{d15f}, @samp{n12}, @samp{n1213},
! @samp{n1233}, @samp{n1233-fpu}, @samp{n1233-spu}, @samp{n13}, @samp{n1337},
! @samp{n1337-fpu}, @samp{n1337-spu}, or @samp{simple}.
! 
! @opindex mconfig-fpu=
! @item -mconfig-fpu=@var{num}
! Specify a FPU configuration value from 0 to 7; 0--3 is as FPU spec says,
! and 4--7 correspond to 0--3.
! 
! @opindex mconfig-mul=
! @item -mconfig-mul=@var{type}
! Specify configuration for multiply instruction.  @var{type} can be one of
! @samp{fast}, @samp{fast1} (equivalent to @samp{fast}), @samp{fast2}, or
! @samp{slow}.  The default is @samp{fast1}.
! 
! @opindex mconfig-register-ports=
! @item -mconfig-register-ports=@var{kind}
! Specify the numbers of read/write ports for n9/n10 cores.  The value should
! be @samp{3r2w} or @samp{2r1w}.
  
  @opindex mcmodel=
  @item -mcmodel=@var{code-model}
! Set the code model to one of:
  @table @asis
  @item @samp{small}
  All the data and read-only data segments must be within 512KB addressing space.
*************** addressing space.
*** 31600,31605 ****
--- 31705,31712 ----
  @item @samp{large}
  All the text and data segments can be within 4GB addressing space.
  @end table
+ The default is @samp{large} on GNU/Linux targets and @samp{medium} on other
+ ELF targets.
  
  @opindex mctor-dtor
  @opindex mno-ctor-dtor
*************** Enable/disable constructor/destructor fe
*** 31613,31618 ****
--- 31720,31761 ----
  @itemx -mno-relax
  Enable/disable linker option to relax instructions.
  
+ @opindex mrelax-hint
+ @opindex mno-relax-hint
+ @item -mrelax-hint
+ @itemx -mno-relax-hint
+ Enable/disable insertion of hints for linker to do relaxation.
+ 
+ @opindex msched-prolog-epilog
+ @opindex mno-sched-prolog-epilog
+ @item -msched-prolog-epilog
+ @itemx -mno-sched-prolog-epilog
+ Enable/disable scheduling of a function's prologue and epilogue sequence.
+ 
+ @opindex mret-in-naked-func
+ @opindex mno-ret-in-naked-func
+ @item -mret-in-naked-func
+ @itemx -mno-ret-in-naked-func
+ Enable/disable generation of return instructions in naked functions.  This
+ option is enabled by default.
+ 
+ @opindex malways-save-lp
+ @opindex mno-always-save-lp
+ @item -malways-save-lp
+ @itemx -mno-always-save-lp
+ Enable/disable always saving @code{$lp} on the stack.
+ 
+ @opindex munaligned-access
+ @opindex mno-unaligned-access
+ @item -munaligned-access
+ @itemx -mno-unaligned-access
+ Enable/disable unaligned word and halfword accesses to packed data.
+ 
+ @opindex minline-asm-r15
+ @opindex mno-inline-asm-r15
+ @item -minline-asm-r15
+ @itemx -mno-inline-asm-r15
+ Allow/disallow use of r15 for inline asm.
  @end table
  
  @node Nvidia PTX Options
*************** This option is enabled by default.
*** 32440,32445 ****
--- 32583,32589 ----
  @table @gcctabopt
  
  @opindex msim
+ @opindex mno-sim
  @item -msim
  Links in additional target libraries to support operation within a
  simulator.
*************** Note, although the RL78/G14 core is the
*** 32485,32492 ****
  @option{-mcpu=g14} or @option{-mcpu=rl78} on the command line does
  change the behavior of the toolchain since it also enables G14
  hardware multiply support.  If these options are not specified on the
! command line then software multiplication routines will be used even
! though the code targets the RL78 core.  This is for backwards
  compatibility with older toolchains which did not have hardware
  multiply and divide support.
  
--- 32629,32636 ----
  @option{-mcpu=g14} or @option{-mcpu=rl78} on the command line does
  change the behavior of the toolchain since it also enables G14
  hardware multiply support.  If these options are not specified on the
! command line, then software multiplication routines are used even
! though the code targets the RL78 core.  This is for backward
  compatibility with older toolchains which did not have hardware
  multiply and divide support.
  
*************** These are aliases for the corresponding
*** 32506,32524 ****
  are provided for backwards compatibility.
  
  @opindex mallregs
  @item -mallregs
  Allow the compiler to use all of the available registers.  By default
  registers @code{r24..r31} are reserved for use in interrupt handlers.
  With this option enabled these registers can be used in ordinary
  functions as well.
  
! @opindex m64bit-doubles
! @opindex m32bit-doubles
! @item -m64bit-doubles
! @itemx -m32bit-doubles
! Make the @code{double} data type be 64 bits (@option{-m64bit-doubles})
! or 32 bits (@option{-m32bit-doubles}) in size.  The default is
! @option{-m32bit-doubles}.
  
  @opindex msave-mduc-in-interrupts
  @opindex mno-save-mduc-in-interrupts
--- 32650,32674 ----
  are provided for backwards compatibility.
  
  @opindex mallregs
+ @opindex mno-allregs
  @item -mallregs
  Allow the compiler to use all of the available registers.  By default
  registers @code{r24..r31} are reserved for use in interrupt handlers.
  With this option enabled these registers can be used in ordinary
  functions as well.
  
! @opindex mrelax
! @opindex mno-relax
! @item -mrelax
! @itemx -mno-relax
! Enable/disable assembler and linker relaxation.  This is enabled by
! default at @option{-Os}.
! 
! @opindex mes0
! @opindex mno-es0
! @item -mes0
! Assume @code{ES} is zero throughout program execution, and use it
! to address read-only data.
  
  @opindex msave-mduc-in-interrupts
  @opindex mno-save-mduc-in-interrupts
*************** Specifies that interrupt handler functio
*** 32528,32536 ****
  MDUC registers.  This is only necessary if normal code might use
  the MDUC registers, for example because it performs multiplication
  and division operations.  The default is to ignore the MDUC registers
! as this makes the interrupt handlers faster.  The target option -mg13
  needs to be passed for this to work as this feature is only available
! on the G13 target (S2 core).  The MDUC registers will only be saved
  if the interrupt handler performs a multiplication or division
  operation or it calls another function.
  
--- 32678,32686 ----
  MDUC registers.  This is only necessary if normal code might use
  the MDUC registers, for example because it performs multiplication
  and division operations.  The default is to ignore the MDUC registers
! as this makes the interrupt handlers faster.  The target option @option{-mg13}
  needs to be passed for this to work as this feature is only available
! on the G13 target (S2 core).  The MDUC registers are only saved
  if the interrupt handler performs a multiplication or division
  operation or it calls another function.
  
*************** operation or it calls another function.
*** 32542,32625 ****
  @cindex IBM RS/6000 and PowerPC Options
  
  These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
- @table @gcctabopt
- @item -mpowerpc-gpopt
- @itemx -mno-powerpc-gpopt
- @itemx -mpowerpc-gfxopt
- @itemx -mno-powerpc-gfxopt
- @need 800
- @itemx -mpowerpc64
- @itemx -mno-powerpc64
- @itemx -mmfcrf
- @itemx -mno-mfcrf
- @itemx -mpopcntb
- @itemx -mno-popcntb
- @itemx -mpopcntd
- @itemx -mno-popcntd
- @itemx -mfprnd
- @itemx -mno-fprnd
- @need 800
- @opindex mpowerpc-gpopt
- @opindex mno-powerpc-gpopt
- @opindex mpowerpc-gfxopt
- @opindex mno-powerpc-gfxopt
- @opindex mpowerpc64
- @opindex mno-powerpc64
- @opindex mmfcrf
- @opindex mno-mfcrf
- @opindex mpopcntb
- @opindex mno-popcntb
- @opindex mpopcntd
- @opindex mno-popcntd
- @opindex mfprnd
- @opindex mno-fprnd
- @opindex mcmpb
- @opindex mno-cmpb
- @opindex mhard-dfp
- @opindex mno-hard-dfp
- @itemx -mcmpb
- @itemx -mno-cmpb
- @itemx -mhard-dfp
- @itemx -mno-hard-dfp
- You use these options to specify which instructions are available on the
- processor you are using.  The default value of these options is
- determined when configuring GCC@.  Specifying the
- @option{-mcpu=@var{cpu_type}} overrides the specification of these
- options.  We recommend you use the @option{-mcpu=@var{cpu_type}} option
- rather than the options listed above.
- 
- Specifying @option{-mpowerpc-gpopt} allows
- GCC to use the optional PowerPC architecture instructions in the
- General Purpose group, including floating-point square root.  Specifying
- @option{-mpowerpc-gfxopt} allows GCC to
- use the optional PowerPC architecture instructions in the Graphics
- group, including floating-point select.
- 
- The @option{-mmfcrf} option allows GCC to generate the move from
- condition register field instruction implemented on the POWER4
- processor and other processors that support the PowerPC V2.01
- architecture.
- The @option{-mpopcntb} option allows GCC to generate the popcount and
- double-precision FP reciprocal estimate instruction implemented on the
- POWER5 processor and other processors that support the PowerPC V2.02
- architecture.
- The @option{-mpopcntd} option allows GCC to generate the popcount
- instruction implemented on the POWER7 processor and other processors
- that support the PowerPC V2.06 architecture.
- The @option{-mfprnd} option allows GCC to generate the FP round to
- integer instructions implemented on the POWER5+ processor and other
- processors that support the PowerPC V2.03 architecture.
- The @option{-mcmpb} option allows GCC to generate the compare bytes
- instruction implemented on the POWER6 processor and other processors
- that support the PowerPC V2.05 architecture.
- The @option{-mhard-dfp} option allows GCC to generate the decimal
- floating-point instructions implemented on some POWER processors.
- 
- The @option{-mpowerpc64} option allows GCC to generate the additional
- 64-bit instructions that are found in the full PowerPC64 architecture
- and to treat GPRs as 64-bit, doubleword quantities.  GCC defaults to
- @option{-mno-powerpc64}.
  
  @opindex mcpu
  @item -mcpu=@var{cpu_type}
  Set architecture type, register usage, and
--- 32692,32699 ----
  @cindex IBM RS/6000 and PowerPC Options
  
  These @samp{-m} options are defined for the IBM RS/6000 and PowerPC:
  
+ @table @gcctabopt
  @opindex mcpu
  @item -mcpu=@var{cpu_type}
  Set architecture type, register usage, and
*************** following options:
*** 32662,32668 ****
  -mmulhw  -mdlmzb  -mmfpgpr  -mvsx
  -mcrypto  -mhtm  -mpower8-fusion
  -mquad-memory  -mquad-memory-atomic  -mfloat128
! -mfloat128-hardware -mprefixed -mpcrel -mmma
  -mrop-protect}
  
  The particular options set for any particular CPU varies between
--- 32736,32742 ----
  -mmulhw  -mdlmzb  -mmfpgpr  -mvsx
  -mcrypto  -mhtm  -mpower8-fusion
  -mquad-memory  -mquad-memory-atomic  -mfloat128
! -mfloat128-hardware  -mprefixed  -mpcrel  -mmma
  -mrop-protect}
  
  The particular options set for any particular CPU varies between
*************** AIX does not have full support for these
*** 32678,32683 ****
--- 32752,32760 ----
  enable or disable them individually if you're sure it'll work in your
  environment.
  
+ In other cases, we recommend you use the @option{-mcpu=@var{cpu_type}} option
+ rather than the options that control generation of specific instructions.
+ 
  @opindex mtune
  @item -mtune=@var{cpu_type}
  Set the instruction scheduling parameters for machine type
*************** values for @var{cpu_type} are used for @
*** 32688,32693 ****
--- 32765,32779 ----
  architecture and registers set by @option{-mcpu}, but the
  scheduling parameters set by @option{-mtune}.
  
+ @opindex mpowerpc64
+ @opindex mno-powerpc64
+ @item -mpowerpc64
+ @itemx -mno-powerpc64
+ The @option{-mpowerpc64} option allows GCC to generate the additional
+ 64-bit instructions that are found in the full PowerPC64 architecture
+ and to treat GPRs as 64-bit, doubleword quantities.  GCC defaults to
+ @option{-mno-powerpc64}.
+ 
  @opindex mcmodel=
  @opindex mcmodel=small
  @item -mcmodel=small
*************** vector register when targeting a big-end
*** 32724,32729 ****
--- 32810,32880 ----
  the rightmost element in a vector register when targeting a
  little-endian platform.
  
+ @opindex mpowerpc-gpopt
+ @opindex mno-powerpc-gpopt
+ @item -mpowerpc-gpopt
+ @itemx -mno-powerpc-gpopt
+ Specifying @option{-mpowerpc-gpopt} allows
+ GCC to use the optional PowerPC architecture instructions in the
+ General Purpose group, including floating-point square root.  Specifying
+ 
+ @opindex mpowerpc-gfxopt
+ @opindex mno-powerpc-gfxopt
+ @item -mpowerpc-gfxopt
+ @itemx -mno-powerpc-gfxopt
+ @option{-mpowerpc-gfxopt} allows GCC to
+ use the optional PowerPC architecture instructions in the Graphics
+ group, including floating-point select.
+ 
+ @opindex mmfcrf
+ @opindex mno-mfcrf
+ @item -mmfcrf
+ @itemx -mno-mfcrf
+ The @option{-mmfcrf} option allows GCC to generate the move from
+ condition register field instruction implemented on the POWER4
+ processor and other processors that support the PowerPC V2.01
+ architecture.
+ 
+ @opindex mpopcntb
+ @opindex mno-popcntb
+ @item -mpopcntb
+ @itemx -mno-popcntb
+ The @option{-mpopcntb} option allows GCC to generate the popcount and
+ double-precision FP reciprocal estimate instruction implemented on the
+ POWER5 processor and other processors that support the PowerPC V2.02
+ architecture.
+ 
+ @opindex mpopcntd
+ @opindex mno-popcntd
+ @item -mpopcntd
+ @itemx -mno-popcntd
+ The @option{-mpopcntd} option allows GCC to generate the popcount
+ instruction implemented on the POWER7 processor and other processors
+ that support the PowerPC V2.06 architecture.
+ 
+ @opindex mfprnd
+ @opindex mno-fprnd
+ @item -mfprnd
+ @itemx -mno-fprnd
+ The @option{-mfprnd} option allows GCC to generate the FP round to
+ integer instructions implemented on the POWER5+ processor and other
+ processors that support the PowerPC V2.03 architecture.
+ 
+ @opindex mcmpb
+ @opindex mno-cmpb
+ @item -mcmpb
+ @itemx -mno-cmpb
+ The @option{-mcmpb} option allows GCC to generate the compare bytes
+ instruction implemented on the POWER6 processor and other processors
+ that support the PowerPC V2.05 architecture.
+ 
+ @opindex mhard-dfp
+ @opindex mno-hard-dfp
+ @item -mhard-dfp
+ @itemx -mno-hard-dfp
+ The @option{-mhard-dfp} option allows GCC to generate the decimal
+ floating-point instructions implemented on some POWER processors.
+ 
  @opindex mvrsave
  @opindex mno-vrsave
  @item -mvrsave
*************** sections that are both writable and exec
*** 32747,32752 ****
--- 32898,32904 ----
  This is a PowerPC 32-bit SYSV ABI option.
  
  @opindex msplit-patch-nops
+ @opindex mno-split-patch-nops
  @item -msplit-patch-nops
  When adding NOPs for a patchable area via the
  @option{-fpatchable-function-entry} option emit the ``before'' NOPs in front
*************** The default for @option{-mfloat128} is e
*** 32827,32837 ****
  systems using the VSX instruction set, and disabled on other systems.
  
  If you use the ISA 3.0 instruction set (@option{-mcpu=power9}) on a
! 64-bit system, the IEEE 128-bit floating point support will also enable
  the generation of ISA 3.0 IEEE 128-bit floating point instructions.
! Otherwise, if you do not specify to generate ISA 3.0 instructions or you
! are targeting a 32-bit big endian system, IEEE 128-bit floating point
! will be done with software emulation.
  
  @opindex mfloat128-hardware
  @opindex mno-float128-hardware
--- 32979,32989 ----
  systems using the VSX instruction set, and disabled on other systems.
  
  If you use the ISA 3.0 instruction set (@option{-mcpu=power9}) on a
! 64-bit system, the IEEE 128-bit floating point support also enables
  the generation of ISA 3.0 IEEE 128-bit floating point instructions.
! Otherwise, if you do not specify generation of ISA 3.0 instructions or you
! are targeting a 32-bit big-endian system, IEEE 128-bit floating point
! is handled with software emulation.
  
  @opindex mfloat128-hardware
  @opindex mno-float128-hardware
*************** pointer to 64 bits, and generates code f
*** 32856,32864 ****
--- 33008,33020 ----
  @option{-mpowerpc64}.
  
  @opindex mfull-toc
+ @opindex mno-full-toc
+ @opindex mfp-in-toc
  @opindex mno-fp-in-toc
+ @opindex msum-in-toc
  @opindex mno-sum-in-toc
  @opindex mminimal-toc
+ @opindex mno-minimal-toc
  @item -mfull-toc
  @itemx -mno-fp-in-toc
  @itemx -mno-sum-in-toc
*************** signals may get corrupted data.
*** 32980,32986 ****
  @item -mavoid-indexed-addresses
  @itemx -mno-avoid-indexed-addresses
  Generate code that tries to avoid (not avoid) the use of indexed load
! or store instructions. These instructions can incur a performance
  penalty on Power6 processors in certain situations, such as when
  stepping through large arrays that cross a 16M boundary.  This option
  is enabled by default when targeting Power6 and disabled otherwise.
--- 33136,33142 ----
  @item -mavoid-indexed-addresses
  @itemx -mno-avoid-indexed-addresses
  Generate code that tries to avoid (not avoid) the use of indexed load
! or store instructions.  These instructions can incur a performance
  penalty on Power6 processors in certain situations, such as when
  stepping through large arrays that cross a 16M boundary.  This option
  is enabled by default when targeting Power6 and disabled otherwise.
*************** alignment of @option{-mrelocatable}.  Ob
*** 33058,33071 ****
  @option{-mrelocatable-lib} may be linked with objects compiled with
  any combination of the @option{-mrelocatable} options.
  
- @opindex mno-toc
- @opindex mtoc
- @item -mno-toc
- @itemx -mtoc
- On System V.4 and embedded PowerPC systems do not (do) assume that
- register 2 contains a pointer to a global area pointing to the addresses
- used in the program.
- 
  @opindex mlittle
  @opindex mlittle-endian
  @item -mlittle
--- 33214,33219 ----
*************** OpenBSD operating system.
*** 33197,33203 ****
  
  @opindex mtraceback
  @item -mtraceback=@var{traceback_type}
! Select the type of traceback table. Valid values for @var{traceback_type}
  are @samp{full}, @samp{part}, and @samp{no}.
  
  @opindex maix-struct-return
--- 33345,33351 ----
  
  @opindex mtraceback
  @item -mtraceback=@var{traceback_type}
! Select the type of traceback table.  Valid values for @var{traceback_type}
  are @samp{full}, @samp{part}, and @samp{no}.
  
  @opindex maix-struct-return
*************** targets.  The default value is target-sp
*** 33384,33407 ****
  @item -mblock-compare-inline-limit=@var{num}
  Generate non-looping inline code for all block compares (such as calls
  to @code{memcmp} or structure compares) less than or equal to @var{num}
! bytes. If @var{num} is 0, all inline expansion (non-loop and loop) of
! block compare is disabled. The default value is target-specific.
  
  @opindex mblock-compare-inline-loop-limit
  @item -mblock-compare-inline-loop-limit=@var{num}
  Generate an inline expansion using loop code for all block compares that
  are less than or equal to @var{num} bytes, but greater than the limit
! for non-loop inline block compare expansion. If the block length is not
! constant, at most @var{num} bytes will be compared before @code{memcmp}
! is called to compare the remainder of the block. The default value is
  target-specific.
  
  @opindex mstring-compare-inline-limit
  @item -mstring-compare-inline-limit=@var{num}
  Compare at most @var{num} string bytes with inline code.
  If the difference or end of string is not found at the
! end of the inline compare a call to @code{strcmp} or @code{strncmp} will
! take care of the rest of the comparison. The default is 64 bytes.
  
  @opindex G
  @cindex smaller data references (PowerPC)
--- 33532,33555 ----
  @item -mblock-compare-inline-limit=@var{num}
  Generate non-looping inline code for all block compares (such as calls
  to @code{memcmp} or structure compares) less than or equal to @var{num}
! bytes.  If @var{num} is 0, all inline expansion (non-loop and loop) of
! block compare is disabled.  The default value is target-specific.
  
  @opindex mblock-compare-inline-loop-limit
  @item -mblock-compare-inline-loop-limit=@var{num}
  Generate an inline expansion using loop code for all block compares that
  are less than or equal to @var{num} bytes, but greater than the limit
! for non-loop inline block compare expansion.  If the block length is not
! constant, at most @var{num} bytes are compared before @code{memcmp}
! is called to compare the remainder of the block.  The default value is
  target-specific.
  
  @opindex mstring-compare-inline-limit
  @item -mstring-compare-inline-limit=@var{num}
  Compare at most @var{num} string bytes with inline code.
  If the difference or end of string is not found at the
! end of the inline compare, a call to @code{strcmp} or @code{strncmp}
! takes care of the rest of the comparison.  The default is 64 bytes.
  
  @opindex G
  @cindex smaller data references (PowerPC)
*************** TLS optimization, which in turn allows G
*** 33485,33490 ****
--- 33633,33639 ----
  sequence.
  
  @opindex mrecip
+ @opindex mno-recip
  @item -mrecip
  @itemx -mno-recip
  This option enables use of the reciprocal estimate and
*************** all of the reciprocal estimate instructi
*** 33545,33550 ****
--- 33694,33700 ----
  which handle the double-precision reciprocal square root calculations.
  
  @opindex mrecip-precision
+ @opindex mno-recip-precision
  @item -mrecip-precision
  @itemx -mno-recip-precision
  Assume (do not assume) that the reciprocal estimate instructions
*************** for power7.  Both @option{-ftree-vectori
*** 33580,33585 ****
--- 33730,33736 ----
  libraries must be specified at link time.
  
  @opindex mfriz
+ @opindex mno-friz
  @item -mfriz
  @itemx -mno-friz
  Generate (do not generate) the @code{friz} instruction when the
*************** point.  The @code{friz} instruction does
*** 33589,33594 ****
--- 33740,33746 ----
  the floating-point number is too large to fit in an integer.
  
  @opindex mpointers-to-nested-functions
+ @opindex mno-pointers-to-nested-functions
  @item -mpointers-to-nested-functions
  @itemx -mno-pointers-to-nested-functions
  Generate (do not generate) code to load up the static chain register
*************** to functions compiled in other languages
*** 33602,33607 ****
--- 33754,33760 ----
  you use @option{-mno-pointers-to-nested-functions}.
  
  @opindex msave-toc-indirect
+ @opindex mno-save-toc-indirect
  @item -msave-toc-indirect
  @itemx -mno-save-toc-indirect
  Generate (do not generate) code to save the TOC value in the reserved
*************** saved in the prologue, it is saved just
*** 33611,33616 ****
--- 33764,33770 ----
  pointer.  The @option{-mno-save-toc-indirect} option is the default.
  
  @opindex mcompat-align-parm
+ @opindex mno-compat-align-parm
  @item -mcompat-align-parm
  @itemx -mno-compat-align-parm
  Generate (do not generate) code to pass structure parameters with a
*************** optimization (@option{-fshrink-wrap}).
*** 33679,33697 ****
  @opindex mno-privileged
  @item -mprivileged
  @itemx -mno-privileged
! Generate (do not generate) code that will run in privileged state.
  
! @opindex block-ops-unaligned-vsx
! @opindex no-block-ops-unaligned-vsx
  @item -mblock-ops-unaligned-vsx
  @itemx -mno-block-ops-unaligned-vsx
  Generate (do not generate) unaligned vsx loads and stores for
  inline expansion of @code{memcpy} and @code{memmove}.
  
  @item --param rs6000-vect-unroll-limit=
! The vectorizer will check with target information to determine whether it
  would be beneficial to unroll the main vectorized loop and by how much.  This
! parameter sets the upper bound of how much the vectorizer will unroll the main
  loop.  The default value is four.
  
  @end table
--- 33833,33851 ----
  @opindex mno-privileged
  @item -mprivileged
  @itemx -mno-privileged
! Generate (do not generate) code that runs in privileged state.
  
! @opindex mblock-ops-unaligned-vsx
! @opindex mno-block-ops-unaligned-vsx
  @item -mblock-ops-unaligned-vsx
  @itemx -mno-block-ops-unaligned-vsx
  Generate (do not generate) unaligned vsx loads and stores for
  inline expansion of @code{memcpy} and @code{memmove}.
  
  @item --param rs6000-vect-unroll-limit=
! The vectorizer checks with target information to determine whether it
  would be beneficial to unroll the main vectorized loop and by how much.  This
! parameter sets the upper bound of how much the vectorizer unrolls the main
  loop.  The default value is four.
  
  @end table
*************** format.
*** 33753,33759 ****
  @opindex msmall-data-limit
  @item -msmall-data-limit=@var{N}
  Specifies the maximum size in bytes of global and static variables
! which can be placed into the small data area.  Using the small data
  area can lead to smaller and faster code, but the size of area is
  limited and it is up to the programmer to ensure that the area does
  not overflow.  Also when the small data area is used one of the RX's
--- 33907,33913 ----
  @opindex msmall-data-limit
  @item -msmall-data-limit=@var{N}
  Specifies the maximum size in bytes of global and static variables
! that can be placed into the small data area.  Using the small data
  area can lead to smaller and faster code, but the size of area is
  limited and it is up to the programmer to ensure that the area does
  not overflow.  Also when the small data area is used one of the RX's
*************** makes the interrupt handlers faster.
*** 33830,33836 ****
  @opindex mno-pid
  @item -mpid
  @itemx -mno-pid
! Enables the generation of position independent data.  When enabled any
  access to constant data is done via an offset from a base address
  held in a register.  This allows the location of constant data to be
  determined at run time without requiring the executable to be
--- 33984,33990 ----
  @opindex mno-pid
  @item -mpid
  @itemx -mno-pid
! Enables the generation of position-independent data.  When enabled, any
  access to constant data is done via an offset from a base address
  held in a register.  This allows the location of constant data to be
  determined at run time without requiring the executable to be
*************** Use only (or not only) @code{JSR} instru
*** 33894,33899 ****
--- 34048,34059 ----
  This option can be used when code size exceeds the range of @code{BSR}
  instructions.  Note that @option{-mno-jsr} does not mean to not use
  @code{JSR} but instead means that any type of branch may be used.
+ 
+ @opindex mlra
+ @opindex mno-lra
+ @item -mlra
+ Use the new LRA register allocator.  By default, the old ``reload''
+ allocator is used.
  @end table
  
  @emph{Note:} The generic GCC command-line option @option{-ffixed-@var{reg}}
*************** available with the vector extension faci
*** 34043,34050 ****
  z13 machine generation.
  This option changes the ABI for some vector type values with regard to
  alignment and calling conventions.  In case vector type values are
! being used in an ABI-relevant context a GAS @samp{.gnu_attribute}
! command will be added to mark the resulting binary with the ABI used.
  @option{-mvx} is enabled by default when using @option{-march=z13}.
  
  @opindex mzvector
--- 34203,34210 ----
  z13 machine generation.
  This option changes the ABI for some vector type values with regard to
  alignment and calling conventions.  In case vector type values are
! being used in an ABI-relevant context, a GAS @samp{.gnu_attribute}
! command is added to mark the resulting binary with the ABI used.
  @option{-mvx} is enabled by default when using @option{-march=z13}.
  
  @opindex mzvector
*************** builtins using instructions available wi
*** 34056,34067 ****
  facility introduced with the IBM z13 machine generation.
  This option adds support for @samp{vector} to be used as a keyword to
  define vector type variables and arguments.  @samp{vector} is only
! available when GNU extensions are enabled.  It will not be expanded
  when requesting strict standard compliance e.g.@: with @option{-std=c99}.
! In addition to the GCC low-level builtins @option{-mzvector} enables
  a set of builtins added for compatibility with AltiVec-style
  implementations like Power and Cell.  In order to make use of these
! builtins the header file @file{vecintrin.h} needs to be included.
  @option{-mzvector} is disabled by default.
  
  @opindex mmvcle
--- 34216,34227 ----
  facility introduced with the IBM z13 machine generation.
  This option adds support for @samp{vector} to be used as a keyword to
  define vector type variables and arguments.  @samp{vector} is only
! available when GNU extensions are enabled.  It is not expanded
  when requesting strict standard compliance e.g.@: with @option{-std=c99}.
! In addition to the GCC low-level builtins, @option{-mzvector} enables
  a set of builtins added for compatibility with AltiVec-style
  implementations like Power and Cell.  In order to make use of these
! builtins, you must include the header file @file{vecintrin.h}.
  @option{-mzvector} is disabled by default.
  
  @opindex mmvcle
*************** routines providing the ability of select
*** 34122,34127 ****
--- 34282,34293 ----
  entries for the TPF OS.  This option is off by default, even when
  compiling for the TPF OS and specifying @option{-mtpf-trace}.
  
+ @opindex mmain
+ @opindex mno-main
+ @item -mmain
+ For TPF OS target, use this option when linking to add the startup code
+ and other linker options to produce a main object.
+ 
  @opindex mfused-madd
  @opindex mno-fused-madd
  @item -mfused-madd
*************** hardware floating point is used.
*** 34132,34174 ****
  
  @opindex mwarn-framesize
  @item -mwarn-framesize=@var{framesize}
! Emit a warning if the current function exceeds the given frame size.  Because
! this is a compile-time check it doesn't need to be a real problem when the program
! runs.  It is intended to identify functions that most probably cause
! a stack overflow.  It is useful to be used in an environment with limited stack
! size e.g.@: the linux kernel.
  
  @opindex mwarn-dynamicstack
  @item -mwarn-dynamicstack
  Emit a warning if the function calls @code{alloca} or uses dynamically-sized
  arrays.  This is generally a bad idea with a limited stack size.
  
  @opindex mstack-guard
  @opindex mstack-size
  @item -mstack-guard=@var{stack-guard}
  @itemx -mstack-size=@var{stack-size}
! If these options are provided the S/390 back end emits additional instructions in
! the function prologue that trigger a trap if the stack size is @var{stack-guard}
! bytes above the @var{stack-size} (remember that the stack on S/390 grows downward).
  If the @var{stack-guard} option is omitted the smallest power of 2 larger than
  the frame size of the compiled function is chosen.
! These options are intended to be used to help debugging stack overflow problems.
! The additionally emitted code causes only little overhead and hence can also be
! used in production-like systems without greater performance degradation.  The given
! values have to be exact powers of 2 and @var{stack-size} has to be greater than
! @var{stack-guard} without exceeding 64k.
! In order to be efficient the extra code makes the assumption that the stack starts
! at an address aligned to the value given by @var{stack-size}.
! The @var{stack-guard} option can only be used in conjunction with @var{stack-size}.
  
  @opindex mhotpatch
  @item -mhotpatch=@var{pre-halfwords},@var{post-halfwords}
  If the hotpatch option is enabled, a ``hot-patching'' function
  prologue is generated for all functions in the compilation unit.
! The funtion label is prepended with the given number of two-byte
  NOP instructions (@var{pre-halfwords}, maximum 1000000).  After
  the label, 2 * @var{post-halfwords} bytes are appended, using the
! largest NOP like instructions the architecture allows (maximum
  1000000).
  
  If both arguments are zero, hotpatching is disabled.
--- 34298,34356 ----
  
  @opindex mwarn-framesize
  @item -mwarn-framesize=@var{framesize}
! Emit a warning if the current function exceeds the given frame size.
! Because this is a compile-time check it doesn't need to be a real
! problem when the program runs.  It is intended to identify functions
! hat most probably cause a stack overflow.  It is useful for
! environments with limited stack size e.g.@: the Linux kernel.
! 
! A value of zero disables this warning; that is the default.
  
  @opindex mwarn-dynamicstack
+ @opindex mno-warn-dynamicstack
  @item -mwarn-dynamicstack
+ @itemx -mno-warn-dynamicstack
  Emit a warning if the function calls @code{alloca} or uses dynamically-sized
  arrays.  This is generally a bad idea with a limited stack size.
  
  @opindex mstack-guard
  @opindex mstack-size
+ @opindex mno-stack-guard
+ @opindex mno-stack-size
  @item -mstack-guard=@var{stack-guard}
  @itemx -mstack-size=@var{stack-size}
! @itemx -mno-stack-guard
! @itemx -mno-stack-size
! If these options are enabled, the S/390 back end emits additional
! instructions in the function prologue that trigger a trap if the stack
! size is @var{stack-guard} bytes above the @var{stack-size} (remember that
! the stack on S/390 grows downward).
  If the @var{stack-guard} option is omitted the smallest power of 2 larger than
  the frame size of the compiled function is chosen.
! 
! These options are intended to be used to help debugging stack overflow
! problems.  The additionally emitted code causes only little overhead and
! hence can also be used in production-like systems without greater
! performance degradation.
! 
! The given values have to be exact powers of 2
! and @var{stack-size} has to be greater than @var{stack-guard} without
! exceeding 64k.
! In order to be efficient the extra code makes the assumption that the
! stack starts at an address aligned to the value given by @var{stack-size}.
! 
! The @option{-mstack-guard=} option can only be used in conjunction with
! @option{-mstack-size=}.  You can override these options on the command line
! with @option{-mno-stack-guard} and @option{-mno-stack-size}, respectively.
  
  @opindex mhotpatch
  @item -mhotpatch=@var{pre-halfwords},@var{post-halfwords}
  If the hotpatch option is enabled, a ``hot-patching'' function
  prologue is generated for all functions in the compilation unit.
! The function label is prepended with the given number of two-byte
  NOP instructions (@var{pre-halfwords}, maximum 1000000).  After
  the label, 2 * @var{post-halfwords} bytes are appended, using the
! largest NOP-like instructions the architecture allows (maximum
  1000000).
  
  If both arguments are zero, hotpatching is disabled.
*************** If both arguments are zero, hotpatching
*** 34176,34187 ****
  This option can be overridden for individual functions with the
  @code{hotpatch} attribute.
  
  @opindex mstack-protector-guard
  @opindex mstack-protector-guard-record
  @item -mstack-protector-guard=@var{guard}
  @itemx -mstack-protector-guard-record
  Generate stack protection code using canary at @var{guard}.  Supported
! locations are @var{global} for a global canary or @var{tls} for a per-thread
  canary in the TLS block (the default).
  
  Option @option{-mstack-protector-guard-record} results in the generation of
--- 34358,34382 ----
  This option can be overridden for individual functions with the
  @code{hotpatch} attribute.
  
+ @opindex mpic-data-is-text-relative
+ @opindex mno-pic-data-is-text-relative
+ @item -mpic-data-is-text-relative
+ @itemx -mno-pic-data-is-text-relative
+ When compiling for S/390 with @option{-fpic} or @option{-fPIC}, normally
+ GCC emits code using relative addressing between code and data.  However,
+ for hotpatching it might be required to introduce new @code{.text} parts
+ while using the existing @code{.data} and @code{.bss} sections.
+ In this case, use @option{-mno-pic-data-is-text-relative} to force
+ addressing through the GOT instead.
+ 
  @opindex mstack-protector-guard
  @opindex mstack-protector-guard-record
+ @opindex mno-stack-protector-guard-record
  @item -mstack-protector-guard=@var{guard}
  @itemx -mstack-protector-guard-record
+ 
  Generate stack protection code using canary at @var{guard}.  Supported
! locations are @samp{global} for a global canary or @samp{tls} for a per-thread
  canary in the TLS block (the default).
  
  Option @option{-mstack-protector-guard-record} results in the generation of
*************** section @code{__stack_protector_loc} con
*** 34189,34194 ****
--- 34384,34480 ----
  which load the address of the global guard.  Thus, this option has only an
  effect in conjunction with @option{-mstack-protector-guard=global}.  The
  intended use is for the Linux kernel.
+ 
+ @opindex mindirect-branch
+ @opindex mindirect-branch-jump
+ @opindex mindirect-branch-call
+ @opindex mfunction-return
+ @opindex mfunction-return-mem
+ @opindex mfunction-return-reg
+ @item -mindirect-branch=@var{choice}
+ @itemx -mindirect-branch-jump=@var{choice}
+ @itemx -mindirect-branch-call=@var{choice}
+ @itemx -mfunction-return=@var{choice}
+ @itemx -mfunction-return-mem=@var{choice}
+ @itemx -mfunction-return-reg=@var{choice}
+ This group of options addresses security vulnerabilities related to
+ speculative execution and indirect branch prediction by enabling replacement
+ of indirect branches and function returns with direct branches to a thunk.
+ 
+ Specifying a @var{choice} of @samp{keep} causes generation of the
+ default code.  @samp{thunk} triggers generation of out-of-line thunks
+ and replaces the formerly indirect branch with a direct branch to the
+ thunk.  @samp{thunk-extern} does the branch replacement like @samp{thunk}
+ but does not emit the thunks.  @samp{thunk-inline} is only available with
+ @option{-mindirect-branch-jump}; it should be used in preference
+ to @samp{thunk} in user-space applications to support correct stack
+ unwinding and exception handling.
+ 
+ @option{-mindirect-branch} sets the value of @option{-mindirect-branch-jump}
+ and @option{-mindirect-branch-call}.
+ @option{-mfunction-return} sets the value of @option{-mfunction-return-reg}
+ and @option{-mfunction-return-mem.}
+ 
+ All of these options can also be set on a per-function basis using
+ function attributes.
+ 
+ @opindex mindirect-branch-table
+ @opindex mno-indirect-branch-table
+ @item -mindirect-branch-table
+ @itemx -mno-indirect-branch-table
+ 
+ This option is useful in conjunction with the
+ @option{-mindirect-branch} and @option{-mfunction-return} options.
+ When enabled, it causes generation of tables pointing to the branch
+ locations which have been patched by those options.  The tables are
+ emitted in sections named @code{.s390_indirect_jump},
+ @code{.s390_indirect_call}, @code{.s390_return_reg}, and
+ @code{.s390_return_mem}.  Each section consists of an array of 32-bit
+ elements; each entry holds the offset from the entry to the patched
+ location.
+ 
+ @opindex mfentry
+ @opindex mno-fentry
+ @item -mfentry
+ @itemx -mno-fentry
+ When used in conjunction with the @option{-pg} option, emit profiling code
+ using the @code{__fentry__} hook provided by GLIBC 2.29 or later.
+ This is only available for 64-bit code.  If this option is not enabled,
+ profiling uses the less efficient @code{_mcount} hook instead.
+ 
+ @opindex mrecord-mcount
+ @opindex mno-record-mcount
+ @item -mrecord-mcount
+ @itemx -mno-record-mcount
+ When enabled, generate a @code{__mcount_loc} section with the locations
+ of all generated profiling calls to @code{_mcount} or @code{__fentry__}.
+ 
+ @opindex mnop-mcount
+ @opindex mno-nop-mcount
+ @item mnop-mcount
+ @itemx mno-nop-mcount
+ Instead of generating calls to @code{_mcount} or @code{__fentry__}
+ with @option{-pg}, insert a sequence no-op instructions of the same length
+ at the locations where the calls would have been inserted.  This can be used
+ in conjunction with the @option{-mrecord-mcount} option to patch the call
+ sequences into the object file without recompiling it.
+ 
+ @opindex mpreserve-args
+ @opindex mno-preserve-args
+ @item -mpreserve-args
+ @itemx -mno-preserve-args
+ When enabled, save all argument registers to the stack, and generate
+ corresponding CFI information.  This is useful for applications that
+ want to implement their own stack unwinding and need access to function
+ arguments.
+ 
+ @opindex munaligned-symbols
+ @opindex mno-unaligned-symbols
+ @item -munaligned-symbols
+ @itemx -mno-unaligned-symbols
+ Assume that external symbols with a natural alignment of 1 are potentially
+ unaligned.  By default, all symbols without explicit alignment are assumed
+ to be aligned on a 2-byte boundary as mandated by the IBM Z ABI.
  @end table
  
  @node SH Options
*************** Enable the use of the instruction @code{
*** 34379,34392 ****
  alignment constraints.
  
  @opindex mrenesas
- @item -mrenesas
- Comply with the calling conventions defined by Renesas.
- 
  @opindex mno-renesas
! @item -mno-renesas
! Comply with the calling conventions defined for GCC before the Renesas
! conventions were available.  This option is the default for all
! targets of the SH toolchain.
  
  @opindex mnomacsave
  @item -mnomacsave
--- 34665,34677 ----
  alignment constraints.
  
  @opindex mrenesas
  @opindex mno-renesas
! @item -mrenesas
! @itemx -mno-renesas
! Comply with the calling conventions defined by Renesas.  The default for all
! targets of the SH toolchain is @option{-mno-renesas}, which uses the
! calling conventions defined for GCC before the Renesas conventions were
! available.
  
  @opindex mnomacsave
  @item -mnomacsave
*************** floating-point greater-equal and less-eq
*** 34405,34417 ****
  can be overridden by specifying either @option{-mieee} or @option{-mno-ieee}.
  
  @opindex minline-ic_invalidate
  @item -minline-ic_invalidate
  Inline code to invalidate instruction cache entries after setting up
  nested function trampolines.
! This option has no effect if @option{-musermode} is in effect and the selected
! code generation option (e.g.@: @option{-m4}) does not allow the use of the @code{icbi}
! instruction.
! If the selected code generation option does not allow the use of the @code{icbi}
  instruction, and @option{-musermode} is not in effect, the inlined code
  manipulates the instruction cache address array directly with an associative
  write.  This not only requires privileged mode at run time, but it also
--- 34690,34705 ----
  can be overridden by specifying either @option{-mieee} or @option{-mno-ieee}.
  
  @opindex minline-ic_invalidate
+ @opindex mno-inline-ic_invalidate
  @item -minline-ic_invalidate
+ @itemx -mno-inline-ic_invalidate
  Inline code to invalidate instruction cache entries after setting up
  nested function trampolines.
! This option has no effect if @option{-musermode} is in effect and the
! selected code generation option (e.g.@: @option{-m4}) does not allow
! the use of the @code{icbi} instruction.
! If the selected code generation option does not allow the use of the
! @code{icbi}
  instruction, and @option{-musermode} is not in effect, the inlined code
  manipulates the instruction cache address array directly with an associative
  write.  This not only requires privileged mode at run time, but it also
*************** fails if the cache line had been mapped
*** 34421,34435 ****
  @item -misize
  Dump instruction size and location in the assembly code.
  
- @opindex mpadstruct
- @item -mpadstruct
- This option is deprecated.  It pads structures to multiple of 4 bytes,
- which is incompatible with the SH ABI@.
- 
  @opindex matomic-model=@var{model}
  @item -matomic-model=@var{model}
! Sets the model of atomic operations and additional parameters as a comma
! separated list.  For details on the atomic built-in functions see
  @ref{__atomic Builtins}.  The following models and parameters are supported:
  
  @table @samp
--- 34709,34718 ----
  @item -misize
  Dump instruction size and location in the assembly code.
  
  @opindex matomic-model=@var{model}
  @item -matomic-model=@var{model}
! Sets the model of atomic operations and additional parameters as a
! comma-separated list.  For details on the atomic built-in functions see
  @ref{__atomic Builtins}.  The following models and parameters are supported:
  
  @table @samp
*************** Disable compiler generated atomic sequen
*** 34439,34445 ****
  operations.  This is the default if the target is not @code{sh*-*-linux*}.
  
  @item soft-gusa
! Generate GNU/Linux compatible gUSA software atomic sequences for the atomic
  built-in functions.  The generated atomic sequences require additional support
  from the interrupt/exception handling code of the system and are only suitable
  for SH3* and SH4* single-core systems.  This option is enabled by default when
--- 34722,34728 ----
  operations.  This is the default if the target is not @code{sh*-*-linux*}.
  
  @item soft-gusa
! Generate GNU/Linux-compatible gUSA software atomic sequences for the atomic
  built-in functions.  The generated atomic sequences require additional support
  from the interrupt/exception handling code of the system and are only suitable
  for SH3* and SH4* single-core systems.  This option is enabled by default when
*************** Generate software atomic sequences that
*** 34453,34460 ****
  block.  This is a variation of the gUSA sequences which can also be used on
  SH1* and SH2* targets.  The generated atomic sequences require additional
  support from the interrupt/exception handling code of the system and are only
! suitable for single-core systems.  When using this model, the @samp{gbr-offset=}
! parameter has to be specified as well.
  
  @item soft-imask
  Generate software atomic sequences that temporarily disable interrupts by
--- 34736,34743 ----
  block.  This is a variation of the gUSA sequences which can also be used on
  SH1* and SH2* targets.  The generated atomic sequences require additional
  support from the interrupt/exception handling code of the system and are only
! suitable for single-core systems.  When using this model,
! the @samp{gbr-offset=} parameter has to be specified as well.
  
  @item soft-imask
  Generate software atomic sequences that temporarily disable interrupts by
*************** required.  This model is enabled by defa
*** 34467,34474 ****
  @item hard-llcs
  Generate hardware atomic sequences using the @code{movli.l} and @code{movco.l}
  instructions only.  This is only available on SH4A and is suitable for
! multi-core systems.  Since the hardware instructions support only 32 bit atomic
! variables access to 8 or 16 bit variables is emulated with 32 bit accesses.
  Code compiled with this option is also compatible with other software
  atomic model interrupt/exception handling systems if executed on an SH4A
  system.  Additional support from the interrupt/exception handling code of the
--- 34750,34758 ----
  @item hard-llcs
  Generate hardware atomic sequences using the @code{movli.l} and @code{movco.l}
  instructions only.  This is only available on SH4A and is suitable for
! multi-core systems.
! Since the hardware instructions support only 32-bit atomic
! variables, access to 8- or 16-bit variables is emulated with 32-bit accesses.
  Code compiled with this option is also compatible with other software
  atomic model interrupt/exception handling systems if executed on an SH4A
  system.  Additional support from the interrupt/exception handling code of the
*************** the Global Offset Table instead of the P
*** 34506,34512 ****
  @opindex mno-usermode
  @item -musermode
  @itemx -mno-usermode
! Don't allow (allow) the compiler generating privileged mode code.  Specifying
  @option{-musermode} also implies @option{-mno-inline-ic_invalidate} if the
  inlined code would not work in user mode.  @option{-musermode} is the default
  when the target is @code{sh*-*-linux*}.  If the target is SH1* or SH2*
--- 34790,34796 ----
  @opindex mno-usermode
  @item -musermode
  @itemx -mno-usermode
! Don't allow (allow) the compiler to generate privileged mode code.  Specifying
  @option{-musermode} also implies @option{-mno-inline-ic_invalidate} if the
  inlined code would not work in user mode.  @option{-musermode} is the default
  when the target is @code{sh*-*-linux*}.  If the target is SH1* or SH2*
*************** when the target is @code{sh*-*-linux*}.
*** 34514,34520 ****
  
  @opindex multcost=@var{number}
  @item -multcost=@var{number}
! Set the cost to assume for a multiply insn.
  
  @opindex mdiv=@var{strategy}
  @item -mdiv=@var{strategy}
--- 34798,34804 ----
  
  @opindex multcost=@var{number}
  @item -multcost=@var{number}
! Set the cost to assume for a multiply instruction.
  
  @opindex mdiv=@var{strategy}
  @item -mdiv=@var{strategy}
*************** SH2A and SHcompact.
*** 34533,34567 ****
  Calls a library function that performs the operation in double precision
  floating point.  Division by zero causes a floating-point exception.  This is
  the default for SHcompact with FPU.  Specifying this for targets that do not
! have a double precision FPU defaults to @code{call-div1}.
  
  @item call-table
  Calls a library function that uses a lookup table for small divisors and
! the @code{div1} instruction with case distinction for larger divisors.  Division
! by zero calculates an unspecified result and does not trap.  This is the default
  for SH4.  Specifying this for targets that do not have dynamic shift
  instructions defaults to @code{call-div1}.
  
  @end table
  
! When a division strategy has not been specified the default strategy is
  selected based on the current target.  For SH2A the default strategy is to
  use the @code{divs} and @code{divu} instructions instead of library function
  calls.
  
  @opindex maccumulate-outgoing-args
  @item -maccumulate-outgoing-args
  Reserve space once for outgoing arguments in the function prologue rather
! than around each call.  Generally beneficial for performance and size.  Also
! needed for unwinding to avoid changing the stack frame around conditional code.
  
  @opindex mdivsi3_libfunc=@var{name}
  @item -mdivsi3_libfunc=@var{name}
  Set the name of the library function used for 32-bit signed division to
  @var{name}.
! This only affects the name used in the @samp{call} division strategies, and
! the compiler still expects the same sets of input/output/clobbered registers as
! if this option were not present.
  
  @opindex mfixed-range
  @item -mfixed-range=@var{register-range}
--- 34817,34856 ----
  Calls a library function that performs the operation in double precision
  floating point.  Division by zero causes a floating-point exception.  This is
  the default for SHcompact with FPU.  Specifying this for targets that do not
! have a double-precision FPU defaults to @code{call-div1}.
  
  @item call-table
  Calls a library function that uses a lookup table for small divisors and
! the @code{div1} instruction with case distinction for larger divisors.
! Division by zero calculates an unspecified result and does not trap.
! This is the default
  for SH4.  Specifying this for targets that do not have dynamic shift
  instructions defaults to @code{call-div1}.
  
  @end table
  
! When a division strategy has not been specified, the default strategy is
  selected based on the current target.  For SH2A the default strategy is to
  use the @code{divs} and @code{divu} instructions instead of library function
  calls.
  
  @opindex maccumulate-outgoing-args
+ @opindex mno-accumulate-outgoing-args
  @item -maccumulate-outgoing-args
+ @item -mno-accumulate-outgoing-args
  Reserve space once for outgoing arguments in the function prologue rather
! than around each call.  This is generally beneficial for performance and
! size, and also needed for unwinding to avoid changing the stack frame
! around conditional code.  @option{-maccumulate-outgoing-args} is
! enabled the default.
  
  @opindex mdivsi3_libfunc=@var{name}
  @item -mdivsi3_libfunc=@var{name}
  Set the name of the library function used for 32-bit signed division to
  @var{name}.
! This only affects the name used in the @samp{call} division strategies,
! and the compiler still expects the same sets of input/output/clobbered
! registers as if this option were not present.
  
  @opindex mfixed-range
  @item -mfixed-range=@var{register-range}
*************** is being compiled for.
*** 34585,34619 ****
  Assume (do not assume) that zero displacement conditional branch instructions
  @code{bt} and @code{bf} are fast.  If @option{-mzdcbranch} is specified, the
  compiler prefers zero displacement branch code sequences.  This is
! enabled by default when generating code for SH4 and SH4A.  It can be explicitly
! disabled by specifying @option{-mno-zdcbranch}.
  
  @opindex mcbranch-force-delay-slot
  @item -mcbranch-force-delay-slot
! Force the usage of delay slots for conditional branches, which stuffs the delay
! slot with a @code{nop} if a suitable instruction cannot be found.  By default
  this option is disabled.  It can be enabled to work around hardware bugs as
  found in the original SH7055.
  
- @opindex mfused-madd
- @opindex mno-fused-madd
- @item -mfused-madd
- @itemx -mno-fused-madd
- Generate code that uses (does not use) the floating-point multiply and
- accumulate instructions.  These instructions are generated by default
- if hardware floating point is used.  The machine-dependent
- @option{-mfused-madd} option is now mapped to the machine-independent
- @option{-ffp-contract=fast} option, and @option{-mno-fused-madd} is
- mapped to @option{-ffp-contract=off}.
- 
  @opindex mfsca
  @opindex mno-fsca
  @item -mfsca
  @itemx -mno-fsca
  Allow or disallow the compiler to emit the @code{fsca} instruction for sine
  and cosine approximations.  The option @option{-mfsca} must be used in
! combination with @option{-funsafe-math-optimizations}.  It is enabled by default
! when generating code for SH4A.  Using @option{-mno-fsca} disables sine and cosine
  approximations even if @option{-funsafe-math-optimizations} is in effect.
  
  @opindex mfsrra
--- 34874,34899 ----
  Assume (do not assume) that zero displacement conditional branch instructions
  @code{bt} and @code{bf} are fast.  If @option{-mzdcbranch} is specified, the
  compiler prefers zero displacement branch code sequences.  This is
! enabled by default when generating code for SH4 and SH4A.
! It can be explicitly disabled by specifying @option{-mno-zdcbranch}.
  
  @opindex mcbranch-force-delay-slot
  @item -mcbranch-force-delay-slot
! Force the usage of delay slots for conditional branches, which stuffs the
! delay slot with a @code{nop} if a suitable instruction cannot be found.
! By default
  this option is disabled.  It can be enabled to work around hardware bugs as
  found in the original SH7055.
  
  @opindex mfsca
  @opindex mno-fsca
  @item -mfsca
  @itemx -mno-fsca
  Allow or disallow the compiler to emit the @code{fsca} instruction for sine
  and cosine approximations.  The option @option{-mfsca} must be used in
! combination with @option{-funsafe-math-optimizations}.
! It is enabled by default when generating code for SH4A.
! Using @option{-mno-fsca} disables sine and cosine
  approximations even if @option{-funsafe-math-optimizations} is in effect.
  
  @opindex mfsrra
*************** approximations even if @option{-funsafe-
*** 34621,34660 ****
  @item -mfsrra
  @itemx -mno-fsrra
  Allow or disallow the compiler to emit the @code{fsrra} instruction for
! reciprocal square root approximations.  The option @option{-mfsrra} must be used
! in combination with @option{-funsafe-math-optimizations} and
! @option{-ffinite-math-only}.  It is enabled by default when generating code for
! SH4A.  Using @option{-mno-fsrra} disables reciprocal square root approximations
! even if @option{-funsafe-math-optimizations} and @option{-ffinite-math-only} are
! in effect.
  
  @opindex mpretend-cmove
  @item -mpretend-cmove
! Prefer zero-displacement conditional branches for conditional move instruction
! patterns.  This can result in faster code on the SH4 processor.
  
! @opindex fdpic
  @item -mfdpic
  Generate code using the FDPIC ABI.
  
  @end table
  
  @node Solaris 2 Options
  @subsection Solaris 2 Options
  @cindex Solaris 2 options
  
! These @samp{-m} options are supported on Solaris 2:
  
  @table @gcctabopt
  @opindex mclear-hwcap
  @item -mclear-hwcap
  @option{-mclear-hwcap} tells the compiler to remove the hardware
  capabilities generated by the Solaris assembler.  This is only necessary
  when object files use ISA extensions not supported by the current
  machine, but check at runtime whether or not to use them.
  
  @opindex mimpure-text
  @item -mimpure-text
  @option{-mimpure-text}, used in addition to @option{-shared}, tells
  the compiler to not pass @option{-z text} to the linker when linking a
  shared object.  Using this option, you can link position-dependent
--- 34901,34957 ----
  @item -mfsrra
  @itemx -mno-fsrra
  Allow or disallow the compiler to emit the @code{fsrra} instruction for
! reciprocal square root approximations.  The option @option{-mfsrra}
! must be used in combination with @option{-funsafe-math-optimizations} and
! @option{-ffinite-math-only}.
! It is enabled by default when generating code for SH4A.
! Using @option{-mno-fsrra} disables reciprocal square root approximations
! even if @option{-funsafe-math-optimizations} and @option{-ffinite-math-only}
! are in effect.
  
  @opindex mpretend-cmove
+ @opindex mno-pretend-cmove
  @item -mpretend-cmove
! @itemx -mno-pretend-cmove
! Prefer or don't prefer zero-displacement conditional branches for
! conditional move instruction patterns.
! This can result in faster code on the SH4 processor.
  
! @opindex mfdpic
! @opindex mnofdpic
  @item -mfdpic
+ @itemx -mno-fdpic
  Generate code using the FDPIC ABI.
  
+ @opindex mlra
+ @opindex mno-lra
+ @item -mlra
+ @itemx -mno-lra
+ Use the new LRA register allocator.  By default, the old ``reload''
+ allocator is used.
+ 
  @end table
  
  @node Solaris 2 Options
  @subsection Solaris 2 Options
  @cindex Solaris 2 options
  
! These options are supported on Solaris 2:
  
  @table @gcctabopt
  @opindex mclear-hwcap
+ @opindex mno-clear-hwcap
  @item -mclear-hwcap
+ @itemx -mno-clear-hwcap
  @option{-mclear-hwcap} tells the compiler to remove the hardware
  capabilities generated by the Solaris assembler.  This is only necessary
  when object files use ISA extensions not supported by the current
  machine, but check at runtime whether or not to use them.
  
  @opindex mimpure-text
+ @opindex mno-impure-text
  @item -mimpure-text
+ @itemx -mno-impure-text
  @option{-mimpure-text}, used in addition to @option{-shared}, tells
  the compiler to not pass @option{-z text} to the linker when linking a
  shared object.  Using this option, you can link position-dependent
*************** shared object is not actually shared acr
*** 34667,34686 ****
  using @option{-mimpure-text}, you should compile all source code with
  @option{-fpic} or @option{-fPIC}.
  
- @end table
- 
- These switches are supported in addition to the above on Solaris 2:
- 
- @table @gcctabopt
  @opindex gsctf
  @item -gsctf
  Generate Solaris CTF.  Needs to be used both for compilation and
  linking.  See @command{ctf(7)} for more information.  This is only
  supported since Solaris 11.4 SRU 84 where the necessary toolchain
  support was added.
  @opindex pthreads
! @item -pthreads
! This is a synonym for @option{-pthread}.
  @end table
  
  @node SPARC Options
--- 34964,34986 ----
  using @option{-mimpure-text}, you should compile all source code with
  @option{-fpic} or @option{-fPIC}.
  
  @opindex gsctf
  @item -gsctf
  Generate Solaris CTF.  Needs to be used both for compilation and
  linking.  See @command{ctf(7)} for more information.  This is only
  supported since Solaris 11.4 SRU 84 where the necessary toolchain
  support was added.
+ 
+ @opindex pthread
  @opindex pthreads
! @item -pthread
! @itemx -pthreads
! On Solaris targets, these both options define the preprocessor symbols
! @code{_REENTRANT} and @code{_PTHREADS}.  In modern versions of Solaris
! these symbols are no longer used in system headers and these options are
! unnecessary unless user code references them.  Additionally, since
! POSIX thread support is provided directly by the Solaris C library, it is
! not necessary to use @option{-pthread} for linking.
  @end table
  
  @node SPARC Options
*************** The 32-bit environment sets int, long an
*** 35055,35060 ****
--- 35355,35367 ----
  The 64-bit environment sets int to 32 bits and long and pointer
  to 64 bits.
  
+ @opindex mptr32
+ @opindex mptr64
+ @item -mptr32
+ @itemx -mptr64
+ Use 32- or 64-bit pointers, respectively.  Unlike the @option{-m32} and
+ @option{-m64} options, this affects only the pointer size and not the ABI.
+ 
  @opindex mcmodel=
  @item -mcmodel=@var{which}
  Set the code model to one of
*************** alignment of all objects to at most 4-by
*** 35361,35380 ****
  @code{__V850_8BYTE_ALIGN__} is defined.
  
  @opindex mbig-switch
  @item -mbig-switch
  Generate code suitable for big switch tables.  Use this option only if
  the assembler/linker complain about out of range branches within a switch
  table.
  
  @opindex mapp-regs
  @item -mapp-regs
! This option causes r2 and r5 to be used in the code generated by
! the compiler.  This setting is the default.
  
! @opindex mno-app-regs
! @item -mno-app-regs
! This option causes r2 and r5 to be treated as fixed registers.
  
  @end table
  
  @node VAX Options
--- 35668,35705 ----
  @code{__V850_8BYTE_ALIGN__} is defined.
  
  @opindex mbig-switch
+ @opindex mno-big-switch
  @item -mbig-switch
+ @itemx -mno-big-switch
  Generate code suitable for big switch tables.  Use this option only if
  the assembler/linker complain about out of range branches within a switch
  table.
  
  @opindex mapp-regs
+ @opindex mno-app-regs
  @item -mapp-regs
! @itemx -mno-app-regs
! @option{-mapp-regs} causes r2 and r5 to be used in the code generated by
! the compiler.  This setting is the default.  @option{-mno-app-regs}
! causes r2 and r5 to be treated as fixed registers.
  
! @opindex msmall-sld
! @opindex mno-small-sld
! @item -msmall-sld
! @itemx -mno-small-sld
! Enable or disable the use of the short load instructions.
! 
! @opindex mno-strict-align
! @item -mno-strict-align
! Do not enforce strict data alignment.
  
+ @opindex mjump-tables-in-data-section
+ @opindex mno-jump-tables-in-data-section
+ @item -mjump-tables-in-data-section
+ @itemx -mno-jump-tables-in-data-section
+ Enable or disable placement of jump tables for switch statements in
+ the @code{.data} section rather than the @code{.code} section.  The
+ default is @option{-mno-jump-tables-in-data-section}.
  @end table
  
  @node VAX Options
*************** instead of D_floating.
*** 35415,35420 ****
--- 35740,35756 ----
  @itemx -mno-lra
  Enable Local Register Allocation.  This is still experimental for the VAX,
  so by default the compiler uses standard reload.
+ 
+ @opindex mvaxc-alignment
+ @item -mvaxc-alignment
+ Use VAXC conventions for alignment of structure members.
+ 
+ @opindex mqmath
+ @opindex mno-qmath
+ @item -mqmath
+ @itemx -mno-qmath
+ Enable or disable new instruction patterns for 64-bit integer addition
+ and subtraction.
  @end table
  
  @node Visium Options
*************** so by default the compiler uses standard
*** 35425,35440 ****
  
  @opindex mdebug
  @item -mdebug
! A program which performs file I/O and is destined to run on an MCM target
! should be linked with this option.  It causes the libraries libc.a and
! libdebug.a to be linked.  The program should be run on the target under
! the control of the GDB remote debugging stub.
  
  @opindex msim
  @item -msim
! A program which performs file I/O and is destined to run on the simulator
! should be linked with option.  This causes libraries libc.a and libsim.a to
! be linked.
  
  @opindex mfpu
  @opindex mhard-float
--- 35761,35776 ----
  
  @opindex mdebug
  @item -mdebug
! Use this option when linking programs that perform file I/O and are
! destined to run on an MCM target.  It causes the libraries
! @file{libc.a} and @file{libdebug.a} to be linked.  You should run program
! on the the target under the control of the GDB remote debugging stub.
  
  @opindex msim
  @item -msim
! Use this option when linking programs that perform file I/O and are
! destined to run on the simulator.  It causes the libraries
! @file{libc.a} and @file{libsim.a} to be linked.
  
  @opindex mfpu
  @opindex mhard-float
*************** than PowerPC, nor on VxWorks version 7 o
*** 35538,35543 ****
--- 35874,35883 ----
  is part of the VxWorks build configuration and the library paths are the
  same for either choice.
  
+ @opindex mvthreads
+ @item -mvthreads
+ Link against the VxWorks AE vThread runtime environment.
+ 
  @opindex non-static
  @item -non-static
  Link an RTP executable against shared libraries rather than static
*************** is defined for compatibility with Diab.
*** 35567,35573 ****
  @subsection x86 Options
  @cindex x86 Options
  
! These @samp{-m} options are defined for the x86 family of computers.
  
  @table @gcctabopt
  
--- 35907,35917 ----
  @subsection x86 Options
  @cindex x86 Options
  
! This section documents @option{-m} options available for the x86 family
! of computers.
! 
! The following group of options allows compilation to target a specific
! processor.
  
  @table @gcctabopt
  
*************** instruction set applicable to all proces
*** 36188,36197 ****
  @option{-mtune} indicates the processor (or, in this case, collection of
  processors) for which the code is optimized.
  @end table
  
! @opindex mcpu
! @item -mcpu=@var{cpu-type}
! A deprecated synonym for @option{-mtune}.
  
  @opindex mfpmath
  @item -mfpmath=@var{unit}
--- 36532,37114 ----
  @option{-mtune} indicates the processor (or, in this case, collection of
  processors) for which the code is optimized.
  @end table
+ @end table
  
! The following options allow more detailed control over which instruction
! set extensions are targeted by GCC.
! Each has a corresponding @option{-mno-} option to disable use of these
! instructions.
! 
! These extensions are also available as built-in functions: see
! @ref{x86 Built-in Functions}, for details of the functions enabled and
! disabled by these switches.
! 
! These options enable GCC to use these extended instructions in
! generated code.  Applications that
! perform run-time CPU detection must compile separate files for each
! supported architecture, using the appropriate flags.  In particular,
! the file containing the CPU detection code should be compiled without
! these options.
! 
! To control whether 387 or SSE/AVX instructions are generated
! automatically for floating-point arithmetic, see @option{-mfpmath=}, below.
! 
! @table @gcctabopt
! @opindex mmmx
! @opindex mno-mmx
! @item -mmmx
! Support MMX built-in functions.
! 
! @opindex msse
! @opindex mno-sse
! @item -msse
! Support MMX and SSE built-in functions and code generation.
! 
! @opindex msse2
! @opindex mno-sse2
! @item -msse2
! Support MMX, SSE and SSE2 built-in functions and code generation.
! 
! @opindex msse3
! @opindex mno-sse3
! @item -msse3
! Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation.
! 
! @opindex mssse3
! @opindex mno-ssse3
! @item -mssse3
! Support MMX, SSE, SSE2, SSE3 and SSSE3 built-in functions and code generation.
! 
! @opindex msse4.1
! @opindex mno-sse4.1
! @item -msse4.1
! Support MMX, SSE, SSE2, SSE3, SSSE3 and SSE4.1 built-in functions and
! code generation.
! 
! @opindex msse4.2
! @opindex mno-sse4.2
! @item -msse4.2
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 and SSE4.2 built-in functions
! and code generation.
! 
! @opindex msse4
! @opindex mno-sse4
! @item -msse4
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 and SSE4.2 built-in functions
! and code generation.
! 
! Note that @option{-msse4} enables both SSE4.1 and SSE4.2 support,
! while @option{-mno-sse4} turns off those features; neither form of the
! option affects SSE4A support, controlled separately by
! @option{-msse4a}.
! 
! @opindex msse4a
! @opindex mno-sse4a
! @item -msse4a
! Support MMX, SSE, SSE2, SSE3 and SSE4A built-in functions and code generation.
! 
! @opindex mavx
! @opindex mno-avx
! @item -mavx
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 and AVX built-in
! functions and code generation.
! 
! @opindex mavx2
! @opindex mno-avx2
! @item -mavx2
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and AVX2
! built-in functions and code generation.
! 
! @opindex mavx512f
! @opindex mno-avx512f
! @item -mavx512f
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and
! AVX512F built-in functions and code generation.
! 
! @opindex mavx512cd
! @opindex mno-avx512cd
! @item -mavx512cd
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX512F and AVX512CD built-in functions and code generation.
! 
! @opindex mavx512vl
! @opindex mno-avx512vl
! @item -mavx512vl
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX512F and AVX512VL built-in functions and code generation.
! 
! @opindex mavx512bw
! @opindex mno-avx512bw
! @item -mavx512bw
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX512F and AVX512BW built-in functions and code generation.
! 
! @opindex mavx512dq
! @opindex mno-avx512dq
! @item -mavx512dq
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX512F and AVX512DQ built-in functions and code generation.
! 
! @opindex mavx512ifma
! @opindex mno-avx512ifma
! @item -mavx512ifma
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX512F and AVX512IFMA built-in functions and code generation.
! 
! @opindex mavx512vbmi
! @opindex mno-avx512vbmi
! @item -mavx512vbmi
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX512F and AVX512VBMI built-in functions and code generation.
! 
! @opindex mavx512vpopcntdq
! @opindex mno-avx512vpopcntdq
! @item -mavx512vpopcntdq
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX512F and AVX512VPOPCNTDQ built-in functions and code generation.
! 
! @opindex mavx512vp2intersect
! @opindex mno-avx512vp2intersect
! @item -mavx512vp2intersect
! Support AVX512VP2INTERSECT built-in functions and code generation.
! 
! @opindex mavx512vnni
! @opindex mno-avx512vnni
! @item -mavx512vnni
! Support AVX512VNNI built-in functions and code generation.
! 
! @opindex mavx512vbmi2
! @opindex mno-avx512vbmi2
! @item -mavx512vbmi2
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F
! and AVX512VBMI2 built-in functions and code generation.
! 
! @opindex mavx512bf16
! @opindex mno-avx512bf16
! @item -mavx512bf16
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and
! AVX512BF16 built-in functions and code generation.
! 
! @opindex mavx512fp16
! @opindex mno-avx512fp16
! @item -mavx512fp16
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and
! AVX512-FP16 built-in functions and code generation.
! 
! @opindex mavx512bitalg
! @opindex mno-avx512bitalg
! @item -mavx512bitalg
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AVX512F and
! AVX512BITALG built-in functions and code generation.
! 
! @opindex mavx512bmm
! @opindex mno-avx512bmm
! @item -mavx512bmm
! Support AVX512BMM built-in functions and code generation.
! 
! @opindex mavxvnni
! @opindex mno-avxvnni
! @item -mavxvnni
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, and
! AVXVNNI built-in functions and code generation.
! 
! @opindex mavxifma
! @opindex mno-avxifma
! @item -mavxifma
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, and
! AVXIFMA built-in functions and code generation.
! 
! @opindex mavxvnniint8
! @opindex mno-avxvnniint8
! @item -mavxvnniint8
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and
! AVXVNNIINT8 built-in functions and code generation.
! 
! @opindex mavxneconvert
! @opindex mno-avxneconvert
! @item -mavxneconvert
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, and
! AVXNECONVERT build-in functions and code generation.
! 
! @opindex mavxvnniint16
! @opindex mno-avxvnniint16
! @item -mavxvnniint16
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and
! AVXVNNIINT16 built-in functions and code generation.
! 
! @opindex mavx10.1
! @opindex mno-avx10.1
! @item -mavx10.1
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! and AVX10.1 built-in functions and code generation.
! 
! @opindex mavx10.2
! @opindex mno-avx10.2
! @item -mavx10.2
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX10.1 and AVX10.2 built-in functions and code generation.
! 
! @opindex msha
! @opindex mno-sha
! @item -msha
! Support SHA1 and SHA256 built-in functions and code generation.
! 
! @opindex maes
! @opindex mno-aes
! @item -maes
! Support AES built-in functions and code generation.
! 
! @opindex mpclmul
! @opindex mno-pclmul
! @item -mpclmul
! Support PCLMUL built-in functions and code generation.
! 
! @opindex mclflushopt
! @opindex mno-clflushopt
! @item -mclflushopt
! Support CLFLUSHOPT instructions.
! 
! @opindex mclwb
! @opindex mno-clwb
! @item -mclwb
! Support CLWB instruction.
! 
! @opindex mfsgsbase
! @opindex mno-fsgsbase
! @item -mfsgsbase
! Support FSGSBASE built-in functions and code generation.
! 
! @opindex mptwrite
! @opindex mno-ptwrite
! @item -mptwrite
! Support PTWRITE built-in functions and code generation.
! 
! @opindex mrdrnd
! @opindex mno-rdrnd
! @item -mrdrnd
! Support RDRND built-in functions and code generation.
! 
! @opindex mf16c
! @opindex mno-f16c
! @item -mf16c
! Support F16C built-in functions and code generation.
! 
! @opindex mfma
! @opindex mno-fma
! @item -mfma
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA
! built-in functions and code generation.
! 
! @opindex mfma4
! @opindex mno-fma4
! @item -mfma4
! Support FMA4 built-in functions and code generation.
! 
! @opindex mpconfig
! @opindex mno-pconfig
! @item -mpconfig
! Support PCONFIG built-in functions and code generation.
! 
! @opindex mwbnoinvd
! @opindex mno-wbnoinvd
! @item -mwbnoinvd
! Support WBNOINVD built-in functions and code generation.
! 
! @opindex mprfchw
! @opindex mno-prfchw
! @item -mprfchw
! Support PREFETCHW instruction.
! 
! @opindex mrdpid
! @opindex mno-rdpid
! @item -mrdpid
! Support RDPID built-in functions and code generation.
! 
! @opindex mrdseed
! @opindex mno-rdseed
! @item -mrdseed
! Support RDSEED instruction.
! 
! @opindex msgx
! @opindex mno-sgx
! @item -msgx
! Support SGX built-in functions and code generation.
! 
! @opindex mxop
! @opindex mno-xop
! @item -mxop
! Support XOP built-in functions and code generation.
! 
! @opindex mlwp
! @opindex mno-lwp
! @item -mlwp
! Support LWP built-in functions and code generation.
! 
! @opindex m3dnow
! @opindex mno-3dnow
! @item -m3dnow
! Support 3DNow! built-in functions.
! 
! @opindex m3dnowa
! @opindex mno-3dnowa
! @item -m3dnowa
! Support Athlon 3Dnow! built-in functions.
! 
! @opindex mpopcnt
! @opindex mno-popcnt
! @item -mpopcnt
! Support code generation of popcnt instruction.
! 
! @opindex mabm
! @opindex mno-abm
! @item -mabm
! Support code generation of Advanced Bit Manipulation (ABM) instructions.
! 
! @opindex madx
! @opindex mno-adx
! @item -madx
! Support flag-preserving add-carry instructions.
! 
! @opindex mbmi
! @opindex mno-bmi
! @item -mbmi
! Support BMI built-in functions and code generation.
! 
! @opindex mbmi2
! @opindex mno-bmi2
! @item -mbmi2
! Support BMI2 built-in functions and code generation.
! 
! @opindex mlzcnt
! @opindex mno-lzcnt
! @item -mlzcnt
! Support LZCNT built-in function and code generation.
! 
! @opindex mfxsr
! @opindex mno-fxsr
! @item -mfxsr
! Support FXSAVE and FXRSTOR instructions.
! 
! @opindex mxsave
! @opindex mno-xsave
! @item -mxsave
! Support XSAVE and XRSTOR instructions.
! 
! @opindex mxsaveopt
! @opindex mno-xsaveopt
! @item -mxsaveopt
! Support XSAVEOPT instruction.
! 
! @opindex mxsavec
! @opindex mno-xsavec
! @item -mxsavec
! Support XSAVEC instructions.
! 
! @opindex mxsaves
! @opindex mno-xsaves
! @item -mxsaves
! Support XSAVES and XRSTORS instructions.
! 
! @opindex mrtm
! @opindex mno-rtm
! @item -mrtm
! Support RTM built-in functions and code generation.
! 
! @opindex mhle
! @opindex mno-hle
! @item -mhle
! Support Hardware Lock Elision prefixes.
! 
! @opindex mtbm
! @opindex mno-tbm
! @item -mtbm
! Support TBM built-in functions and code generation.
! 
! @opindex mmwaitx
! @opindex mno-mwaitx
! @item -mmwaitx
! Support MWAITX and MONITORX built-in functions and code generation.
! 
! @opindex mclzero
! @opindex mno-clzero
! @item -mclzero
! Support CLZERO built-in functions and code generation.
! 
! @opindex mpku
! @opindex mno-pku
! @item -mpku
! Support PKU built-in functions and code generation.
! 
! @opindex mgfni
! @opindex mno-gfni
! @item -mgfni
! Support GFNI built-in functions and code generation.
! 
! @opindex mvaes
! @opindex mno-vaes
! @item -mvaes
! Support VAES built-in functions and code generation.
! 
! @opindex mwaitpkg
! @opindex mno-waitpkg
! @item -mwaitpkg
! Support WAITPKG built-in functions and code generation.
! 
! @opindex mvpclmulqdq
! @opindex mno-vpclmulqdq
! @item -mvpclmulqdq
! Support VPCLMULQDQ built-in functions and code generation.
! 
! @opindex mmovdiri
! @opindex mno-movdiri
! @item -mmovdiri
! Support MOVDIRI built-in functions and code generation.
! 
! @opindex mmovdir64b
! @opindex mno-movdir64b
! @item -mmovdir64b
! Support MOVDIR64B built-in functions and code generation.
! 
! @opindex menqcmd
! @opindex mno-enqcmd
! @item -menqcmd
! Support ENQCMD built-in functions and code generation.
! 
! @opindex muintr
! @opindex mno-uintr
! @item -muintr
! Support UINTR built-in functions and code generation.
! 
! @opindex mtsxldtrk
! @opindex mno-tsxldtrk
! @item -mtsxldtrk
! Support TSXLDTRK built-in functions and code generation.
! 
! @opindex mcldemote
! @opindex mno-cldemote
! @item -mcldemote
! Support CLDEMOTE built-in functions and code generation.
! 
! @opindex mserialize
! @opindex mno-serialize
! @item -mserialize
! Support SERIALIZE built-in functions and code generation.
! 
! @opindex mamx-tile
! @opindex mno-amx-tile
! @item -mamx-tile
! Support AMX-TILE built-in functions and code generation.
! 
! @opindex mamx-int8
! @opindex mno-amx-int8
! @item -mamx-int8
! Support AMX-INT8 built-in functions and code generation.
! 
! @opindex mamx-bf16
! @opindex mno-amx-bf16
! @item -mamx-bf16
! Support AMX-BF16 built-in functions and code generation.
! 
! @opindex mhreset
! @opindex mno-hreset
! @item -mhreset
! Support HRESET built-in functions and code generation.
! 
! @opindex mkl
! @opindex mno-kl
! @item -mkl
! Support KL built-in functions and code generation.
! 
! @opindex mwidekl
! @opindex mno-widekl
! @item -mwidekl
! Support WIDEKL built-in functions and code generation.
! 
! @opindex mcmpccxadd
! @opindex mno-cmpccxadd
! @item -mcmpccxadd
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, and
! CMPCCXADD build-in functions and code generation.
! 
! @opindex mamx-fp16
! @opindex mno-amx-fp16
! @item -mamx-fp16
! Support AMX-FP16 built-in functions and code generation.
! 
! @opindex mprefetchi
! @opindex mno-prefetchi
! @item -mprefetchi
! Support PREFETCHI built-in functions and code generation.
! 
! @opindex mraoint
! @opindex mno-raoint
! @item -mraoint
! Support RAOINT built-in functions and code generation.
! 
! @opindex mamx-complex
! @opindex mno-amx-complex
! @item -mamx-complex
! Support AMX-COMPLEX built-in functions and code generation.
! 
! @opindex msm3
! @opindex mno-sm3
! @item -msm3
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and
! SM3 built-in functions and code generation.
! 
! @opindex msm4
! @opindex mno-sm4
! @item -msm4
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and
! SM4 built-in functions and code generation.
! 
! @opindex msha512
! @opindex mno-sha512
! @item -msha512
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and
! SHA512 built-in functions and code generation.
! 
! @opindex mapxf
! @opindex mno-apxf
! @item -mapxf
! Support code generation for APX features, including EGPR, PUSH2POP2,
! NDD, PPX, NF, CCMP and ZU.
! 
! @opindex musermsr
! @opindex mno-usermsr
! @item -musermsr
! Support USER_MSR built-in functions and code generation.
! 
! @opindex mamx-avx512
! @opindex mno-amx-avx512
! @item -mamx-avx512
! Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
! AVX10.1, AVX10.2 and AMX-AVX512 built-in functions and code generation.
! 
! @opindex mamx-tf32
! @opindex mno-amx-tf32
! @item -mamx-tf32
! Support AMX-TF32 built-in functions and code generation.
! 
! @opindex mamx-fp8
! @opindex mno-amx-fp8
! @item -mamx-fp8
! Support AMX-FP8 built-in functions and code generation.
! 
! @opindex mmovrs
! @opindex mno-movrs
! @item -mmovrs
! Support MOVRS built-in functions and code generation.
! 
! @opindex mamx-movrs
! @opindex mno-amx-movrs
! @item -mamx-movrs
! Support AMX-MOVRS built-in functions and code generation.
! @end table
! 
! These additional options are available for the x86 processor family.
! 
! @table @gcctabopt
  
  @opindex mfpmath
  @item -mfpmath=@var{unit}
*************** for @var{unit} are:
*** 36200,36207 ****
  
  @table @samp
  @item 387
! Use the standard 387 floating-point coprocessor present on the majority of chips and
! emulated otherwise.  Code compiled with this option runs almost everywhere.
  The temporary results are computed in 80-bit precision instead of the precision
  specified by the type, resulting in slightly different results compared to most
  of other chips.  See @option{-ffloat-store} for more detailed description.
--- 37117,37125 ----
  
  @table @samp
  @item 387
! Use the standard 387 floating-point coprocessor present on the majority
! of chips and emulated otherwise.
! Code compiled with this option runs almost everywhere.
  The temporary results are computed in 80-bit precision instead of the precision
  specified by the type, resulting in slightly different results compared to most
  of other chips.  See @option{-ffloat-store} for more detailed description.
*************** This is the default choice for non-Darwi
*** 36211,36228 ****
  @item sse
  Use scalar floating-point instructions present in the SSE instruction set.
  This instruction set is supported by Pentium III and newer chips,
! and in the AMD line
! by Athlon-4, Athlon XP and Athlon MP chips.  The earlier version of the SSE
  instruction set supports only single-precision arithmetic, thus the double and
! extended-precision arithmetic are still done using 387.  A later version, present
! only in Pentium 4 and AMD x86-64 chips, supports double-precision
! arithmetic too.
  
! For the x86-32 compiler, you must use @option{-march=@var{cpu-type}}, @option{-msse}
  or @option{-msse2} switches to enable SSE extensions and make this option
  effective.  For the x86-64 compiler, these extensions are enabled by default.
  
! The resulting code should be considerably faster in the majority of cases and avoid
  the numerical instability problems of 387 code, but may break some existing
  code that expects temporaries to be 80 bits.
  
--- 37129,37148 ----
  @item sse
  Use scalar floating-point instructions present in the SSE instruction set.
  This instruction set is supported by Pentium III and newer chips,
! and in the AMD line by Athlon-4, Athlon XP and Athlon MP chips.
! The earlier version of the SSE
  instruction set supports only single-precision arithmetic, thus the double and
! extended-precision arithmetic are still done using 387.
! A later version, present only in Pentium 4 and AMD x86-64 chips,
! supports double-precision arithmetic too.
  
! For the x86-32 compiler, you must use @option{-march=@var{cpu-type}},
! @option{-msse}
  or @option{-msse2} switches to enable SSE extensions and make this option
  effective.  For the x86-64 compiler, these extensions are enabled by default.
  
! The resulting code should be considerably faster in the majority of cases
! and avoid
  the numerical instability problems of 387 code, but may break some existing
  code that expects temporaries to be 80 bits.
  
*************** This is the default choice for the x86-6
*** 36230,36235 ****
--- 37150,37160 ----
  and the default choice for x86-32 targets with the SSE2 instruction set
  when @option{-ffast-math} is enabled.
  
+ GCC depresses SSE instructions when @option{-mavx} (or another option
+ enabling AVX extensions) is used.  Instead, it
+ generates new AVX instructions or AVX equivalents for all SSE instructions
+ when needed.
+ 
  @item sse,387
  @itemx sse+387
  @itemx both
*************** still experimental, because the GCC regi
*** 36240,36253 ****
  functional units well, resulting in unstable performance.
  @end table
  
- @opindex masm=@var{dialect}
- @item -masm=@var{dialect}
- Output assembly instructions using selected @var{dialect}.  Also affects
- which dialect is used for basic @code{asm} (@pxref{Basic Asm}) and
- extended @code{asm} (@pxref{Extended Asm}). Supported choices (in dialect
- order) are @samp{att} or @samp{intel}. The default is @samp{att}. Darwin does
- not support @samp{intel}.
- 
  @opindex mieee-fp
  @opindex mno-ieee-fp
  @item -mieee-fp
--- 37165,37170 ----
*************** comparison is unordered.
*** 36262,36268 ****
  @itemx -mhard-float
  Generate output containing 80387 instructions for floating point.
  
! @opindex no-80387
  @opindex msoft-float
  @item -mno-80387
  @itemx -msoft-float
--- 37179,37185 ----
  @itemx -mhard-float
  Generate output containing 80387 instructions for floating point.
  
! @opindex mno-80387
  @opindex msoft-float
  @item -mno-80387
  @itemx -msoft-float
*************** objects larger than @var{threshold} are
*** 36383,36388 ****
--- 37300,37306 ----
  default is 65535.
  
  @opindex mrtd
+ @opindex mno-rtd
  @item -mrtd
  Use a different function-calling convention, in which functions that
  take a fixed number of arguments return with the @code{ret @var{num}}
*************** modules with the same value, including a
*** 36433,36438 ****
--- 37351,37357 ----
  the system libraries and startup modules.
  
  @opindex mvect8-ret-in-mem
+ @opindex mno-vect8-ret-in-mem
  @item -mvect8-ret-in-mem
  Return 8-byte vectors in memory instead of MMX registers.  This is the
  default on VxWorks to match the ABI of the Sun Studio compilers until
*************** loss of accuracy, typically through so-c
*** 36465,36480 ****
  when this option is used to set the precision to less than extended precision.
  
  @opindex mdaz-ftz
  @item -mdaz-ftz
! 
! The flush-to-zero (FTZ) and denormals-are-zero (DAZ) flags in the MXCSR register
! are used to control floating-point calculations.SSE and AVX instructions
! including scalar and vector instructions could benefit from enabling the FTZ
! and DAZ flags when @option{-mdaz-ftz} is specified. Don't set FTZ/DAZ flags
! when @option{-mno-daz-ftz} or @option{-shared} is specified, @option{-mdaz-ftz}
! will set FTZ/DAZ flags even with @option{-shared}.
  
  @opindex mstackrealign
  @item -mstackrealign
  Realign the stack at entry.  On the x86, the @option{-mstackrealign}
  option generates an alternate prologue and epilogue that realigns the
--- 37384,37403 ----
  when this option is used to set the precision to less than extended precision.
  
  @opindex mdaz-ftz
+ @opindex mno-daz-ftz
  @item -mdaz-ftz
! @itemx -mno-daz-ftz
! The flush-to-zero (FTZ) and denormals-are-zero (DAZ) flags in the
! MXCSR register are used to control floating-point calculations.  The
! @option{-Ofast}, @option{-ffast-math}, or
! @option{-funsafe-math-optimizations} options normally link in startup code
! that sets these flags except when building a shared library
! (@option{-shared}).  You can use the @option{-mdaz-ftz} and
! @option{-mno-daz-ftz} options to explicitly enable or disable setting
! these flags, regardless of other options passed to GCC.
  
  @opindex mstackrealign
+ @opindex mno-stackrealign
  @item -mstackrealign
  Realign the stack at entry.  On the x86, the @option{-mstackrealign}
  option generates an alternate prologue and epilogue that realigns the
*************** run-time stack if necessary.  This suppo
*** 36483,36488 ****
--- 37406,37416 ----
  SSE compatibility.  See also the attribute @code{force_align_arg_pointer},
  applicable to individual functions.
  
+ @opindex mstack-arg-probe
+ @opindex mno-stack-arg-probe
+ @item -mstack-arg-probe
+ Emit stack probing code in the function prologue.
+ 
  @opindex mpreferred-stack-boundary
  @item -mpreferred-stack-boundary=@var{num}
  Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
*************** increases code size.  Code that is sensi
*** 36529,36877 ****
  as embedded systems and operating system kernels, may want to reduce the
  preferred alignment to @option{-mpreferred-stack-boundary=2}.
  
- @need 200
- @opindex mmmx
- @item -mmmx
- @need 200
- @opindex msse
- @itemx -msse
- @need 200
- @opindex msse2
- @itemx -msse2
- @need 200
- @opindex msse3
- @itemx -msse3
- @need 200
- @opindex mssse3
- @itemx -mssse3
- @need 200
- @opindex msse4
- @itemx -msse4
- @need 200
- @opindex msse4a
- @itemx -msse4a
- @need 200
- @opindex msse4.1
- @itemx -msse4.1
- @need 200
- @opindex msse4.2
- @itemx -msse4.2
- @need 200
- @opindex mavx
- @itemx -mavx
- @need 200
- @opindex mavx2
- @itemx -mavx2
- @need 200
- @opindex mavx512f
- @itemx -mavx512f
- @need 200
- @opindex mavx512cd
- @itemx -mavx512cd
- @need 200
- @opindex mavx512vl
- @itemx -mavx512vl
- @need 200
- @opindex mavx512bw
- @itemx -mavx512bw
- @need 200
- @opindex mavx512dq
- @itemx -mavx512dq
- @need 200
- @opindex mavx512ifma
- @itemx -mavx512ifma
- @need 200
- @opindex mavx512vbmi
- @itemx -mavx512vbmi
- @need 200
- @opindex msha
- @itemx -msha
- @need 200
- @opindex maes
- @itemx -maes
- @need 200
- @opindex mpclmul
- @itemx -mpclmul
- @need 200
- @opindex mclflushopt
- @itemx -mclflushopt
- @need 200
- @opindex mclwb
- @itemx -mclwb
- @need 200
- @opindex mfsgsbase
- @itemx -mfsgsbase
- @need 200
- @opindex mptwrite
- @itemx -mptwrite
- @need 200
- @opindex mrdrnd
- @itemx -mrdrnd
- @need 200
- @opindex mf16c
- @itemx -mf16c
- @need 200
- @opindex mfma
- @itemx -mfma
- @need 200
- @opindex mpconfig
- @itemx -mpconfig
- @need 200
- @opindex mwbnoinvd
- @itemx -mwbnoinvd
- @need 200
- @opindex mfma4
- @itemx -mfma4
- @need 200
- @opindex mprfchw
- @itemx -mprfchw
- @need 200
- @opindex mrdpid
- @itemx -mrdpid
- @need 200
- @opindex mrdseed
- @itemx -mrdseed
- @need 200
- @opindex msgx
- @itemx -msgx
- @need 200
- @opindex mxop
- @itemx -mxop
- @need 200
- @opindex mlwp
- @itemx -mlwp
- @need 200
- @opindex m3dnow
- @itemx -m3dnow
- @need 200
- @opindex m3dnowa
- @itemx -m3dnowa
- @need 200
- @opindex mpopcnt
- @itemx -mpopcnt
- @need 200
- @opindex mabm
- @itemx -mabm
- @need 200
- @opindex madx
- @itemx -madx
- @need 200
- @opindex mbmi
- @itemx -mbmi
- @need 200
- @opindex mbmi2
- @itemx -mbmi2
- @need 200
- @opindex mlzcnt
- @itemx -mlzcnt
- @need 200
- @opindex mfxsr
- @itemx -mfxsr
- @need 200
- @opindex mxsave
- @itemx -mxsave
- @need 200
- @opindex mxsaveopt
- @itemx -mxsaveopt
- @need 200
- @opindex mxsavec
- @itemx -mxsavec
- @need 200
- @opindex mxsaves
- @itemx -mxsaves
- @need 200
- @opindex mrtm
- @itemx -mrtm
- @need 200
- @opindex mhle
- @itemx -mhle
- @need 200
- @opindex mtbm
- @itemx -mtbm
- @need 200
- @opindex mmwaitx
- @itemx -mmwaitx
- @need 200
- @opindex mclzero
- @itemx -mclzero
- @need 200
- @opindex mpku
- @itemx -mpku
- @need 200
- @opindex mavx512vbmi2
- @itemx -mavx512vbmi2
- @need 200
- @opindex mavx512bf16
- @itemx -mavx512bf16
- @need 200
- @opindex mavx512fp16
- @itemx -mavx512fp16
- @need 200
- @opindex mgfni
- @itemx -mgfni
- @need 200
- @opindex mvaes
- @itemx -mvaes
- @need 200
- @opindex mwaitpkg
- @itemx -mwaitpkg
- @need 200
- @opindex mvpclmulqdq
- @itemx -mvpclmulqdq
- @need 200
- @opindex mavx512bitalg
- @itemx -mavx512bitalg
- @need 200
- @opindex mmovdiri
- @itemx -mmovdiri
- @need 200
- @opindex mmovdir64b
- @itemx -mmovdir64b
- @need 200
- @opindex menqcmd
- @opindex muintr
- @itemx -menqcmd
- @itemx -muintr
- @need 200
- @opindex mtsxldtrk
- @itemx -mtsxldtrk
- @need 200
- @opindex mavx512vpopcntdq
- @itemx -mavx512vpopcntdq
- @need 200
- @opindex mavx512vp2intersect
- @itemx -mavx512vp2intersect
- @need 200
- @opindex mavx512vnni
- @itemx -mavx512vnni
- @need 200
- @opindex mavxvnni
- @itemx -mavxvnni
- @need 200
- @opindex mcldemote
- @itemx -mcldemote
- @need 200
- @opindex mserialize
- @itemx -mserialize
- @need 200
- @opindex mamx-tile
- @itemx -mamx-tile
- @need 200
- @opindex mamx-int8
- @itemx -mamx-int8
- @need 200
- @opindex mamx-bf16
- @itemx -mamx-bf16
- @need 200
- @opindex mhreset
- @opindex mkl
- @itemx -mhreset
- @itemx -mkl
- @need 200
- @opindex mwidekl
- @itemx -mwidekl
- @need 200
- @opindex mavxifma
- @itemx -mavxifma
- @need 200
- @opindex mavxvnniint8
- @itemx -mavxvnniint8
- @need 200
- @opindex mavxneconvert
- @itemx -mavxneconvert
- @need 200
- @opindex mcmpccxadd
- @itemx -mcmpccxadd
- @need 200
- @opindex mamx-fp16
- @itemx -mamx-fp16
- @need 200
- @opindex mprefetchi
- @itemx -mprefetchi
- @need 200
- @opindex mraoint
- @itemx -mraoint
- @need 200
- @opindex mamx-complex
- @itemx -mamx-complex
- @need 200
- @opindex mavxvnniint16
- @itemx -mavxvnniint16
- @need 200
- @opindex msm3
- @itemx -msm3
- @need 200
- @opindex msha512
- @itemx -msha512
- @need 200
- @opindex msm4
- @itemx -msm4
- @need 200
- @opindex mapxf
- @itemx -mapxf
- @need 200
- @opindex musermsr
- @itemx -musermsr
- @need 200
- @opindex mavx10.1
- @itemx -mavx10.1
- @need 200
- @opindex mavx10.2
- @itemx -mavx10.2
- @need 200
- @opindex mamx-avx512
- @itemx -mamx-avx512
- @need 200
- @opindex mamx-tf32
- @itemx -mamx-tf32
- @need 200
- @itemx -mamx-fp8
- @opindex mamx-fp8
- @need 200
- @opindex mmovrs
- @itemx -mmovrs
- @need 200
- @opindex mamx-movrs
- @itemx -mamx-movrs
- @need 200
- @opindex mavx512bmm
- @itemx -mavx512bmm
- These switches enable the use of instructions in the MMX, SSE,
- AVX512CD, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, SHA, AES,
- PCLMUL, CLFLUSHOPT, CLWB, FSGSBASE, PTWRITE, RDRND, F16C, FMA, PCONFIG,
- WBNOINVD, FMA4, PREFETCHW, RDPID, RDSEED, SGX, XOP, LWP, 3DNow!@:,
- enhanced 3DNow!@:, POPCNT, ABM, ADX, BMI, BMI2, LZCNT, FXSR, XSAVE, XSAVEOPT,
- XSAVEC, XSAVES, RTM, HLE, TBM, MWAITX, CLZERO, PKU, AVX512VBMI2, GFNI, VAES,
- WAITPKG, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B, AVX512BF16, ENQCMD,
- AVX512VPOPCNTDQ, AVX512VNNI, SERIALIZE, UINTR, HRESET, AMXTILE, AMXINT8,
- AMXBF16, KL, WIDEKL, AVXVNNI, AVX512-FP16, AVXIFMA, AVXVNNIINT8, AVXNECONVERT,
- CMPCCXADD, AMX-FP16, PREFETCHI, RAOINT, AMX-COMPLEX, AVXVNNIINT16, SM3, SHA512,
- SM4, APX_F, USER_MSR, AVX10.1, AVX10.2, AMX-AVX512, AMX-TF32, AMX-FP8, MOVRS,
- AMX-MOVRS, AVX512BMM or CLDEMOTE extended instruction sets. Each has a
- corresponding @option{-mno-} option to disable use of these instructions.
- 
- These extensions are also available as built-in functions: see
- @ref{x86 Built-in Functions}, for details of the functions enabled and
- disabled by these switches.
- 
- Note that @option{-msse4} enables both SSE4.1 and SSE4.2 support,
- while @option{-mno-sse4} turns off those features; neither form of the
- option affects SSE4A support, controlled separately by
- @option{-msse4a}.
- 
- To generate SSE/SSE2 instructions automatically from floating-point
- code (as opposed to 387 instructions), see @option{-mfpmath=sse}.
- 
- GCC depresses SSEx instructions when @option{-mavx} is used. Instead, it
- generates new AVX instructions or AVX equivalence for all SSEx instructions
- when needed.
- 
- These options enable GCC to use these extended instructions in
- generated code, even without @option{-mfpmath=sse}.  Applications that
- perform run-time CPU detection must compile separate files for each
- supported architecture, using the appropriate flags.  In particular,
- the file containing the CPU detection code should be compiled without
- these options.
  
  @opindex mdump-tune-features
  @item -mdump-tune-features
--- 37457,37462 ----
*************** tuning features and default settings. Th
*** 36881,36890 ****
  
  @opindex mtune-ctrl=@var{feature-list}
  @item -mtune-ctrl=@var{feature-list}
! This option is used to do fine grain control of x86 code generation features.
! @var{feature-list} is a comma separated list of @var{feature} names. See also
! @option{-mdump-tune-features}. When specified, the @var{feature} is turned
! on if it is not preceded with @samp{^}, otherwise, it is turned off.
  @option{-mtune-ctrl=@var{feature-list}} is intended to be used by GCC
  developers. Using it may lead to code paths not covered by testing and can
  potentially result in compiler ICEs or runtime errors.
--- 37466,37475 ----
  
  @opindex mtune-ctrl=@var{feature-list}
  @item -mtune-ctrl=@var{feature-list}
! This option is used to do fine-grain control of x86 code generation features.
! @var{feature-list} is a comma-separated list of @var{feature} names. See also
! @option{-mdump-tune-features}.  When specified, the @var{feature} is turned
! on if it is not preceded with @samp{^}; otherwise, it is turned off.
  @option{-mtune-ctrl=@var{feature-list}} is intended to be used by GCC
  developers. Using it may lead to code paths not covered by testing and can
  potentially result in compiler ICEs or runtime errors.
*************** This option instructs GCC to turn off al
*** 36895,36900 ****
--- 37480,37486 ----
  @option{-mtune-ctrl=@var{feature-list}} and @option{-mdump-tune-features}.
  
  @opindex mcld
+ @opindex mno-cld
  @item -mcld
  This option instructs GCC to emit a @code{cld} instruction in the prologue
  of functions that use string instructions.  String instructions depend on
*************** instructions can be suppressed with the
*** 36909,36921 ****
--- 37495,37517 ----
  in this case.
  
  @opindex mvzeroupper
+ @opindex mno-vzeroupper
  @item -mvzeroupper
  This option instructs GCC to emit a @code{vzeroupper} instruction
  before a transfer of control flow out of the function to minimize
  the AVX to SSE transition penalty as well as remove unnecessary @code{zeroupper}
  intrinsics.
  
+ @opindex mstv
+ @opindex mno-stv
+ @item -mstv
+ @itemx -mno-stv
+ Enable/disable Scalar to Vectorization pass transforming 64-bit
+ integer computation into vector ones.  This optimization is restricted
+ to @option{-O2} and higher.
+ 
  @opindex mprefer-avx128
+ @opindex mno-prefer-avx128
  @item -mprefer-avx128
  This option instructs GCC to use 128-bit AVX instructions instead of
  256-bit AVX instructions in the auto-vectorizer.
*************** This option instructs GCC to use @var{op
*** 36926,36932 ****
--- 37522,37530 ----
  instead of default on the selected platform.
  
  @opindex mpartial-vector-fp-math
+ @opindex mno-partial-vector-fp-math
  @item -mpartial-vector-fp-math
+ @itemx -mno-partial-vector-fp-math
  This option enables GCC to generate floating-point operations that might
  affect the set of floating-point status flags on partial vectors, where
  vector elements reside in the low part of the 128-bit SSE register.  Unless
*************** Prefer 512-bit vector width for instruct
*** 36969,36974 ****
--- 37567,37573 ----
  @end table
  
  @opindex mnoreturn-no-callee-saved-registers
+ @opindex mno-noreturn-no-callee-saved-registers
  @item -mnoreturn-no-callee-saved-registers
  This option optimizes functions with @code{noreturn} attribute or
  @code{_Noreturn} specifier by not saving in the function prologue callee-saved
*************** register).  This option can interfere wi
*** 36978,36983 ****
--- 37577,37583 ----
  is not enabled by default.
  
  @opindex mcx16
+ @opindex mno-cx16
  @item -mcx16
  This option enables GCC to generate @code{CMPXCHG16B} instructions in 64-bit
  code to implement compare-and-exchange operations on 16-byte aligned 128-bit
*************** machine word in size.  The compiler uses
*** 36987,36992 ****
--- 37587,37593 ----
  128-bit integers, a library call is always used.
  
  @opindex msahf
+ @opindex mno-sahf
  @item -msahf
  This option enables generation of @code{SAHF} instructions in 64-bit code.
  Early Intel Pentium 4 CPUs with Intel 64 support,
*************** In 64-bit mode, the @code{SAHF} instruct
*** 36999,37026 ****
--- 37600,37632 ----
  see @ref{Other Builtins} for details.
  
  @opindex mmovbe
+ @opindex mno-movbe
  @item -mmovbe
  This option enables use of the @code{movbe} instruction to optimize
  byte swapping of four and eight byte entities.
  
  @opindex mshstk
+ @opindex mno-shstk
  @item -mshstk
  The @option{-mshstk} option enables shadow stack built-in functions
  from x86 Control-flow Enforcement Technology (CET).
  
  @opindex mcrc32
+ @opindex mno-crc32
  @item -mcrc32
  This option enables built-in functions @code{__builtin_ia32_crc32qi},
  @code{__builtin_ia32_crc32hi}, @code{__builtin_ia32_crc32si} and
  @code{__builtin_ia32_crc32di} to generate the @code{crc32} machine instruction.
  
  @opindex mmwait
+ @opindex mno-mwait
  @item -mmwait
  This option enables built-in functions @code{__builtin_ia32_monitor},
  and @code{__builtin_ia32_mwait} to generate the @code{monitor} and
  @code{mwait} machine instructions.
  
  @opindex mrecip
+ @opindex mno-recip
  @item -mrecip
  This option enables use of @code{RCPSS} and @code{RSQRTSS} instructions
  (and their vectorized variants @code{RCPPS} and @code{RSQRTPS})
*************** for vectorized single-float division and
*** 37043,37049 ****
  already with @option{-ffast-math} (or the above option combination), and
  doesn't need @option{-mrecip}.
  
! @opindex mrecip=opt
  @item -mrecip=@var{opt}
  This option controls which reciprocal estimate instructions
  may be used.  @var{opt} is a comma-separated list of options, which may
--- 37649,37655 ----
  already with @option{-ffast-math} (or the above option combination), and
  doesn't need @option{-mrecip}.
  
! @opindex mrecip=
  @item -mrecip=@var{opt}
  This option controls which reciprocal estimate instructions
  may be used.  @var{opt} is a comma-separated list of options, which may
*************** You can control this behavior for specif
*** 37139,37151 ****
--- 37745,37767 ----
  using the function attributes @code{ms_abi} and @code{sysv_abi}.
  @xref{Function Attributes}.
  
+ @opindex masm=@var{dialect}
+ @item -masm=@var{dialect}
+ Output assembly instructions using selected @var{dialect}.  Also affects
+ which dialect is used for basic @code{asm} (@pxref{Basic Asm}) and
+ extended @code{asm} (@pxref{Extended Asm}). Supported choices (in dialect
+ order) are @samp{att} or @samp{intel}. The default is @samp{att}. Darwin does
+ not support @samp{intel}.
+ 
  @opindex mforce-indirect-call
+ @opindex mno-force-indirect-call
  @item -mforce-indirect-call
  Force all calls to functions to be indirect. This is useful
  when using Intel Processor Trace where it generates more precise timing
  information for function calls.
  
  @opindex mmanual-endbr
+ @opindex mno-manual-endbr
  @item -mmanual-endbr
  Insert ENDBR instruction at function entry only via the @code{cf_check}
  function attribute. This is useful when used with the option
*************** function attribute. This is useful when
*** 37153,37158 ****
--- 37769,37775 ----
  function entry.
  
  @opindex mcet-switch
+ @opindex mno-cet-switch
  @item -mcet-switch
  By default, CET instrumentation is turned off on switch statements that
  use a jump table and indirect branch track is disabled.  Since jump
*************** by default.  In some cases disabling it
*** 37191,37196 ****
--- 37808,37814 ----
  improved scheduling and reduced dependencies.
  
  @opindex maccumulate-outgoing-args
+ @opindex mno-accumulate-outgoing-args
  @item -maccumulate-outgoing-args
  If enabled, the maximum amount of space required for outgoing arguments is
  computed in the function prologue.  This is faster on most modern CPUs
*************** because of reduced dependencies, improve
*** 37198,37211 ****
  when the preferred stack boundary is not equal to 2.  The drawback is a notable
  increase in code size.  This switch implies @option{-mno-push-args}.
  
- @opindex mthreads
- @item -mthreads
- Support thread-safe exception handling on MinGW.  Programs that rely
- on thread-safe exception handling must compile and link all code with the
- @option{-mthreads} option.  When compiling, @option{-mthreads} defines
- @option{-D_MT}; when linking, it links in a special thread helper library
- @option{-lmingwthrd} which cleans up per-thread exception-handling data.
- 
  @opindex mms-bitfields
  @opindex mno-ms-bitfields
  @item -mms-bitfields
--- 37816,37821 ----
*************** Taking this into account, it is importan
*** 37308,37318 ****
  @enumerate
  @item If a zero-length bit-field follows a normal bit-field, the type of the
  zero-length bit-field may affect the alignment of the structure as whole. For
! example, @code{t2} has a size of 4 bytes, since the zero-length bit-field follows a
! normal bit-field, and is of type short.
  
! @item Even if a zero-length bit-field is not followed by a normal bit-field, it may
! still affect the alignment of the structure:
  
  @smallexample
  struct
--- 37918,37928 ----
  @enumerate
  @item If a zero-length bit-field follows a normal bit-field, the type of the
  zero-length bit-field may affect the alignment of the structure as whole. For
! example, @code{t2} has a size of 4 bytes, since the zero-length bit-field
! follows a normal bit-field, and is of type short.
  
! @item Even if a zero-length bit-field is not followed by a normal bit-field,
! it may still affect the alignment of the structure:
  
  @smallexample
  struct
*************** code size and improves performance in ca
*** 37350,37355 ****
--- 37960,37966 ----
  but GCC doesn't know about it.
  
  @opindex minline-all-stringops
+ @opindex mno-inline-all-stringops
  @item -minline-all-stringops
  By default GCC inlines string operations only when the destination is
  known to be aligned to least a 4-byte boundary.
*************** The option enables inline expansion of @
*** 37360,37365 ****
--- 37971,37977 ----
  pointer alignments.
  
  @opindex minline-stringops-dynamically
+ @opindex mno-inline-stringops-dynamically
  @item -minline-stringops-dynamically
  For string operations of unknown size, use run-time checks with
  inline code for small blocks and a library call for large blocks.
*************** Always use a library call.
*** 37386,37416 ****
  
  @opindex mmemcpy-strategy=@var{strategy}
  @item -mmemcpy-strategy=@var{strategy}
! Override the internal decision heuristic to decide if @code{__builtin_memcpy}
! should be inlined and what inline algorithm to use when the expected size
! of the copy operation is known. @var{strategy}
! is a comma-separated list of @var{alg}:@var{max_size}:@var{dest_align} triplets.
! @var{alg} is specified in @option{-mstringop-strategy}, @var{max_size} specifies
! the max byte size with which inline algorithm @var{alg} is allowed.  For the last
! triplet, the @var{max_size} must be @code{-1}. The @var{max_size} of the triplets
! in the list must be specified in increasing order.  The minimal byte size for
! @var{alg} is @code{0} for the first triplet and @code{@var{max_size} + 1} of the
! preceding range.
  
  @opindex mmemset-strategy=@var{strategy}
  @item -mmemset-strategy=@var{strategy}
! The option is similar to @option{-mmemcpy-strategy=} except that it is to control
! @code{__builtin_memset} expansion.
  
  @opindex momit-leaf-frame-pointer
  @item -momit-leaf-frame-pointer
  Don't keep the frame pointer in a register for leaf functions.  This
  avoids the instructions to save, set up, and restore frame pointers and
  makes an extra register available in leaf functions.  The option
! @option{-momit-leaf-frame-pointer} removes the frame pointer for leaf functions,
! which might make debugging harder.
  
  @opindex mtls-direct-seg-refs
  @item -mtls-direct-seg-refs
  @itemx -mno-tls-direct-seg-refs
  Controls whether TLS variables may be accessed with offsets from the
--- 37998,38031 ----
  
  @opindex mmemcpy-strategy=@var{strategy}
  @item -mmemcpy-strategy=@var{strategy}
! Override the internal decision heuristic to decide if
! @code{__builtin_memcpy} should be inlined and what inline algorithm to
! use when the expected size of the copy operation is known.
! @var{strategy} is a comma-separated list of
! @var{alg}:@var{max_size}:@var{dest_align} triplets.  @var{alg} is
! specified in @option{-mstringop-strategy}, @var{max_size} specifies
! the max byte size with which inline algorithm @var{alg} is allowed.
! For the last triplet, the @var{max_size} must be @code{-1}.
! The @var{max_size} of the triplets in the list must be specified in
! increasing order.  The minimal byte size for @var{alg} is @code{0} for
! the first triplet and @code{@var{max_size} + 1} of the preceding range.
  
  @opindex mmemset-strategy=@var{strategy}
  @item -mmemset-strategy=@var{strategy}
! This option is similar to @option{-mmemcpy-strategy=} except that it
! controls the @code{__builtin_memset} expansion.
  
  @opindex momit-leaf-frame-pointer
+ @opindex mno-omit-leaf-frame-pointer
  @item -momit-leaf-frame-pointer
  Don't keep the frame pointer in a register for leaf functions.  This
  avoids the instructions to save, set up, and restore frame pointers and
  makes an extra register available in leaf functions.  The option
! @option{-momit-leaf-frame-pointer} removes the frame pointer for leaf
! functions, which might make debugging harder.
  
  @opindex mtls-direct-seg-refs
+ @opindex mno-tls-direct-seg-refs
  @item -mtls-direct-seg-refs
  @itemx -mno-tls-direct-seg-refs
  Controls whether TLS variables may be accessed with offsets from the
*************** segment to cover the entire TLS area.
*** 37422,37433 ****
--- 38037,38050 ----
  For systems that use the GNU C Library, the default is on.
  
  @opindex msse2avx
+ @opindex mno-sse2avx
  @item -msse2avx
  @itemx -mno-sse2avx
  Specify that the assembler should encode SSE instructions with VEX
  prefix.  The option @option{-mavx} turns this on by default.
  
  @opindex mfentry
+ @opindex mno-fentry
  @item -mfentry
  @itemx -mno-fentry
  If profiling is active (@option{-pg}), put the profiling
*************** Note: On x86 architectures the attribute
*** 37436,37490 ****
  isn't possible at the moment for @option{-mfentry} and @option{-pg}.
  
  @opindex mrecord-mcount
  @item -mrecord-mcount
  @itemx -mno-record-mcount
! If profiling is active (@option{-pg}), generate a __mcount_loc section
! that contains pointers to each profiling call. This is useful for
! automatically patching and out calls.
  
  @opindex mnop-mcount
  @item -mnop-mcount
  @itemx -mno-nop-mcount
  If profiling is active (@option{-pg}), generate the calls to
! the profiling functions as NOPs. This is useful when they
  should be patched in later dynamically. This is likely only
  useful together with @option{-mrecord-mcount}.
  
  @opindex minstrument-return
  @item -minstrument-return=@var{type}
! Instrument function exit in -pg -mfentry instrumented functions with
! call to specified function. This only instruments true returns ending
! with ret, but not sibling calls ending with jump. Valid types
! are @var{none} to not instrument, @var{call} to generate a call to __return__,
! or @var{nop5} to generate a 5 byte nop.
  
  @opindex mrecord-return
  @item -mrecord-return
  @itemx -mno-record-return
! Generate a __return_loc section pointing to all return instrumentation code.
  
  @opindex mfentry-name
  @item -mfentry-name=@var{name}
! Set name of __fentry__ symbol called at function entry for -pg -mfentry functions.
  
  @opindex mfentry-section
  @item -mfentry-section=@var{name}
! Set name of section to record -mrecord-mcount calls (default __mcount_loc).
  
  @opindex mskip-rax-setup
  @item -mskip-rax-setup
  @itemx -mno-skip-rax-setup
  When generating code for the x86-64 architecture with SSE extensions
  disabled, @option{-mskip-rax-setup} can be used to skip setting up RAX
  register when there are no variable arguments passed in vector registers.
  
- @strong{Warning:} Since RAX register is used to avoid unnecessarily
- saving vector registers on stack when passing variable arguments, the
- impacts of this option are callees may waste some stack space,
- misbehave or jump to a random location.  GCC 4.4 or newer don't have
- those issues, regardless the RAX register value.
- 
  @opindex m8bit-idiv
  @item -m8bit-idiv
  @itemx -mno-8bit-idiv
  On some processors, like Intel Atom, 8-bit unsigned integer divide is
--- 38053,38110 ----
  isn't possible at the moment for @option{-mfentry} and @option{-pg}.
  
  @opindex mrecord-mcount
+ @opindex mno-record-mcount
  @item -mrecord-mcount
  @itemx -mno-record-mcount
! If profiling is active (@option{-pg}), generate a section that contains
! pointers to each profiling call; this is useful for automatically patching
! the calls.  You can use the @option{mfentry-section=} option to set the
! name of the section; it defaults to @samp{__mcount_loc}.
  
  @opindex mnop-mcount
+ @opindex mno-nop-mcount
  @item -mnop-mcount
  @itemx -mno-nop-mcount
  If profiling is active (@option{-pg}), generate the calls to
! the profiling functions as NOPs.  This is useful when they
  should be patched in later dynamically. This is likely only
  useful together with @option{-mrecord-mcount}.
  
  @opindex minstrument-return
  @item -minstrument-return=@var{type}
! With @option{-pg -mfentry}, instrument function exits according to
! @var{type}, which may be one of @samp{none} to not instrument,
! @samp{call} to generate a call to @code{__return__}, or @samp{nop5} to
! generate a 5-byte nop sequence.  This option only instruments true
! returns ending with a @code{ret}, not sibling calls via a jump.
  
  @opindex mrecord-return
+ @opindex mno-record-return
  @item -mrecord-return
  @itemx -mno-record-return
! Generate a @code{__return_loc} section pointing to all return instrumentation
! code.
  
  @opindex mfentry-name
  @item -mfentry-name=@var{name}
! Set name of @code{__fentry__} symbol called at function entry for
! @option{-pg -mfentry} functions.
  
  @opindex mfentry-section
  @item -mfentry-section=@var{name}
! Set name of section to record @option{-mrecord-mcount} calls.  The
! default is @samp{__mcount_loc}.
  
  @opindex mskip-rax-setup
+ @opindex mno-skip-rax-setup
  @item -mskip-rax-setup
  @itemx -mno-skip-rax-setup
  When generating code for the x86-64 architecture with SSE extensions
  disabled, @option{-mskip-rax-setup} can be used to skip setting up RAX
  register when there are no variable arguments passed in vector registers.
  
  @opindex m8bit-idiv
+ @opindex mno-8bit-idiv
  @item -m8bit-idiv
  @itemx -mno-8bit-idiv
  On some processors, like Intel Atom, 8-bit unsigned integer divide is
*************** to 255, 8-bit unsigned integer divide is
*** 37494,37500 ****
--- 38114,38122 ----
  32-bit/64-bit integer divide.
  
  @opindex mavx256-split-unaligned-load
+ @opindex mno-avx256-split-unaligned-load
  @opindex mavx256-split-unaligned-store
+ @opindex mno-avx256-split-unaligned-store
  @item -mavx256-split-unaligned-load
  @itemx -mavx256-split-unaligned-store
  Split 32-byte AVX unaligned load and store.
*************** prevents the compiler from using floatin
*** 37529,37534 ****
--- 38151,38157 ----
  registers.
  
  @opindex mrelax-cmpxchg-loop
+ @opindex mno-relax-cmpxchg-loop
  @item -mrelax-cmpxchg-loop
  When emitting a compare-and-swap loop for @ref{__sync Builtins}
  and @ref{__atomic Builtins} lacking a native instruction, optimize
*************** not be reachable in the large code model
*** 37578,37583 ****
--- 38201,38207 ----
  
  
  @opindex mindirect-branch-register
+ @opindex mno-indirect-branch-register
  @item -mindirect-branch-register
  Force indirect call and jump via register.
  
*************** hardening.  @samp{return} enables SLS ha
*** 37590,37609 ****
  @samp{all} enables all SLS hardening.
  
  @opindex mindirect-branch-cs-prefix
  @item -mindirect-branch-cs-prefix
  Add CS prefix to call and jmp to indirect thunk with branch target in
! r8-r15 registers so that the call and jmp instruction length is 6 bytes
! to allow them to be replaced with @samp{lfence; call *%r8-r15} or
! @samp{lfence; jmp *%r8-r15} at run-time.
  
  @opindex mapx-inline-asm-use-gpr32
  @item -mapx-inline-asm-use-gpr32
! For inline asm support with APX, by default the EGPR feature was
! disabled to prevent potential illegal instruction with EGPR occurs.
! To invoke egpr usage in inline asm, use new compiler option
! -mapx-inline-asm-use-gpr32 and user should ensure the instruction
! supports EGPR.
  
  @end table
  
  These @samp{-m} switches are supported in addition to the above
--- 38214,38240 ----
  @samp{all} enables all SLS hardening.
  
  @opindex mindirect-branch-cs-prefix
+ @opindex mno-indirect-branch-cs-prefix
  @item -mindirect-branch-cs-prefix
  Add CS prefix to call and jmp to indirect thunk with branch target in
! r8-r15 registers, so that the call and jmp instruction length is 6 bytes.
! This allows them to potentially be replaced with @samp{lfence; call *%r8-r15}
! or @samp{lfence; jmp *%r8-r15} at run time.
  
  @opindex mapx-inline-asm-use-gpr32
+ @opindex mno-apx-inline-asm-use-gpr32
  @item -mapx-inline-asm-use-gpr32
! By default, EGPR usage is disabled in inline asm constraints as GCC cannot
! be aware of whether the asm instructions support GP32 or not.
! If your inline asm can handle EGPR, use @option{-mapx-inline-asm-use-gpr32}.
  
+ @opindex mgather
+ @opindex mno-gather
+ @opindex mscatter
+ @opindex mno-scatter
+ @item -mgather
+ @itemx -mscatter
+ Enable vectorization for gather and scatter instructions, respectively.
  @end table
  
  These @samp{-m} switches are supported in addition to the above
*************** on x86-64 processors in 64-bit environme
*** 37614,37625 ****
  @opindex m64
  @opindex mx32
  @opindex m16
- @opindex miamcu
  @item -m32
  @itemx -m64
  @itemx -mx32
  @itemx -m16
- @itemx -miamcu
  Generate code for a 16-bit, 32-bit or 64-bit environment.
  The @option{-m32} option sets @code{int}, @code{long}, and pointer types
  to 32 bits, and
--- 38245,38254 ----
*************** The @option{-m16} option is the same as
*** 37638,37644 ****
  it outputs the @code{.code16gcc} assembly directive at the beginning of
  the assembly output so that the binary can run in 16-bit mode.
  
! The @option{-miamcu} option generates code which conforms to Intel MCU
  psABI.  It requires the @option{-m32} option to be turned on.
  
  @opindex mno-red-zone
--- 38267,38276 ----
  it outputs the @code{.code16gcc} assembly directive at the beginning of
  the assembly output so that the binary can run in 16-bit mode.
  
! @opindex miamcu
! @opindex mno-iamcu
! @item -miamcu
! The @option{-miamcu} option generates code that conforms to Intel MCU
  psABI.  It requires the @option{-m32} option to be turned on.
  
  @opindex mno-red-zone
*************** and x32 environments.  It is the default
*** 37690,37695 ****
--- 38322,38328 ----
  x32 environments.
  
  @opindex mneeded
+ @opindex mno-needed
  @item -mneeded
  @itemx -mno-needed
  Emit GNU_PROPERTY_X86_ISA_1_NEEDED GNU property for Linux target to
*************** indicate the micro-architecture ISA leve
*** 37698,37704 ****
  @opindex mno-direct-extern-access
  @opindex mdirect-extern-access
  @item -mno-direct-extern-access
! Without @option{-fpic} nor @option{-fPIC}, always use the GOT pointer
  to access external symbols.  With @option{-fpic} or @option{-fPIC},
  treat access to protected symbols as local symbols.  The default is
  @option{-mdirect-extern-access}.
--- 38331,38337 ----
  @opindex mno-direct-extern-access
  @opindex mdirect-extern-access
  @item -mno-direct-extern-access
! Without @option{-fpic} or @option{-fPIC}, always use the GOT pointer
  to access external symbols.  With @option{-fpic} or @option{-fPIC},
  treat access to protected symbols as local symbols.  The default is
  @option{-mdirect-extern-access}.
*************** protected symbols are used in shared lib
*** 37711,37720 ****
  @opindex munroll-only-small-loops
  @opindex mno-unroll-only-small-loops
  @item -munroll-only-small-loops
! Controls conservative small loop unrolling. It is default enabled by
! O2, and unrolls loop with less than 4 insns by 1 time. Explicit
! -f[no-]unroll-[all-]loops would disable this flag to avoid any
! unintended unrolling behavior that user does not want.
  
  @opindex mlam
  @item -mlam=@var{choice}
--- 38344,38362 ----
  @opindex munroll-only-small-loops
  @opindex mno-unroll-only-small-loops
  @item -munroll-only-small-loops
! @itemx -mno-unroll-only-small-loops
! Controls conservative small loop unrolling.  It is enabled by default with
! @option{-O2}, and unrolls loops with less than 4 instructions by 1 time.
! This gives better utilization of the instruction decoding pipeline on modern
! processors.  You can disable this with @option{-mno-unroll-only-small-loops},
! and it is also disabled if the more general options @option{-funroll-loops}
! or @option{-funroll-all-loops} are either enabled or explicitly disabled.
! 
! @opindex mdispatch-scheduler
! @item -mdispatch-scheduler
! Enable instruction scheduling.  This is only supported on @samp{bdver1},
! @samp{bdver2}, @samp{bdver3}, @samp{bdver4}, and @samp{znver1} processors and
! additionally requires @option{-fschedule-insns -fsched-pressure}.
  
  @opindex mlam
  @item -mlam=@var{choice}
*************** instructions are always used in place of
*** 37761,37783 ****
  instructions.  The use of @code{CONST16} is enabled by default only if
  the @code{L32R} instruction is not available.
  
- @opindex mfused-madd
- @opindex mno-fused-madd
- @item -mfused-madd
- @itemx -mno-fused-madd
- Enable or disable use of fused multiply/add and multiply/subtract
- instructions in the floating-point option.  This has no effect if the
- floating-point option is not also enabled.  Disabling fused multiply/add
- and multiply/subtract instructions forces the compiler to use separate
- instructions for the multiply and add/subtract operations.  This may be
- desirable in some cases where strict IEEE 754-compliant results are
- required: the fused multiply add/subtract instructions do not round the
- intermediate result, thereby producing results with @emph{more} bits of
- precision than specified by the IEEE standard.  Disabling fused multiply
- add/subtract instructions also ensures that the program output is not
- sensitive to the compiler's ability to combine multiply and add/subtract
- operations.
- 
  @opindex mserialize-volatile
  @opindex mno-serialize-volatile
  @item -mserialize-volatile
--- 38403,38408 ----
*************** The default is @option{-mserialize-volat
*** 37788,37795 ****
  @option{-mno-serialize-volatile} to omit the @code{MEMW} instructions.
  
  @opindex mforce-no-pic
  @item -mforce-no-pic
! For targets, like GNU/Linux, where all user-mode Xtensa code must be
  position-independent code (PIC), this option disables PIC for compiling
  kernel code.
  
--- 38413,38422 ----
  @option{-mno-serialize-volatile} to omit the @code{MEMW} instructions.
  
  @opindex mforce-no-pic
+ @opindex mno-force-no-pic
  @item -mforce-no-pic
! @itemx -mno-force-no-pic
! For targets like GNU/Linux, where all user-mode Xtensa code must be
  position-independent code (PIC), this option disables PIC for compiling
  kernel code.
  
diff -Nrcpad gcc-16-20260111/gcc/dwarf2out.cc gcc-16-20260118/gcc/dwarf2out.cc
*** gcc-16-20260111/gcc/dwarf2out.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/dwarf2out.cc	Sun Jan 18 22:32:07 2026
*************** is_base_type (tree type)
*** 13494,13500 ****
        return false;
  
      default:
!       if (is_cxx_auto (type))
  	return false;
        gcc_unreachable ();
      }
--- 13494,13503 ----
        return false;
  
      default:
!       if (is_cxx ()
! 	  && TREE_CODE (type) >= LAST_AND_UNUSED_TREE_CODE
! 	  && TYPE_P (type)
! 	  && TYPE_IDENTIFIER (type))
  	return false;
        gcc_unreachable ();
      }
*************** gen_type_die_with_usage (tree type, dw_d
*** 26959,26964 ****
--- 26962,26968 ----
  
      case NULLPTR_TYPE:
      case LANG_TYPE:
+     unspecified_type:
        /* Just use DW_TAG_unspecified_type.  */
        {
          dw_die_ref type_die = lookup_type_die (type);
*************** gen_type_die_with_usage (tree type, dw_d
*** 26988,26993 ****
--- 26992,27002 ----
  	  equate_type_number_to_die (type, *die);
  	  break;
  	}
+       if (is_cxx ()
+ 	  && TREE_CODE (type) >= LAST_AND_UNUSED_TREE_CODE
+ 	  && TYPE_P (type)
+ 	  && TYPE_IDENTIFIER (type))
+ 	goto unspecified_type;
        gcc_unreachable ();
      }
  
diff -Nrcpad gcc-16-20260111/gcc/fold-const.cc gcc-16-20260118/gcc/fold-const.cc
*** gcc-16-20260111/gcc/fold-const.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/fold-const.cc	Sun Jan 18 22:32:07 2026
*************** fold_vec_perm (tree type, tree arg0, tre
*** 10704,10714 ****
  
    /* For fall back case, we want to ensure we have VLS vectors
       with equal length.  */
!   if (!sel.length ().is_constant (&nelts))
      return NULL_TREE;
  
-   gcc_assert (known_eq (sel.length (),
- 			TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0))));
    tree *in_elts = XALLOCAVEC (tree, nelts * 2);
    if (!vec_cst_ctor_to_array (arg0, nelts, in_elts)
        || !vec_cst_ctor_to_array (arg1, nelts, in_elts + nelts))
--- 10704,10713 ----
  
    /* For fall back case, we want to ensure we have VLS vectors
       with equal length.  */
!   if (!sel.length ().is_constant (&nelts)
!       || !known_eq (sel.length (), TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0))))
      return NULL_TREE;
  
    tree *in_elts = XALLOCAVEC (tree, nelts * 2);
    if (!vec_cst_ctor_to_array (arg0, nelts, in_elts)
        || !vec_cst_ctor_to_array (arg1, nelts, in_elts + nelts))
*************** fold_binary_loc (location_t loc, enum tr
*** 12393,12432 ****
  				      build_int_cst (TREE_TYPE (iref), 0));
  	    }
  	}
- 
-       /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
- 	 of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
-       if (TREE_CODE (arg0) == RSHIFT_EXPR
- 	  && integer_zerop (arg1)
- 	  && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
- 	{
- 	  tree arg00 = TREE_OPERAND (arg0, 0);
- 	  tree arg01 = TREE_OPERAND (arg0, 1);
- 	  tree itype = TREE_TYPE (arg00);
- 	  if (wi::to_wide (arg01) == element_precision (itype) - 1)
- 	    {
- 	      if (TYPE_UNSIGNED (itype))
- 		{
- 		  itype = signed_type_for (itype);
- 		  arg00 = fold_convert_loc (loc, itype, arg00);
- 		}
- 	      enum tree_code code2 = code == EQ_EXPR ? GE_EXPR : LT_EXPR;
- 	      /* Make sure to transform vector compares only to supported
- 		 ones or from unsupported ones and check that only after
- 		 IPA so offloaded code is handled correctly in this regard.  */
- 	      if (!VECTOR_TYPE_P (itype)
- 		  || (cfun
- 		      && cfun->after_inlining
- 		      /* We can jump on EQ/NE but not GE/LT.  */
- 		      && VECTOR_BOOLEAN_TYPE_P (type)
- 		      && (expand_vec_cmp_expr_p (itype, type, code2)
- 			  || !expand_vec_cmp_expr_p (TREE_TYPE (op0),
- 						     type, code))))
- 		return fold_build2_loc (loc, code2,
- 					type, arg00, build_zero_cst (itype));
- 	    }
- 	}
- 
        /* Fold (~X & C) == 0 into (X & C) != 0 and (~X & C) != 0 into
  	 (X & C) == 0 when C is a single bit.  */
        if (TREE_CODE (arg0) == BIT_AND_EXPR
--- 12392,12397 ----
diff -Nrcpad gcc-16-20260111/gcc/fortran/ChangeLog gcc-16-20260118/gcc/fortran/ChangeLog
*** gcc-16-20260111/gcc/fortran/ChangeLog	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/fortran/ChangeLog	Sun Jan 18 22:32:07 2026
***************
*** 1,3 ****
--- 1,38 ----
+ 2026-01-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/122957
+ 	* invoke.texi: Add note that these features are incompatible
+ 	with user defined derived type I/O. (DTIO)
+ 
+ 2026-01-17  Steven G. Kargl  <kargl@gcc.gnu.org>
+ 
+ 	PR fortran/109512
+ 	* resolve.cc (resolve_function): Check if an external
+ 	attribute is required on a call to an external procedure.
+ 	(resolve_call): Likewise.
+ 
+ 2026-01-13  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/112460
+ 	* array.cc (resolve_array_list): Stash the first PDT element
+ 	and check its type specification parameters against those of
+ 	subsequent elements.
+ 	* expr.cc (get_parm_list_from_expr): New function to extract the
+ 	type spec lists from expressions to be compared.
+ 	(gfc_check_type_spec_parms): New function to compare type spec
+ 	lists between two expressions. Emit an error if any constant
+ 	values are different.
+ 	(gfc_check_assign): Check that the PDT type specification parms
+ 	are the same on lhs and rhs.
+ 	* gfortran.h : Add prototype for gfc_check_type_spec_parms.
+ 	* trans-expr.cc (copyable_array_p): PDT arrays are not copyable
+ 
+ 2026-01-12  Steven G. Kargl  <kargl@gcc.gnu.org>
+ 
+ 	PR fortran/91960
+ 	* resolve.cc (resolve_fl_parameter): Check the righthand symbol
+ 	is a constant expression.
+ 
  2026-01-09  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
  
  	PR fortran/123483
diff -Nrcpad gcc-16-20260111/gcc/fortran/array.cc gcc-16-20260118/gcc/fortran/array.cc
*** gcc-16-20260111/gcc/fortran/array.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/fortran/array.cc	Sun Jan 18 22:32:07 2026
*************** resolve_array_list (gfc_constructor_base
*** 2214,2219 ****
--- 2214,2220 ----
    bool t;
    gfc_constructor *c;
    gfc_iterator *iter;
+   gfc_expr *expr1 = NULL;
  
    t = true;
  
*************** resolve_array_list (gfc_constructor_base
*** 2276,2281 ****
--- 2277,2293 ----
  	  t = false;
  	}
  
+       /* 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;
+ 	  else
+ 	    t = gfc_check_type_spec_parms (expr1, c->expr, "in array constructor");
+ 	}
      }
  
    return t;
diff -Nrcpad gcc-16-20260111/gcc/fortran/expr.cc gcc-16-20260118/gcc/fortran/expr.cc
*** gcc-16-20260111/gcc/fortran/expr.cc	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/fortran/expr.cc	Sun Jan 18 22:32:07 2026
*************** gfc_check_conformance (gfc_expr *op1, gf
*** 3930,3935 ****
--- 3930,3996 ----
  }
  
  
+ /* Functions to check constant valued type specification parameters.  */
+ 
+ static gfc_actual_arglist *
+ get_parm_list_from_expr (gfc_expr *expr)
+ {
+   gfc_actual_arglist *a = NULL;
+   gfc_constructor *c;
+ 
+   if (expr->expr_type == EXPR_STRUCTURE)
+     a = expr->param_list;
+   else if (expr->expr_type == EXPR_ARRAY)
+     {
+       /* Take the first constant expression, if there is one.  */
+       c = gfc_constructor_first (expr->value.constructor);
+       for (; c; c = gfc_constructor_next (c))
+ 	if (!c->iterator && c->expr && c->expr->param_list)
+ 	  {
+ 	    a = c->expr->param_list;
+ 	    break;
+ 	  }
+     }
+   else if (expr->expr_type == EXPR_VARIABLE)
+     a = expr->symtree->n.sym->param_list;
+ 
+   return a;
+ }
+ 
+ bool
+ gfc_check_type_spec_parms (gfc_expr *expr1, gfc_expr *expr2,
+ 			   const char *context)
+ {
+   bool t = true;
+   gfc_actual_arglist *a1, *a2;
+ 
+   gcc_assert (expr1->ts.type == BT_DERIVED
+ 	      && expr1->ts.u.derived->attr.pdt_type);
+ 
+   a1 = get_parm_list_from_expr (expr1);
+   a2 = get_parm_list_from_expr (expr2);
+ 
+   for (; a1 && a2; a1 = a1->next, a2 = a2->next)
+     {
+       if (a1->expr && a1->expr->expr_type == EXPR_CONSTANT
+ 	  && a2->expr && a2->expr->expr_type == EXPR_CONSTANT
+ 	  && !strcmp (a1->name, a2->name)
+ 	  && mpz_cmp (a1->expr->value.integer, a2->expr->value.integer))
+ 	{
+ 	  gfc_error ("Mismatched type parameters %qs(%d/%d) %s at %L/%L",
+ 		     a2->name,
+ 		     (int)mpz_get_ui (a1->expr->value.integer),
+ 		     (int)mpz_get_ui (a2->expr->value.integer),
+ 		     context,
+ 		     &expr1->where, &expr2->where);
+ 	  t = false;
+ 	}
+     }
+ 
+   return t;
+ }
+ 
+ 
  /* Given an assignable expression and an arbitrary expression, make
     sure that the assignment can take place.  Only add a call to the intrinsic
     conversion routines, when allow_convert is set.  When this assign is a
*************** gfc_check_assign (gfc_expr *lvalue, gfc_
*** 4123,4128 ****
--- 4184,4195 ----
        return false;
      }
  
+ 
+   /* Check that the type spec. parameters are the same on both sides.  */
+   if (lvalue->ts.type == BT_DERIVED && lvalue->ts.u.derived->attr.pdt_type
+       && !gfc_check_type_spec_parms (lvalue, rvalue, "in assignment"))
+     return false;
+ 
    if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
      return true;
  
diff -Nrcpad gcc-16-20260111/gcc/fortran/gfortran.h gcc-16-20260118/gcc/fortran/gfortran.h
*** gcc-16-20260111/gcc/fortran/gfortran.h	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/fortran/gfortran.h	Sun Jan 18 22:32:07 2026
*************** bool gfc_numeric_ts (gfc_typespec *);
*** 3998,4003 ****
--- 3998,4004 ----
  int gfc_kind_max (gfc_expr *, gfc_expr *);
  
  bool gfc_check_conformance (gfc_expr *, gfc_expr *, const char *, ...) ATTRIBUTE_PRINTF_3;
+ bool gfc_check_type_spec_parms (gfc_expr *, gfc_expr *, const char *);
  bool gfc_check_assign (gfc_expr *, gfc_expr *, int, bool c = true);
  bool gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue,
  			       bool suppres_type_test = false,
diff -Nrcpad gcc-16-20260111/gcc/fortran/invoke.texi gcc-16-20260118/gcc/fortran/invoke.texi
*** gcc-16-20260111/gcc/fortran/invoke.texi	Sun Jan 11 22:32:06 2026
--- gcc-16-20260118/gcc/fortran/invoke.texi	Sun Jan 18 22:32:07 2026
*************** BOZ literal constant conversion, and I/O
*** 592,597 ****
--- 592,599 ----
  when passing a value to the @code{kind=} dummy argument.  Inspection of the
  intermediate representation of the translated Fortran code, produced by
  @option{-fdump-fortran-original} or @option{-fdump-tree-original}, is suggested.
+ NOTE: These options are incompatible with user defined derived
+ type I/O (DTIO).
  
  @opindex std=@var{std}
  @item -std=@var{std}
diff -Nrcpad gcc-16-20260111/gcc/fortran/resolve.cc gcc-16-20260118/gcc/fortran/resolve.cc
*** gcc-16-20260111/gcc/fortran/resolve.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/fortran/resolve.cc	Sun Jan 18 22:32:07 2026
*************** resolve_function (gfc_expr *expr)
*** 3687,3692 ****
--- 3687,3706 ----
      gfc_warning (OPT_Wdeprecated_declarations,
  		 "Using function %qs at %L is deprecated",
  		 sym->name, &expr->where);
+ 
+   /* Check an external function supplied as a dummy argument has an external
+      attribute when a program unit uses 'implicit none (external)'.  */
+   if (expr->expr_type == EXPR_FUNCTION
+       && expr->symtree
+       && expr->symtree->n.sym->attr.dummy
+       && expr->symtree->n.sym->ns->has_implicit_none_export
+       && !gfc_is_intrinsic(expr->symtree->n.sym, 0, expr->where))
+     {
+       gfc_error ("Dummy procedure %qs at %L requires an EXTERNAL attribute",
+ 		 sym->name, &expr->where);
+       return false;
+     }
+ 
    return t;
  }
  
*************** resolve_call (gfc_code *c)
*** 4167,4172 ****
--- 4181,4196 ----
    /* Resume assumed_size checking.  */
    need_full_assumed_size--;
  
+   /* If 'implicit none (external)' and the symbol is a dummy argument,
+      check for an 'external' attribute.  */
+   if (csym->ns->has_implicit_none_export
+       && csym->attr.external == 0 && csym->attr.dummy == 1)
+     {
+       gfc_error ("Dummy procedure %qs at %L requires an EXTERNAL attribute",
+ 		 csym->name, &c->loc);
+       return false;
+     }
+ 
    /* If external, check for usage.  */
    if (csym && is_external_proc (csym))
      resolve_global_procedure (csym, &c->loc, 1);
*************** resolve_fl_parameter (gfc_symbol *sym)
*** 17871,17876 ****
--- 17895,17921 ----
        return false;
      }
  
+   /* Some programmers can have a typo when using an implied-do loop to
+      initialize an array constant.  For example,
+        INTEGER I,J
+        INTEGER, PARAMETER :: A(3) = [(I, I = 1, 3)]     ! OK
+        INTEGER, PARAMETER :: B(3) = [(A(J), I = 1, 3)]  ! Not OK, J undefined
+      This check catches the typo.  */
+   if (sym->attr.dimension
+       && sym->value && sym->value->expr_type == EXPR_ARRAY
+       && !gfc_is_constant_expr (sym->value))
+     {
+       /* PR fortran/117070 argues a nonconstant proc pointer can appear in
+ 	 the array constructor of a paramater.  This seems inconsistant with
+ 	 the concept of a parameter. TODO: Needs an interpretation.  */
+       if (sym->value->ts.type == BT_DERIVED
+ 	  && sym->value->ts.u.derived
+ 	  && sym->value->ts.u.derived->attr.proc_pointer_comp)
+ 	return true;
+       gfc_error ("Expecting constant expression near %L", &sym->value->where);
+       return false;
+     }
+ 
    return true;
  }
  
diff -Nrcpad gcc-16-20260111/gcc/fortran/trans-expr.cc gcc-16-20260118/gcc/fortran/trans-expr.cc
*** gcc-16-20260111/gcc/fortran/trans-expr.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/fortran/trans-expr.cc	Sun Jan 18 22:32:07 2026
*************** copyable_array_p (gfc_expr * expr)
*** 13612,13618 ****
        return false;
  
      case_bt_struct:
!       return !expr->ts.u.derived->attr.alloc_comp;
  
      default:
        break;
--- 13612,13619 ----
        return false;
  
      case_bt_struct:
!       return (!expr->ts.u.derived->attr.alloc_comp
! 	      && !expr->ts.u.derived->attr.pdt_type);
  
      default:
        break;
diff -Nrcpad gcc-16-20260111/gcc/function.h gcc-16-20260118/gcc/function.h
*** gcc-16-20260111/gcc/function.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/function.h	Sun Jan 18 22:32:07 2026
*************** struct GTY(()) function {
*** 274,279 ****
--- 274,284 ----
       the same uid.  This is used for condition coverage.  */
    hash_map <gcond*, unsigned> *GTY((skip)) cond_uids;
  
+   /* Per-function copyid allocator for hierarchical discriminators.
+      Tracks the next available copyid for each location to ensure uniqueness
+      across code duplication passes (unrolling, vectorization, etc.).  */
+   struct copyid_allocator *GTY((skip)) copyid_alloc;
+ 
    /* For function.cc.  */
  
    /* Points to the FUNCTION_DECL of this function.  */
diff -Nrcpad gcc-16-20260111/gcc/gcc.cc gcc-16-20260118/gcc/gcc.cc
*** gcc-16-20260111/gcc/gcc.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/gcc.cc	Sun Jan 18 22:32:07 2026
*************** proper position among the other output f
*** 999,1006 ****
--- 999,1010 ----
  /* Here is the spec for running the linker, after compiling all files.  */
  
  #if defined(TARGET_PROVIDES_LIBATOMIC) && defined(USE_LD_AS_NEEDED)
+ #ifdef USE_LD_AS_NEEDED_LDSCRIPT
+ #define LINK_LIBATOMIC_SPEC "%{!fno-link-libatomic:-latomic_asneeded} "
+ #else
  #define LINK_LIBATOMIC_SPEC "%{!fno-link-libatomic:" LD_AS_NEEDED_OPTION \
  			    " -latomic " LD_NO_AS_NEEDED_OPTION "} "
+ #endif
  #else
  #define LINK_LIBATOMIC_SPEC ""
  #endif
*************** init_gcc_specs (struct obstack *obstack,
*** 1845,1850 ****
--- 1849,1864 ----
    char *buf;
  
  #if USE_LD_AS_NEEDED
+ #if defined(USE_LD_AS_NEEDED_LDSCRIPT) && !defined(USE_LIBUNWIND_EXCEPTIONS)
+   buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}"
+ 		"%{!static:%{!static-libgcc:%{!static-pie:"
+ 		"%{!shared-libgcc:",
+ 		static_name, " ",
+ 		shared_name, "_asneeded}"
+ 		"%{shared-libgcc:",
+ 		shared_name, "%{!shared: ", static_name, "}"
+ 		"}}"
+ #else
    buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}"
  		"%{!static:%{!static-libgcc:%{!static-pie:"
  		"%{!shared-libgcc:",
*************** init_gcc_specs (struct obstack *obstack,
*** 1854,1859 ****
--- 1868,1874 ----
  		"%{shared-libgcc:",
  		shared_name, "%{!shared: ", static_name, "}"
  		"}}"
+ #endif
  #else
    buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}"
  		"%{!static:%{!static-libgcc:"
diff -Nrcpad gcc-16-20260111/gcc/gimple-loop-versioning.cc gcc-16-20260118/gcc/gimple-loop-versioning.cc
*** gcc-16-20260111/gcc/gimple-loop-versioning.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/gimple-loop-versioning.cc	Sun Jan 18 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 41,46 ****
--- 41,47 ----
  #include "tree-into-ssa.h"
  #include "gimple-range.h"
  #include "tree-cfg.h"
+ #include "hierarchical_discriminator.h"
  
  namespace {
  
*************** loop_versioning::version_loop (class loo
*** 1699,1704 ****
--- 1700,1724 ----
        return false;
      }
  
+   /* Assign hierarchical discriminators to distinguish loop versions.
+      This allows AutoFDO to distinguish profile data from different
+      versions.  No multiplicity for non-vectorized loop versioning.  */
+   gimple *optimized_last = last_nondebug_stmt (li.optimized_loop->header);
+   location_t optimized_loc
+     = optimized_last ? gimple_location (optimized_last) : UNKNOWN_LOCATION;
+   if (optimized_loc != UNKNOWN_LOCATION)
+     {
+       unsigned int optimized_copyid = allocate_copyid_base (optimized_loc, 1);
+       assign_discriminators_to_loop (li.optimized_loop, 0, optimized_copyid);
+     }
+   gimple *loop_last = last_nondebug_stmt (loop->header);
+   location_t loop_loc
+     = loop_last ? gimple_location (loop_last) : UNKNOWN_LOCATION;
+   if (loop_loc != UNKNOWN_LOCATION)
+     {
+       unsigned int loop_copyid = allocate_copyid_base (loop_loc, 1);
+       assign_discriminators_to_loop (loop, 0, loop_copyid);
+     }
    if (dump_enabled_p ())
      dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, find_loop_location (loop),
  		     "versioned this loop for when certain strides are 1\n");
diff -Nrcpad gcc-16-20260111/gcc/gimple-pretty-print.cc gcc-16-20260118/gcc/gimple-pretty-print.cc
*** gcc-16-20260111/gcc/gimple-pretty-print.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/gimple-pretty-print.cc	Sun Jan 18 22:32:07 2026
*************** dump_gimple_phi (pretty_printer *pp, con
*** 2470,2476 ****
    for (i = 0; i < gimple_phi_num_args (phi); i++)
      {
        if ((flags & TDF_LINENO) && gimple_phi_arg_has_location (phi, i))
! 	dump_location (pp, gimple_phi_arg_location (phi, i));
        basic_block src = gimple_phi_arg_edge (phi, i)->src;
        if (flags & TDF_GIMPLE)
  	{
--- 2470,2476 ----
    for (i = 0; i < gimple_phi_num_args (phi); i++)
      {
        if ((flags & TDF_LINENO) && gimple_phi_arg_has_location (phi, i))
! 	dump_location (pp, gimple_phi_arg_location (phi, i), flags);
        basic_block src = gimple_phi_arg_edge (phi, i)->src;
        if (flags & TDF_GIMPLE)
  	{
*************** pp_gimple_stmt_1 (pretty_printer *pp, co
*** 2724,2730 ****
      pp_printf (pp, "<&%p> ", (const void *) gs);
  
    if ((flags & TDF_LINENO) && gimple_has_location (gs))
!     dump_location (pp, gimple_location (gs));
  
    if (flags & TDF_EH)
      {
--- 2724,2730 ----
      pp_printf (pp, "<&%p> ", (const void *) gs);
  
    if ((flags & TDF_LINENO) && gimple_has_location (gs))
!     dump_location (pp, gimple_location (gs), flags);
  
    if (flags & TDF_EH)
      {
*************** dump_implicit_edges (pretty_printer *pp,
*** 3104,3110 ****
  
        if ((flags & TDF_LINENO)
  	  && e->goto_locus != UNKNOWN_LOCATION)
! 	dump_location (pp, e->goto_locus);
  
        pp_cfg_jump (pp, e, flags);
        pp_newline (pp);
--- 3104,3110 ----
  
        if ((flags & TDF_LINENO)
  	  && e->goto_locus != UNKNOWN_LOCATION)
! 	dump_location (pp, e->goto_locus, flags);
  
        pp_cfg_jump (pp, e, flags);
        pp_newline (pp);
*************** gimple_dump_bb_as_sarif_properties (diag
*** 3276,3282 ****
  
  	if ((dump_flags & TDF_LINENO)
  	    && e->goto_locus != UNKNOWN_LOCATION)
! 	  dump_location (pp, e->goto_locus);
  
  	pp_cfg_jump (pp, e, dump_flags);
  	pp_newline (pp);
--- 3276,3282 ----
  
  	if ((dump_flags & TDF_LINENO)
  	    && e->goto_locus != UNKNOWN_LOCATION)
! 	  dump_location (pp, e->goto_locus, dump_flags);
  
  	pp_cfg_jump (pp, e, dump_flags);
  	pp_newline (pp);
diff -Nrcpad gcc-16-20260111/gcc/hierarchical_discriminator.cc gcc-16-20260118/gcc/hierarchical_discriminator.cc
*** gcc-16-20260111/gcc/hierarchical_discriminator.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/hierarchical_discriminator.cc	Sun Jan 18 22:32:07 2026
***************
*** 0 ****
--- 1,341 ----
+ /* 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.
+ 
+ You should have received a copy of the GNU General Public License
+ 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 "backend.h"
+ #include "tree.h"
+ #include "gimple.h"
+ #include "tree-pass.h"
+ #include "ssa.h"
+ #include "gimple-iterator.h"
+ #include "tree-cfg.h"
+ #include "cfgloop.h"
+ #include "hierarchical_discriminator.h"
+ #include "cfghooks.h"
+ #include "diagnostic-core.h"
+ #include "function.h"
+ #include "rtl.h"
+ #include "basic-block.h"
+ 
+ /* Helper to update a location with new discriminator components.  If
+    multiplicity_factor is non-zero, multiply existing multiplicity.
+    If copyid is non-zero, set it (otherwise preserve existing).  */
+ 
+ static location_t
+ update_location_discriminator (location_t loc,
+ 			       unsigned int multiplicity_factor,
+ 			       unsigned int copyid)
+ {
+   if (loc == UNKNOWN_LOCATION)
+     return loc;
+ 
+   discriminator_components comp = get_discriminator_components_from_loc (loc);
+ 
+   /* Multiply existing multiplicity if requested.  */
+   if (multiplicity_factor > 0)
+     {
+       unsigned int new_mult = (comp.multiplicity == 0)
+ 	? multiplicity_factor
+ 	: comp.multiplicity * multiplicity_factor;
+       if (new_mult > DISCR_MULTIPLICITY_MAX)
+ 	new_mult = DISCR_MULTIPLICITY_MAX;
+       comp.multiplicity = new_mult;
+     }
+ 
+   /* Update copyid if requested.  */
+   if (copyid > 0)
+     comp.copyid = copyid;
+ 
+   return location_with_discriminator_components (loc, comp);
+ }
+ 
+ /* Assign discriminators to a statement
+    Updates the multiplicity and/or copyid discriminator components for
+    all statements in the given basic block, while preserving the base
+    discriminator.
+ 
+    If multiplicity_factor > 0, multiply existing multiplicity by this factor.
+    If copyid > 0, set it to this value.  */
+ 
+ void
+ assign_discriminators_to_stmt (gimple* stmt,
+ 			       unsigned int multiplicity_factor,
+ 			       unsigned int copyid)
+ {
+   location_t loc = gimple_location (stmt);
+ 
+   if (loc != UNKNOWN_LOCATION)
+     {
+       location_t new_loc
+ 	= update_location_discriminator (loc,
+ 					 multiplicity_factor,
+ 					 copyid);
+       gimple_set_location (stmt, new_loc);
+     }
+ }
+ 
+ 
+ /* Assign discriminators to all statements in a basic block.  This
+    function updates the multiplicity and/or copyid discriminator components for
+    all statements in the given basic block, while preserving the base
+    discriminator.
+ 
+    If multiplicity_factor > 0, multiply existing multiplicity by this factor.
+    If copyid > 0, set it to this value.  */
+ 
+ void
+ assign_discriminators_to_bb (basic_block bb,
+ 			     unsigned int multiplicity_factor,
+ 			     unsigned int copyid)
+ {
+   gimple_stmt_iterator gsi;
+   gphi_iterator phi_gsi;
+   edge e;
+   edge_iterator ei;
+ 
+   /* Update PHI statements.  */
+   for (phi_gsi = gsi_start_phis (bb); !gsi_end_p (phi_gsi);
+        gsi_next (&phi_gsi))
+     {
+       gphi *phi = phi_gsi.phi ();
+       location_t loc = gimple_location (phi);
+ 
+       if (loc != UNKNOWN_LOCATION)
+ 	{
+ 	  location_t new_loc
+ 	    = update_location_discriminator (loc,
+ 					     multiplicity_factor,
+ 					     copyid);
+ 	  gimple_set_location (phi, new_loc);
+ 	}
+     }
+ 
+   /* Update regular statements.  */
+   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+     {
+       gimple *stmt = gsi_stmt (gsi);
+ 
+       if (is_gimple_debug (stmt))
+ 	continue;
+ 
+       location_t loc = gimple_location (stmt);
+       if (loc != UNKNOWN_LOCATION)
+ 	{
+ 	  location_t new_loc
+ 	    = update_location_discriminator (loc,
+ 					     multiplicity_factor,
+ 					     copyid);
+ 	  gimple_set_location (stmt, new_loc);
+ 	}
+     }
+ 
+   /* Update goto/edge locations.  */
+   FOR_EACH_EDGE (e, ei, bb->succs)
+     {
+       location_t loc = e->goto_locus;
+       if (loc != UNKNOWN_LOCATION)
+ 	{
+ 	  location_t new_loc
+ 	    = update_location_discriminator (loc,
+ 					     multiplicity_factor,
+ 					     copyid);
+ 	  e->goto_locus = new_loc;
+ 	}
+     }
+ }
+ 
+ /* Assign discriminators to all basic blocks in a loop.  This function is
+    used by loop versioning passes to assign version IDs and vectorization
+    factors to all statements in a loop version.  */
+ 
+ void
+ assign_discriminators_to_loop (class loop *loop,
+ 			       unsigned int multiplicity_factor,
+ 			       unsigned int copyid)
+ {
+   basic_block *bbs;
+   unsigned int i;
+ 
+   /* Get all basic blocks in the loop.  */
+   bbs = get_loop_body (loop);
+ 
+   /* Assign discriminators to all blocks in the loop.  */
+   for (i = 0; i < loop->num_nodes; i++)
+     assign_discriminators_to_bb (bbs[i], multiplicity_factor, copyid);
+ 
+   free (bbs);
+ }
+ 
+ 
+ /* Helper to update the copyid allocator map with a location's existing copyid.
+    If the location has a non-zero copyid, record that we need to start
+    allocating from copyid+1 for this location.  */
+ 
+ static void
+ record_existing_copyid (location_t loc, struct function *fn)
+ {
+   if (loc == UNKNOWN_LOCATION)
+     return;
+ 
+   location_t pure_loc = get_pure_location (loc);
+   unsigned int discr = get_discriminator_from_loc (loc);
+   if (discr == 0)
+     return;
+ 
+   /* Extract copyid from discriminator.  */
+   unsigned int copyid = (discr >> DISCR_COPYID_SHIFT) & DISCR_COPYID_MASK;
+   if (copyid == 0)
+     return;
+ 
+   /* Update max copyid for this location.  */
+   unsigned int next_copyid = copyid + 1;
+   if (next_copyid > DISCR_COPYID_MAX)
+     next_copyid = DISCR_COPYID_MAX;
+ 
+   unsigned int *existing = fn->copyid_alloc->location_map->get (pure_loc);
+   if (!existing || *existing <= copyid)
+     fn->copyid_alloc->location_map->put (pure_loc, next_copyid);
+ }
+ 
+ /* Initialize the per-function copyid allocator.  Walks the function
+    body to find existing max copyids per location.  */
+ 
+ static void
+ init_copyid_allocator (struct function *fn)
+ {
+   if (!fn)
+     return;
+ 
+   if (fn->copyid_alloc && fn->copyid_alloc->initialized)
+     return;  /* Already initialized.  */
+ 
+   if (!fn->copyid_alloc)
+     {
+       fn->copyid_alloc = XNEW (struct copyid_allocator);
+       fn->copyid_alloc->location_map
+ 	= new hash_map<int_hash<location_t, UNKNOWN_LOCATION,
+ 			       UNKNOWN_LOCATION>, unsigned int>;
+       fn->copyid_alloc->initialized = false;
+     }
+ 
+   /* Only walk the body if not yet initialized.  */
+   if (fn->copyid_alloc->initialized)
+     return;
+ 
+   /* Walk the function body to find existing max copyids per location.
+      This ensures we don't reuse copyids that were allocated in previous
+      passes, during LTO, or brought in by inlining.  */
+   basic_block bb;
+   FOR_EACH_BB_FN (bb, fn)
+     {
+       if (current_ir_type () == IR_GIMPLE)
+ 	{
+ 	  /* Process PHI nodes.  */
+ 	  gphi_iterator phi_gsi;
+ 	  for (phi_gsi = gsi_start_phis (bb); !gsi_end_p (phi_gsi);
+ 	       gsi_next (&phi_gsi))
+ 	    record_existing_copyid (gimple_location (phi_gsi.phi ()), fn);
+ 
+ 	  /* Process regular statements.  */
+ 	  gimple_stmt_iterator gsi;
+ 	  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+ 	    record_existing_copyid (gimple_location (gsi_stmt (gsi)), fn);
+ 
+ 	  /* Process edge goto_locus locations.  */
+ 	  edge e;
+ 	  edge_iterator ei;
+ 	  FOR_EACH_EDGE (e, ei, bb->succs)
+ 	    record_existing_copyid (e->goto_locus, fn);
+ 	}
+       else
+ 	{
+ 	  /* For RTL mode.  */
+ 	  rtx_insn *insn;
+ 	  FOR_BB_INSNS (bb, insn)
+ 	    {
+ 	      if (INSN_P (insn))
+ 		record_existing_copyid (INSN_LOCATION (insn), fn);
+ 	    }
+ 	}
+     }
+ 
+   fn->copyid_alloc->initialized = true;
+ }
+ 
+ /* Allocate a unique copy_id base for the given location.
+    STRIDE indicates how many copy_ids to reserve (for unrolling N times,
+    use stride=N).  Returns the base copy_id.  */
+ 
+ unsigned int
+ allocate_copyid_base (location_t loc, unsigned int stride)
+ {
+   /* Need current function context.  */
+   if (!cfun)
+     return 1;  /* No function context, return default.  */
+ 
+   init_copyid_allocator (cfun);
+ 
+   loc = get_pure_location (loc);
+ 
+   /* Cannot allocate copyid for unknown location.  */
+   if (loc == UNKNOWN_LOCATION)
+     return 1;  /* Return default base copyid.  */
+ 
+   /* Check if this location has been seen before.  */
+   unsigned int *existing = cfun->copyid_alloc->location_map->get (loc);
+   if (existing)
+     {
+       /* Location already duplicated before.  Allocate next copy_id for it.  */
+       unsigned int base = *existing;
+       *existing += stride;  /* Update for next duplication.  */
+ 
+       /* Clamp to maximum.  */
+       if (*existing > DISCR_COPYID_MAX)
+ 	*existing = DISCR_COPYID_MAX;
+       return base;
+     }
+   else
+     {
+       /* First duplication at this location in this function.
+ 	 Start at 1 (not 0, which means "no copyid").  */
+       unsigned int base = 1;
+       unsigned int next = base + stride;
+       if (next > DISCR_COPYID_MAX)
+ 	next = DISCR_COPYID_MAX;
+       /* Record this location for future duplications.  */
+       cfun->copyid_alloc->location_map->put (loc, next);
+ 
+       return base;
+     }
+ }
+ 
+ /* Free the copy_id allocator for a function.  Called when the function
+    is being destroyed.  */
+ 
+ void
+ free_copyid_allocator (struct function *fn)
+ {
+   if (fn && fn->copyid_alloc)
+     {
+       delete fn->copyid_alloc->location_map;
+       XDELETE (fn->copyid_alloc);
+       fn->copyid_alloc = NULL;
+     }
+ }
diff -Nrcpad gcc-16-20260111/gcc/hierarchical_discriminator.h gcc-16-20260118/gcc/hierarchical_discriminator.h
*** gcc-16-20260111/gcc/hierarchical_discriminator.h	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/hierarchical_discriminator.h	Sun Jan 18 22:32:07 2026
***************
*** 0 ****
--- 1,93 ----
+ /* 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.
+ 
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
+ #ifndef GCC_HIERARCHICAL_DISCRIMINATOR_H
+ #define GCC_HIERARCHICAL_DISCRIMINATOR_H
+ 
+ #include "config.h"
+ #include "system.h"
+ #include "coretypes.h"
+ #include "gimple.h"
+ #include "tree.h"
+ #include "basic-block.h"
+ #include "input.h"
+ 
+ /* Hierarchical discriminator layout (32 bits total):
+    Discriminator format: [Base:8][Multiplicity:7][CopyID:11][Unused:6]
+    - Base: bits 0-7 (8 bits, 0-255)
+    - Multiplicity: bits 8-14 (7 bits, 0-127)
+    - CopyID: bits 15-25 (11 bits, 0-2047)
+    - Unused: bits 26-31 (6 bits, reserved)
+ 
+    Base discriminator: Used by front-end and early passes to distinguish
+ 		       different statements on the same source line.
+ 
+    Multiplicity: Represents when a single IR statement corresponds to
+ 		 multiple scalar iterations or executions
+ 
+    CopyID: Unique identifier for distinct code copies to distinguish
+  */
+ 
+ 
+ /* Helper function to assign discriminators to a statement.
+    This preserves the base discriminator and updates multiplicity
+    and/or copyid.  */
+ extern void assign_discriminators_to_stmt (gimple* stmt,
+ 					   unsigned int multiplicity_factor,
+ 					   unsigned int copyid);
+ 
+ /* Helper function to assign discriminators to all statements in a basic
+    block.  This preserves the base discriminator and updates multiplicity
+    and/or copyid.  PHI statements, PHI arguments, and edge locations are
+    also updated.  */
+ extern void assign_discriminators_to_bb (basic_block bb,
+ 					 unsigned int multiplicity_factor,
+ 					 unsigned int copyid);
+ 
+ /* Helper function to assign discriminators to all basic blocks in a loop.
+    This is used by loop versioning passes to distinguish different versions
+    of the same loop and to indicate vectorization factors.  */
+ extern void assign_discriminators_to_loop (class loop *loop,
+ 					   unsigned int multiplicity_factor,
+ 					   unsigned int copyid);
+ 
+ /* Copy ID allocator for tracking unique copy_id assignments per location.
+    This ensures that nested code duplication (e.g., unroll + vectorize) gets
+    unique copy_ids even when the same location is duplicated
+    multiple times.  */
+ 
+ struct copyid_allocator
+ {
+   /* Hash map from location to the next available copy_id base.
+      Key: location_t, Value: unsigned int (next available base).  */
+   hash_map<int_hash<location_t, UNKNOWN_LOCATION, UNKNOWN_LOCATION>,
+ 	   unsigned int> *location_map;
+ 
+   /* Whether the allocator has been initialized.  */
+   bool initialized;
+ };
+ 
+ /* Allocate a unique copy_id base for the given location.
+    STRIDE indicates how many copy_ids to reserve (for unrolling N times,
+    use stride=N).  Returns the base copy_id.  */
+ extern unsigned int allocate_copyid_base (location_t loc, unsigned int stride);
+ 
+ /* Free the copy_id allocator for a function.  */
+ extern void free_copyid_allocator (struct function *fn);
+ 
+ #endif /* GCC_HIERARCHICAL_DISCRIMINATOR_H.  */
diff -Nrcpad gcc-16-20260111/gcc/ifcvt.cc gcc-16-20260118/gcc/ifcvt.cc
*** gcc-16-20260111/gcc/ifcvt.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/ifcvt.cc	Sun Jan 18 22:32:07 2026
*************** static rtx noce_get_alt_condition (struc
*** 790,796 ****
  static bool noce_try_minmax (struct noce_if_info *);
  static bool noce_try_abs (struct noce_if_info *);
  static bool noce_try_sign_mask (struct noce_if_info *);
- static int noce_try_cond_zero_arith (struct noce_if_info *);
  
  /* Return the comparison code for reversed condition for IF_INFO,
     or UNKNOWN if reversing the condition is not possible.  */
--- 790,795 ----
*************** get_base_reg (rtx exp)
*** 3135,3144 ****
  
        tmp = !cond ? y : 0
  	x = (y & z) | tmp
    */
  
  static int
! noce_try_cond_zero_arith (struct noce_if_info *if_info)
  {
    rtx target, a, b, a_op0, a_op1;
    rtx cond = if_info->cond;
--- 3134,3148 ----
  
        tmp = !cond ? y : 0
  	x = (y & z) | tmp
+     Also for AND try:
+       tmp = cond ? z : -1
+ 	x = y op tmp
+     To see if it is cheaper to produce `!cond ? y : 0`
+     or `cond ? z : -1`.
    */
  
  static int
! noce_try_cond_arith (struct noce_if_info *if_info)
  {
    rtx target, a, b, a_op0, a_op1;
    rtx cond = if_info->cond;
*************** noce_try_cond_zero_arith (struct noce_if
*** 3230,3256 ****
        target = rtl_hooks.gen_lowpart_no_emit (GET_MODE (XEXP (a, op != AND)), target);
        gcc_assert (target);
      }
-   if (!target)
-     goto end_seq_n_fail;
  
    if (op == AND)
      {
        rtx a_bin = gen_reg_rtx (mode);
        noce_emit_move_insn (a_bin, a);
  
        target = expand_simple_binop (mode, IOR, a_bin, target, if_info->x, 0,
  				    OPTAB_WIDEN);
! 
!     }
!   else
!     {
!       target = expand_simple_binop (mode, op, a_op0, target, if_info->x, 0,
! 				    OPTAB_WIDEN);
      }
  
    if (!target)
      goto end_seq_n_fail;
  
    if (target != if_info->x)
      noce_emit_move_insn (if_info->x, target);
  
--- 3234,3302 ----
        target = rtl_hooks.gen_lowpart_no_emit (GET_MODE (XEXP (a, op != AND)), target);
        gcc_assert (target);
      }
  
+   /* For AND, try `cond ? z : -1` to see if that is cheaper or the same cost.
+      In some cases it will be cheaper to produce the -1 rather than the 0 case.  */
    if (op == AND)
      {
+       rtx_insn *seq0 = end_sequence ();
+       unsigned cost0 = seq_cost (seq0, if_info->speed_p);
+       if (!target)
+ 	cost0 = -1u;
+ 
+       /* Produce `cond ? z : -1`. */
+       rtx targetm1;
+       start_sequence ();
+       targetm1 = gen_reg_rtx (GET_MODE (XEXP (a, 1)));
+       targetm1 = noce_emit_cmove (if_info, targetm1, code,
+ 				  XEXP (cond, 0), XEXP (cond, 1),
+ 				  XEXP (a, 1), constm1_rtx);
+       rtx_insn *seqm1 = end_sequence ();
+       unsigned costm1 = seq_cost (seqm1, if_info->speed_p);
+       if (!targetm1)
+ 	costm1 = -1u;
+       /* If both fails, then there is no costing to be done. */
+       if (!targetm1 && !target)
+ 	return false;
+ 
+       /* If -1 is cheaper or the same cost to producing 0, then use that.  */
+       if (costm1 <= cost0)
+ 	{
+ 	  push_to_sequence (seqm1);
+ 	  targetm1 = expand_simple_binop (mode, op, a_op0, targetm1,
+ 					  if_info->x, 0, OPTAB_WIDEN);
+ 	  if (targetm1)
+ 	    {
+ 	      target = targetm1;
+ 	      goto success;
+ 	    }
+ 	  end_sequence ();
+ 	}
+       if (!target)
+ 	return false;
+       /* For 0 the produce sequence is:
+ 	 tmp = !cond ? y : 0
+ 	 x = (y & z) | tmp  */
+       push_to_sequence (seq0);
        rtx a_bin = gen_reg_rtx (mode);
        noce_emit_move_insn (a_bin, a);
  
        target = expand_simple_binop (mode, IOR, a_bin, target, if_info->x, 0,
  				    OPTAB_WIDEN);
!       if (!target)
! 	goto end_seq_n_fail;
!       goto success;
      }
+   if (!target)
+     goto end_seq_n_fail;
+ 
+   target = expand_simple_binop (mode, op, a_op0, target, if_info->x, 0,
+ 				OPTAB_WIDEN);
  
    if (!target)
      goto end_seq_n_fail;
  
+ success:
    if (target != if_info->x)
      noce_emit_move_insn (if_info->x, target);
  
*************** noce_try_cond_zero_arith (struct noce_if
*** 3259,3265 ****
      goto fail;
  
    emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATION (if_info->insn_a));
!   if_info->transform_name = "noce_try_cond_zero_arith";
    return true;
  
  end_seq_n_fail:
--- 3305,3311 ----
      goto fail;
  
    emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATION (if_info->insn_a));
!   if_info->transform_name = "noce_try_cond_arith";
    return true;
  
  end_seq_n_fail:
*************** noce_process_if_block (struct noce_if_in
*** 4431,4437 ****
        if (noce_try_store_flag_mask (if_info))
  	goto success;
        if (HAVE_conditional_move
!           && noce_try_cond_zero_arith (if_info))
  	goto success;
        if (HAVE_conditional_move
  	  && noce_try_cmove_arith (if_info))
--- 4477,4483 ----
        if (noce_try_store_flag_mask (if_info))
  	goto success;
        if (HAVE_conditional_move
!           && noce_try_cond_arith (if_info))
  	goto success;
        if (HAVE_conditional_move
  	  && noce_try_cmove_arith (if_info))
diff -Nrcpad gcc-16-20260111/gcc/input.cc gcc-16-20260118/gcc/input.cc
*** gcc-16-20260111/gcc/input.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/input.cc	Sun Jan 18 22:32:07 2026
*************** get_discriminator_from_loc (location_t l
*** 1074,1079 ****
--- 1074,1108 ----
    return get_discriminator_from_loc (line_table, locus);
  }
  
+ /* Create a location with hierarchical discriminator components.  */
+ 
+ location_t
+ location_with_discriminator_components (location_t locus,
+ 					const discriminator_components &comp)
+ {
+   gcc_assert (comp.base <= DISCR_BASE_MAX);
+   gcc_assert (comp.multiplicity <= DISCR_MULTIPLICITY_MAX);
+   gcc_assert (comp.copyid <= DISCR_COPYID_MAX);
+   unsigned int discriminator = (comp.base << DISCR_BASE_SHIFT)
+     | (comp.multiplicity << DISCR_MULTIPLICITY_SHIFT)
+     | (comp.copyid << DISCR_COPYID_SHIFT);
+   return location_with_discriminator (locus, discriminator);
+ }
+ 
+ /* Get hierarchical discriminator components from a location.  */
+ 
+ discriminator_components
+ get_discriminator_components_from_loc (location_t locus)
+ {
+   unsigned int discriminator = get_discriminator_from_loc (locus);
+   discriminator_components comp;
+   comp.base = discriminator & DISCR_BASE_MASK;
+   comp.multiplicity = (discriminator >> DISCR_MULTIPLICITY_SHIFT)
+     & DISCR_MULTIPLICITY_MASK;
+   comp.copyid = (discriminator >> DISCR_COPYID_SHIFT) & DISCR_COPYID_MASK;
+   return comp;
+ }
+ 
  #if CHECKING_P
  
  namespace selftest {
diff -Nrcpad gcc-16-20260111/gcc/input.h gcc-16-20260118/gcc/input.h
*** gcc-16-20260111/gcc/input.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/input.h	Sun Jan 18 22:32:07 2026
*************** extern location_t location_with_discrimi
*** 89,94 ****
--- 89,137 ----
  extern bool has_discriminator (location_t);
  extern int get_discriminator_from_loc (location_t);
  
+ /* Hierarchical discriminator support for AutoFDO.
+ Discriminator format: [Base:8][Multiplicity:7][CopyID:11][Unused:6]
+ - Base discriminator (bits 0-7): Distinguishes instructions at same line
+ - Multiplicity (bits 8-14): Duplication factor for unrolling/vectorization
+ - CopyID (bits 15-25): Unique identifier for code copies
+ - Unused (bits 26-31): Reserved.  */
+ 
+ /* Discriminator bit layout constants.  */
+ #define DISCR_BASE_BITS 8
+ #define DISCR_MULTIPLICITY_BITS 7
+ #define DISCR_COPYID_BITS 11
+ #define DISCR_UNUSED_BITS 6
+ 
+ #define DISCR_BASE_MASK ((1u << DISCR_BASE_BITS) - 1)
+ #define DISCR_MULTIPLICITY_MASK ((1u << DISCR_MULTIPLICITY_BITS) - 1)
+ #define DISCR_COPYID_MASK ((1u << DISCR_COPYID_BITS) - 1)
+ 
+ #define DISCR_BASE_SHIFT 0
+ #define DISCR_MULTIPLICITY_SHIFT DISCR_BASE_BITS
+ #define DISCR_COPYID_SHIFT (DISCR_BASE_BITS + DISCR_MULTIPLICITY_BITS)
+ 
+ /* Maximum values for each discriminator field.  */
+ #define DISCR_BASE_MAX DISCR_BASE_MASK
+ #define DISCR_MULTIPLICITY_MAX DISCR_MULTIPLICITY_MASK
+ #define DISCR_COPYID_MAX DISCR_COPYID_MASK
+ 
+ /* Structure to hold hierarchical discriminator components.  */
+ struct discriminator_components
+ {
+   unsigned int base;         /* Front-end discriminator (bits 0-7).  */
+   unsigned int multiplicity; /* Duplication factor (bits 8-14).  */
+   unsigned int copyid;       /* Copy identifier (bits 15-25).  */
+ };
+ 
+ /* Create location with hierarchical discriminator.  */
+ extern location_t
+ location_with_discriminator_components (location_t,
+ 					const discriminator_components &);
+ 
+ /* Get discriminator components from location.  */
+ extern discriminator_components
+ get_discriminator_components_from_loc (location_t);
+ 
  #define LOCATION_FILE(LOC) ((expand_location (LOC)).file)
  #define LOCATION_LINE(LOC) ((expand_location (LOC)).line)
  #define LOCATION_COLUMN(LOC)((expand_location (LOC)).column)
diff -Nrcpad gcc-16-20260111/gcc/ipa-cp.cc gcc-16-20260118/gcc/ipa-cp.cc
*** gcc-16-20260111/gcc/ipa-cp.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/ipa-cp.cc	Sun Jan 18 22:32:07 2026
*************** tree
*** 1627,1634 ****
  ipa_value_from_jfunc (class ipa_node_params *info, struct ipa_jump_func *jfunc,
  		      tree parm_type)
  {
    if (jfunc->type == IPA_JF_CONST)
!     return ipa_get_jf_constant (jfunc);
    else if (jfunc->type == IPA_JF_PASS_THROUGH
  	   || jfunc->type == IPA_JF_ANCESTOR)
      {
--- 1627,1636 ----
  ipa_value_from_jfunc (class ipa_node_params *info, struct ipa_jump_func *jfunc,
  		      tree parm_type)
  {
+   if (!parm_type)
+     return NULL_TREE;
    if (jfunc->type == IPA_JF_CONST)
!     return ipacp_value_safe_for_type (parm_type, ipa_get_jf_constant (jfunc));
    else if (jfunc->type == IPA_JF_PASS_THROUGH
  	   || jfunc->type == IPA_JF_ANCESTOR)
      {
*************** ipa_value_from_jfunc (class ipa_node_par
*** 1660,1667 ****
  
        if (jfunc->type == IPA_JF_PASS_THROUGH)
  	{
- 	  if (!parm_type)
- 	    return NULL_TREE;
  	  enum tree_code opcode = ipa_get_jf_pass_through_operation (jfunc);
  	  tree op2 = ipa_get_jf_pass_through_operand (jfunc);
  	  tree op_type
--- 1662,1667 ----
*************** ipa_value_from_jfunc (class ipa_node_par
*** 1671,1677 ****
  	  return ipacp_value_safe_for_type (parm_type, cstval);
  	}
        else
! 	return ipa_get_jf_ancestor_result (jfunc, input);
      }
    else
      return NULL_TREE;
--- 1671,1679 ----
  	  return ipacp_value_safe_for_type (parm_type, cstval);
  	}
        else
! 	return ipacp_value_safe_for_type (parm_type,
! 					  ipa_get_jf_ancestor_result (jfunc,
! 								      input));
      }
    else
      return NULL_TREE;
*************** propagate_bits_across_jump_function (cgr
*** 2618,2624 ****
  	 and we store it in jump function during analysis stage.  */
  
        if (!src_lats->bits_lattice.bottom_p ()
! 	  || src_lats->bits_lattice.recipient_only_p ())
  	{
  	  if (!op_type)
  	    op_type = ipa_get_type (caller_info, src_idx);
--- 2620,2626 ----
  	 and we store it in jump function during analysis stage.  */
  
        if (!src_lats->bits_lattice.bottom_p ()
! 	  && !src_lats->bits_lattice.recipient_only_p ())
  	{
  	  if (!op_type)
  	    op_type = ipa_get_type (caller_info, src_idx);
*************** devirtualization_time_bonus (struct cgra
*** 3353,3359 ****
  	continue;
  
        /* Only bare minimum benefit for clearly un-inlineable targets.  */
!       int savings = 1;
        callee = cgraph_node::get (target);
        if (!callee || !callee->definition)
  	continue;
--- 3355,3361 ----
  	continue;
  
        /* Only bare minimum benefit for clearly un-inlineable targets.  */
!       res = res + ie->combined_sreal_frequency ();
        callee = cgraph_node::get (target);
        if (!callee || !callee->definition)
  	continue;
*************** devirtualization_time_bonus (struct cgra
*** 3364,3381 ****
        if (!isummary || !isummary->inlinable)
  	continue;
  
        int size = ipa_size_summaries->get (callee)->size;
        /* FIXME: The values below need re-considering and perhaps also
  	 integrating into the cost metrics, at lest in some very basic way.  */
        int max_inline_insns_auto
  	= opt_for_fn (callee->decl, param_max_inline_insns_auto);
        if (size <= max_inline_insns_auto / 4)
! 	savings += 31 / ((int)speculative + 1);
        else if (size <= max_inline_insns_auto / 2)
! 	savings += 15 / ((int)speculative + 1);
        else if (size <= max_inline_insns_auto
  	       || DECL_DECLARED_INLINE_P (callee->decl))
! 	savings += 7 / ((int)speculative + 1);
        res = res + ie->combined_sreal_frequency () * (sreal) savings;
      }
  
--- 3366,3386 ----
        if (!isummary || !isummary->inlinable)
  	continue;
  
+       int savings = 0;
        int size = ipa_size_summaries->get (callee)->size;
        /* FIXME: The values below need re-considering and perhaps also
  	 integrating into the cost metrics, at lest in some very basic way.  */
        int max_inline_insns_auto
  	= opt_for_fn (callee->decl, param_max_inline_insns_auto);
        if (size <= max_inline_insns_auto / 4)
! 	savings = 31 / ((int)speculative + 1);
        else if (size <= max_inline_insns_auto / 2)
! 	savings = 15 / ((int)speculative + 1);
        else if (size <= max_inline_insns_auto
  	       || DECL_DECLARED_INLINE_P (callee->decl))
! 	savings = 7 / ((int)speculative + 1);
!       else
! 	continue;
        res = res + ie->combined_sreal_frequency () * (sreal) savings;
      }
  
diff -Nrcpad gcc-16-20260111/gcc/ipa-fnsummary.cc gcc-16-20260118/gcc/ipa-fnsummary.cc
*** gcc-16-20260111/gcc/ipa-fnsummary.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/ipa-fnsummary.cc	Sun Jan 18 22:32:07 2026
*************** redirect_to_unreachable (struct cgraph_e
*** 272,278 ****
    if (callee)
      callee->remove_symbol_and_inline_clones ();
    if (e->has_callback)
!     e->purge_callback_edges ();
    return e;
  }
  
--- 272,281 ----
    if (callee)
      callee->remove_symbol_and_inline_clones ();
    if (e->has_callback)
!     for (cgraph_edge *cbe = e->first_callback_edge (); cbe;
! 	 cbe = cbe->next_callback_edge ())
!       /* If the carrying edge is unreachable, so are the callback calls.  */
!       redirect_to_unreachable (cbe);
    return e;
  }
  
diff -Nrcpad gcc-16-20260111/gcc/ira-lives.cc gcc-16-20260118/gcc/ira-lives.cc
*** gcc-16-20260111/gcc/ira-lives.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/ira-lives.cc	Sun Jan 18 22:32:07 2026
*************** along with GCC; see the file COPYING3.
*** 24,29 ****
--- 24,30 ----
  #include "backend.h"
  #include "target.h"
  #include "rtl.h"
+ #include "stmt.h"
  #include "predict.h"
  #include "df.h"
  #include "memmodel.h"
*************** ira_implicitly_set_insn_hard_regs (HARD_
*** 971,976 ****
--- 972,983 ----
  		    if (regno >= 0)
  		      add_to_hard_reg_set (set, mode, regno);
  		  }
+ 		else if (c == '{')
+ 		  {
+ 		    int regno = decode_hard_reg_constraint (p);
+ 		    gcc_assert (regno >= 0 && regno < FIRST_PSEUDO_REGISTER);
+ 		    add_to_hard_reg_set (set, mode, regno);
+ 		  }
  	      }
  	}
      }
diff -Nrcpad gcc-16-20260111/gcc/ira.cc gcc-16-20260118/gcc/ira.cc
*** gcc-16-20260111/gcc/ira.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/ira.cc	Sun Jan 18 22:32:07 2026
*************** ira_setup_alts (rtx_insn *insn)
*** 1843,1848 ****
--- 1843,1854 ----
  		    goto op_success;
  		    break;
  
+ 		  case '{':
+ 		    if (REG_P (op) || SUBREG_P (op))
+ 		      goto op_success;
+ 		    win_p = true;
+ 		    break;
+ 
  		  default:
  		    {
  		      enum constraint_num cn = lookup_constraint (p);
diff -Nrcpad gcc-16-20260111/gcc/lra-constraints.cc gcc-16-20260118/gcc/lra-constraints.cc
*** gcc-16-20260111/gcc/lra-constraints.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/lra-constraints.cc	Sun Jan 18 22:32:07 2026
*************** lra_constraints (bool first_p)
*** 5664,5669 ****
--- 5664,5670 ----
  		   && loc_equivalence_change_p (&PATTERN (curr_insn)))
  	    {
  	      lra_update_insn_regno_info (curr_insn);
+ 	      lra_push_insn_by_uid (INSN_UID (curr_insn));
  	      changed_p = true;
  	    }
  	}
diff -Nrcpad gcc-16-20260111/gcc/lto/ChangeLog gcc-16-20260118/gcc/lto/ChangeLog
*** gcc-16-20260111/gcc/lto/ChangeLog	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/lto/ChangeLog	Sun Jan 18 22:32:07 2026
***************
*** 1,3 ****
--- 1,40 ----
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* lto-symtab.cc (lto_symtab_merge_symbols): Set body_removed
+ 	for symbols resolved outside of IR.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* lto-partition.cc (join_partitions): Declare.
+ 	(lto_1_to_1_map): Split out to..
+ 	(map_1_to_1): ..here.
+ 	(create_asm_partition): Replaced by..
+ 	(create_asm_partitions): ..this.
+ 	(lto_max_map): Use new create_asm_partitions.
+ 	(lto_balanced_map): Use new create_asm_partitions.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* lto-symtab.cc (lto_cgraph_replace_node): Propagate
+ 	must_remain_in_tu_*.
+ 	(lto_varpool_replace_node): Likewise.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* lto-common.cc (read_cgraph_and_symbols): Call
+ 	input_toplevel_asms after decl merging.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	PR ipa/122458
+ 	* lto-common.cc (read_cgraph_and_symbols):
+ 	Call analyze_toplevel_extended_asm.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* lto-symtab.cc (lto_cgraph_replace_node): Propagate ref_by_asm.
+ 	(lto_varpool_replace_node): Propagate ref_by_asm.
+ 
  2025-12-23  Dhruv Chawla  <dhruvc@nvidia.com>
  
  	* Make-lang.in: Bump GCOV version to 3.
diff -Nrcpad gcc-16-20260111/gcc/match.pd gcc-16-20260118/gcc/match.pd
*** gcc-16-20260111/gcc/match.pd	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/match.pd	Sun Jan 18 22:32:07 2026
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 2320,2329 ****
  	&& INTEGRAL_TYPE_P (TREE_TYPE (@0))
  	&& TREE_CODE (@1) != INTEGER_CST
  	&& tree_nop_conversion_p (type, TREE_TYPE (@2))
- 	&& !POINTER_TYPE_P (TREE_TYPE (@0))
- 	&& TREE_CODE (TREE_TYPE (@0)) != OFFSET_TYPE
  	&& TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (type))
!    (bitop:type (convert @0) (convert @1)))))
  
  (for bitop (bit_and bit_ior)
       rbitop (bit_ior bit_and)
--- 2320,2334 ----
  	&& INTEGRAL_TYPE_P (TREE_TYPE (@0))
  	&& TREE_CODE (@1) != INTEGER_CST
  	&& tree_nop_conversion_p (type, TREE_TYPE (@2))
  	&& TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (type))
!    (bitop:type (convert @0) (convert @1))
!    /* Similar as above, but the outer and inner most types match
!        and it was widening cast; replacing 2 casts with only one.  */
!    (if (GIMPLE
!         && INTEGRAL_TYPE_P (type)
!         && types_match (type, TREE_TYPE (@0))
!         && TYPE_PRECISION (TREE_TYPE (@2)) > TYPE_PRECISION (type))
!     (bitop:type @0 (convert @1))))))
  
  (for bitop (bit_and bit_ior)
       rbitop (bit_ior bit_and)
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 2824,2829 ****
--- 2829,2856 ----
  	(le (minus (convert:etype @0) { lo; }) { hi; })
  	(gt (minus (convert:etype @0) { lo; }) { hi; })))))))))
  
+ /* Fold (X >> C) != 0 into X < 0 if C is one less than the width
+    of X.  Similarly fold (X >> C) == 0 into X >= 0.  */
+ (for neeq (ne eq)
+      ltge (lt ge)
+  (simplify
+   (neeq
+    (rshift@2 @0 INTEGER_CST@1)
+    integer_zerop)
+   (with { tree itype = signed_type_for (TREE_TYPE (@0)); }
+    /* Make sure to transform vector compares only to supported
+       ones or from unsupported ones and check that only after
+       IPA so offloaded code is handled correctly in this regard.  */
+    (if (wi::to_wide (@1) == element_precision (itype) - 1
+ 	&& (!VECTOR_TYPE_P (itype)
+ 	    || (cfun
+ 		&& cfun->after_inlining
+ 		&& VECTOR_BOOLEAN_TYPE_P (type)
+ 		&& (expand_vec_cmp_expr_p (itype, type, ltge)
+ 		    || !expand_vec_cmp_expr_p (TREE_TYPE (@2),
+ 					       type, neeq)))))
+     (ltge (convert:itype @0) { build_zero_cst (itype); })))))
+ 
  /* X + Z < Y + Z is the same as X < Y when there is no overflow.  */
  (for op (lt le ge gt)
   (simplify
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 5129,5134 ****
--- 5156,5166 ----
        && (GIMPLE || !TREE_SIDE_EFFECTS (@1)))
    (cond (convert:boolean_type_node @2) @1 @0)))
  
+ /* Transform A & (B*cmp) into (A&B)*cmp.  */
+ (simplify
+  (bit_and:c (mult:cs zero_one_valued_p@0 @1) @2)
+  (mult @0 (bit_and! @1 @2)))
+ 
  /* (x <= 0 ? -x : 0) -> max(-x, 0).  */
  (simplify
   (cond (le @0 integer_zerop@1) (negate@2 @0) integer_zerop@1)
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 9824,9832 ****
      (with { tree res = int_const_binop (rop, @2, @1); }
       (if (TREE_OVERFLOW (res))
        {
- 	fold_overflow_warning (("assuming signed overflow does not occur "
- 				"when simplifying conditional to constant"),
- 			       WARN_STRICT_OVERFLOW_CONDITIONAL);
          bool less = cmp == LE_EXPR || cmp == LT_EXPR;
  	/* wi::ges_p (@2, 0) should be sufficient for a signed type.  */
  	bool ovf_high = wi::lt_p (wi::to_wide (@1), 0,
--- 9856,9861 ----
*************** DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
*** 9835,9848 ****
  	constant_boolean_node (less == ovf_high, type);
        }
        (if (single_use (@3))
!        (with
! 	{
! 	  fold_overflow_warning (("assuming signed overflow does not occur "
! 				  "when changing X +- C1 cmp C2 to "
! 				  "X cmp C2 -+ C1"),
! 				 WARN_STRICT_OVERFLOW_COMPARISON);
! 	}
! 	(cmp @0 { res; })))))
  /* For wrapping types, simplify the following cases of X +- C1 CMP C2:
  
     (a) If CMP is <= and C2 -+ C1 == +INF (1), simplify to X >= -INF -+ C1
--- 9864,9870 ----
  	constant_boolean_node (less == ovf_high, type);
        }
        (if (single_use (@3))
! 	(cmp @0 { res; }))))
  /* For wrapping types, simplify the following cases of X +- C1 CMP C2:
  
     (a) If CMP is <= and C2 -+ C1 == +INF (1), simplify to X >= -INF -+ C1
*************** and,
*** 11515,11527 ****
      {
        /* Create a vec_perm_indices for the integer vector.  */
        poly_uint64 nelts = TYPE_VECTOR_SUBPARTS (type);
        bool single_arg = (op0 == op1);
!       vec_perm_indices sel (builder, single_arg ? 1 : 2, nelts);
      }
!     (if (sel.series_p (0, 1, 0, 1))
!      { op0; }
!      (if (sel.series_p (0, 1, nelts, 1))
!       { op1; }
        (with
         {
           if (!single_arg)
--- 11537,11550 ----
      {
        /* Create a vec_perm_indices for the integer vector.  */
        poly_uint64 nelts = TYPE_VECTOR_SUBPARTS (type);
+       poly_uint64 nelts_in = TYPE_VECTOR_SUBPARTS (TREE_TYPE (op0));
        bool single_arg = (op0 == op1);
!       vec_perm_indices sel (builder, single_arg ? 1 : 2, nelts_in);
      }
!     (if (known_eq (nelts, nelts_in) && sel.series_p (0, 1, 0, 1))
!      (view_convert @0)
!      (if (known_eq (nelts, nelts_in) && sel.series_p (0, 1, nelts_in, 1))
!       (view_convert @1)
        (with
         {
           if (!single_arg)
*************** and,
*** 11533,11539 ****
  	         op0 = op1;
  	         sel.rotate_inputs (1);
  	       }
! 	     else if (known_ge (poly_uint64 (sel[0]), nelts))
  	       {
  	         std::swap (op0, op1);
  	         sel.rotate_inputs (1);
--- 11556,11562 ----
  	         op0 = op1;
  	         sel.rotate_inputs (1);
  	       }
! 	     else if (known_ge (poly_uint64 (sel[0]), nelts_in))
  	       {
  	         std::swap (op0, op1);
  	         sel.rotate_inputs (1);
*************** and,
*** 11568,11573 ****
--- 11591,11597 ----
  	      in that case.  But only if the vector mode is supported,
  	      otherwise this is invalid GIMPLE.  */
  	   if (op_mode != BLKmode
+ 	       && known_eq (nelts, nelts_in)
  	       && (TREE_CODE (cop0) == VECTOR_CST
  		   || TREE_CODE (cop0) == CONSTRUCTOR
  		   || TREE_CODE (cop1) == VECTOR_CST
*************** and,
*** 12180,12186 ****
  (simplify
    (bit_ior:c (lshift @0 INTEGER_CST@1)
  	     (bit_xor (rshift @2 INTEGER_CST@3) INTEGER_CST@4))
!    (if (((~((HOST_WIDE_INT_1U << tree_to_uhwi (@1)) - 1)) & tree_to_uhwi (@4)) == 0
          && (tree_to_uhwi (@1) + tree_to_uhwi (@3)) == TYPE_PRECISION (type)
          && TYPE_UNSIGNED (type)
          && @0 == @2)
--- 12204,12213 ----
  (simplify
    (bit_ior:c (lshift @0 INTEGER_CST@1)
  	     (bit_xor (rshift @2 INTEGER_CST@3) INTEGER_CST@4))
!    (if (tree_fits_uhwi_p (@1)
! 	&& tree_fits_uhwi_p (@3)
! 	&& tree_fits_uhwi_p (@4)
! 	&& ((~((HOST_WIDE_INT_1U << tree_to_uhwi (@1)) - 1)) & tree_to_uhwi (@4)) == 0
          && (tree_to_uhwi (@1) + tree_to_uhwi (@3)) == TYPE_PRECISION (type)
          && TYPE_UNSIGNED (type)
          && @0 == @2)
*************** and,
*** 12191,12197 ****
  (simplify
    (bit_ior:c (bit_xor (lshift @0 INTEGER_CST@1) INTEGER_CST@2)
  	     (rshift @3 INTEGER_CST@4))
!    (if ((((((HOST_WIDE_INT_1U << tree_to_uhwi (@1)) - 1)) & tree_to_uhwi (@2)) == 0)
          && (tree_to_uhwi (@1) + tree_to_uhwi (@4)) == TYPE_PRECISION (type)
          && TYPE_UNSIGNED (type)
          && @0 == @3)
--- 12218,12227 ----
  (simplify
    (bit_ior:c (bit_xor (lshift @0 INTEGER_CST@1) INTEGER_CST@2)
  	     (rshift @3 INTEGER_CST@4))
!    (if (tree_fits_uhwi_p (@1)
! 	&& tree_fits_uhwi_p (@2)
! 	&& tree_fits_uhwi_p (@4)
! 	&& (((((HOST_WIDE_INT_1U << tree_to_uhwi (@1)) - 1)) & tree_to_uhwi (@2)) == 0)
          && (tree_to_uhwi (@1) + tree_to_uhwi (@4)) == TYPE_PRECISION (type)
          && TYPE_UNSIGNED (type)
          && @0 == @3)
diff -Nrcpad gcc-16-20260111/gcc/params.opt gcc-16-20260118/gcc/params.opt
*** gcc-16-20260111/gcc/params.opt	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/params.opt	Sun Jan 18 22:32:07 2026
*************** Enable asan detection of use-after-retur
*** 70,75 ****
--- 70,79 ----
  Common Joined UInteger Var(param_auto_profile_bbs) Init(1) IntegerRange(0, 1) Param Optimization
  Build basic block profile using auto profile.
  
+ -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
  Whether the scheduling description is mostly a cycle-accurate model of the target processor and is likely to be spill aggressively to fill any pipeline bubbles.
diff -Nrcpad gcc-16-20260111/gcc/print-rtl.cc gcc-16-20260118/gcc/print-rtl.cc
*** gcc-16-20260111/gcc/print-rtl.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/print-rtl.cc	Sun Jan 18 22:32:08 2026
*************** rtx_writer::print_rtx_operand_code_L (co
*** 458,467 ****
  	  expanded_location xloc = insn_location (in_insn);
  	  fprintf (m_outfile, " \"%s\":%i:%i", xloc.file, xloc.line,
  		   xloc.column);
! 	  int discriminator = insn_discriminator (in_insn);
! 	    if (discriminator)
  	      fprintf (m_outfile, " discrim %d", discriminator);
- 
  	}
  #endif
      }
--- 458,466 ----
  	  expanded_location xloc = insn_location (in_insn);
  	  fprintf (m_outfile, " \"%s\":%i:%i", xloc.file, xloc.line,
  		   xloc.column);
! 	  if ((dump_flags & TDF_COMPARE_DEBUG) == 0)
! 	    if (int discriminator = insn_discriminator (in_insn))
  	      fprintf (m_outfile, " discrim %d", discriminator);
  	}
  #endif
      }
diff -Nrcpad gcc-16-20260111/gcc/rtlanal.cc gcc-16-20260118/gcc/rtlanal.cc
*** gcc-16-20260111/gcc/rtlanal.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rtlanal.cc	Sun Jan 18 22:32:08 2026
*************** nonzero_bits1 (const_rtx x, scalar_int_m
*** 4795,4800 ****
--- 4795,4818 ----
  
    unsigned int mode_width = GET_MODE_PRECISION (mode);
  
+   /* For unary ops like ffs or popcount we want to determine the number of
+      nonzero bits from the operand.  This only matters with very large
+      vector modes.  A
+        (popcount:DI (V128BImode)
+      should not get a nonzero-bit mask of (1 << 7) - 1 as that could
+      lead to incorrect optimizations based on it, see PR123501.  */
+   unsigned int op_mode_width = mode_width;
+   machine_mode op_mode = mode;
+   if (UNARY_P (x))
+     {
+       const_rtx op = XEXP (x, 0);
+       if (GET_MODE_PRECISION (GET_MODE (op)).is_constant ())
+ 	{
+ 	  op_mode = GET_MODE (op);
+ 	  op_mode_width = GET_MODE_PRECISION (op_mode).to_constant ();
+ 	}
+     }
+ 
    if (CONST_INT_P (x))
      {
        if (SHORT_IMMEDIATES_SIGN_EXTEND
*************** nonzero_bits1 (const_rtx x, scalar_int_m
*** 5198,5210 ****
      case FFS:
      case POPCOUNT:
        /* This is at most the number of bits in the mode.  */
!       nonzero = (HOST_WIDE_INT_UC (2) << (floor_log2 (mode_width))) - 1;
        break;
  
      case CLZ:
        /* If CLZ has a known value at zero, then the nonzero bits are
! 	 that value, plus the number of bits in the mode minus one.  */
!       if (CLZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
  	nonzero
  	  |= (HOST_WIDE_INT_1U << (floor_log2 (mode_width))) - 1;
        else
--- 5216,5231 ----
      case FFS:
      case POPCOUNT:
        /* This is at most the number of bits in the mode.  */
!       nonzero = (HOST_WIDE_INT_UC (2) << (floor_log2 (op_mode_width))) - 1;
        break;
  
      case CLZ:
        /* If CLZ has a known value at zero, then the nonzero bits are
! 	 that value, plus the number of bits in the mode minus one.
! 	 If we have a different operand mode, don't try to get nonzero
! 	 bits as currently nonzero is not a poly_int.  */
!       if (op_mode == mode
! 	  && CLZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
  	nonzero
  	  |= (HOST_WIDE_INT_1U << (floor_log2 (mode_width))) - 1;
        else
*************** nonzero_bits1 (const_rtx x, scalar_int_m
*** 5213,5220 ****
  
      case CTZ:
        /* If CTZ has a known value at zero, then the nonzero bits are
! 	 that value, plus the number of bits in the mode minus one.  */
!       if (CTZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
  	nonzero
  	  |= (HOST_WIDE_INT_1U << (floor_log2 (mode_width))) - 1;
        else
--- 5234,5243 ----
  
      case CTZ:
        /* If CTZ has a known value at zero, then the nonzero bits are
! 	 that value, plus the number of bits in the mode minus one.
! 	 See above for op_mode != mode.  */
!       if (op_mode == mode
! 	  && CLZ_DEFINED_VALUE_AT_ZERO (mode, nonzero))
  	nonzero
  	  |= (HOST_WIDE_INT_1U << (floor_log2 (mode_width))) - 1;
        else
*************** nonzero_bits1 (const_rtx x, scalar_int_m
*** 5223,5229 ****
  
      case CLRSB:
        /* This is at most the number of bits in the mode minus 1.  */
!       nonzero = (HOST_WIDE_INT_1U << (floor_log2 (mode_width))) - 1;
        break;
  
      case PARITY:
--- 5246,5252 ----
  
      case CLRSB:
        /* This is at most the number of bits in the mode minus 1.  */
!       nonzero = (HOST_WIDE_INT_1U << (floor_log2 (op_mode_width))) - 1;
        break;
  
      case PARITY:
diff -Nrcpad gcc-16-20260111/gcc/rust/ChangeLog gcc-16-20260118/gcc/rust/ChangeLog
*** gcc-16-20260111/gcc/rust/ChangeLog	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ChangeLog	Sun Jan 18 22:32:08 2026
***************
*** 1,3 ****
--- 1,246 ----
+ 2026-01-16  Yap Zhi Heng  <yapzhhg@gmail.com>
+ 
+ 	* typecheck/rust-hir-type-check-expr.cc (visit(StructExprStruct)): Update to properly
+ 	unwrap enum variants for type checking.
+ 	* typecheck/rust-tyty.cc (VariantDef::get_fields) : Remove NUM assert.
+ 	* backend/rust-compile-expr.cc: Update to properly unwrap enum variants for type
+ 	resolution checking.
+ 
+ 2026-01-16  lenny.chiadmi-delage  <lenny.chiadmi-delage@epita.fr>
+ 
+ 	* parse/rust-parse-impl-expr.hxx(Parser::null_denotation): Add
+ 	HASH case to handle outer attributes in expressions.
+ 
+ 2026-01-16  Lucas Ly Ba  <lucas.ly-ba@outlook.com>
+ 
+ 	* checks/lints/unused/rust-unused-checker.cc (UnusedChecker::visit_loop_label):
+ 	Add warning for unused label in LoopLabel expr.
+ 	* checks/lints/unused/rust-unused-checker.h: Likewise.
+ 	* checks/lints/unused/rust-unused-collector.cc (UnusedCollector::visit):
+ 	Check in BreakExpr and ContinueExpr if a label is used.
+ 	* checks/lints/unused/rust-unused-collector.h: Likewise.
+ 	* checks/lints/unused/rust-unused-context.cc (UnusedContext::add_label):
+ 	Method helper.
+ 	(UnusedContext::is_label_used): Likewise
+ 	* checks/lints/unused/rust-unused-context.h: Likewise.
+ 
+ 2026-01-16  Jayant Chauhan  <0001jayant@gmail.com>
+ 
+ 	* util/rust-attributes.cc (AttributeChecker::visit): Emit diagnostic.
+ 
+ 2026-01-16  Jayant Chauhan  <0001jayant@gmail.com>
+ 
+ 	* util/rust-attributes.cc (AttributeChecker::visit): Emit diagnostic.
+ 
+ 2026-01-16  Lucas Ly Ba  <lucas.ly-ba@outlook.com>
+ 
+ 	* checks/lints/unused/rust-unused-checker.cc (UnusedChecker::visit):
+ 	Emit warning in empty statement visitor.
+ 	* checks/lints/unused/rust-unused-checker.h:
+ 	Likewise.
+ 
+ 2026-01-16  Jayant Chauhan  <0001jayant@gmail.com>
+ 
+ 	* util/rust-attributes.cc: Emit diagnostic.
+ 
+ 2026-01-16  Arthur Cohen  <arthur.cohen@embecosm.com>
+ 	    Owen Avery  <powerboat9.gamer@gmail.com>
+ 
+ 	* resolve/rust-name-resolution-context.h:
+ 
+ 2026-01-16  Arthur Cohen  <arthur.cohen@embecosm.com>
+ 
+ 	* resolve/rust-forever-stack.h: New function.
+ 	* resolve/rust-forever-stack.hxx: Implement it.
+ 	* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Call it if the prelude exists
+ 	and we have an unresolved Identifier Call it if the prelude exists and we have
+ 	an unresolved Identifier.
+ 
+ 2026-01-16  Arthur Cohen  <arthur.cohen@embecosm.com>
+ 
+ 	* resolve/rust-forever-stack.h: Add new resolve_path function.
+ 	* resolve/rust-forever-stack.hxx: Implement it.
+ 
+ 2026-01-16  Arthur Cohen  <arthur.cohen@embecosm.com>
+ 
+ 	* resolve/rust-early-name-resolver-2.0.cc (Early::finalize_glob_import): Save prelude
+ 	if we find one.
+ 	* resolve/rust-name-resolution-context.h: Add field.
+ 	* resolve/rust-toplevel-name-resolver-2.0.cc (has_prelude_import): New function.
+ 	(TopLevel::visit): Create a prelude glob import if necessary.
+ 	* resolve/rust-toplevel-name-resolver-2.0.h: Allow glob imports to be prelude imports.
+ 
+ 2026-01-16  Arthur Cohen  <arthur.cohen@embecosm.com>
+ 
+ 	* resolve/rust-forever-stack.h: Add depth parameter to function.
+ 	* resolve/rust-forever-stack.hxx: Likewise and use it.
+ 
+ 2026-01-16  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* parse/rust-parse-impl-expr.hxx: Use explicit template.
+ 	* parse/rust-parse-impl-path.hxx: Likewise.
+ 	* parse/rust-parse-impl-ttree.hxx: Likewise.
+ 	* parse/rust-parse-impl.hxx: Likewise.
+ 
+ 2026-01-16  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast-collector.cc (TokenCollector::visit): Update function
+ 	name.
+ 	* ast/rust-ast-pointer-visitor.cc (PointerVisitor::visit): Likewise.
+ 	* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
+ 	* ast/rust-ast.cc (BreakExpr::as_string): Use getter function.
+ 	(AttributeParser::parse_path_meta_item): Convert to expected type.
+ 	(ReturnExpr::as_string): Change access to returned expr.
+ 	* ast/rust-desugar-for-loops.cc (DesugarForLoops::DesugarCtx::make_break_arm):
+ 	Likewise.
+ 	* ast/rust-expr.h (class BreakExpr): Make expr in break optional.
+ 	(class ReturnExpr): Make returned expr explicitely optional. Change the
+ 	getters and introduce a  const getter.
+ 	* expand/rust-cfg-strip.cc (CfgStrip::visit): Convert to expected type.
+ 	* expand/rust-macro-builtins-asm.cc (parse_reg_operand_in): Update
+ 	constructor call to new expected types.
+ 	(parse_reg_operand_out): Likewise.
+ 	(parse_reg_operand_inout): Likewise.
+ 	(parse_llvm_operands): Likewise.
+ 	* expand/rust-macro-builtins-format-args.cc (format_args_parse_expr):
+ 	Likewise.
+ 	(format_args_parse_arguments): Likewise.
+ 	* expand/rust-macro-builtins-helpers.cc (try_expand_many_expr): Update
+ 	value for tl::expected.
+ 	* expand/rust-macro-builtins-include.cc (MacroBuiltin::include_handler):
+ 	Likewise.
+ 	* expand/rust-macro-expand.cc (transcribe_expression): Update
+ 	constructor call with expected value.
+ 	* hir/rust-ast-lower-expr.cc (ASTLoweringExpr::visit): Likewise.
+ 	* parse/rust-parse-error.h (enum class): Add new error types for Expr
+ 	and StructExprField.
+ 	* parse/rust-parse-impl-expr.hxx: Explicitely handle return expr
+ 	parsing failure. Update to fit new expected types.
+ 	* parse/rust-parse-impl.hxx: Likewise.
+ 	* resolve/rust-late-name-resolver-2.0.cc (Late::visit): Adapt to
+ 	tl::expected.
+ 	* ast/rust-desugar-while-let.cc (DesugarWhileLet::DesugarCtx::make_break_arm):
+ 	Use optional for break expressions when missing instead of nullptr.
+ 	* parse/rust-parse.h: Change function return type with expected. Remove
+ 	error state from ExprOrStmt.
+ 
+ 2026-01-16  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* ast/rust-ast.cc (AttributeParser::parse_meta_item_lit): Use
+ 	tl::expected
+ 	* expand/rust-macro-builtins-helpers.cc (parse_single_string_literal):
+ 	Likewise.
+ 	* expand/rust-macro-expand.cc (MacroExpander::match_fragment):
+ 	Likewise.
+ 	* parse/rust-cfg-parser.cc (parse_cfg_option): Likewise.
+ 	* parse/rust-parse-error.h (struct SimplePath): Remove error type.
+ 	(struct DelimTokenTree): Likewise.
+ 	(struct Token): Likewise.
+ 	(struct TokenTree): Likewise.
+ 	(class LifetimeParam): Move from here ...
+ 	(struct LifetimeParam): ... to here. Add ctor.
+ 	(class Lifetime): Add error type.
+ 	(enum class): Remove AnonConst.
+ 	(struct BlockExpr): Change BlockExpr to generic node error.
+ 	* parse/rust-parse-impl-expr.hxx: Use tl::expected for errors.
+ 	* parse/rust-parse-impl-path.hxx: Likewise.
+ 	* parse/rust-parse-impl-ttree.hxx: Likewise.
+ 	* parse/rust-parse-impl.hxx: Likewise.
+ 	* parse/rust-parse.h: Update function return types with tl::expected
+ 	to propagate errors.
+ 
+ 2026-01-16  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* parse/rust-parse-error.h (struct BlockExpr): Add BlockExpr error type
+ 	* parse/rust-parse-impl-expr.hxx: Update return types.
+ 	* parse/rust-parse-impl.hxx: Likewise.
+ 	* parse/rust-parse.h: Update function prototypes.
+ 
+ 2026-01-16  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* parse/rust-parse-impl.hxx: Collect errors instead of emitting them.
+ 
+ 2026-01-16  Pierre-Emmanuel Patry  <pierre-emmanuel.patry@embecosm.com>
+ 
+ 	* parse/rust-parse.h (class ParseLifetimeParamError): Move error from
+ 	here ...
+ 	(class ParseLifetimeError): Likewise.
+ 	(enum class): Likewise.
+ 	* parse/rust-parse-error.h (class LifetimeParam): ... to here.
+ 	here.
+ 	(class Lifetime): Likewise.
+ 	(enum class): Likewise.
+ 	(struct LoopLabel): Likewise and make it a full struct with ctors.
+ 	(struct Self): Likewise.
+ 	* parse/rust-parse-impl-expr.hxx: Make error point to new namespace.
+ 	* parse/rust-parse-impl.hxx: Likewise.
+ 
+ 2026-01-16  Harishankar  <harishankarpp7@gmail.com>
+ 
+ 	* expand/rust-macro-expand.cc (MacroExpander::expand_invoc): Handle
+ 	error fragments by replacing them with empty fragments.
+ 
+ 2026-01-16  Lucas Ly Ba  <lucas.ly-ba@outlook.com>
+ 
+ 	* ast/rust-ast-builder.cc (Builder::match_arm): Moves the vector of patterns
+ 	to a single pattern.
+ 	* ast/rust-ast-collector.cc (TokenCollector::visit):Likewise.
+ 	* ast/rust-ast-pointer-visitor.cc (PointerVisitor::visit):Likewise.
+ 	* ast/rust-ast-visitor.cc (DefaultASTVisitor::visit):Likewise.
+ 	* ast/rust-ast.cc (IfLetExpr::as_string):Likewise.
+ 	(WhileLetLoopExpr::as_string):Likewise.
+ 	(MatchArm::as_string):Likewise.
+ 	* ast/rust-desugar-question-mark.cc (make_match_arm):Likewise.
+ 	* ast/rust-desugar-while-let.cc (DesugarWhileLet::desugar):Likewise.
+ 	* ast/rust-expr.h (class WhileLetLoopExpr):Likewise.
+ 	(class IfLetExpr):Likewise.
+ 	* backend/rust-compile-expr.cc (CompileExpr::visit):Likewise.
+ 	* checks/errors/rust-hir-pattern-analysis.cc (lower_arm):Likewise.
+ 	* expand/rust-cfg-strip.cc (CfgStrip::visit):Likewise.
+ 	* hir/rust-ast-lower.cc (ASTLoweringIfLetBlock::desugar_iflet):Likewise.
+ 	(ASTLoweringExprWithBlock::visit):Likewise.
+ 	* hir/rust-hir-dump.cc (Dump::do_matcharm):Likewise.
+ 	(Dump::visit):Likewise.
+ 	* hir/tree/rust-hir-expr.cc (OperatorExpr::operator=):Likewise.
+ 	(ArithmeticOrLogicalExpr::operator=):Likewise.
+ 	(ComparisonExpr::operator=):Likewise.
+ 	(LazyBooleanExpr::operator=):Likewise.
+ 	(TypeCastExpr::operator=):Likewise.
+ 	(AssignmentExpr::operator=):Likewise.
+ 	(CompoundAssignmentExpr::operator=):Likewise.
+ 	(GroupedExpr::operator=):Likewise.
+ 	(ArrayExpr::operator=):Likewise.
+ 	(ArrayIndexExpr::operator=):Likewise.
+ 	(CallExpr::operator=):Likewise.
+ 	(MethodCallExpr::operator=):Likewise.
+ 	(FieldAccessExpr::operator=):Likewise.
+ 	(BlockExpr::operator=):Likewise.
+ 	(BreakExpr::operator=):Likewise.
+ 	(ReturnExpr::operator=):Likewise.
+ 	(UnsafeBlockExpr::operator=):Likewise.
+ 	(BaseLoopExpr::operator=):Likewise.
+ 	(WhileLetLoopExpr::WhileLetLoopExpr):Likewise.
+ 	(WhileLetLoopExpr::operator=):Likewise.
+ 	(MatchArm::MatchArm):Likewise.
+ 	(MatchArm::operator=):Likewise.
+ 	(MatchExpr::operator=):Likewise.
+ 	* hir/tree/rust-hir-expr.h (class WhileLetLoopExpr):Likewise.
+ 	* hir/tree/rust-hir-visitor.cc (DefaultHIRVisitor::walk):Likewise.
+ 	(DefaultHIRVisitor::visit_match_arm):Likewise.
+ 	* hir/tree/rust-hir.cc (WhileLetLoopExpr::as_string):Likewise.
+ 	(MatchArm::as_string):Likewise.
+ 	* parse/rust-parse-impl-expr.hxx: Likewise.
+ 	* parse/rust-parse-impl.hxx: Likewise.
+ 	* parse/rust-parse.h:Likewise.
+ 	* resolve/rust-default-resolver.cc (DefaultResolver::visit_if_let_patterns):Likewise.
+ 	* resolve/rust-late-name-resolver-2.0.cc (Late::visit):Likewise.
+ 	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit):Likewise.
+ 
+ 2026-01-16  Arthur Cohen  <arthur.cohen@embecosm.com>
+ 
+ 	* resolve/rust-early-name-resolver-2.0.cc (Early::visit_attributes): Mention the name
+ 	of the attribute macro that hasn't been found.
+ 
  2025-12-23  lenny.chiadmi-delage  <lenny.chiadmi-delage@epita.fr>
  
  	* checks/errors/feature/rust-feature-gate.cc (FeatureGate::visit): Added
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-ast-builder.cc gcc-16-20260118/gcc/rust/ast/rust-ast-builder.cc
*** gcc-16-20260111/gcc/rust/ast/rust-ast-builder.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-ast-builder.cc	Sun Jan 18 22:32:08 2026
*************** Builder::match (std::unique_ptr<Expr> &&
*** 484,493 ****
  MatchArm
  Builder::match_arm (std::unique_ptr<Pattern> &&pattern)
  {
!   auto patterns = std::vector<std::unique_ptr<Pattern>> ();
!   patterns.emplace_back (std::move (pattern));
! 
!   return MatchArm (std::move (patterns), loc);
  }
  
  MatchCase
--- 484,490 ----
  MatchArm
  Builder::match_arm (std::unique_ptr<Pattern> &&pattern)
  {
!   return MatchArm (std::move (pattern), loc);
  }
  
  MatchCase
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-ast-collector.cc gcc-16-20260118/gcc/rust/ast/rust-ast-collector.cc
*** gcc-16-20260111/gcc/rust/ast/rust-ast-collector.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-ast-collector.cc	Sun Jan 18 22:32:08 2026
*************** TokenCollector::visit (BreakExpr &expr)
*** 1477,1483 ****
      if (expr.has_label ())
        visit (expr.get_label_unchecked ());
      if (expr.has_break_expr ())
!       visit (expr.get_break_expr ());
    });
  }
  
--- 1477,1483 ----
      if (expr.has_label ())
        visit (expr.get_label_unchecked ());
      if (expr.has_break_expr ())
!       visit (expr.get_break_expr_unchecked ());
    });
  }
  
*************** TokenCollector::visit (WhileLetLoopExpr
*** 1617,1627 ****
      visit_loop_common (expr);
      push (Rust::Token::make (WHILE, expr.get_locus ()));
      push (Rust::Token::make (LET, UNDEF_LOCATION));
!     // TODO: The reference mention only one Pattern
!     for (auto &item : expr.get_patterns ())
!       {
! 	visit (item);
!       }
      push (Rust::Token::make (EQUAL, UNDEF_LOCATION));
      visit (expr.get_scrutinee_expr ());
      visit (expr.get_loop_block ());
--- 1617,1623 ----
      visit_loop_common (expr);
      push (Rust::Token::make (WHILE, expr.get_locus ()));
      push (Rust::Token::make (LET, UNDEF_LOCATION));
!     visit (expr.get_pattern ());
      push (Rust::Token::make (EQUAL, UNDEF_LOCATION));
      visit (expr.get_scrutinee_expr ());
      visit (expr.get_loop_block ());
*************** TokenCollector::visit (IfLetExpr &expr)
*** 1669,1678 ****
    describe_node (std::string ("IfLetExpr"), [this, &expr] () {
      push (Rust::Token::make (IF, expr.get_locus ()));
      push (Rust::Token::make (LET, UNDEF_LOCATION));
!     for (auto &pattern : expr.get_patterns ())
!       {
! 	visit (pattern);
!       }
      push (Rust::Token::make (EQUAL, UNDEF_LOCATION));
      visit (expr.get_value_expr ());
      visit (expr.get_if_block ());
--- 1665,1671 ----
    describe_node (std::string ("IfLetExpr"), [this, &expr] () {
      push (Rust::Token::make (IF, expr.get_locus ()));
      push (Rust::Token::make (LET, UNDEF_LOCATION));
!     visit (expr.get_pattern ());
      push (Rust::Token::make (EQUAL, UNDEF_LOCATION));
      visit (expr.get_value_expr ());
      visit (expr.get_if_block ());
*************** TokenCollector::visit (MatchArm &arm)
*** 1695,1704 ****
  {
    describe_node (std::string ("MatchArm"), [this, &arm] () {
      visit_items_as_lines (arm.get_outer_attrs ());
!     for (auto &pattern : arm.get_patterns ())
!       {
! 	visit (pattern);
!       }
      if (arm.has_match_arm_guard ())
        {
  	push (Rust::Token::make (IF, UNDEF_LOCATION));
--- 1688,1694 ----
  {
    describe_node (std::string ("MatchArm"), [this, &arm] () {
      visit_items_as_lines (arm.get_outer_attrs ());
!     visit (arm.get_pattern ());
      if (arm.has_match_arm_guard ())
        {
  	push (Rust::Token::make (IF, UNDEF_LOCATION));
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-ast-pointer-visitor.cc gcc-16-20260118/gcc/rust/ast/rust-ast-pointer-visitor.cc
*** gcc-16-20260111/gcc/rust/ast/rust-ast-pointer-visitor.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-ast-pointer-visitor.cc	Sun Jan 18 22:32:08 2026
*************** PointerVisitor::visit (AST::BreakExpr &e
*** 490,496 ****
      visit (expr.get_label_unchecked ());
  
    if (expr.has_break_expr ())
!     reseat (expr.get_break_expr_ptr ());
  }
  
  void
--- 490,496 ----
      visit (expr.get_label_unchecked ());
  
    if (expr.has_break_expr ())
!     reseat (expr.get_break_expr_ptr_unchecked ());
  }
  
  void
*************** void
*** 587,594 ****
  PointerVisitor::visit (AST::WhileLetLoopExpr &expr)
  {
    visit_outer_attrs (expr);
!   for (auto &pattern : expr.get_patterns ())
!     reseat (pattern);
  
    if (expr.has_loop_label ())
      visit (expr.get_loop_label ());
--- 587,593 ----
  PointerVisitor::visit (AST::WhileLetLoopExpr &expr)
  {
    visit_outer_attrs (expr);
!   reseat (expr.get_pattern ());
  
    if (expr.has_loop_label ())
      visit (expr.get_loop_label ());
*************** void
*** 627,634 ****
  PointerVisitor::visit (AST::IfLetExpr &expr)
  {
    visit_outer_attrs (expr);
!   for (auto &pattern : expr.get_patterns ())
!     reseat (pattern);
    reseat (expr.get_value_expr_ptr ());
    visit (expr.get_if_block ());
  }
--- 626,632 ----
  PointerVisitor::visit (AST::IfLetExpr &expr)
  {
    visit_outer_attrs (expr);
!   reseat (expr.get_pattern ());
    reseat (expr.get_value_expr_ptr ());
    visit (expr.get_if_block ());
  }
*************** void
*** 644,651 ****
  PointerVisitor::visit (AST::MatchArm &arm)
  {
    visit_outer_attrs (arm);
!   for (auto &pattern : arm.get_patterns ())
!     reseat (pattern);
    if (arm.has_match_arm_guard ())
      reseat (arm.get_guard_expr_ptr ());
  }
--- 642,648 ----
  PointerVisitor::visit (AST::MatchArm &arm)
  {
    visit_outer_attrs (arm);
!   reseat (arm.get_pattern ());
    if (arm.has_match_arm_guard ())
      reseat (arm.get_guard_expr_ptr ());
  }
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-ast-visitor.cc gcc-16-20260118/gcc/rust/ast/rust-ast-visitor.cc
*** gcc-16-20260111/gcc/rust/ast/rust-ast-visitor.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-ast-visitor.cc	Sun Jan 18 22:32:08 2026
*************** DefaultASTVisitor::visit (AST::BreakExpr
*** 510,516 ****
      visit (expr.get_label_unchecked ());
  
    if (expr.has_break_expr ())
!     visit (expr.get_break_expr ());
  }
  
  void
--- 510,516 ----
      visit (expr.get_label_unchecked ());
  
    if (expr.has_break_expr ())
!     visit (expr.get_break_expr_unchecked ());
  }
  
  void
*************** void
*** 607,614 ****
  DefaultASTVisitor::visit (AST::WhileLetLoopExpr &expr)
  {
    visit_outer_attrs (expr);
!   for (auto &pattern : expr.get_patterns ())
!     visit (pattern);
  
    if (expr.has_loop_label ())
      visit (expr.get_loop_label ());
--- 607,613 ----
  DefaultASTVisitor::visit (AST::WhileLetLoopExpr &expr)
  {
    visit_outer_attrs (expr);
!   visit (expr.get_pattern ());
  
    if (expr.has_loop_label ())
      visit (expr.get_loop_label ());
*************** void
*** 647,654 ****
  DefaultASTVisitor::visit (AST::IfLetExpr &expr)
  {
    visit_outer_attrs (expr);
!   for (auto &pattern : expr.get_patterns ())
!     visit (pattern);
    visit (expr.get_value_expr ());
    visit (expr.get_if_block ());
  }
--- 646,652 ----
  DefaultASTVisitor::visit (AST::IfLetExpr &expr)
  {
    visit_outer_attrs (expr);
!   visit (expr.get_pattern ());
    visit (expr.get_value_expr ());
    visit (expr.get_if_block ());
  }
*************** void
*** 664,671 ****
  DefaultASTVisitor::visit (AST::MatchArm &arm)
  {
    visit_outer_attrs (arm);
!   for (auto &pattern : arm.get_patterns ())
!     visit (pattern);
    if (arm.has_match_arm_guard ())
      visit (arm.get_guard_expr ());
  }
--- 662,668 ----
  DefaultASTVisitor::visit (AST::MatchArm &arm)
  {
    visit_outer_attrs (arm);
!   visit (arm.get_pattern ());
    if (arm.has_match_arm_guard ())
      visit (arm.get_guard_expr ());
  }
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-ast.cc gcc-16-20260118/gcc/rust/ast/rust-ast.cc
*** gcc-16-20260111/gcc/rust/ast/rust-ast.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-ast.cc	Sun Jan 18 22:32:08 2026
*************** ReturnExpr::as_string () const
*** 1649,1655 ****
    std::string str ("return ");
  
    if (has_returned_expr ())
!     str += return_expr->as_string ();
  
    return str;
  }
--- 1649,1655 ----
    std::string str ("return ");
  
    if (has_returned_expr ())
!     str += get_returned_expr ().as_string ();
  
    return str;
  }
*************** IfLetExpr::as_string () const
*** 1943,1956 ****
    str += append_attributes (outer_attrs, OUTER);
  
    str += "\n Condition match arm patterns: ";
!   if (match_arm_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &pattern : match_arm_patterns)
! 	str += "\n  " + pattern->as_string ();
      }
  
    str += "\n Scrutinee expr: " + value->as_string ();
--- 1943,1955 ----
    str += append_attributes (outer_attrs, OUTER);
  
    str += "\n Condition match arm patterns: ";
!   if (match_arm_pattern == nullptr)
      {
        str += "none";
      }
    else
      {
!       str += "\n  " + match_arm_pattern->as_string ();
      }
  
    str += "\n Scrutinee expr: " + value->as_string ();
*************** WhileLetLoopExpr::as_string () const
*** 2167,2180 ****
      str += get_loop_label ().as_string ();
  
    str += "\n Match arm patterns: ";
!   if (match_arm_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &pattern : match_arm_patterns)
! 	str += "\n  " + pattern->as_string ();
      }
  
    str += "\n Scrutinee expr: " + scrutinee->as_string ();
--- 2166,2178 ----
      str += get_loop_label ().as_string ();
  
    str += "\n Match arm patterns: ";
!   if (match_arm_pattern == nullptr)
      {
        str += "none";
      }
    else
      {
!       str += "\n  " + match_arm_pattern->as_string ();
      }
  
    str += "\n Scrutinee expr: " + scrutinee->as_string ();
*************** BreakExpr::as_string () const
*** 2235,2241 ****
      str += get_label_unchecked ().as_string () + " ";
  
    if (has_break_expr ())
!     str += break_expr->as_string ();
  
    return str;
  }
--- 2233,2239 ----
      str += get_label_unchecked ().as_string () + " ";
  
    if (has_break_expr ())
!     str += get_break_expr_unchecked ().as_string ();
  
    return str;
  }
*************** MatchArm::as_string () const
*** 2253,2266 ****
    std::string str = append_attributes (outer_attrs, OUTER);
  
    str += "\nPatterns: ";
!   if (match_arm_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &pattern : match_arm_patterns)
! 	str += "\n " + pattern->as_string ();
      }
  
    str += "\nGuard expr: ";
--- 2251,2263 ----
    std::string str = append_attributes (outer_attrs, OUTER);
  
    str += "\nPatterns: ";
!   if (match_arm_pattern == nullptr)
      {
        str += "none";
      }
    else
      {
!       str += "\n " + match_arm_pattern->as_string ();
      }
  
    str += "\nGuard expr: ";
*************** AttributeParser::parse_path_meta_item ()
*** 3729,3735 ****
        {
  	lexer->skip_token ();
  
! 	std::unique_ptr<Expr> expr = parser->parse_expr ();
  
  	// handle error
  	// parse_expr should already emit an error and return nullptr
--- 3726,3732 ----
        {
  	lexer->skip_token ();
  
! 	auto expr = parser->parse_expr ();
  
  	// handle error
  	// parse_expr should already emit an error and return nullptr
*************** AttributeParser::parse_path_meta_item ()
*** 3737,3743 ****
  	  return nullptr;
  
  	return std::unique_ptr<MetaItemPathExpr> (
! 	  new MetaItemPathExpr (std::move (path.value ()), std::move (expr)));
        }
      case COMMA:
        // just simple path
--- 3734,3741 ----
  	  return nullptr;
  
  	return std::unique_ptr<MetaItemPathExpr> (
! 	  new MetaItemPathExpr (std::move (path.value ()),
! 				std::move (expr.value ())));
        }
      case COMMA:
        // just simple path
*************** DelimTokenTree::to_token_stream () const
*** 3816,3822 ****
  std::unique_ptr<MetaItemLitExpr>
  AttributeParser::parse_meta_item_lit ()
  {
!   std::unique_ptr<LiteralExpr> lit_expr = parser->parse_literal_expr ({});
  
    // TODO: return nullptr instead?
    if (!lit_expr)
--- 3814,3820 ----
  std::unique_ptr<MetaItemLitExpr>
  AttributeParser::parse_meta_item_lit ()
  {
!   auto lit_expr = parser->parse_literal_expr ({});
  
    // TODO: return nullptr instead?
    if (!lit_expr)
*************** AttributeParser::parse_meta_item_lit ()
*** 3825,3831 ****
  		       lexer->peek_token ()->get_locus ()));
  
    return std::unique_ptr<MetaItemLitExpr> (
!     new MetaItemLitExpr (std::move (*lit_expr)));
  }
  
  bool
--- 3823,3829 ----
  		       lexer->peek_token ()->get_locus ()));
  
    return std::unique_ptr<MetaItemLitExpr> (
!     new MetaItemLitExpr (std::move (*lit_expr.value ())));
  }
  
  bool
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-desugar-for-loops.cc gcc-16-20260118/gcc/rust/ast/rust-desugar-for-loops.cc
*** gcc-16-20260111/gcc/rust/ast/rust-desugar-for-loops.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-desugar-for-loops.cc	Sun Jan 18 22:32:08 2026
*************** DesugarForLoops::DesugarCtx::make_break_
*** 37,43 ****
      builder.path_in_expression (LangItem::Kind::OPTION_NONE))));
  
    auto break_expr
!     = std::unique_ptr<Expr> (new BreakExpr (tl::nullopt, nullptr, {}, loc));
  
    return MatchCase (std::move (arm), std::move (break_expr));
  }
--- 37,43 ----
      builder.path_in_expression (LangItem::Kind::OPTION_NONE))));
  
    auto break_expr
!     = std::unique_ptr<Expr> (new BreakExpr (tl::nullopt, tl::nullopt, {}, loc));
  
    return MatchCase (std::move (arm), std::move (break_expr));
  }
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-desugar-question-mark.cc gcc-16-20260118/gcc/rust/ast/rust-desugar-question-mark.cc
*** gcc-16-20260111/gcc/rust/ast/rust-desugar-question-mark.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-desugar-question-mark.cc	Sun Jan 18 22:32:08 2026
*************** MatchArm
*** 39,49 ****
  make_match_arm (std::unique_ptr<Pattern> &&pattern)
  {
    auto loc = pattern->get_locus ();
! 
!   auto patterns = std::vector<std::unique_ptr<Pattern>> ();
!   patterns.emplace_back (std::move (pattern));
! 
!   return MatchArm (std::move (patterns), loc);
  }
  
  MatchCase
--- 39,45 ----
  make_match_arm (std::unique_ptr<Pattern> &&pattern)
  {
    auto loc = pattern->get_locus ();
!   return MatchArm (std::move (pattern), loc);
  }
  
  MatchCase
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-desugar-while-let.cc gcc-16-20260118/gcc/rust/ast/rust-desugar-while-let.cc
*** gcc-16-20260111/gcc/rust/ast/rust-desugar-while-let.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-desugar-while-let.cc	Sun Jan 18 22:32:08 2026
*************** DesugarWhileLet::DesugarCtx::make_break_
*** 36,42 ****
    auto arm = builder.match_arm (builder.wildcard ());
  
    auto break_expr
!     = std::unique_ptr<Expr> (new BreakExpr (tl::nullopt, nullptr, {}, loc));
  
    return MatchCase (std::move (arm), std::move (break_expr));
  }
--- 36,42 ----
    auto arm = builder.match_arm (builder.wildcard ());
  
    auto break_expr
!     = std::unique_ptr<Expr> (new BreakExpr (tl::nullopt, tl::nullopt, {}, loc));
  
    return MatchCase (std::move (arm), std::move (break_expr));
  }
*************** DesugarWhileLet::DesugarCtx::make_contin
*** 53,61 ****
  std::unique_ptr<Expr>
  DesugarWhileLet::desugar (WhileLetLoopExpr &expr)
  {
!   rust_assert (expr.get_patterns ().size () == 1);
  
!   auto pattern = expr.get_patterns ()[0]->clone_pattern ();
    auto body = expr.get_loop_block ().clone_block_expr ();
    auto scrutinee = expr.get_scrutinee_expr ().clone_expr ();
  
--- 53,61 ----
  std::unique_ptr<Expr>
  DesugarWhileLet::desugar (WhileLetLoopExpr &expr)
  {
!   rust_assert (expr.get_pattern () != nullptr);
  
!   auto pattern = expr.get_pattern ()->clone_pattern ();
    auto body = expr.get_loop_block ().clone_block_expr ();
    auto scrutinee = expr.get_scrutinee_expr ().clone_expr ();
  
diff -Nrcpad gcc-16-20260111/gcc/rust/ast/rust-expr.h gcc-16-20260118/gcc/rust/ast/rust-expr.h
*** gcc-16-20260111/gcc/rust/ast/rust-expr.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/ast/rust-expr.h	Sun Jan 18 22:32:08 2026
*************** class BreakExpr : public ExprWithoutBloc
*** 3192,3198 ****
  {
    std::vector<Attribute> outer_attrs;
    tl::optional<LoopLabel> label;
!   std::unique_ptr<Expr> break_expr;
    location_t locus;
  
    // TODO: find another way to store this to save memory?
--- 3192,3198 ----
  {
    std::vector<Attribute> outer_attrs;
    tl::optional<LoopLabel> label;
!   tl::optional<std::unique_ptr<Expr>> break_expr;
    location_t locus;
  
    // TODO: find another way to store this to save memory?
*************** public:
*** 3206,3220 ****
  
    /* Returns whether the break expression has an expression used in the break or
     * not. */
!   bool has_break_expr () const { return break_expr != nullptr; }
  
    // Constructor for a break expression
    BreakExpr (tl::optional<LoopLabel> break_label,
! 	     std::unique_ptr<Expr> expr_in_break,
  	     std::vector<Attribute> outer_attribs, location_t locus)
      : outer_attrs (std::move (outer_attribs)), label (std::move (break_label)),
        break_expr (std::move (expr_in_break)), locus (locus)
!   {}
  
    // Copy constructor defined to use clone for unique pointer
    BreakExpr (BreakExpr const &other)
--- 3206,3223 ----
  
    /* Returns whether the break expression has an expression used in the break or
     * not. */
!   bool has_break_expr () const { return break_expr.has_value (); }
  
    // Constructor for a break expression
    BreakExpr (tl::optional<LoopLabel> break_label,
! 	     tl::optional<std::unique_ptr<Expr>> expr_in_break,
  	     std::vector<Attribute> outer_attribs, location_t locus)
      : outer_attrs (std::move (outer_attribs)), label (std::move (break_label)),
        break_expr (std::move (expr_in_break)), locus (locus)
!   {
!     if (this->has_break_expr ())
!       rust_assert (this->break_expr != nullptr);
!   }
  
    // Copy constructor defined to use clone for unique pointer
    BreakExpr (BreakExpr const &other)
*************** public:
*** 3222,3230 ****
        label (other.label), locus (other.locus),
        marked_for_strip (other.marked_for_strip)
    {
!     // guard to protect from null pointer dereference
!     if (other.break_expr != nullptr)
!       break_expr = other.break_expr->clone_expr ();
    }
  
    // Overload assignment operator to clone unique pointer
--- 3225,3232 ----
        label (other.label), locus (other.locus),
        marked_for_strip (other.marked_for_strip)
    {
!     if (other.has_break_expr ())
!       break_expr = other.get_break_expr_unchecked ().clone_expr ();
    }
  
    // Overload assignment operator to clone unique pointer
*************** public:
*** 3237,3246 ****
      outer_attrs = other.outer_attrs;
  
      // guard to protect from null pointer dereference
!     if (other.break_expr != nullptr)
!       break_expr = other.break_expr->clone_expr ();
      else
!       break_expr = nullptr;
  
      return *this;
    }
--- 3239,3248 ----
      outer_attrs = other.outer_attrs;
  
      // guard to protect from null pointer dereference
!     if (other.has_break_expr ())
!       break_expr = other.get_break_expr_unchecked ().clone_expr ();
      else
!       break_expr = tl::nullopt;
  
      return *this;
    }
*************** public:
*** 3258,3273 ****
    bool is_marked_for_strip () const override { return marked_for_strip; }
  
    // TODO: is this better? Or is a "vis_block" better?
!   Expr &get_break_expr ()
    {
      rust_assert (has_break_expr ());
!     return *break_expr;
    }
  
!   std::unique_ptr<Expr> &get_break_expr_ptr ()
    {
      rust_assert (has_break_expr ());
!     return break_expr;
    }
  
    const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
--- 3260,3281 ----
    bool is_marked_for_strip () const override { return marked_for_strip; }
  
    // TODO: is this better? Or is a "vis_block" better?
!   Expr &get_break_expr_unchecked ()
    {
      rust_assert (has_break_expr ());
!     return *break_expr.value ();
    }
  
!   const Expr &get_break_expr_unchecked () const
    {
      rust_assert (has_break_expr ());
!     return *break_expr.value ();
!   }
! 
!   std::unique_ptr<Expr> &get_break_expr_ptr_unchecked ()
!   {
!     rust_assert (has_break_expr ());
!     return break_expr.value ();
    }
  
    const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
*************** protected:
*** 3831,3837 ****
  class ReturnExpr : public ExprWithoutBlock
  {
    std::vector<Attribute> outer_attrs;
!   std::unique_ptr<Expr> return_expr;
    location_t locus;
  
    // TODO: find another way to store this to save memory?
--- 3839,3845 ----
  class ReturnExpr : public ExprWithoutBlock
  {
    std::vector<Attribute> outer_attrs;
!   tl::optional<std::unique_ptr<Expr>> return_expr;
    location_t locus;
  
    // TODO: find another way to store this to save memory?
*************** public:
*** 3842,3851 ****
  
    /* Returns whether the object has an expression returned (i.e. not void return
     * type). */
!   bool has_returned_expr () const { return return_expr != nullptr; }
  
    // Constructor for ReturnExpr.
!   ReturnExpr (std::unique_ptr<Expr> returned_expr,
  	      std::vector<Attribute> outer_attribs, location_t locus)
      : outer_attrs (std::move (outer_attribs)),
        return_expr (std::move (returned_expr)), locus (locus)
--- 3850,3859 ----
  
    /* Returns whether the object has an expression returned (i.e. not void return
     * type). */
!   bool has_returned_expr () const { return return_expr.has_value (); }
  
    // Constructor for ReturnExpr.
!   ReturnExpr (tl::optional<std::unique_ptr<Expr>> returned_expr,
  	      std::vector<Attribute> outer_attribs, location_t locus)
      : outer_attrs (std::move (outer_attribs)),
        return_expr (std::move (returned_expr)), locus (locus)
*************** public:
*** 3857,3864 ****
        locus (other.locus), marked_for_strip (other.marked_for_strip)
    {
      // guard to protect from null pointer dereference
!     if (other.return_expr != nullptr)
!       return_expr = other.return_expr->clone_expr ();
    }
  
    // Overloaded assignment operator to clone return_expr pointer
--- 3865,3872 ----
        locus (other.locus), marked_for_strip (other.marked_for_strip)
    {
      // guard to protect from null pointer dereference
!     if (other.return_expr)
!       return_expr = other.return_expr.value ()->clone_expr ();
    }
  
    // Overloaded assignment operator to clone return_expr pointer
*************** public:
*** 3870,3879 ****
      outer_attrs = other.outer_attrs;
  
      // guard to protect from null pointer dereference
!     if (other.return_expr != nullptr)
!       return_expr = other.return_expr->clone_expr ();
      else
!       return_expr = nullptr;
  
      return *this;
    }
--- 3878,3887 ----
      outer_attrs = other.outer_attrs;
  
      // guard to protect from null pointer dereference
!     if (other.return_expr)
!       return_expr = other.return_expr.value ()->clone_expr ();
      else
!       return_expr = tl::nullopt;
  
      return *this;
    }
*************** public:
*** 3893,3906 ****
    // TODO: is this better? Or is a "vis_block" better?
    Expr &get_returned_expr ()
    {
!     rust_assert (return_expr != nullptr);
!     return *return_expr;
    }
  
    std::unique_ptr<Expr> &get_returned_expr_ptr ()
    {
!     rust_assert (return_expr != nullptr);
!     return return_expr;
    }
  
    const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
--- 3901,3920 ----
    // TODO: is this better? Or is a "vis_block" better?
    Expr &get_returned_expr ()
    {
!     rust_assert (return_expr);
!     return *return_expr.value ();
!   }
! 
!   const Expr &get_returned_expr () const
!   {
!     rust_assert (return_expr);
!     return *return_expr.value ();
    }
  
    std::unique_ptr<Expr> &get_returned_expr_ptr ()
    {
!     rust_assert (return_expr);
!     return return_expr.value ();
    }
  
    const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
*************** protected:
*** 4292,4305 ****
  class WhileLetLoopExpr : public BaseLoopExpr
  {
    // MatchArmPatterns patterns;
!   std::vector<std::unique_ptr<Pattern>> match_arm_patterns; // inlined
    std::unique_ptr<Expr> scrutinee;
  
  public:
    std::string as_string () const override;
  
    // Constructor with a loop label
!   WhileLetLoopExpr (std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
  		    std::unique_ptr<Expr> scrutinee,
  		    std::unique_ptr<BlockExpr> loop_block, location_t locus,
  		    tl::optional<LoopLabel> loop_label = tl::nullopt,
--- 4306,4319 ----
  class WhileLetLoopExpr : public BaseLoopExpr
  {
    // MatchArmPatterns patterns;
!   std::unique_ptr<Pattern> match_arm_pattern; // inlined
    std::unique_ptr<Expr> scrutinee;
  
  public:
    std::string as_string () const override;
  
    // Constructor with a loop label
!   WhileLetLoopExpr (std::unique_ptr<Pattern> match_arm_pattern,
  		    std::unique_ptr<Expr> scrutinee,
  		    std::unique_ptr<BlockExpr> loop_block, location_t locus,
  		    tl::optional<LoopLabel> loop_label = tl::nullopt,
*************** public:
*** 4307,4313 ****
  		    = std::vector<Attribute> ())
      : BaseLoopExpr (std::move (loop_block), locus, std::move (loop_label),
  		    std::move (outer_attribs)),
!       match_arm_patterns (std::move (match_arm_patterns)),
        scrutinee (std::move (scrutinee))
    {}
  
--- 4321,4327 ----
  		    = std::vector<Attribute> ())
      : BaseLoopExpr (std::move (loop_block), locus, std::move (loop_label),
  		    std::move (outer_attribs)),
!       match_arm_pattern (std::move (match_arm_pattern)),
        scrutinee (std::move (scrutinee))
    {}
  
*************** public:
*** 4317,4341 ****
        /*match_arm_patterns(other.match_arm_patterns),*/ scrutinee (
  	other.scrutinee->clone_expr ())
    {
!     match_arm_patterns.reserve (other.match_arm_patterns.size ());
!     for (const auto &e : other.match_arm_patterns)
!       match_arm_patterns.push_back (e->clone_pattern ());
    }
  
    // Overloaded assignment operator to clone pointers
    WhileLetLoopExpr &operator= (WhileLetLoopExpr const &other)
    {
      BaseLoopExpr::operator= (other);
-     // match_arm_patterns = other.match_arm_patterns;
      scrutinee = other.scrutinee->clone_expr ();
!     // loop_block = other.loop_block->clone_block_expr();
!     // loop_label = other.loop_label;
!     // outer_attrs = other.outer_attrs;
! 
!     match_arm_patterns.reserve (other.match_arm_patterns.size ());
!     for (const auto &e : other.match_arm_patterns)
!       match_arm_patterns.push_back (e->clone_pattern ());
! 
      return *this;
    }
  
--- 4331,4345 ----
        /*match_arm_patterns(other.match_arm_patterns),*/ scrutinee (
  	other.scrutinee->clone_expr ())
    {
!     match_arm_pattern = other.get_pattern ()->clone_pattern ();
    }
  
    // Overloaded assignment operator to clone pointers
    WhileLetLoopExpr &operator= (WhileLetLoopExpr const &other)
    {
      BaseLoopExpr::operator= (other);
      scrutinee = other.scrutinee->clone_expr ();
!     match_arm_pattern = other.get_pattern ()->clone_pattern ();
      return *this;
    }
  
*************** public:
*** 4359,4372 ****
    }
  
    // TODO: this mutable getter seems really dodgy. Think up better way.
!   const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
!   {
!     return match_arm_patterns;
!   }
!   std::vector<std::unique_ptr<Pattern>> &get_patterns ()
    {
!     return match_arm_patterns;
    }
  
    BaseLoopExpr::Kind get_loop_kind () const override
    {
--- 4363,4373 ----
    }
  
    // TODO: this mutable getter seems really dodgy. Think up better way.
!   const std::unique_ptr<Pattern> &get_pattern () const
    {
!     return match_arm_pattern;
    }
+   std::unique_ptr<Pattern> &get_pattern () { return match_arm_pattern; }
  
    BaseLoopExpr::Kind get_loop_kind () const override
    {
*************** protected:
*** 4658,4664 ****
  class IfLetExpr : public ExprWithBlock
  {
    std::vector<Attribute> outer_attrs;
!   std::vector<std::unique_ptr<Pattern>> match_arm_patterns; // inlined
    std::unique_ptr<Expr> value;
    std::unique_ptr<BlockExpr> if_block;
    location_t locus;
--- 4659,4665 ----
  class IfLetExpr : public ExprWithBlock
  {
    std::vector<Attribute> outer_attrs;
!   std::unique_ptr<Pattern> match_arm_pattern; // inlined
    std::unique_ptr<Expr> value;
    std::unique_ptr<BlockExpr> if_block;
    location_t locus;
*************** class IfLetExpr : public ExprWithBlock
*** 4666,4676 ****
  public:
    std::string as_string () const override;
  
!   IfLetExpr (std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
  	     std::unique_ptr<Expr> value, std::unique_ptr<BlockExpr> if_block,
  	     std::vector<Attribute> outer_attrs, location_t locus)
      : outer_attrs (std::move (outer_attrs)),
!       match_arm_patterns (std::move (match_arm_patterns)),
        value (std::move (value)), if_block (std::move (if_block)), locus (locus)
    {}
  
--- 4667,4677 ----
  public:
    std::string as_string () const override;
  
!   IfLetExpr (std::unique_ptr<Pattern> match_arm_pattern,
  	     std::unique_ptr<Expr> value, std::unique_ptr<BlockExpr> if_block,
  	     std::vector<Attribute> outer_attrs, location_t locus)
      : outer_attrs (std::move (outer_attrs)),
!       match_arm_pattern (std::move (match_arm_pattern)),
        value (std::move (value)), if_block (std::move (if_block)), locus (locus)
    {}
  
*************** public:
*** 4684,4693 ****
        value = other.value->clone_expr ();
      if (other.if_block != nullptr)
        if_block = other.if_block->clone_block_expr ();
! 
!     match_arm_patterns.reserve (other.match_arm_patterns.size ());
!     for (const auto &e : other.match_arm_patterns)
!       match_arm_patterns.push_back (e->clone_pattern ());
    }
  
    // overload assignment operator to clone
--- 4685,4691 ----
        value = other.value->clone_expr ();
      if (other.if_block != nullptr)
        if_block = other.if_block->clone_block_expr ();
!     match_arm_pattern = other.match_arm_pattern->clone_pattern ();
    }
  
    // overload assignment operator to clone
*************** public:
*** 4707,4716 ****
      else
        if_block = nullptr;
  
!     match_arm_patterns.reserve (other.match_arm_patterns.size ());
!     for (const auto &e : other.match_arm_patterns)
!       match_arm_patterns.push_back (e->clone_pattern ());
  
      return *this;
    }
  
--- 4705,4714 ----
      else
        if_block = nullptr;
  
!     if (other.if_block != nullptr)
!       if_block = other.if_block->clone_block_expr ();
  
+     match_arm_pattern = other.match_arm_pattern->clone_pattern ();
      return *this;
    }
  
*************** public:
*** 4760,4773 ****
    }
  
    // TODO: this mutable getter seems really dodgy. Think up better way.
!   const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
!   {
!     return match_arm_patterns;
!   }
!   std::vector<std::unique_ptr<Pattern>> &get_patterns ()
    {
!     return match_arm_patterns;
    }
  
    void set_outer_attrs (std::vector<Attribute> new_attrs) override
    {
--- 4758,4768 ----
    }
  
    // TODO: this mutable getter seems really dodgy. Think up better way.
!   const std::unique_ptr<Pattern> &get_pattern () const
    {
!     return match_arm_pattern;
    }
+   std::unique_ptr<Pattern> &get_pattern () { return match_arm_pattern; }
  
    void set_outer_attrs (std::vector<Attribute> new_attrs) override
    {
*************** class IfLetExprConseqElse : public IfLet
*** 4804,4815 ****
  public:
    std::string as_string () const override;
  
!   IfLetExprConseqElse (std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
  		       std::unique_ptr<Expr> value,
  		       std::unique_ptr<BlockExpr> if_block,
  		       std::unique_ptr<ExprWithBlock> else_block,
  		       std::vector<Attribute> outer_attrs, location_t locus)
!     : IfLetExpr (std::move (match_arm_patterns), std::move (value),
  		 std::move (if_block), std::move (outer_attrs), locus),
        else_block (std::move (else_block))
    {}
--- 4799,4810 ----
  public:
    std::string as_string () const override;
  
!   IfLetExprConseqElse (std::unique_ptr<Pattern> match_arm_pattern,
  		       std::unique_ptr<Expr> value,
  		       std::unique_ptr<BlockExpr> if_block,
  		       std::unique_ptr<ExprWithBlock> else_block,
  		       std::vector<Attribute> outer_attrs, location_t locus)
!     : IfLetExpr (std::move (match_arm_pattern), std::move (value),
  		 std::move (if_block), std::move (outer_attrs), locus),
        else_block (std::move (else_block))
    {}
*************** struct MatchArm
*** 4861,4867 ****
  private:
    std::vector<Attribute> outer_attrs;
    // MatchArmPatterns patterns;
!   std::vector<std::unique_ptr<Pattern>> match_arm_patterns; // inlined
  
    // bool has_match_arm_guard;
    // inlined from MatchArmGuard
--- 4856,4862 ----
  private:
    std::vector<Attribute> outer_attrs;
    // MatchArmPatterns patterns;
!   std::unique_ptr<Pattern> match_arm_pattern; // inlined
  
    // bool has_match_arm_guard;
    // inlined from MatchArmGuard
*************** public:
*** 4874,4884 ****
    bool has_match_arm_guard () const { return guard_expr != nullptr; }
  
    // Constructor for match arm with a guard expression
!   MatchArm (std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
! 	    location_t locus, std::unique_ptr<Expr> guard_expr = nullptr,
  	    std::vector<Attribute> outer_attrs = std::vector<Attribute> ())
      : outer_attrs (std::move (outer_attrs)),
!       match_arm_patterns (std::move (match_arm_patterns)),
        guard_expr (std::move (guard_expr)), locus (locus)
    {}
  
--- 4869,4879 ----
    bool has_match_arm_guard () const { return guard_expr != nullptr; }
  
    // Constructor for match arm with a guard expression
!   MatchArm (std::unique_ptr<Pattern> match_arm_pattern, location_t locus,
! 	    std::unique_ptr<Expr> guard_expr = nullptr,
  	    std::vector<Attribute> outer_attrs = std::vector<Attribute> ())
      : outer_attrs (std::move (outer_attrs)),
!       match_arm_pattern (std::move (match_arm_pattern)),
        guard_expr (std::move (guard_expr)), locus (locus)
    {}
  
*************** public:
*** 4889,4897 ****
      if (other.guard_expr != nullptr)
        guard_expr = other.guard_expr->clone_expr ();
  
!     match_arm_patterns.reserve (other.match_arm_patterns.size ());
!     for (const auto &e : other.match_arm_patterns)
!       match_arm_patterns.push_back (e->clone_pattern ());
  
      locus = other.locus;
    }
--- 4884,4890 ----
      if (other.guard_expr != nullptr)
        guard_expr = other.guard_expr->clone_expr ();
  
!     match_arm_pattern = other.match_arm_pattern->clone_pattern ();
  
      locus = other.locus;
    }
*************** public:
*** 4908,4916 ****
      else
        guard_expr = nullptr;
  
!     match_arm_patterns.reserve (other.match_arm_patterns.size ());
!     for (const auto &e : other.match_arm_patterns)
!       match_arm_patterns.push_back (e->clone_pattern ());
  
      return *this;
    }
--- 4901,4907 ----
      else
        guard_expr = nullptr;
  
!     match_arm_pattern = other.match_arm_pattern->clone_pattern ();
  
      return *this;
    }
*************** public:
*** 4920,4932 ****
    MatchArm &operator= (MatchArm &&other) = default;
  
    // Returns whether match arm is in an error state.
!   bool is_error () const { return match_arm_patterns.empty (); }
  
    // Creates a match arm in an error state.
    static MatchArm create_error ()
    {
      location_t locus = UNDEF_LOCATION;
!     return MatchArm (std::vector<std::unique_ptr<Pattern>> (), locus);
    }
  
    std::string as_string () const;
--- 4911,4923 ----
    MatchArm &operator= (MatchArm &&other) = default;
  
    // Returns whether match arm is in an error state.
!   bool is_error () const { return match_arm_pattern == nullptr; }
  
    // Creates a match arm in an error state.
    static MatchArm create_error ()
    {
      location_t locus = UNDEF_LOCATION;
!     return MatchArm (nullptr, locus);
    }
  
    std::string as_string () const;
*************** public:
*** 4948,4961 ****
    const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
    std::vector<Attribute> &get_outer_attrs () { return outer_attrs; }
  
!   const std::vector<std::unique_ptr<Pattern>> &get_patterns () const
!   {
!     return match_arm_patterns;
!   }
!   std::vector<std::unique_ptr<Pattern>> &get_patterns ()
    {
!     return match_arm_patterns;
    }
  
    location_t get_locus () const { return locus; }
  };
--- 4939,4949 ----
    const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
    std::vector<Attribute> &get_outer_attrs () { return outer_attrs; }
  
!   const std::unique_ptr<Pattern> &get_pattern () const
    {
!     return match_arm_pattern;
    }
+   std::unique_ptr<Pattern> &get_pattern () { return match_arm_pattern; }
  
    location_t get_locus () const { return locus; }
  };
diff -Nrcpad gcc-16-20260111/gcc/rust/backend/rust-compile-expr.cc gcc-16-20260118/gcc/rust/backend/rust-compile-expr.cc
*** gcc-16-20260111/gcc/rust/backend/rust-compile-expr.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/backend/rust-compile-expr.cc	Sun Jan 18 22:32:08 2026
*************** CompileExpr::visit (HIR::StructExprStruc
*** 499,505 ****
        return;
      }
  
!   rust_assert (tyty->is_unit ());
    translated = unit_expression (struct_expr.get_locus ());
  }
  
--- 499,523 ----
        return;
      }
  
!   TyTy::ADTType *adt = static_cast<TyTy::ADTType *> (tyty);
!   TyTy::VariantDef *variant = nullptr;
!   if (adt->is_enum ())
!     {
!       // unwrap variant and ensure that it can be resolved
!       HirId variant_id;
!       bool ok = ctx->get_tyctx ()->lookup_variant_definition (
! 	struct_expr.get_struct_name ().get_mappings ().get_hirid (),
! 	&variant_id);
!       rust_assert (ok);
! 
!       ok = adt->lookup_variant_by_id (variant_id, &variant);
!       rust_assert (ok);
!     }
!   else
!     {
!       rust_assert (tyty->is_unit ());
!     }
! 
    translated = unit_expression (struct_expr.get_locus ());
  }
  
*************** CompileExpr::visit (HIR::MatchExpr &expr
*** 1193,1252 ****
      {
        // for now lets just get single pattern's working
        HIR::MatchArm &kase_arm = kase.get_arm ();
!       rust_assert (kase_arm.get_patterns ().size () > 0);
  
!       for (auto &kase_pattern : kase_arm.get_patterns ())
! 	{
! 	  // setup the match-arm-body-block
! 	  location_t start_location = UNKNOWN_LOCATION; // FIXME
! 	  location_t end_location = UNKNOWN_LOCATION;	// FIXME
! 	  tree arm_body_block = Backend::block (fndecl, enclosing_scope, {},
! 						start_location, end_location);
  
! 	  ctx->push_block (arm_body_block);
  
! 	  // setup the bindings for the block
! 	  CompilePatternBindings::Compile (*kase_pattern, match_scrutinee_expr,
! 					   ctx);
  
! 	  // compile the expr and setup the assignment if required when tmp !=
! 	  // NULL
! 	  location_t arm_locus = kase_arm.get_locus ();
! 	  tree kase_expr_tree = CompileExpr::Compile (kase.get_expr (), ctx);
! 	  tree result_reference = Backend::var_expression (tmp, arm_locus);
  
! 	  TyTy::BaseType *actual = nullptr;
! 	  bool ok = ctx->get_tyctx ()->lookup_type (
! 	    kase.get_expr ().get_mappings ().get_hirid (), &actual);
! 	  rust_assert (ok);
  
! 	  tree coerced_result
! 	    = coercion_site (kase.get_expr ().get_mappings ().get_hirid (),
! 			     kase_expr_tree, actual, expr_tyty,
! 			     expr.get_locus (), arm_locus);
  
! 	  tree assignment
! 	    = Backend::assignment_statement (result_reference, coerced_result,
! 					     arm_locus);
! 	  ctx->add_statement (assignment);
  
! 	  // go to end label
! 	  tree goto_end_label
! 	    = build1_loc (arm_locus, GOTO_EXPR, void_type_node, end_label);
! 	  ctx->add_statement (goto_end_label);
  
! 	  ctx->pop_block ();
  
! 	  tree check_expr
! 	    = CompilePatternCheckExpr::Compile (*kase_pattern,
! 						match_scrutinee_expr, ctx);
  
! 	  tree check_stmt
! 	    = Backend::if_statement (NULL_TREE, check_expr, arm_body_block,
! 				     NULL_TREE, kase_pattern->get_locus ());
  
! 	  ctx->add_statement (check_stmt);
! 	}
      }
  
    // setup the switch expression
--- 1211,1268 ----
      {
        // for now lets just get single pattern's working
        HIR::MatchArm &kase_arm = kase.get_arm ();
!       rust_assert (kase_arm.get_pattern () != nullptr);
  
!       auto &kase_pattern = kase_arm.get_pattern ();
!       // setup the match-arm-body-block
!       location_t start_location = UNKNOWN_LOCATION; // FIXME
!       location_t end_location = UNKNOWN_LOCATION;   // FIXME
!       tree arm_body_block = Backend::block (fndecl, enclosing_scope, {},
! 					    start_location, end_location);
  
!       ctx->push_block (arm_body_block);
  
!       // setup the bindings for the block
!       CompilePatternBindings::Compile (*kase_pattern, match_scrutinee_expr,
! 				       ctx);
  
!       // compile the expr and setup the assignment if required when tmp !=
!       // NULL
!       location_t arm_locus = kase_arm.get_locus ();
!       tree kase_expr_tree = CompileExpr::Compile (kase.get_expr (), ctx);
!       tree result_reference = Backend::var_expression (tmp, arm_locus);
  
!       TyTy::BaseType *actual = nullptr;
!       bool ok = ctx->get_tyctx ()->lookup_type (
! 	kase.get_expr ().get_mappings ().get_hirid (), &actual);
!       rust_assert (ok);
  
!       tree coerced_result
! 	= coercion_site (kase.get_expr ().get_mappings ().get_hirid (),
! 			 kase_expr_tree, actual, expr_tyty, expr.get_locus (),
! 			 arm_locus);
  
!       tree assignment
! 	= Backend::assignment_statement (result_reference, coerced_result,
! 					 arm_locus);
!       ctx->add_statement (assignment);
  
!       // go to end label
!       tree goto_end_label
! 	= build1_loc (arm_locus, GOTO_EXPR, void_type_node, end_label);
!       ctx->add_statement (goto_end_label);
  
!       ctx->pop_block ();
  
!       tree check_expr
! 	= CompilePatternCheckExpr::Compile (*kase_pattern, match_scrutinee_expr,
! 					    ctx);
  
!       tree check_stmt
! 	= Backend::if_statement (NULL_TREE, check_expr, arm_body_block,
! 				 NULL_TREE, kase_pattern->get_locus ());
  
!       ctx->add_statement (check_stmt);
      }
  
    // setup the switch expression
diff -Nrcpad gcc-16-20260111/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc gcc-16-20260118/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
*** gcc-16-20260111/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc	Sun Jan 18 22:32:08 2026
*************** static MatchArm
*** 1463,1472 ****
  lower_arm (Resolver::TypeCheckContext *ctx, HIR::MatchCase &arm,
  	   TyTy::BaseType *scrutinee_ty)
  {
!   rust_assert (arm.get_arm ().get_patterns ().size () > 0);
  
    DeconstructedPat pat
!     = lower_pattern (ctx, *arm.get_arm ().get_patterns ().at (0), scrutinee_ty);
    return MatchArm (pat, arm.get_arm ().has_match_arm_guard ());
  }
  
--- 1463,1472 ----
  lower_arm (Resolver::TypeCheckContext *ctx, HIR::MatchCase &arm,
  	   TyTy::BaseType *scrutinee_ty)
  {
!   rust_assert (arm.get_arm ().get_pattern () != nullptr);
  
    DeconstructedPat pat
!     = lower_pattern (ctx, *arm.get_arm ().get_pattern (), scrutinee_ty);
    return MatchArm (pat, arm.get_arm ().has_match_arm_guard ());
  }
  
diff -Nrcpad gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-checker.cc gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-checker.cc
*** gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-checker.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-checker.cc	Sun Jan 18 22:32:08 2026
*************** UnusedChecker::visit (HIR::StructPattern
*** 117,121 ****
--- 117,139 ----
  		     pattern.get_identifier ().as_string ().c_str ());
  }
  
+ void
+ UnusedChecker::visit (HIR::EmptyStmt &stmt)
+ {
+   rust_warning_at (stmt.get_locus (), OPT_Wunused_variable,
+ 		   "unnecessary trailing semicolons");
+ }
+ 
+ void
+ UnusedChecker::visit_loop_label (HIR::LoopLabel &label)
+ {
+   auto lifetime = label.get_lifetime ();
+   std::string var_name = lifetime.to_string ();
+   auto id = lifetime.get_mappings ().get_hirid ();
+   if (!unused_context.is_label_used (id) && var_name[0] != '_')
+     rust_warning_at (lifetime.get_locus (), OPT_Wunused_variable,
+ 		     "unused label %qs", lifetime.to_string ().c_str ());
+ }
+ 
  } // namespace Analysis
  } // namespace Rust
diff -Nrcpad gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-checker.h gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-checker.h
*** gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-checker.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-checker.h	Sun Jan 18 22:32:08 2026
*************** private:
*** 43,48 ****
--- 43,50 ----
    virtual void visit (HIR::IdentifierPattern &identifier) override;
    virtual void visit (HIR::AssignmentExpr &identifier) override;
    virtual void visit (HIR::StructPatternFieldIdent &identifier) override;
+   virtual void visit (HIR::EmptyStmt &stmt) override;
+   virtual void visit_loop_label (HIR::LoopLabel &label) override;
  };
  } // namespace Analysis
  } // namespace Rust
diff -Nrcpad gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-collector.cc gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-collector.cc
*** gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-collector.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-collector.cc	Sun Jan 18 22:32:08 2026
*************** UnusedCollector::visit (HIR::StructPatte
*** 88,92 ****
--- 88,110 ----
    walk (pattern);
  }
  
+ void
+ UnusedCollector::visit (HIR::BreakExpr &expr)
+ {
+   if (!expr.has_label ())
+     return;
+   mark_label_used (expr.get_label ());
+   walk (expr);
+ }
+ 
+ void
+ UnusedCollector::visit (HIR::ContinueExpr &expr)
+ {
+   if (!expr.has_label ())
+     return;
+   mark_label_used (expr.get_label ());
+   walk (expr);
+ }
+ 
  } // namespace Analysis
  } // namespace Rust
diff -Nrcpad gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-collector.h gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-collector.h
*** gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-collector.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-collector.h	Sun Jan 18 22:32:08 2026
*************** private:
*** 51,56 ****
--- 51,60 ----
    virtual void visit (HIR::IdentifierPattern &pattern) override;
    virtual void visit (HIR::StructPatternFieldIdent &pattern) override;
  
+   // Unused label
+   virtual void visit (HIR::BreakExpr &expr) override;
+   virtual void visit (HIR::ContinueExpr &expr) override;
+ 
    template <typename T> HirId get_def_id (T &path_expr)
    {
      NodeId ast_node_id = path_expr.get_mappings ().get_nodeid ();
*************** private:
*** 65,70 ****
--- 69,80 ----
      unused_context.add_variable (def_id);
      unused_context.remove_assign (def_id);
    }
+ 
+   template <typename T> void mark_label_used (T &path_expr)
+   {
+     auto def_id = get_def_id (path_expr);
+     unused_context.add_label (def_id);
+   }
  };
  } // namespace Analysis
  } // namespace Rust
diff -Nrcpad gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-context.cc gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-context.cc
*** gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-context.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-context.cc	Sun Jan 18 22:32:08 2026
*************** UnusedContext::is_mut_used (HirId id) co
*** 73,78 ****
--- 73,91 ----
    return mutable_vars.find (id) == mutable_vars.end ();
  }
  
+ void
+ UnusedContext::add_label (HirId id)
+ 
+ {
+   used_labels.emplace (id);
+ }
+ 
+ bool
+ UnusedContext::is_label_used (HirId id) const
+ {
+   return used_labels.find (id) != used_labels.end ();
+ }
+ 
  std::string
  UnusedContext::as_string () const
  {
diff -Nrcpad gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-context.h gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-context.h
*** gcc-16-20260111/gcc/rust/checks/lints/unused/rust-unused-context.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/checks/lints/unused/rust-unused-context.h	Sun Jan 18 22:32:08 2026
*************** public:
*** 37,48 ****
--- 37,54 ----
    void add_mut (HirId id);
    void remove_mut (HirId id);
    bool is_mut_used (HirId id) const;
+ 
+   // Unused label
+   void add_label (HirId id);
+   bool is_label_used (HirId id) const;
+ 
    std::string as_string () const;
  
  private:
    std::unordered_set<HirId> used_vars;
    std::unordered_set<HirId> mutable_vars;
    std::map<HirId, std::vector<HirId>> assigned_vars;
+   std::unordered_set<HirId> used_labels;
  };
  
  } // namespace Analysis
diff -Nrcpad gcc-16-20260111/gcc/rust/expand/rust-cfg-strip.cc gcc-16-20260118/gcc/rust/expand/rust-cfg-strip.cc
*** gcc-16-20260111/gcc/rust/expand/rust-cfg-strip.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/expand/rust-cfg-strip.cc	Sun Jan 18 22:32:08 2026
*************** CfgStrip::visit (AST::BreakExpr &expr)
*** 1236,1242 ****
     * is the only thing that can be done */
    if (expr.has_break_expr ())
      {
!       auto &break_expr = expr.get_break_expr ();
  
        if (break_expr.is_marked_for_strip ())
  	rust_error_at (break_expr.get_locus (),
--- 1236,1242 ----
     * is the only thing that can be done */
    if (expr.has_break_expr ())
      {
!       auto &break_expr = expr.get_break_expr_unchecked ();
  
        if (break_expr.is_marked_for_strip ())
  	rust_error_at (break_expr.get_locus (),
*************** CfgStrip::visit (AST::WhileLetLoopExpr &
*** 1436,1445 ****
  
    AST::DefaultASTVisitor::visit (expr);
  
!   for (auto &pattern : expr.get_patterns ())
!     if (pattern->is_marked_for_strip ())
!       rust_error_at (pattern->get_locus (),
! 		     "cannot strip pattern in this position");
  
    // can't strip scrutinee expr itself, but can strip sub-expressions
    auto &scrutinee_expr = expr.get_scrutinee_expr ();
--- 1436,1444 ----
  
    AST::DefaultASTVisitor::visit (expr);
  
!   if (expr.get_pattern ()->is_marked_for_strip ())
!     rust_error_at (expr.get_pattern ()->get_locus (),
! 		   "cannot strip pattern in this position");
  
    // can't strip scrutinee expr itself, but can strip sub-expressions
    auto &scrutinee_expr = expr.get_scrutinee_expr ();
*************** CfgStrip::visit (AST::IfLetExpr &expr)
*** 1566,1575 ****
  
    AST::DefaultASTVisitor::visit (expr);
  
!   for (auto &pattern : expr.get_patterns ())
!     if (pattern->is_marked_for_strip ())
!       rust_error_at (pattern->get_locus (),
! 		     "cannot strip pattern in this position");
  
    // can't strip value expr itself, but can strip sub-expressions
    auto &value_expr = expr.get_value_expr ();
--- 1565,1573 ----
  
    AST::DefaultASTVisitor::visit (expr);
  
!   if (expr.get_pattern ()->is_marked_for_strip ())
!     rust_error_at (expr.get_pattern ()->get_locus (),
! 		   "cannot strip pattern in this position");
  
    // can't strip value expr itself, but can strip sub-expressions
    auto &value_expr = expr.get_value_expr ();
*************** CfgStrip::visit (AST::IfLetExprConseqEls
*** 1598,1607 ****
  
    AST::DefaultASTVisitor::visit (expr);
  
!   for (auto &pattern : expr.get_patterns ())
!     if (pattern->is_marked_for_strip ())
!       rust_error_at (pattern->get_locus (),
! 		     "cannot strip pattern in this position");
  
    // can't strip value expr itself, but can strip sub-expressions
    auto &value_expr = expr.get_value_expr ();
--- 1596,1604 ----
  
    AST::DefaultASTVisitor::visit (expr);
  
!   if (expr.get_pattern ()->is_marked_for_strip ())
!     rust_error_at (expr.get_pattern ()->get_locus (),
! 		   "cannot strip pattern in this position");
  
    // can't strip value expr itself, but can strip sub-expressions
    auto &value_expr = expr.get_value_expr ();
*************** CfgStrip::visit (AST::MatchExpr &expr)
*** 1668,1677 ****
  	  continue;
  	}
  
!       for (auto &pattern : match_arm.get_patterns ())
! 	if (pattern->is_marked_for_strip ())
! 	  rust_error_at (pattern->get_locus (),
! 			 "cannot strip pattern in this position");
  
        /* assuming that guard expression cannot be stripped as
         * strictly speaking you would have to strip the whole guard to
--- 1665,1673 ----
  	  continue;
  	}
  
!       if (match_arm.get_pattern ()->is_marked_for_strip ())
! 	rust_error_at (match_arm.get_pattern ()->get_locus (),
! 		       "cannot strip pattern in this position");
  
        /* assuming that guard expression cannot be stripped as
         * strictly speaking you would have to strip the whole guard to
diff -Nrcpad gcc-16-20260111/gcc/rust/expand/rust-macro-builtins-asm.cc gcc-16-20260118/gcc/rust/expand/rust-macro-builtins-asm.cc
*** gcc-16-20260111/gcc/rust/expand/rust-macro-builtins-asm.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/expand/rust-macro-builtins-asm.cc	Sun Jan 18 22:32:08 2026
*************** parse_reg_operand_in (InlineAsmContext i
*** 326,335 ****
  	}
  
        auto expr = parser.parse_expr ();
  
        // TODO: When we've succesfully parse an expr, remember to clone_expr()
        // instead of nullptr
!       AST::InlineAsmOperand::In in (reg, std::move (expr));
        inline_asm_ctx.inline_asm.operands.emplace_back (in, locus);
        return inline_asm_ctx;
      }
--- 326,336 ----
  	}
  
        auto expr = parser.parse_expr ();
+       rust_assert (expr);
  
        // TODO: When we've succesfully parse an expr, remember to clone_expr()
        // instead of nullptr
!       AST::InlineAsmOperand::In in (reg, std::move (expr.value ()));
        inline_asm_ctx.inline_asm.operands.emplace_back (in, locus);
        return inline_asm_ctx;
      }
*************** parse_reg_operand_out (InlineAsmContext
*** 344,359 ****
    if (!inline_asm_ctx.is_global_asm () && check_identifier (parser, "out"))
      {
        auto reg = parse_reg (inline_asm_ctx);
!       std::unique_ptr<AST::Expr> expr = parser.parse_expr ();
! 
!       rust_assert (expr != nullptr);
  
        /*auto expr_ptr =
  	 std::make_unique<AST::Expr>(AST::LiteralExpr(Literal))*/
  
        // TODO: When we've succesfully parse an expr, remember to clone_expr()
        // instead of nullptr
!       AST::InlineAsmOperand::Out out (reg, false, std::move (expr));
  
        inline_asm_ctx.inline_asm.operands.emplace_back (out, locus);
  
--- 345,359 ----
    if (!inline_asm_ctx.is_global_asm () && check_identifier (parser, "out"))
      {
        auto reg = parse_reg (inline_asm_ctx);
!       auto expr = parser.parse_expr ();
!       rust_assert (expr);
  
        /*auto expr_ptr =
  	 std::make_unique<AST::Expr>(AST::LiteralExpr(Literal))*/
  
        // TODO: When we've succesfully parse an expr, remember to clone_expr()
        // instead of nullptr
!       AST::InlineAsmOperand::Out out (reg, false, std::move (expr.value ()));
  
        inline_asm_ctx.inline_asm.operands.emplace_back (out, locus);
  
*************** parse_reg_operand_inout (InlineAsmContex
*** 402,411 ****
  
        // TODO: Is error propogation our top priority, the ? in rust's asm.rs is
        // doing a lot of work.
!       std::unique_ptr<AST::Expr> in_expr = parser.parse_expr ();
!       rust_assert (in_expr != nullptr);
! 
!       std::unique_ptr<AST::Expr> out_expr;
  
        if (parser.skip_token (MATCH_ARROW))
  	{
--- 402,409 ----
  
        // TODO: Is error propogation our top priority, the ? in rust's asm.rs is
        // doing a lot of work.
!       auto in_expr = parser.parse_expr ();
!       rust_assert (in_expr);
  
        if (parser.skip_token (MATCH_ARROW))
  	{
*************** parse_reg_operand_inout (InlineAsmContex
*** 413,422 ****
  	    {
  	      // auto result = parse_format_string (inline_asm_ctx);
  
! 	      out_expr = parser.parse_expr ();
  
  	      AST::InlineAsmOperand::SplitInOut splitinout (
! 		reg, false, std::move (in_expr), std::move (out_expr));
  
  	      inline_asm_ctx.inline_asm.operands.emplace_back (splitinout,
  							       locus);
--- 411,422 ----
  	    {
  	      // auto result = parse_format_string (inline_asm_ctx);
  
! 	      auto out_expr = parser.parse_expr ();
! 	      rust_assert (out_expr);
  
  	      AST::InlineAsmOperand::SplitInOut splitinout (
! 		reg, false, std::move (in_expr.value ()),
! 		std::move (out_expr.value ()));
  
  	      inline_asm_ctx.inline_asm.operands.emplace_back (splitinout,
  							       locus);
*************** parse_reg_operand_inout (InlineAsmContex
*** 439,445 ****
  	}
        else
  	{
! 	  AST::InlineAsmOperand::InOut inout (reg, false, std::move (in_expr));
  	  inline_asm_ctx.inline_asm.operands.emplace_back (inout, locus);
  	  // https://github.com/rust-lang/rust/blob/a3167859f2fd8ff2241295469876a2b687280bdc/compiler/rustc_builtin_macros/src/asm.rs#L137
  	  // RUST VERSION: ast::InlineAsmOperand::InOut { reg, expr, late: false
--- 439,446 ----
  	}
        else
  	{
! 	  AST::InlineAsmOperand::InOut inout (reg, false,
! 					      std::move (in_expr.value ()));
  	  inline_asm_ctx.inline_asm.operands.emplace_back (inout, locus);
  	  // https://github.com/rust-lang/rust/blob/a3167859f2fd8ff2241295469876a2b687280bdc/compiler/rustc_builtin_macros/src/asm.rs#L137
  	  // RUST VERSION: ast::InlineAsmOperand::InOut { reg, expr, late: false
*************** parse_llvm_operands (LlvmAsmContext &ctx
*** 1090,1099 ****
        ParseRestrictions restrictions;
        restrictions.expr_can_be_null = true;
        auto expr = parser.parse_expr ();
  
        parser.skip_token (RIGHT_PAREN);
  
!       result.emplace_back (constraint, std::move (expr));
  
        if (parser.peek_current_token ()->get_id () == COMMA)
  	parser.skip_token (COMMA);
--- 1091,1101 ----
        ParseRestrictions restrictions;
        restrictions.expr_can_be_null = true;
        auto expr = parser.parse_expr ();
+       rust_assert (expr);
  
        parser.skip_token (RIGHT_PAREN);
  
!       result.emplace_back (constraint, std::move (expr.value ()));
  
        if (parser.peek_current_token ()->get_id () == COMMA)
  	parser.skip_token (COMMA);
diff -Nrcpad gcc-16-20260111/gcc/rust/expand/rust-macro-builtins-format-args.cc gcc-16-20260118/gcc/rust/expand/rust-macro-builtins-format-args.cc
*** gcc-16-20260111/gcc/rust/expand/rust-macro-builtins-format-args.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/expand/rust-macro-builtins-format-args.cc	Sun Jan 18 22:32:08 2026
*************** format_args_parse_expr (location_t invoc
*** 42,49 ****
  			Parser<MacroInvocLexer> &parser,
  			BuiltinMacro macro_kind)
  {
!   std::unique_ptr<AST::Expr> format_expr = parser.parse_expr ();
!   rust_assert (format_expr);
  
    if (format_expr->get_expr_kind () == AST::Expr::Kind::MacroInvocation)
      {
--- 42,50 ----
  			Parser<MacroInvocLexer> &parser,
  			BuiltinMacro macro_kind)
  {
!   auto format_expr_res = parser.parse_expr ();
!   rust_assert (format_expr_res);
!   auto format_expr = std::move (format_expr_res.value ());
  
    if (format_expr->get_expr_kind () == AST::Expr::Kind::MacroInvocation)
      {
*************** format_args_parse_arguments (AST::MacroI
*** 114,120 ****
  	  if (!expr)
  	    rust_unreachable ();
  
! 	  args.push (AST::FormatArgument::named (ident, std::move (expr)));
  	}
        else
  	{
--- 115,122 ----
  	  if (!expr)
  	    rust_unreachable ();
  
! 	  args.push (
! 	    AST::FormatArgument::named (ident, std::move (expr.value ())));
  	}
        else
  	{
*************** format_args_parse_arguments (AST::MacroI
*** 124,130 ****
  	  if (!expr)
  	    rust_unreachable ();
  
! 	  args.push (AST::FormatArgument::normal (std::move (expr)));
  	}
        // we need to skip commas, don't we?
      }
--- 126,132 ----
  	  if (!expr)
  	    rust_unreachable ();
  
! 	  args.push (AST::FormatArgument::normal (std::move (expr.value ())));
  	}
        // we need to skip commas, don't we?
      }
diff -Nrcpad gcc-16-20260111/gcc/rust/expand/rust-macro-builtins-helpers.cc gcc-16-20260118/gcc/rust/expand/rust-macro-builtins-helpers.cc
*** gcc-16-20260111/gcc/rust/expand/rust-macro-builtins-helpers.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/expand/rust-macro-builtins-helpers.cc	Sun Jan 18 22:32:08 2026
*************** try_expand_many_expr (Parser<MacroInvocL
*** 151,157 ****
        auto expr = parser.parse_expr (AST::AttrVec (), restrictions);
        // something must be so wrong that the expression could not be parsed
        rust_assert (expr);
!       result.push_back (std::move (expr));
  
        auto next_token = parser.peek_current_token ();
        if (!parser.skip_token (COMMA) && next_token->get_id () != last_token_id)
--- 151,157 ----
        auto expr = parser.parse_expr (AST::AttrVec (), restrictions);
        // something must be so wrong that the expression could not be parsed
        rust_assert (expr);
!       result.push_back (std::move (expr.value ()));
  
        auto next_token = parser.peek_current_token ();
        if (!parser.skip_token (COMMA) && next_token->get_id () != last_token_id)
*************** parse_single_string_literal (BuiltinMacr
*** 188,194 ****
  
    if (parser.peek_current_token ()->get_id () == STRING_LITERAL)
      {
!       lit_expr = parser.parse_literal_expr ();
        parser.maybe_skip_token (COMMA);
        if (parser.peek_current_token ()->get_id () != last_token_id)
  	{
--- 188,194 ----
  
    if (parser.peek_current_token ()->get_id () == STRING_LITERAL)
      {
!       lit_expr = parser.parse_literal_expr ().value ();
        parser.maybe_skip_token (COMMA);
        if (parser.peek_current_token ()->get_id () != last_token_id)
  	{
diff -Nrcpad gcc-16-20260111/gcc/rust/expand/rust-macro-builtins-include.cc gcc-16-20260118/gcc/rust/expand/rust-macro-builtins-include.cc
*** gcc-16-20260111/gcc/rust/expand/rust-macro-builtins-include.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/expand/rust-macro-builtins-include.cc	Sun Jan 18 22:32:08 2026
*************** MacroBuiltin::include_handler (location_
*** 251,257 ****
      parsed_items = parser.parse_items ().value_or (
        std::vector<std::unique_ptr<AST::Item>>{});
    else
!     parsed_expr = parser.parse_expr ();
  
    bool has_error = !parser.get_errors ().empty ();
  
--- 251,257 ----
      parsed_items = parser.parse_items ().value_or (
        std::vector<std::unique_ptr<AST::Item>>{});
    else
!     parsed_expr = parser.parse_expr ().value ();
  
    bool has_error = !parser.get_errors ().empty ();
  
diff -Nrcpad gcc-16-20260111/gcc/rust/expand/rust-macro-expand.cc gcc-16-20260118/gcc/rust/expand/rust-macro-expand.cc
*** gcc-16-20260111/gcc/rust/expand/rust-macro-expand.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/expand/rust-macro-expand.cc	Sun Jan 18 22:32:08 2026
*************** MacroExpander::expand_invoc (AST::MacroI
*** 327,333 ****
    else
      fragment
        = expand_decl_macro (invoc.get_locus (), invoc_data, *rdef, semicolon);
! 
    set_expanded_fragment (std::move (fragment));
  }
  
--- 327,340 ----
    else
      fragment
        = expand_decl_macro (invoc.get_locus (), invoc_data, *rdef, semicolon);
!   // fix: if the expansion is failing, we must replace the marco with an empty
!   // error or node
!   // makes sure that it doesn't panic on Rouge macro (it -> Lowering Phase)
!   // added the parsing errors in gcc/testsuite/rust/compile/issue-4213.rs
!   if (fragment.is_error ())
!     {
!       fragment = AST::Fragment::create_empty ();
!     }
    set_expanded_fragment (std::move (fragment));
  }
  
*************** MacroExpander::match_fragment (Parser<Ma
*** 427,433 ****
        break;
  
      case AST::MacroFragSpec::LITERAL:
!       parser.parse_literal_expr ();
        break;
  
      case AST::MacroFragSpec::ITEM:
--- 434,440 ----
        break;
  
      case AST::MacroFragSpec::LITERAL:
!       std::ignore = parser.parse_literal_expr ();
        break;
  
      case AST::MacroFragSpec::ITEM:
*************** transcribe_expression (Parser<MacroInvoc
*** 980,986 ****
  
    auto end = lexer.get_offs ();
  
!   return AST::Fragment ({std::move (expr)}, lexer.get_token_slice (start, end));
  }
  
  /**
--- 987,994 ----
  
    auto end = lexer.get_offs ();
  
!   return AST::Fragment ({std::move (expr.value ())},
! 			lexer.get_token_slice (start, end));
  }
  
  /**
diff -Nrcpad gcc-16-20260111/gcc/rust/hir/rust-ast-lower-expr.cc gcc-16-20260118/gcc/rust/hir/rust-ast-lower-expr.cc
*** gcc-16-20260111/gcc/rust/hir/rust-ast-lower-expr.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/hir/rust-ast-lower-expr.cc	Sun Jan 18 22:32:08 2026
*************** ASTLoweringExpr::visit (AST::BreakExpr &
*** 639,645 ****
  
    HIR::Expr *break_expr
      = expr.has_break_expr ()
! 	? ASTLoweringExpr::translate (expr.get_break_expr ())
  	: nullptr;
  
    auto crate_num = mappings.get_current_crate ();
--- 639,645 ----
  
    HIR::Expr *break_expr
      = expr.has_break_expr ()
! 	? ASTLoweringExpr::translate (expr.get_break_expr_unchecked ())
  	: nullptr;
  
    auto crate_num = mappings.get_current_crate ();
diff -Nrcpad gcc-16-20260111/gcc/rust/hir/rust-ast-lower.cc gcc-16-20260118/gcc/rust/hir/rust-ast-lower.cc
*** gcc-16-20260111/gcc/rust/hir/rust-ast-lower.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/hir/rust-ast-lower.cc	Sun Jan 18 22:32:08 2026
*************** ASTLoweringIfLetBlock::desugar_iflet (AS
*** 228,235 ****
  				      std::vector<HIR::MatchCase> &match_arms)
  {
    HIR::Expr *kase_expr;
!   std::vector<std::unique_ptr<HIR::Pattern>> match_arm_patterns;
!   match_arm_patterns.reserve (expr.get_patterns ().size ());
  
    *branch_value = ASTLoweringExpr::translate (expr.get_value_expr ());
    kase_expr = ASTLoweringExpr::translate (expr.get_if_block ());
--- 228,234 ----
  				      std::vector<HIR::MatchCase> &match_arms)
  {
    HIR::Expr *kase_expr;
!   std::unique_ptr<HIR::Pattern> match_arm_pattern;
  
    *branch_value = ASTLoweringExpr::translate (expr.get_value_expr ());
    kase_expr = ASTLoweringExpr::translate (expr.get_if_block ());
*************** ASTLoweringIfLetBlock::desugar_iflet (AS
*** 237,249 ****
    // (stable) if let only accepts a single pattern, but (unstable) if let chains
    // need more than one pattern.
    // We don't support if let chains, so only support a single pattern.
!   rust_assert (expr.get_patterns ().size () == 1);
  
!   for (auto &pattern : expr.get_patterns ())
!     match_arm_patterns.emplace_back (ASTLoweringPattern::translate (*pattern));
  
    // The match arm corresponding to the if let pattern when it matches.
!   HIR::MatchArm arm (std::move (match_arm_patterns), expr.get_locus (), nullptr,
  		     {});
  
    auto crate_num = mappings.get_current_crate ();
--- 236,248 ----
    // (stable) if let only accepts a single pattern, but (unstable) if let chains
    // need more than one pattern.
    // We don't support if let chains, so only support a single pattern.
!   rust_assert (expr.get_pattern () != nullptr);
  
!   match_arm_pattern
!     = ASTLoweringPattern::translate (*expr.get_pattern ())->clone_pattern ();
  
    // The match arm corresponding to the if let pattern when it matches.
!   HIR::MatchArm arm (std::move (match_arm_pattern), expr.get_locus (), nullptr,
  		     {});
  
    auto crate_num = mappings.get_current_crate ();
*************** ASTLoweringIfLetBlock::desugar_iflet (AS
*** 255,269 ****
  			   std::unique_ptr<HIR::Expr> (kase_expr));
  
    // The default match arm when the if let pattern does not match
-   std::vector<std::unique_ptr<HIR::Pattern>> match_arm_patterns_wildcard;
    Analysis::NodeMapping mapping_default (crate_num, expr.get_node_id (),
  					 mappings.get_next_hir_id (crate_num),
  					 UNKNOWN_LOCAL_DEFID);
  
!   match_arm_patterns_wildcard.emplace_back (
      new HIR::WildcardPattern (mapping_default, expr.get_locus ()));
  
!   HIR::MatchArm arm_default (std::move (match_arm_patterns_wildcard),
  			     expr.get_locus (), nullptr, {});
  
    match_arms.emplace_back (std::move (mapping_default), std::move (arm_default),
--- 254,267 ----
  			   std::unique_ptr<HIR::Expr> (kase_expr));
  
    // The default match arm when the if let pattern does not match
    Analysis::NodeMapping mapping_default (crate_num, expr.get_node_id (),
  					 mappings.get_next_hir_id (crate_num),
  					 UNKNOWN_LOCAL_DEFID);
  
!   auto match_arm_pattern_wildcard = std::unique_ptr<HIR::WildcardPattern> (
      new HIR::WildcardPattern (mapping_default, expr.get_locus ()));
  
!   HIR::MatchArm arm_default (std::move (match_arm_pattern_wildcard),
  			     expr.get_locus (), nullptr, {});
  
    match_arms.emplace_back (std::move (mapping_default), std::move (arm_default),
*************** ASTLoweringExprWithBlock::visit (AST::Ma
*** 431,445 ****
  	    match_case.get_arm ().get_guard_expr ());
  	}
  
!       std::vector<std::unique_ptr<HIR::Pattern>> match_arm_patterns;
!       match_arm_patterns.reserve (
! 	match_case.get_arm ().get_patterns ().size ());
  
!       for (auto &pattern : match_case.get_arm ().get_patterns ())
! 	match_arm_patterns.emplace_back (
! 	  ASTLoweringPattern::translate (*pattern));
  
!       HIR::MatchArm arm (std::move (match_arm_patterns), expr.get_locus (),
  			 std::unique_ptr<HIR::Expr> (kase_guard_expr),
  			 match_case.get_arm ().get_outer_attrs ());
  
--- 429,441 ----
  	    match_case.get_arm ().get_guard_expr ());
  	}
  
!       std::unique_ptr<HIR::Pattern> match_arm_pattern;
  
!       match_arm_pattern
! 	= ASTLoweringPattern::translate (*match_case.get_arm ().get_pattern ())
! 	    ->clone_pattern ();
  
!       HIR::MatchArm arm (std::move (match_arm_pattern), expr.get_locus (),
  			 std::unique_ptr<HIR::Expr> (kase_guard_expr),
  			 match_case.get_arm ().get_outer_attrs ());
  
diff -Nrcpad gcc-16-20260111/gcc/rust/hir/rust-hir-dump.cc gcc-16-20260118/gcc/rust/hir/rust-hir-dump.cc
*** gcc-16-20260111/gcc/rust/hir/rust-hir-dump.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/hir/rust-hir-dump.cc	Sun Jan 18 22:32:08 2026
*************** Dump::do_matcharm (MatchArm &e)
*** 366,372 ****
    begin ("MatchArm");
    // FIXME Can't remember how to handle that. Let's see later.
    // do_outer_attrs(e);
!   visit_collection ("match_arm_patterns", e.get_patterns ());
    if (e.has_match_arm_guard ())
      visit_field ("guard_expr", e.get_guard_expr ());
    end ("MatchArm");
--- 366,372 ----
    begin ("MatchArm");
    // FIXME Can't remember how to handle that. Let's see later.
    // do_outer_attrs(e);
!   visit_field ("match_arm_pattern", e.get_pattern ());
    if (e.has_match_arm_guard ())
      visit_field ("guard_expr", e.get_guard_expr ());
    end ("MatchArm");
*************** Dump::visit (WhileLetLoopExpr &e)
*** 1461,1467 ****
    begin ("WhileLetLoopExpr");
    do_baseloopexpr (e);
  
!   visit_collection ("match_arm_patterns", e.get_patterns ());
  
    visit_field ("condition", e.get_cond ());
  
--- 1461,1467 ----
    begin ("WhileLetLoopExpr");
    do_baseloopexpr (e);
  
!   visit_field ("match_arm_patterns", e.get_pattern ());
  
    visit_field ("condition", e.get_cond ());
  
diff -Nrcpad gcc-16-20260111/gcc/rust/hir/tree/rust-hir-expr.cc gcc-16-20260118/gcc/rust/hir/tree/rust-hir-expr.cc
*** gcc-16-20260111/gcc/rust/hir/tree/rust-hir-expr.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/hir/tree/rust-hir-expr.cc	Sun Jan 18 22:32:08 2026
*************** OperatorExpr::operator= (OperatorExpr co
*** 76,82 ****
    ExprWithoutBlock::operator= (other);
    main_or_left_expr = other.main_or_left_expr->clone_expr ();
    locus = other.locus;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 76,81 ----
*************** ArithmeticOrLogicalExpr &
*** 130,136 ****
  ArithmeticOrLogicalExpr::operator= (ArithmeticOrLogicalExpr const &other)
  {
    OperatorExpr::operator= (other);
-   // main_or_left_expr = other.main_or_left_expr->clone_expr();
    right_expr = other.right_expr->clone_expr ();
    expr_type = other.expr_type;
  
--- 129,134 ----
*************** ComparisonExpr &
*** 155,164 ****
  ComparisonExpr::operator= (ComparisonExpr const &other)
  {
    OperatorExpr::operator= (other);
-   // main_or_left_expr = other.main_or_left_expr->clone_expr();
    right_expr = other.right_expr->clone_expr ();
    expr_type = other.expr_type;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 153,160 ----
*************** LazyBooleanExpr &
*** 181,187 ****
  LazyBooleanExpr::operator= (LazyBooleanExpr const &other)
  {
    OperatorExpr::operator= (other);
-   // main_or_left_expr = other.main_or_left_expr->clone_expr();
    right_expr = other.right_expr->clone_expr ();
    expr_type = other.expr_type;
  
--- 177,182 ----
*************** TypeCastExpr &
*** 206,212 ****
  TypeCastExpr::operator= (TypeCastExpr const &other)
  {
    OperatorExpr::operator= (other);
-   // main_or_left_expr = other.main_or_left_expr->clone_expr();
    type_to_convert_to = other.type_to_convert_to->clone_type ();
  
    return *this;
--- 201,206 ----
*************** AssignmentExpr &
*** 229,237 ****
  AssignmentExpr::operator= (AssignmentExpr const &other)
  {
    OperatorExpr::operator= (other);
-   // main_or_left_expr = other.main_or_left_expr->clone_expr();
    right_expr = other.right_expr->clone_expr ();
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 223,229 ----
*************** CompoundAssignmentExpr &
*** 254,263 ****
  CompoundAssignmentExpr::operator= (CompoundAssignmentExpr const &other)
  {
    OperatorExpr::operator= (other);
-   // main_or_left_expr = other.main_or_left_expr->clone_expr();
    right_expr = other.right_expr->clone_expr ();
    expr_type = other.expr_type;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 246,253 ----
*************** GroupedExpr::operator= (GroupedExpr cons
*** 283,289 ****
    inner_attrs = other.inner_attrs;
    expr_in_parens = other.expr_in_parens->clone_expr ();
    locus = other.locus;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 273,278 ----
*************** ArrayExpr::operator= (ArrayExpr const &o
*** 357,363 ****
    if (other.has_array_elems ())
      internal_elements = other.internal_elements->clone_array_elems ();
    locus = other.locus;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 346,351 ----
*************** ArrayIndexExpr::operator= (ArrayIndexExp
*** 382,388 ****
    ExprWithoutBlock::operator= (other);
    array_expr = other.array_expr->clone_expr ();
    index_expr = other.index_expr->clone_expr ();
-   // outer_attrs = other.outer_attrs;
    locus = other.locus;
  
    return *this;
--- 370,375 ----
*************** CallExpr::operator= (CallExpr const &oth
*** 607,614 ****
    ExprWithoutBlock::operator= (other);
    function = other.function->clone_expr ();
    locus = other.locus;
-   // params = other.params;
-   // outer_attrs = other.outer_attrs;
  
    params.reserve (other.params.size ());
    for (const auto &e : other.params)
--- 594,599 ----
*************** MethodCallExpr::operator= (MethodCallExp
*** 642,649 ****
    receiver = other.receiver->clone_expr ();
    method_name = other.method_name;
    locus = other.locus;
-   // params = other.params;
-   // outer_attrs = other.outer_attrs;
  
    params.reserve (other.params.size ());
    for (const auto &e : other.params)
--- 627,632 ----
*************** FieldAccessExpr::operator= (FieldAccessE
*** 673,679 ****
    receiver = other.receiver->clone_expr ();
    field = other.field;
    locus = other.locus;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 656,661 ----
*************** BlockExpr &
*** 778,791 ****
  BlockExpr::operator= (BlockExpr const &other)
  {
    ExprWithBlock::operator= (other);
-   // statements = other.statements;
    expr = other.expr->clone_expr ();
    inner_attrs = other.inner_attrs;
    start_locus = other.end_locus;
    end_locus = other.end_locus;
-   // outer_attrs = other.outer_attrs;
- 
    statements.reserve (other.statements.size ());
    for (const auto &e : other.statements)
      statements.push_back (e->clone_stmt ());
  
--- 760,771 ----
  BlockExpr::operator= (BlockExpr const &other)
  {
    ExprWithBlock::operator= (other);
    expr = other.expr->clone_expr ();
    inner_attrs = other.inner_attrs;
    start_locus = other.end_locus;
    end_locus = other.end_locus;
    statements.reserve (other.statements.size ());
+ 
    for (const auto &e : other.statements)
      statements.push_back (e->clone_stmt ());
  
*************** BreakExpr::operator= (BreakExpr const &o
*** 878,884 ****
    label = other.label;
    break_expr = other.break_expr->clone_expr ();
    locus = other.locus;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 858,863 ----
*************** ReturnExpr::operator= (ReturnExpr const
*** 1014,1020 ****
    ExprWithoutBlock::operator= (other);
    return_expr = other.return_expr->clone_expr ();
    locus = other.locus;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 993,998 ----
*************** UnsafeBlockExpr::operator= (UnsafeBlockE
*** 1037,1043 ****
    ExprWithBlock::operator= (other);
    expr = other.expr->clone_block_expr ();
    locus = other.locus;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 1015,1020 ----
*************** BaseLoopExpr::operator= (BaseLoopExpr co
*** 1064,1070 ****
    loop_block = other.loop_block->clone_block_expr ();
    loop_label = other.loop_label;
    locus = other.locus;
-   // outer_attrs = other.outer_attrs;
  
    return *this;
  }
--- 1041,1046 ----
*************** WhileLoopExpr::operator= (WhileLoopExpr
*** 1097,1144 ****
  {
    BaseLoopExpr::operator= (other);
    condition = other.condition->clone_expr ();
-   // loop_block = other.loop_block->clone_block_expr();
-   // loop_label = other.loop_label;
-   // outer_attrs = other.outer_attrs;
- 
    return *this;
  }
  
! WhileLetLoopExpr::WhileLetLoopExpr (
!   Analysis::NodeMapping mappings,
!   std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
!   std::unique_ptr<Expr> condition, std::unique_ptr<BlockExpr> loop_block,
!   location_t locus, tl::optional<LoopLabel> loop_label,
!   AST::AttrVec outer_attribs)
    : BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
  		  std::move (loop_label), std::move (outer_attribs)),
!     match_arm_patterns (std::move (match_arm_patterns)),
      condition (std::move (condition))
  {}
  
  WhileLetLoopExpr::WhileLetLoopExpr (WhileLetLoopExpr const &other)
    : BaseLoopExpr (other),
!     /*match_arm_patterns(other.match_arm_patterns),*/ condition (
!       other.condition->clone_expr ())
! {
!   match_arm_patterns.reserve (other.match_arm_patterns.size ());
!   for (const auto &e : other.match_arm_patterns)
!     match_arm_patterns.push_back (e->clone_pattern ());
! }
  
  WhileLetLoopExpr &
  WhileLetLoopExpr::operator= (WhileLetLoopExpr const &other)
  {
    BaseLoopExpr::operator= (other);
-   // match_arm_patterns = other.match_arm_patterns;
    condition = other.condition->clone_expr ();
!   // loop_block = other.loop_block->clone_block_expr();
!   // loop_label = other.loop_label;
!   // outer_attrs = other.outer_attrs;
! 
!   match_arm_patterns.reserve (other.match_arm_patterns.size ());
!   for (const auto &e : other.match_arm_patterns)
!     match_arm_patterns.push_back (e->clone_pattern ());
  
    return *this;
  }
--- 1073,1106 ----
  {
    BaseLoopExpr::operator= (other);
    condition = other.condition->clone_expr ();
    return *this;
  }
  
! WhileLetLoopExpr::WhileLetLoopExpr (Analysis::NodeMapping mappings,
! 				    std::unique_ptr<Pattern> match_arm_pattern,
! 				    std::unique_ptr<Expr> condition,
! 				    std::unique_ptr<BlockExpr> loop_block,
! 				    location_t locus,
! 				    tl::optional<LoopLabel> loop_label,
! 				    AST::AttrVec outer_attribs)
    : BaseLoopExpr (std::move (mappings), std::move (loop_block), locus,
  		  std::move (loop_label), std::move (outer_attribs)),
!     match_arm_pattern (std::move (match_arm_pattern)),
      condition (std::move (condition))
  {}
  
  WhileLetLoopExpr::WhileLetLoopExpr (WhileLetLoopExpr const &other)
    : BaseLoopExpr (other),
!     match_arm_pattern (other.match_arm_pattern->clone_pattern ()),
!     condition (other.condition->clone_expr ())
! {}
  
  WhileLetLoopExpr &
  WhileLetLoopExpr::operator= (WhileLetLoopExpr const &other)
  {
    BaseLoopExpr::operator= (other);
    condition = other.condition->clone_expr ();
!   match_arm_pattern = other.match_arm_pattern->clone_pattern ();
  
    return *this;
  }
*************** IfExprConseqElse::operator= (IfExprConse
*** 1191,1201 ****
    return *this;
  }
  
! MatchArm::MatchArm (std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
  		    location_t locus, std::unique_ptr<Expr> guard_expr,
  		    AST::AttrVec outer_attrs)
    : outer_attrs (std::move (outer_attrs)),
!     match_arm_patterns (std::move (match_arm_patterns)),
      guard_expr (std::move (guard_expr)), locus (locus)
  {}
  
--- 1153,1163 ----
    return *this;
  }
  
! MatchArm::MatchArm (std::unique_ptr<Pattern> match_arm_pattern,
  		    location_t locus, std::unique_ptr<Expr> guard_expr,
  		    AST::AttrVec outer_attrs)
    : outer_attrs (std::move (outer_attrs)),
!     match_arm_pattern (std::move (match_arm_pattern)),
      guard_expr (std::move (guard_expr)), locus (locus)
  {}
  
*************** MatchArm::MatchArm (MatchArm const &othe
*** 1205,1213 ****
    if (other.guard_expr != nullptr)
      guard_expr = other.guard_expr->clone_expr ();
  
!   match_arm_patterns.reserve (other.match_arm_patterns.size ());
!   for (const auto &e : other.match_arm_patterns)
!     match_arm_patterns.push_back (e->clone_pattern ());
  
    locus = other.locus;
  }
--- 1167,1173 ----
    if (other.guard_expr != nullptr)
      guard_expr = other.guard_expr->clone_expr ();
  
!   match_arm_pattern = other.match_arm_pattern->clone_pattern ();
  
    locus = other.locus;
  }
*************** MatchArm::operator= (MatchArm const &oth
*** 1220,1229 ****
    if (other.guard_expr != nullptr)
      guard_expr = other.guard_expr->clone_expr ();
  
!   match_arm_patterns.clear ();
!   match_arm_patterns.reserve (other.match_arm_patterns.size ());
!   for (const auto &e : other.match_arm_patterns)
!     match_arm_patterns.push_back (e->clone_pattern ());
  
    return *this;
  }
--- 1180,1186 ----
    if (other.guard_expr != nullptr)
      guard_expr = other.guard_expr->clone_expr ();
  
!   match_arm_pattern = other.match_arm_pattern->clone_pattern ();
  
    return *this;
  }
*************** MatchExpr::operator= (MatchExpr const &o
*** 1275,1281 ****
    branch_value = other.branch_value->clone_expr ();
    inner_attrs = other.inner_attrs;
    match_arms = other.match_arms;
-   // outer_attrs = other.outer_attrs;
    locus = other.locus;
  
    /*match_arms.reserve (other.match_arms.size ());
--- 1232,1237 ----
diff -Nrcpad gcc-16-20260111/gcc/rust/hir/tree/rust-hir-expr.h gcc-16-20260118/gcc/rust/hir/tree/rust-hir-expr.h
*** gcc-16-20260111/gcc/rust/hir/tree/rust-hir-expr.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/hir/tree/rust-hir-expr.h	Sun Jan 18 22:32:08 2026
*************** protected:
*** 2498,2504 ****
  class WhileLetLoopExpr : public BaseLoopExpr
  {
    // MatchArmPatterns patterns;
!   std::vector<std::unique_ptr<Pattern>> match_arm_patterns; // inlined
    std::unique_ptr<Expr> condition;
  
  public:
--- 2498,2504 ----
  class WhileLetLoopExpr : public BaseLoopExpr
  {
    // MatchArmPatterns patterns;
!   std::unique_ptr<Pattern> match_arm_pattern; // inlined
    std::unique_ptr<Expr> condition;
  
  public:
*************** public:
*** 2506,2512 ****
  
    // Constructor with a loop label
    WhileLetLoopExpr (Analysis::NodeMapping mappings,
! 		    std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
  		    std::unique_ptr<Expr> condition,
  		    std::unique_ptr<BlockExpr> loop_block, location_t locus,
  		    tl::optional<LoopLabel> loop_label,
--- 2506,2512 ----
  
    // Constructor with a loop label
    WhileLetLoopExpr (Analysis::NodeMapping mappings,
! 		    std::unique_ptr<Pattern> match_arm_pattern,
  		    std::unique_ptr<Expr> condition,
  		    std::unique_ptr<BlockExpr> loop_block, location_t locus,
  		    tl::optional<LoopLabel> loop_label,
*************** public:
*** 2526,2535 ****
    void accept_vis (HIRExpressionVisitor &vis) override;
  
    Expr &get_cond () { return *condition; }
!   std::vector<std::unique_ptr<Pattern>> &get_patterns ()
!   {
!     return match_arm_patterns;
!   }
  
  protected:
    /* Use covariance to implement clone function as returning this object rather
--- 2526,2532 ----
    void accept_vis (HIRExpressionVisitor &vis) override;
  
    Expr &get_cond () { return *condition; }
!   std::unique_ptr<Pattern> &get_pattern () { return match_arm_pattern; }
  
  protected:
    /* Use covariance to implement clone function as returning this object rather
*************** struct MatchArm
*** 2671,2677 ****
  {
  private:
    AST::AttrVec outer_attrs;
!   std::vector<std::unique_ptr<Pattern>> match_arm_patterns;
    std::unique_ptr<Expr> guard_expr;
    location_t locus;
  
--- 2668,2674 ----
  {
  private:
    AST::AttrVec outer_attrs;
!   std::unique_ptr<Pattern> match_arm_pattern;
    std::unique_ptr<Expr> guard_expr;
    location_t locus;
  
*************** public:
*** 2680,2687 ****
    bool has_match_arm_guard () const { return guard_expr != nullptr; }
  
    // Constructor for match arm with a guard expression
!   MatchArm (std::vector<std::unique_ptr<Pattern>> match_arm_patterns,
! 	    location_t locus, std::unique_ptr<Expr> guard_expr = nullptr,
  	    AST::AttrVec outer_attrs = AST::AttrVec ());
  
    // Copy constructor with clone
--- 2677,2684 ----
    bool has_match_arm_guard () const { return guard_expr != nullptr; }
  
    // Constructor for match arm with a guard expression
!   MatchArm (std::unique_ptr<Pattern> match_arm_pattern, location_t locus,
! 	    std::unique_ptr<Expr> guard_expr = nullptr,
  	    AST::AttrVec outer_attrs = AST::AttrVec ());
  
    // Copy constructor with clone
*************** public:
*** 2697,2717 ****
    MatchArm &operator= (MatchArm &&other) = default;
  
    // Returns whether match arm is in an error state.
!   bool is_error () const { return match_arm_patterns.empty (); }
  
    // Creates a match arm in an error state.
    static MatchArm create_error ()
    {
      location_t locus = UNDEF_LOCATION;
!     return MatchArm (std::vector<std::unique_ptr<Pattern>> (), locus);
    }
  
    std::string to_string () const;
  
!   std::vector<std::unique_ptr<Pattern>> &get_patterns ()
!   {
!     return match_arm_patterns;
!   }
  
    Expr &get_guard_expr () { return *guard_expr; }
  
--- 2694,2711 ----
    MatchArm &operator= (MatchArm &&other) = default;
  
    // Returns whether match arm is in an error state.
!   bool is_error () const { return match_arm_pattern == nullptr; }
  
    // Creates a match arm in an error state.
    static MatchArm create_error ()
    {
      location_t locus = UNDEF_LOCATION;
!     return MatchArm (nullptr, locus);
    }
  
    std::string to_string () const;
  
!   std::unique_ptr<Pattern> &get_pattern () { return match_arm_pattern; }
  
    Expr &get_guard_expr () { return *guard_expr; }
  
diff -Nrcpad gcc-16-20260111/gcc/rust/hir/tree/rust-hir-visitor.cc gcc-16-20260118/gcc/rust/hir/tree/rust-hir-visitor.cc
*** gcc-16-20260111/gcc/rust/hir/tree/rust-hir-visitor.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/hir/tree/rust-hir-visitor.cc	Sun Jan 18 22:32:08 2026
*************** void
*** 479,486 ****
  DefaultHIRVisitor::walk (WhileLetLoopExpr &expr)
  {
    visit_outer_attrs (expr);
!   for (auto &pattern : expr.get_patterns ())
!     pattern->accept_vis (*this);
    if (expr.has_loop_label ())
      visit_loop_label (expr.get_loop_label ());
    expr.get_cond ().accept_vis (*this);
--- 479,485 ----
  DefaultHIRVisitor::walk (WhileLetLoopExpr &expr)
  {
    visit_outer_attrs (expr);
!   expr.get_pattern ()->accept_vis (*this);
    if (expr.has_loop_label ())
      visit_loop_label (expr.get_loop_label ());
    expr.get_cond ().accept_vis (*this);
*************** void
*** 506,513 ****
  DefaultHIRVisitor::visit_match_arm (MatchArm &arm)
  {
    // visit_outer_attrs (arm);
!   for (auto &pattern : arm.get_patterns ())
!     pattern->accept_vis (*this);
    if (arm.has_match_arm_guard ())
      arm.get_guard_expr ().accept_vis (*this);
  }
--- 505,511 ----
  DefaultHIRVisitor::visit_match_arm (MatchArm &arm)
  {
    // visit_outer_attrs (arm);
!   arm.get_pattern ()->accept_vis (*this);
    if (arm.has_match_arm_guard ())
      arm.get_guard_expr ().accept_vis (*this);
  }
diff -Nrcpad gcc-16-20260111/gcc/rust/hir/tree/rust-hir.cc gcc-16-20260118/gcc/rust/hir/tree/rust-hir.cc
*** gcc-16-20260111/gcc/rust/hir/tree/rust-hir.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/hir/tree/rust-hir.cc	Sun Jan 18 22:32:08 2026
*************** WhileLetLoopExpr::to_string () const
*** 1775,1790 ****
      }
  
    str += "\n Match arm patterns: ";
!   if (match_arm_patterns.empty ())
      {
        str += "none";
      }
    else
      {
!       for (const auto &pattern : match_arm_patterns)
! 	{
! 	  str += "\n  " + pattern->to_string ();
! 	}
      }
  
    str += "\n Scrutinee expr: " + condition->to_string ();
--- 1775,1787 ----
      }
  
    str += "\n Match arm patterns: ";
!   if (match_arm_pattern == nullptr)
      {
        str += "none";
      }
    else
      {
!       str += "\n  " + match_arm_pattern->to_string ();
      }
  
    str += "\n Scrutinee expr: " + condition->to_string ();
*************** MatchArm::to_string () const
*** 1898,1914 ****
      }
  
    str += "\nPatterns: ";
!   if (match_arm_patterns.empty ())
!     {
!       str += "none";
!     }
    else
!     {
!       for (const auto &pattern : match_arm_patterns)
! 	{
! 	  str += "\n " + pattern->to_string ();
! 	}
!     }
  
    str += "\nGuard expr: ";
    if (!has_match_arm_guard ())
--- 1895,1904 ----
      }
  
    str += "\nPatterns: ";
!   if (match_arm_pattern == nullptr)
!     str += "none";
    else
!     str += "\n " + match_arm_pattern->to_string ();
  
    str += "\nGuard expr: ";
    if (!has_match_arm_guard ())
diff -Nrcpad gcc-16-20260111/gcc/rust/parse/rust-cfg-parser.cc gcc-16-20260118/gcc/rust/parse/rust-cfg-parser.cc
*** gcc-16-20260111/gcc/rust/parse/rust-cfg-parser.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/parse/rust-cfg-parser.cc	Sun Jan 18 22:32:08 2026
*************** parse_cfg_option (std::string &input, st
*** 51,60 ****
        {
  	rust_assert (parser.skip_token (EQUAL));
  
! 	auto value_expr = parser.parse_literal_expr ();
  	// We had an equal sign but no value, error out
! 	if (!value_expr)
  	  return false;
  
  	if (value_expr->get_lit_type () != AST::Literal::LitType::STRING)
  	  return false;
--- 51,61 ----
        {
  	rust_assert (parser.skip_token (EQUAL));
  
! 	auto value_expr_res = parser.parse_literal_expr ();
  	// We had an equal sign but no value, error out
! 	if (!value_expr_res)
  	  return false;
+ 	auto value_expr = std::move (value_expr_res.value ());
  
  	if (value_expr->get_lit_type () != AST::Literal::LitType::STRING)
  	  return false;
diff -Nrcpad gcc-16-20260111/gcc/rust/parse/rust-parse-error.h gcc-16-20260118/gcc/rust/parse/rust-parse-error.h
*** gcc-16-20260111/gcc/rust/parse/rust-parse-error.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/parse/rust-parse-error.h	Sun Jan 18 22:32:08 2026
*************** private:
*** 55,76 ****
    Attribute (Kind kind) : kind (kind) {}
  };
  
- struct SimplePath
- {
-   static tl::expected<AST::SimplePath, SimplePath> make_malformed ()
-   {
-     return tl::unexpected<SimplePath> (SimplePath (Kind::MALFORMED));
-   }
- 
-   enum class Kind
-   {
-     MALFORMED,
-   } kind;
- 
- private:
-   SimplePath (Kind kind) : kind (kind) {}
- };
- 
  struct AttributeBody
  {
    static tl::expected<Parse::AttributeBody, AttributeBody> make_invalid_path ()
--- 55,60 ----
*************** private:
*** 172,216 ****
    AttrInput (Kind kind) : kind (kind) {}
  };
  
! struct DelimTokenTree
  {
!   static tl::expected<AST::DelimTokenTree, DelimTokenTree>
!   make_expected_delimiter ()
!   {
!     return tl::unexpected<DelimTokenTree> (
!       DelimTokenTree (Kind::EXPECTED_DELIMITER));
!   }
! 
!   static tl::expected<AST::DelimTokenTree, DelimTokenTree>
!   make_invalid_token_tree ()
    {
!     return tl::unexpected<DelimTokenTree> (
!       DelimTokenTree (Kind::INVALID_TOKEN_TREE));
    }
  
!   static tl::expected<AST::DelimTokenTree, DelimTokenTree>
!   make_mismatched_delimiters ()
    {
!     return tl::unexpected<DelimTokenTree> (
!       DelimTokenTree (Kind::INVALID_TOKEN_TREE));
    }
  
    enum class Kind
    {
!     EXPECTED_DELIMITER,
!     INVALID_TOKEN_TREE,
!     MISMATCHED_DELIMITERS,
    } kind;
  
  private:
!   DelimTokenTree (Kind kind) : kind (kind) {}
  };
  
! struct Token
  {
!   static tl::expected<std::unique_ptr<AST::Token>, Token> make_malformed ()
    {
!     return tl::unexpected<Token> (Token (Kind::MALFORMED));
    }
  
    enum class Kind
--- 156,189 ----
    AttrInput (Kind kind) : kind (kind) {}
  };
  
! struct Item
  {
!   static tl::expected<std::unique_ptr<AST::Item>, Item> make_end_of_file ()
    {
!     return tl::unexpected<Item> (Item (Kind::END_OF_FILE));
    }
  
!   static tl::expected<std::unique_ptr<AST::Item>, Item> make_malformed ()
    {
!     return tl::unexpected<Item> (Item (Kind::MALFORMED));
    }
  
    enum class Kind
    {
!     END_OF_FILE,
!     MALFORMED,
    } kind;
  
  private:
!   Item (Kind kind) : kind (kind) {}
  };
  
! struct Items
  {
!   static tl::expected<std::vector<std::unique_ptr<AST::Item>>, Items>
!   make_malformed (std::vector<std::unique_ptr<AST::Item>> items)
    {
!     return tl::unexpected<Items> (Items (Kind::MALFORMED, std::move (items)));
    }
  
    enum class Kind
*************** struct Token
*** 218,322 ****
      MALFORMED,
    } kind;
  
  private:
!   Token (Kind kind) : kind (kind) {}
  };
  
! struct TokenTree
  {
!   static tl::expected<std::unique_ptr<AST::TokenTree>, TokenTree>
!   make_malformed ()
    {
!     return tl::unexpected<TokenTree> (TokenTree (Kind::MALFORMED));
    }
  
!   static tl::expected<std::unique_ptr<AST::TokenTree>, TokenTree>
!   make_malformed_delimited_token_tree ()
    {
!     return tl::unexpected<TokenTree> (
!       TokenTree (Kind::MALFORMED_DELIMITED_TOKEN_TREE));
    }
  
    enum class Kind
    {
      MALFORMED,
-     MALFORMED_DELIMITED_TOKEN_TREE,
    } kind;
  
  private:
!   TokenTree (Kind kind) : kind (kind) {}
  };
  
! struct Item
  {
!   static tl::expected<std::unique_ptr<AST::Item>, Item> make_end_of_file ()
!   {
!     return tl::unexpected<Item> (Item (Kind::END_OF_FILE));
!   }
! 
!   static tl::expected<std::unique_ptr<AST::Item>, Item> make_malformed ()
    {
!     return tl::unexpected<Item> (Item (Kind::MALFORMED));
    }
  
    enum class Kind
    {
!     END_OF_FILE,
!     MALFORMED,
    } kind;
  
  private:
!   Item (Kind kind) : kind (kind) {}
  };
  
! struct Items
  {
!   static tl::expected<std::vector<std::unique_ptr<AST::Item>>, Items>
!   make_malformed (std::vector<std::unique_ptr<AST::Item>> items)
    {
!     return tl::unexpected<Items> (Items (Kind::MALFORMED, std::move (items)));
    }
  
    enum class Kind
    {
!     MALFORMED,
    } kind;
  
-   Items (Items const &) = delete;
-   Items &operator= (Items const &) = delete;
- 
-   Items (Items &&items) = default;
-   Items &operator= (Items &&) = default;
- 
-   // Should we do anything with valid items ?
-   std::vector<std::unique_ptr<AST::Item>> items;
- 
  private:
!   Items (Kind kind, std::vector<std::unique_ptr<AST::Item>> items)
!     : kind (kind), items (std::move (items))
!   {}
  };
  
! struct Visibility
  {
!   static tl::expected<AST::Visibility, Visibility> make_malformed ()
    {
!     return tl::unexpected<Visibility> (Visibility (Kind::MALFORMED));
    }
  
!   static tl::expected<AST::Visibility, Visibility> make_missing_path ()
    {
!     return tl::unexpected<Visibility> (Visibility (Kind::MISSING_PATH));
    }
  
    enum class Kind
    {
!     MISSING_PATH,
!     MALFORMED,
    } kind;
  
  private:
!   Visibility (Kind kind) : kind (kind) {}
  };
  
  } // namespace Error
--- 191,333 ----
      MALFORMED,
    } kind;
  
+   Items (Items const &) = delete;
+   Items &operator= (Items const &) = delete;
+ 
+   Items (Items &&items) = default;
+   Items &operator= (Items &&) = default;
+ 
+   // Should we do anything with valid items ?
+   std::vector<std::unique_ptr<AST::Item>> items;
+ 
  private:
!   Items (Kind kind, std::vector<std::unique_ptr<AST::Item>> items)
!     : kind (kind), items (std::move (items))
!   {}
  };
  
! struct Visibility
  {
!   static tl::expected<AST::Visibility, Visibility> make_malformed ()
    {
!     return tl::unexpected<Visibility> (Visibility (Kind::MALFORMED));
    }
  
!   static tl::expected<AST::Visibility, Visibility> make_missing_path ()
    {
!     return tl::unexpected<Visibility> (Visibility (Kind::MISSING_PATH));
    }
  
    enum class Kind
    {
+     MISSING_PATH,
      MALFORMED,
    } kind;
  
  private:
!   Visibility (Kind kind) : kind (kind) {}
  };
  
! struct LifetimeParam
  {
!   static tl::expected<AST::LifetimeParam, LifetimeParam>
!   make_not_a_lifetime_param ()
    {
!     return tl::unexpected<LifetimeParam> (
!       LifetimeParam (Kind::NOT_A_LIFETIME_PARAM));
    }
  
    enum class Kind
    {
!     NOT_A_LIFETIME_PARAM,
    } kind;
  
  private:
!   LifetimeParam (Kind kind) : kind (kind) {}
  };
  
! class Lifetime
  {
! };
! 
! struct LoopLabel
! {
!   static tl::expected<AST::LoopLabel, LoopLabel> make_not_loop_label ()
    {
!     return tl::unexpected<LoopLabel> (LoopLabel (Kind::NOT_LOOP_LABEL));
!   }
! 
!   static tl::expected<AST::LoopLabel, LoopLabel> make_missing_colon ()
!   {
!     return tl::unexpected<LoopLabel> (LoopLabel (Kind::MISSING_COLON));
    }
  
    enum class Kind
    {
!     // Not an hard error
!     NOT_LOOP_LABEL,
!     // Hard error
!     MISSING_COLON,
    } kind;
  
  private:
!   LoopLabel (Kind kind) : kind (kind) {}
  };
  
! struct Self
  {
!   static tl::expected<std::unique_ptr<AST::Param>, Self>
!   make_self_raw_pointer ()
    {
!     return tl::unexpected<Self> (Self (Kind::SELF_RAW_PTR));
    }
  
!   static tl::expected<std::unique_ptr<AST::Param>, Self> make_not_self ()
    {
!     return tl::unexpected<Self> (Self (Kind::NOT_SELF));
!   }
! 
!   static tl::expected<std::unique_ptr<AST::Param>, Self> make_parsing_error ()
!   {
!     return tl::unexpected<Self> (Self (Kind::PARSING));
    }
  
    enum class Kind
    {
!     SELF_RAW_PTR,
!     PARSING,
!     NOT_SELF,
    } kind;
  
  private:
!   Self (Kind kind) : kind (kind) {}
! };
! 
! enum class Expr
! {
!   MALFORMED,
!   CHILD_ERROR,
!   NULL_EXPR,
!   NULL_DENOTATION,
!   LEFT_DENOTATION,
! };
! 
! enum class StructExprField
! {
!   MALFORMED,
!   CHILD_ERROR,
!   // Not a hard error
!   STRUCT_BASE,
! };
! 
! // Generic intermediate AST node error used when the errors need no special
! // handling
! enum class Node
! {
!   // Unexpected or missing token whilst parsing the node
!   MALFORMED,
!   // Error whilst parsing a child construct for the current node
!   CHILD_ERROR,
  };
  
  } // namespace Error
diff -Nrcpad gcc-16-20260111/gcc/rust/parse/rust-parse-impl-expr.hxx gcc-16-20260118/gcc/rust/parse/rust-parse-impl-expr.hxx
*** gcc-16-20260111/gcc/rust/parse/rust-parse-impl-expr.hxx	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/parse/rust-parse-impl-expr.hxx	Sun Jan 18 22:32:08 2026
*************** namespace Rust {
*** 26,32 ****
  
  // Parses a block expression, including the curly braces at start and end.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::BlockExpr>
  Parser<ManagedTokenSource>::parse_block_expr (
    AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label,
    location_t pratt_parsed_loc)
--- 26,32 ----
  
  // Parses a block expression, including the curly braces at start and end.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::BlockExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_block_expr (
    AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label,
    location_t pratt_parsed_loc)
*************** Parser<ManagedTokenSource>::parse_block_
*** 38,44 ****
        if (!skip_token (LEFT_CURLY))
  	{
  	  skip_after_end_block ();
! 	  return nullptr;
  	}
      }
  
--- 38,45 ----
        if (!skip_token (LEFT_CURLY))
  	{
  	  skip_after_end_block ();
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
      }
  
*************** Parser<ManagedTokenSource>::parse_block_
*** 51,74 ****
    const_TokenPtr t = lexer.peek_token ();
    while (t->get_id () != RIGHT_CURLY)
      {
!       ExprOrStmt expr_or_stmt = parse_stmt_or_expr ();
!       if (expr_or_stmt.is_error ())
  	{
  	  skip_after_end_block ();
! 	  return nullptr;
  	}
  
        t = lexer.peek_token ();
  
!       if (expr_or_stmt.stmt != nullptr)
  	{
! 	  stmts.push_back (std::move (expr_or_stmt.stmt));
  	}
        else
  	{
  	  // assign to expression and end parsing inside
! 	  expr = std::move (expr_or_stmt.expr);
! 	  break;
  	}
      }
  
--- 52,75 ----
    const_TokenPtr t = lexer.peek_token ();
    while (t->get_id () != RIGHT_CURLY)
      {
!       auto expr_or_stmt = parse_stmt_or_expr ();
!       if (!expr_or_stmt)
  	{
  	  skip_after_end_block ();
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  	}
  
        t = lexer.peek_token ();
  
!       if (expr_or_stmt->stmt != nullptr)
  	{
! 	  stmts.push_back (std::move (expr_or_stmt->stmt));
  	}
        else
  	{
  	  // assign to expression and end parsing inside
! 	  expr = std::move (expr_or_stmt->expr);
  	}
      }
  
*************** Parser<ManagedTokenSource>::parse_block_
*** 82,88 ****
        add_error (std::move (error));
  
        skip_after_end_block ();
!       return nullptr;
      }
  
    // grammar allows for empty block expressions
--- 83,89 ----
        add_error (std::move (error));
  
        skip_after_end_block ();
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    // grammar allows for empty block expressions
*************** Parser<ManagedTokenSource>::parse_block_
*** 98,104 ****
  /* Parse an anonymous const expression. This can be a regular const expression
   * or an underscore for deferred const inference */
  template <typename ManagedTokenSource>
! tl::expected<AST::AnonConst, AnonConstError>
  Parser<ManagedTokenSource>::parse_anon_const ()
  {
    auto current = lexer.peek_token ();
--- 99,105 ----
  /* Parse an anonymous const expression. This can be a regular const expression
   * or an underscore for deferred const inference */
  template <typename ManagedTokenSource>
! tl::expected<AST::AnonConst, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_anon_const ()
  {
    auto current = lexer.peek_token ();
*************** Parser<ManagedTokenSource>::parse_anon_c
*** 111,137 ****
    auto expr = parse_expr ();
  
    if (!expr)
!     return tl::make_unexpected (AnonConstError::InvalidSizeExpr);
  
!   return AST::AnonConst (std::move (expr), locus);
  }
  
  /* Parse a "const block", a block preceded by the `const` keyword whose
   * statements can be const evaluated and used in constant contexts */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ConstBlock>
  Parser<ManagedTokenSource>::parse_const_block_expr (AST::AttrVec outer_attrs,
  						    location_t locus)
  {
!   auto block = parse_block_expr ();
  
!   if (!block)
      {
        add_error (Error (locus, "failed to parse inner block in const block"));
        skip_after_end_block ();
  
!       return nullptr;
      }
  
    auto block_locus = block->get_locus ();
  
--- 112,140 ----
    auto expr = parse_expr ();
  
    if (!expr)
!     return tl::make_unexpected (Parse::Error::Node{});
  
!   return AST::AnonConst (std::move (expr.value ()), locus);
  }
  
  /* Parse a "const block", a block preceded by the `const` keyword whose
   * statements can be const evaluated and used in constant contexts */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ConstBlock>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_const_block_expr (AST::AttrVec outer_attrs,
  						    location_t locus)
  {
!   auto block_res = parse_block_expr ();
  
!   if (!block_res)
      {
        add_error (Error (locus, "failed to parse inner block in const block"));
        skip_after_end_block ();
  
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
+   auto block = std::move (block_res.value ());
  
    auto block_locus = block->get_locus ();
  
*************** Parser<ManagedTokenSource>::parse_const_
*** 143,149 ****
  /* Parses a "grouped" expression (expression in parentheses), used to control
   * precedence. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::GroupedExpr>
  Parser<ManagedTokenSource>::parse_grouped_expr (AST::AttrVec outer_attrs)
  {
    location_t locus = lexer.peek_token ()->get_locus ();
--- 146,152 ----
  /* Parses a "grouped" expression (expression in parentheses), used to control
   * precedence. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::GroupedExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_grouped_expr (AST::AttrVec outer_attrs)
  {
    location_t locus = lexer.peek_token ()->get_locus ();
*************** Parser<ManagedTokenSource>::parse_groupe
*** 152,179 ****
    AST::AttrVec inner_attrs = parse_inner_attributes ();
  
    // parse required expr inside parentheses
!   std::unique_ptr<AST::Expr> expr_in_parens = parse_expr ();
!   if (expr_in_parens == nullptr)
      {
        // skip after somewhere?
        // error?
!       return nullptr;
      }
  
    if (!skip_token (RIGHT_PAREN))
      {
        // skip after somewhere?
!       return nullptr;
      }
  
    return std::unique_ptr<AST::GroupedExpr> (
!     new AST::GroupedExpr (std::move (expr_in_parens), std::move (inner_attrs),
! 			  std::move (outer_attrs), locus));
  }
  
  // Parses a closure expression (closure definition).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ClosureExpr>
  Parser<ManagedTokenSource>::parse_closure_expr (AST::AttrVec outer_attrs)
  {
    location_t locus = lexer.peek_token ()->get_locus ();
--- 155,184 ----
    AST::AttrVec inner_attrs = parse_inner_attributes ();
  
    // parse required expr inside parentheses
!   auto expr_in_parens = parse_expr ();
!   if (!expr_in_parens)
      {
        // skip after somewhere?
        // error?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
    if (!skip_token (RIGHT_PAREN))
      {
        // skip after somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    return std::unique_ptr<AST::GroupedExpr> (
!     new AST::GroupedExpr (std::move (expr_in_parens.value ()),
! 			  std::move (inner_attrs), std::move (outer_attrs),
! 			  locus));
  }
  
  // Parses a closure expression (closure definition).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ClosureExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_closure_expr (AST::AttrVec outer_attrs)
  {
    location_t locus = lexer.peek_token ()->get_locus ();
*************** Parser<ManagedTokenSource>::parse_closur
*** 233,239 ****
  			t->get_token_description ()));
  
        // skip somewhere?
!       return nullptr;
      }
  
    // again branch based on next token
--- 238,244 ----
  			t->get_token_description ()));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    // again branch based on next token
*************** Parser<ManagedTokenSource>::parse_closur
*** 254,265 ****
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
  
        // parse block expr, which is required
!       std::unique_ptr<AST::BlockExpr> block = parse_block_expr ();
!       if (block == nullptr)
  	{
  	  // error
  	  Error error (lexer.peek_token ()->get_locus (),
--- 259,271 ----
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  	}
  
        // parse block expr, which is required
!       auto block = parse_block_expr ();
!       if (!block)
  	{
  	  // error
  	  Error error (lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_closur
*** 267,277 ****
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
  
        return std::unique_ptr<AST::ClosureExprInnerTyped> (
! 	new AST::ClosureExprInnerTyped (std::move (type), std::move (block),
  					std::move (params), locus, has_move,
  					std::move (outer_attrs)));
      }
--- 273,285 ----
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  	}
  
        return std::unique_ptr<AST::ClosureExprInnerTyped> (
! 	new AST::ClosureExprInnerTyped (std::move (type),
! 					std::move (block.value ()),
  					std::move (params), locus, has_move,
  					std::move (outer_attrs)));
      }
*************** Parser<ManagedTokenSource>::parse_closur
*** 280,305 ****
        // must be expr-only closure
  
        // parse expr, which is required
!       std::unique_ptr<AST::Expr> expr = parse_expr ();
!       if (expr == nullptr)
  	{
  	  Error error (t->get_locus (),
  		       "failed to parse expression in closure");
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
  
        return std::unique_ptr<AST::ClosureExprInner> (
! 	new AST::ClosureExprInner (std::move (expr), std::move (params), locus,
! 				   has_move, std::move (outer_attrs)));
      }
  }
  
  // Parses a literal token (to literal expression).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::LiteralExpr>
  Parser<ManagedTokenSource>::parse_literal_expr (AST::AttrVec outer_attrs)
  {
    // TODO: change if literal representation in lexer changes
--- 288,315 ----
        // must be expr-only closure
  
        // parse expr, which is required
!       auto expr = parse_expr ();
!       if (!expr)
  	{
  	  Error error (t->get_locus (),
  		       "failed to parse expression in closure");
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  	}
  
        return std::unique_ptr<AST::ClosureExprInner> (
! 	new AST::ClosureExprInner (std::move (expr.value ()),
! 				   std::move (params), locus, has_move,
! 				   std::move (outer_attrs)));
      }
  }
  
  // Parses a literal token (to literal expression).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::LiteralExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_literal_expr (AST::AttrVec outer_attrs)
  {
    // TODO: change if literal representation in lexer changes
*************** Parser<ManagedTokenSource>::parse_litera
*** 365,371 ****
  			t->get_token_description ()));
  
        // skip?
!       return nullptr;
      }
  
    // create literal based on stuff in switch
--- 375,381 ----
  			t->get_token_description ()));
  
        // skip?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    // create literal based on stuff in switch
*************** Parser<ManagedTokenSource>::parse_litera
*** 376,382 ****
  }
  
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::BoxExpr>
  Parser<ManagedTokenSource>::parse_box_expr (AST::AttrVec outer_attrs,
  					    location_t pratt_parsed_loc)
  {
--- 386,392 ----
  }
  
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::BoxExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_box_expr (AST::AttrVec outer_attrs,
  					    location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_box_ex
*** 390,404 ****
    ParseRestrictions restrictions;
    restrictions.expr_can_be_null = false;
  
!   std::unique_ptr<AST::Expr> expr = parse_expr (AST::AttrVec (), restrictions);
  
    return std::unique_ptr<AST::BoxExpr> (
!     new AST::BoxExpr (std::move (expr), std::move (outer_attrs), locus));
  }
  
  // Parses a return expression (including any expression to return).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ReturnExpr>
  Parser<ManagedTokenSource>::parse_return_expr (AST::AttrVec outer_attrs,
  					       location_t pratt_parsed_loc)
  {
--- 400,417 ----
    ParseRestrictions restrictions;
    restrictions.expr_can_be_null = false;
  
!   auto expr = parse_expr (AST::AttrVec (), restrictions);
!   if (!expr)
!     return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::CHILD_ERROR);
  
    return std::unique_ptr<AST::BoxExpr> (
!     new AST::BoxExpr (std::move (expr.value ()), std::move (outer_attrs),
! 		      locus));
  }
  
  // Parses a return expression (including any expression to return).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ReturnExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_return_expr (AST::AttrVec outer_attrs,
  					       location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_return
*** 412,428 ****
    // parse expression to return, if it exists
    ParseRestrictions restrictions;
    restrictions.expr_can_be_null = true;
!   std::unique_ptr<AST::Expr> returned_expr
!     = parse_expr (AST::AttrVec (), restrictions);
  
!   return std::unique_ptr<AST::ReturnExpr> (
!     new AST::ReturnExpr (std::move (returned_expr), std::move (outer_attrs),
! 			 locus));
  }
  
  // Parses a try expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::TryExpr>
  Parser<ManagedTokenSource>::parse_try_expr (AST::AttrVec outer_attrs,
  					    location_t pratt_parsed_loc)
  {
--- 425,442 ----
    // parse expression to return, if it exists
    ParseRestrictions restrictions;
    restrictions.expr_can_be_null = true;
!   auto returned_expr = parse_expr (AST::AttrVec (), restrictions);
!   tl::optional<std::unique_ptr<AST::Expr>> expr = tl::nullopt;
!   if (returned_expr)
!     expr = std::move (returned_expr.value ());
  
!   return std::make_unique<AST::ReturnExpr> (std::move (expr),
! 					    std::move (outer_attrs), locus);
  }
  
  // Parses a try expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::TryExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_try_expr (AST::AttrVec outer_attrs,
  					    location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_try_ex
*** 433,457 ****
        skip_token (TRY);
      }
  
!   std::unique_ptr<AST::BlockExpr> block_expr = parse_block_expr ();
  
    if (!block_expr)
!     {
!       Error error (lexer.peek_token ()->get_locus (),
! 		   "failed to parse try block expression");
!       add_error (std::move (error));
! 
!       return nullptr;
!     }
  
    return std::unique_ptr<AST::TryExpr> (
!     new AST::TryExpr (std::move (block_expr), std::move (outer_attrs), locus));
  }
  
  /* Parses a break expression (including any label to break to AND any return
   * expression). */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::BreakExpr>
  Parser<ManagedTokenSource>::parse_break_expr (AST::AttrVec outer_attrs,
  					      location_t pratt_parsed_loc)
  {
--- 447,466 ----
        skip_token (TRY);
      }
  
!   auto block_expr = parse_block_expr ();
  
    if (!block_expr)
!     return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::CHILD_ERROR);
  
    return std::unique_ptr<AST::TryExpr> (
!     new AST::TryExpr (std::move (block_expr.value ()), std::move (outer_attrs),
! 		      locus));
  }
  
  /* Parses a break expression (including any label to break to AND any return
   * expression). */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::BreakExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_break_expr (AST::AttrVec outer_attrs,
  					      location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_break_
*** 470,481 ****
    // parse break return expression if it exists
    ParseRestrictions restrictions;
    restrictions.expr_can_be_null = true;
!   std::unique_ptr<AST::Expr> return_expr
!     = parse_expr (AST::AttrVec (), restrictions);
  
!   return std::unique_ptr<AST::BreakExpr> (
!     new AST::BreakExpr (std::move (label), std::move (return_expr),
! 			std::move (outer_attrs), locus));
  }
  
  // Parses a continue expression (including any label to continue from).
--- 479,496 ----
    // parse break return expression if it exists
    ParseRestrictions restrictions;
    restrictions.expr_can_be_null = true;
!   auto return_expr = parse_expr (AST::AttrVec (), restrictions);
  
!   if (return_expr)
!     return std::unique_ptr<AST::BreakExpr> (
!       new AST::BreakExpr (std::move (label), std::move (return_expr.value ()),
! 			  std::move (outer_attrs), locus));
!   else if (return_expr.error () == Parse::Error::Expr::NULL_EXPR)
!     return std::unique_ptr<AST::BreakExpr> (
!       new AST::BreakExpr (std::move (label), tl::nullopt,
! 			  std::move (outer_attrs), locus));
!   else
!     return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::CHILD_ERROR);
  }
  
  // Parses a continue expression (including any label to continue from).
*************** Parser<ManagedTokenSource>::parse_contin
*** 496,510 ****
  		 ? tl::optional<AST::Lifetime> (parsed_label.value ())
  		 : tl::nullopt;
  
!   return std::unique_ptr<AST::ContinueExpr> (
!     new AST::ContinueExpr (std::move (label), std::move (outer_attrs), locus));
  }
  
  /* Parses an if expression of any kind, including with else, else if, else if
   * let, and neither. Note that any outer attributes will be ignored because if
   * expressions don't support them. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::IfExpr>
  Parser<ManagedTokenSource>::parse_if_expr (AST::AttrVec outer_attrs,
  					   location_t pratt_parsed_loc)
  {
--- 511,525 ----
  		 ? tl::optional<AST::Lifetime> (parsed_label.value ())
  		 : tl::nullopt;
  
!   return std::make_unique<AST::ContinueExpr> (std::move (label),
! 					      std::move (outer_attrs), locus);
  }
  
  /* Parses an if expression of any kind, including with else, else if, else if
   * let, and neither. Note that any outer attributes will be ignored because if
   * expressions don't support them. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::IfExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_if_expr (AST::AttrVec outer_attrs,
  					   location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 516,522 ****
        if (!skip_token (IF))
  	{
  	  skip_after_end_block ();
! 	  return nullptr;
  	}
      }
  
--- 531,538 ----
        if (!skip_token (IF))
  	{
  	  skip_after_end_block ();
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
      }
  
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 529,564 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
    /* parse required condition expr - HACK to prevent struct expr from being
     * parsed */
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   std::unique_ptr<AST::Expr> condition = parse_expr ({}, no_struct_expr);
!   if (condition == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse condition expression in if expression");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
    // parse required block expr
!   std::unique_ptr<AST::BlockExpr> if_body = parse_block_expr ();
!   if (if_body == nullptr)
!     return nullptr;
  
    // branch to parse end or else (and then else, else if, or else if let)
    if (lexer.peek_token ()->get_id () != ELSE)
      {
        // single selection - end of if expression
        return std::unique_ptr<AST::IfExpr> (
! 	new AST::IfExpr (std::move (condition), std::move (if_body),
! 			 std::move (outer_attrs), locus));
      }
    else
      {
--- 545,582 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    /* parse required condition expr - HACK to prevent struct expr from being
     * parsed */
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   auto condition = parse_expr ({}, no_struct_expr);
!   if (!condition)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse condition expression in if expression");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
    // parse required block expr
!   auto if_body = parse_block_expr ();
!   if (!if_body)
!     return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::CHILD_ERROR);
  
    // branch to parse end or else (and then else, else if, or else if let)
    if (lexer.peek_token ()->get_id () != ELSE)
      {
        // single selection - end of if expression
        return std::unique_ptr<AST::IfExpr> (
! 	new AST::IfExpr (std::move (condition.value ()),
! 			 std::move (if_body.value ()), std::move (outer_attrs),
! 			 locus));
      }
    else
      {
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 575,582 ****
  	  {
  	    // double selection - else
  	    // parse else block expr (required)
! 	    std::unique_ptr<AST::BlockExpr> else_body = parse_block_expr ();
! 	    if (else_body == nullptr)
  	      {
  		Error error (lexer.peek_token ()->get_locus (),
  			     "failed to parse else body block expression in "
--- 593,600 ----
  	  {
  	    // double selection - else
  	    // parse else block expr (required)
! 	    auto else_body = parse_block_expr ();
! 	    if (!else_body)
  	      {
  		Error error (lexer.peek_token ()->get_locus (),
  			     "failed to parse else body block expression in "
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 584,596 ****
  		add_error (std::move (error));
  
  		// skip somewhere?
! 		return nullptr;
  	      }
  
  	    return std::unique_ptr<AST::IfExprConseqElse> (
! 	      new AST::IfExprConseqElse (std::move (condition),
! 					 std::move (if_body),
! 					 std::move (else_body),
  					 std::move (outer_attrs), locus));
  	  }
  	case IF:
--- 602,615 ----
  		add_error (std::move (error));
  
  		// skip somewhere?
! 		return tl::unexpected<Parse::Error::Node> (
! 		  Parse::Error::Node::CHILD_ERROR);
  	      }
  
  	    return std::unique_ptr<AST::IfExprConseqElse> (
! 	      new AST::IfExprConseqElse (std::move (condition.value ()),
! 					 std::move (if_body.value ()),
! 					 std::move (else_body.value ()),
  					 std::move (outer_attrs), locus));
  	  }
  	case IF:
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 600,608 ****
  	    if (lexer.peek_token (1)->get_id () == LET)
  	      {
  		// parse if let expr (required)
! 		std::unique_ptr<AST::IfLetExpr> if_let_expr
! 		  = parse_if_let_expr ();
! 		if (if_let_expr == nullptr)
  		  {
  		    Error error (lexer.peek_token ()->get_locus (),
  				 "failed to parse (else) if let expression "
--- 619,626 ----
  	    if (lexer.peek_token (1)->get_id () == LET)
  	      {
  		// parse if let expr (required)
! 		auto if_let_expr = parse_if_let_expr ();
! 		if (!if_let_expr)
  		  {
  		    Error error (lexer.peek_token ()->get_locus (),
  				 "failed to parse (else) if let expression "
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 610,629 ****
  		    add_error (std::move (error));
  
  		    // skip somewhere?
! 		    return nullptr;
  		  }
  
  		return std::unique_ptr<AST::IfExprConseqElse> (
! 		  new AST::IfExprConseqElse (std::move (condition),
! 					     std::move (if_body),
! 					     std::move (if_let_expr),
  					     std::move (outer_attrs), locus));
  	      }
  	    else
  	      {
  		// parse if expr (required)
! 		std::unique_ptr<AST::IfExpr> if_expr = parse_if_expr ();
! 		if (if_expr == nullptr)
  		  {
  		    Error error (lexer.peek_token ()->get_locus (),
  				 "failed to parse (else) if expression after "
--- 628,648 ----
  		    add_error (std::move (error));
  
  		    // skip somewhere?
! 		    return tl::unexpected<Parse::Error::Node> (
! 		      Parse::Error::Node::CHILD_ERROR);
  		  }
  
  		return std::unique_ptr<AST::IfExprConseqElse> (
! 		  new AST::IfExprConseqElse (std::move (condition.value ()),
! 					     std::move (if_body.value ()),
! 					     std::move (if_let_expr.value ()),
  					     std::move (outer_attrs), locus));
  	      }
  	    else
  	      {
  		// parse if expr (required)
! 		auto if_expr = parse_if_expr ();
! 		if (!if_expr)
  		  {
  		    Error error (lexer.peek_token ()->get_locus (),
  				 "failed to parse (else) if expression after "
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 631,643 ****
  		    add_error (std::move (error));
  
  		    // skip somewhere?
! 		    return nullptr;
  		  }
  
  		return std::unique_ptr<AST::IfExprConseqElse> (
! 		  new AST::IfExprConseqElse (std::move (condition),
! 					     std::move (if_body),
! 					     std::move (if_expr),
  					     std::move (outer_attrs), locus));
  	      }
  	  }
--- 650,663 ----
  		    add_error (std::move (error));
  
  		    // skip somewhere?
! 		    return tl::unexpected<Parse::Error::Node> (
! 		      Parse::Error::Node::CHILD_ERROR);
  		  }
  
  		return std::unique_ptr<AST::IfExprConseqElse> (
! 		  new AST::IfExprConseqElse (std::move (condition.value ()),
! 					     std::move (if_body.value ()),
! 					     std::move (if_expr.value ()),
  					     std::move (outer_attrs), locus));
  	      }
  	  }
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 648,654 ****
  			    t->get_token_description ()));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
      }
  }
--- 668,675 ----
  			    t->get_token_description ()));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
      }
  }
*************** Parser<ManagedTokenSource>::parse_if_exp
*** 657,663 ****
   * if let, and none. Note that any outer attributes will be ignored as if let
   * expressions don't support them. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::IfLetExpr>
  Parser<ManagedTokenSource>::parse_if_let_expr (AST::AttrVec outer_attrs,
  					       location_t pratt_parsed_loc)
  {
--- 678,684 ----
   * if let, and none. Note that any outer attributes will be ignored as if let
   * expressions don't support them. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::IfLetExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_if_let_expr (AST::AttrVec outer_attrs,
  					       location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_if_let
*** 669,675 ****
        if (!skip_token (IF))
  	{
  	  skip_after_end_block ();
! 	  return nullptr;
  	}
      }
  
--- 690,697 ----
        if (!skip_token (IF))
  	{
  	  skip_after_end_block ();
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
      }
  
*************** Parser<ManagedTokenSource>::parse_if_let
*** 682,695 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
    lexer.skip_token ();
  
    // parse match arm patterns (which are required)
!   std::vector<std::unique_ptr<AST::Pattern>> match_arm_patterns
!     = parse_match_arm_patterns (EQUAL);
!   if (match_arm_patterns.empty ())
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
--- 704,717 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
    lexer.skip_token ();
  
    // parse match arm patterns (which are required)
!   std::unique_ptr<AST::Pattern> match_arm_pattern
!     = parse_match_arm_pattern (EQUAL);
!   if (match_arm_pattern == nullptr)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_if_let
*** 697,730 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
    if (!skip_token (EQUAL))
      {
        // skip somewhere?
!       return nullptr;
      }
  
    // parse expression (required) - HACK to prevent struct expr being parsed
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   std::unique_ptr<AST::Expr> scrutinee_expr = parse_expr ({}, no_struct_expr);
!   if (scrutinee_expr == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse scrutinee expression in if let expression");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
    /* TODO: check for expression not being a struct expression or lazy boolean
     * expression here? or actually probably in semantic analysis. */
  
    // parse block expression (required)
!   std::unique_ptr<AST::BlockExpr> if_let_body = parse_block_expr ();
!   if (if_let_body == nullptr)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
--- 719,754 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
    if (!skip_token (EQUAL))
      {
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    // parse expression (required) - HACK to prevent struct expr being parsed
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   auto scrutinee_expr = parse_expr ({}, no_struct_expr);
!   if (!scrutinee_expr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse scrutinee expression in if let expression");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
    /* TODO: check for expression not being a struct expression or lazy boolean
     * expression here? or actually probably in semantic analysis. */
  
    // parse block expression (required)
!   auto if_let_body = parse_block_expr ();
!   if (!if_let_body)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_if_let
*** 732,748 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
    // branch to parse end or else (and then else, else if, or else if let)
    if (lexer.peek_token ()->get_id () != ELSE)
      {
        // single selection - end of if let expression
!       return std::unique_ptr<AST::IfLetExpr> (
! 	new AST::IfLetExpr (std::move (match_arm_patterns),
! 			    std::move (scrutinee_expr), std::move (if_let_body),
! 			    std::move (outer_attrs), locus));
      }
    else
      {
--- 756,772 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
    // branch to parse end or else (and then else, else if, or else if let)
    if (lexer.peek_token ()->get_id () != ELSE)
      {
        // single selection - end of if let expression
!       return std::unique_ptr<AST::IfLetExpr> (new AST::IfLetExpr (
! 	std::move (match_arm_pattern), std::move (scrutinee_expr.value ()),
! 	std::move (if_let_body.value ()), std::move (outer_attrs), locus));
      }
    else
      {
*************** Parser<ManagedTokenSource>::parse_if_let
*** 759,766 ****
  	  {
  	    // double selection - else
  	    // parse else block expr (required)
! 	    std::unique_ptr<AST::BlockExpr> else_body = parse_block_expr ();
! 	    if (else_body == nullptr)
  	      {
  		Error error (lexer.peek_token ()->get_locus (),
  			     "failed to parse else body block expression in "
--- 783,790 ----
  	  {
  	    // double selection - else
  	    // parse else block expr (required)
! 	    auto else_body = parse_block_expr ();
! 	    if (!else_body)
  	      {
  		Error error (lexer.peek_token ()->get_locus (),
  			     "failed to parse else body block expression in "
*************** Parser<ManagedTokenSource>::parse_if_let
*** 768,781 ****
  		add_error (std::move (error));
  
  		// skip somewhere?
! 		return nullptr;
  	      }
  
  	    return std::unique_ptr<AST::IfLetExprConseqElse> (
! 	      new AST::IfLetExprConseqElse (std::move (match_arm_patterns),
! 					    std::move (scrutinee_expr),
! 					    std::move (if_let_body),
! 					    std::move (else_body),
  					    std::move (outer_attrs), locus));
  	  }
  	case IF:
--- 792,806 ----
  		add_error (std::move (error));
  
  		// skip somewhere?
! 		return tl::unexpected<Parse::Error::Node> (
! 		  Parse::Error::Node::CHILD_ERROR);
  	      }
  
  	    return std::unique_ptr<AST::IfLetExprConseqElse> (
! 	      new AST::IfLetExprConseqElse (std::move (match_arm_pattern),
! 					    std::move (scrutinee_expr.value ()),
! 					    std::move (if_let_body.value ()),
! 					    std::move (else_body.value ()),
  					    std::move (outer_attrs), locus));
  	  }
  	case IF:
*************** Parser<ManagedTokenSource>::parse_if_let
*** 785,793 ****
  	    if (lexer.peek_token (1)->get_id () == LET)
  	      {
  		// parse if let expr (required)
! 		std::unique_ptr<AST::IfLetExpr> if_let_expr
! 		  = parse_if_let_expr ();
! 		if (if_let_expr == nullptr)
  		  {
  		    Error error (lexer.peek_token ()->get_locus (),
  				 "failed to parse (else) if let expression "
--- 810,817 ----
  	    if (lexer.peek_token (1)->get_id () == LET)
  	      {
  		// parse if let expr (required)
! 		auto if_let_expr = parse_if_let_expr ();
! 		if (!if_let_expr)
  		  {
  		    Error error (lexer.peek_token ()->get_locus (),
  				 "failed to parse (else) if let expression "
*************** Parser<ManagedTokenSource>::parse_if_let
*** 795,814 ****
  		    add_error (std::move (error));
  
  		    // skip somewhere?
! 		    return nullptr;
  		  }
  
  		return std::unique_ptr<AST::IfLetExprConseqElse> (
  		  new AST::IfLetExprConseqElse (
! 		    std::move (match_arm_patterns), std::move (scrutinee_expr),
! 		    std::move (if_let_body), std::move (if_let_expr),
! 		    std::move (outer_attrs), locus));
  	      }
  	    else
  	      {
  		// parse if expr (required)
! 		std::unique_ptr<AST::IfExpr> if_expr = parse_if_expr ();
! 		if (if_expr == nullptr)
  		  {
  		    Error error (lexer.peek_token ()->get_locus (),
  				 "failed to parse (else) if expression after "
--- 819,841 ----
  		    add_error (std::move (error));
  
  		    // skip somewhere?
! 		    return tl::unexpected<Parse::Error::Node> (
! 		      Parse::Error::Node::CHILD_ERROR);
  		  }
  
  		return std::unique_ptr<AST::IfLetExprConseqElse> (
  		  new AST::IfLetExprConseqElse (
! 		    std::move (match_arm_pattern),
! 		    std::move (scrutinee_expr.value ()),
! 		    std::move (if_let_body.value ()),
! 		    std::move (if_let_expr.value ()), std::move (outer_attrs),
! 		    locus));
  	      }
  	    else
  	      {
  		// parse if expr (required)
! 		auto if_expr = parse_if_expr ();
! 		if (!if_expr)
  		  {
  		    Error error (lexer.peek_token ()->get_locus (),
  				 "failed to parse (else) if expression after "
*************** Parser<ManagedTokenSource>::parse_if_let
*** 816,829 ****
  		    add_error (std::move (error));
  
  		    // skip somewhere?
! 		    return nullptr;
  		  }
  
  		return std::unique_ptr<AST::IfLetExprConseqElse> (
  		  new AST::IfLetExprConseqElse (
! 		    std::move (match_arm_patterns), std::move (scrutinee_expr),
! 		    std::move (if_let_body), std::move (if_expr),
! 		    std::move (outer_attrs), locus));
  	      }
  	  }
  	default:
--- 843,859 ----
  		    add_error (std::move (error));
  
  		    // skip somewhere?
! 		    return tl::unexpected<Parse::Error::Node> (
! 		      Parse::Error::Node::CHILD_ERROR);
  		  }
  
  		return std::unique_ptr<AST::IfLetExprConseqElse> (
  		  new AST::IfLetExprConseqElse (
! 		    std::move (match_arm_pattern),
! 		    std::move (scrutinee_expr.value ()),
! 		    std::move (if_let_body.value ()),
! 		    std::move (if_expr.value ()), std::move (outer_attrs),
! 		    locus));
  	      }
  	  }
  	default:
*************** Parser<ManagedTokenSource>::parse_if_let
*** 834,840 ****
  		   t->get_token_description ()));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
      }
  }
--- 864,871 ----
  		   t->get_token_description ()));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
      }
  }
*************** Parser<ManagedTokenSource>::parse_if_let
*** 845,851 ****
  /* Parses a "loop" infinite loop expression. Label is not parsed and should be
   * parsed via parse_labelled_loop_expr, which would call this. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::LoopExpr>
  Parser<ManagedTokenSource>::parse_loop_expr (AST::AttrVec outer_attrs,
  					     tl::optional<AST::LoopLabel> label,
  					     location_t pratt_parsed_loc)
--- 876,882 ----
  /* Parses a "loop" infinite loop expression. Label is not parsed and should be
   * parsed via parse_labelled_loop_expr, which would call this. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::LoopExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_loop_expr (AST::AttrVec outer_attrs,
  					     tl::optional<AST::LoopLabel> label,
  					     location_t pratt_parsed_loc)
*************** Parser<ManagedTokenSource>::parse_loop_e
*** 861,867 ****
        if (!skip_token (LOOP))
  	{
  	  skip_after_end_block ();
! 	  return nullptr;
  	}
      }
    else
--- 892,899 ----
        if (!skip_token (LOOP))
  	{
  	  skip_after_end_block ();
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
      }
    else
*************** Parser<ManagedTokenSource>::parse_loop_e
*** 871,889 ****
      }
  
    // parse loop body, which is required
!   std::unique_ptr<AST::BlockExpr> loop_body = parse_block_expr ();
!   if (loop_body == nullptr)
!     return nullptr;
  
    return std::unique_ptr<AST::LoopExpr> (
!     new AST::LoopExpr (std::move (loop_body), locus, std::move (label),
  		       std::move (outer_attrs)));
  }
  
  /* Parses a "while" loop expression. Label is not parsed and should be parsed
   * via parse_labelled_loop_expr, which would call this. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::WhileLoopExpr>
  Parser<ManagedTokenSource>::parse_while_loop_expr (
    AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label,
    location_t pratt_parsed_loc)
--- 903,921 ----
      }
  
    // parse loop body, which is required
!   auto loop_body = parse_block_expr ();
!   if (!loop_body)
!     return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::CHILD_ERROR);
  
    return std::unique_ptr<AST::LoopExpr> (
!     new AST::LoopExpr (std::move (loop_body.value ()), locus, std::move (label),
  		       std::move (outer_attrs)));
  }
  
  /* Parses a "while" loop expression. Label is not parsed and should be parsed
   * via parse_labelled_loop_expr, which would call this. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::WhileLoopExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_while_loop_expr (
    AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label,
    location_t pratt_parsed_loc)
*************** Parser<ManagedTokenSource>::parse_while_
*** 899,905 ****
        if (!skip_token (WHILE))
  	{
  	  skip_after_end_block ();
! 	  return nullptr;
  	}
      }
    else
--- 931,938 ----
        if (!skip_token (WHILE))
  	{
  	  skip_after_end_block ();
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
      }
    else
*************** Parser<ManagedTokenSource>::parse_while_
*** 917,962 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
    // parse loop predicate (required) with HACK to prevent struct expr parsing
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   std::unique_ptr<AST::Expr> predicate = parse_expr ({}, no_struct_expr);
!   if (predicate == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse predicate expression in while loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
    /* TODO: check that it isn't struct expression here? actually, probably in
     * semantic analysis */
  
    // parse loop body (required)
!   std::unique_ptr<AST::BlockExpr> body = parse_block_expr ();
!   if (body == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse loop body block expression in while loop");
        add_error (std::move (error));
  
        // skip somewhere
!       return nullptr;
      }
  
    return std::unique_ptr<AST::WhileLoopExpr> (
!     new AST::WhileLoopExpr (std::move (predicate), std::move (body), locus,
! 			    std::move (label), std::move (outer_attrs)));
  }
  
  /* Parses a "while let" loop expression. Label is not parsed and should be
   * parsed via parse_labelled_loop_expr, which would call this. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::WhileLetLoopExpr>
  Parser<ManagedTokenSource>::parse_while_let_loop_expr (
    AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label)
  {
--- 950,998 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    // parse loop predicate (required) with HACK to prevent struct expr parsing
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   auto predicate = parse_expr ({}, no_struct_expr);
!   if (!predicate)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse predicate expression in while loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
    /* TODO: check that it isn't struct expression here? actually, probably in
     * semantic analysis */
  
    // parse loop body (required)
!   auto body = parse_block_expr ();
!   if (!body)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse loop body block expression in while loop");
        add_error (std::move (error));
  
        // skip somewhere
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
    return std::unique_ptr<AST::WhileLoopExpr> (
!     new AST::WhileLoopExpr (std::move (predicate.value ()),
! 			    std::move (body.value ()), locus, std::move (label),
! 			    std::move (outer_attrs)));
  }
  
  /* Parses a "while let" loop expression. Label is not parsed and should be
   * parsed via parse_labelled_loop_expr, which would call this. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::WhileLetLoopExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_while_let_loop_expr (
    AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label)
  {
*************** Parser<ManagedTokenSource>::parse_while_
*** 977,1043 ****
        add_error (std::move (error));
  
        // skip somewhere
!       return nullptr;
      }
    // as this token is definitely let now, save the computation of comparison
    lexer.skip_token ();
  
    // parse predicate patterns
!   std::vector<std::unique_ptr<AST::Pattern>> predicate_patterns
!     = parse_match_arm_patterns (EQUAL);
    // ensure that there is at least 1 pattern
!   if (predicate_patterns.empty ())
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "should be at least 1 pattern");
        add_error (std::move (error));
!       return nullptr;
      }
  
    if (!skip_token (EQUAL))
      {
        // skip somewhere?
!       return nullptr;
      }
  
    /* parse predicate expression, which is required (and HACK to prevent struct
     * expr) */
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   std::unique_ptr<AST::Expr> predicate_expr = parse_expr ({}, no_struct_expr);
!   if (predicate_expr == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse predicate expression in while let loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
    /* TODO: ensure that struct expression is not parsed? Actually, probably in
     * semantic analysis. */
  
    // parse loop body, which is required
!   std::unique_ptr<AST::BlockExpr> body = parse_block_expr ();
!   if (body == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse block expr (loop body) of while let loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
!   return std::unique_ptr<AST::WhileLetLoopExpr> (new AST::WhileLetLoopExpr (
!     std::move (predicate_patterns), std::move (predicate_expr),
!     std::move (body), locus, std::move (label), std::move (outer_attrs)));
  }
  
  /* Parses a "for" iterative loop. Label is not parsed and should be parsed via
   * parse_labelled_loop_expr, which would call this. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ForLoopExpr>
  Parser<ManagedTokenSource>::parse_for_loop_expr (
    AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label)
  {
--- 1013,1083 ----
        add_error (std::move (error));
  
        // skip somewhere
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
    // as this token is definitely let now, save the computation of comparison
    lexer.skip_token ();
  
    // parse predicate patterns
!   std::unique_ptr<AST::Pattern> predicate_pattern
!     = parse_match_arm_pattern (EQUAL);
    // ensure that there is at least 1 pattern
!   if (predicate_pattern == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "should be at least 1 pattern");
        add_error (std::move (error));
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    if (!skip_token (EQUAL))
      {
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    /* parse predicate expression, which is required (and HACK to prevent struct
     * expr) */
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   auto predicate_expr = parse_expr ({}, no_struct_expr);
!   if (!predicate_expr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse predicate expression in while let loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
    /* TODO: ensure that struct expression is not parsed? Actually, probably in
     * semantic analysis. */
  
    // parse loop body, which is required
!   auto body = parse_block_expr ();
!   if (!body)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse block expr (loop body) of while let loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
!   return std::unique_ptr<AST::WhileLetLoopExpr> (
!     new AST::WhileLetLoopExpr (std::move (predicate_pattern),
! 			       std::move (predicate_expr.value ()),
! 			       std::move (body.value ()), locus,
! 			       std::move (label), std::move (outer_attrs)));
  }
  
  /* Parses a "for" iterative loop. Label is not parsed and should be parsed via
   * parse_labelled_loop_expr, which would call this. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ForLoopExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_for_loop_expr (
    AST::AttrVec outer_attrs, tl::optional<AST::LoopLabel> label)
  {
*************** Parser<ManagedTokenSource>::parse_for_lo
*** 1050,1138 ****
  
    // parse pattern, which is required
    std::unique_ptr<AST::Pattern> pattern = parse_pattern ();
!   if (pattern == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse iterator pattern in for loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
    if (!skip_token (IN))
      {
        // skip somewhere?
!       return nullptr;
      }
  
    /* parse iterator expression, which is required - also HACK to prevent
     * struct expr */
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   std::unique_ptr<AST::Expr> expr = parse_expr ({}, no_struct_expr);
!   if (expr == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse iterator expression in for loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
    // TODO: check to ensure this isn't struct expr? Or in semantic analysis.
  
    // parse loop body, which is required
!   std::unique_ptr<AST::BlockExpr> body = parse_block_expr ();
!   if (body == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse loop body block expression in for loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
- 
    return std::unique_ptr<AST::ForLoopExpr> (
!     new AST::ForLoopExpr (std::move (pattern), std::move (expr),
! 			  std::move (body), locus, std::move (label),
  			  std::move (outer_attrs)));
  }
  
  // Parses a loop expression with label (any kind of loop - disambiguates).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Expr>
  Parser<ManagedTokenSource>::parse_labelled_loop_expr (const_TokenPtr tok,
  						      AST::AttrVec outer_attrs)
  {
-   /* TODO: decide whether it should not work if there is no label, or parse it
-    * with no label at the moment, I will make it not work with no label
-    * because that's the implication. */
- 
-   if (tok->get_id () != LIFETIME)
-     {
-       Error error (tok->get_locus (),
- 		   "expected lifetime in labelled loop expr (to parse loop "
- 		   "label) - found %qs",
- 		   tok->get_token_description ());
-       add_error (std::move (error));
- 
-       // skip?
-       return nullptr;
-     }
- 
    // parse loop label (required)
-   // TODO: Convert this return type to tl::expected instead of tl::optional
    auto parsed_label = parse_loop_label (tok);
    if (!parsed_label)
      {
!       Error error (lexer.peek_token ()->get_locus (),
! 		   "failed to parse loop label in labelled loop expr");
!       add_error (std::move (error));
  
!       // skip?
!       return nullptr;
      }
  
    auto label = parsed_label
--- 1090,1183 ----
  
    // parse pattern, which is required
    std::unique_ptr<AST::Pattern> pattern = parse_pattern ();
!   if (!pattern)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse iterator pattern in for loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
    if (!skip_token (IN))
      {
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    /* parse iterator expression, which is required - also HACK to prevent
     * struct expr */
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   auto expr = parse_expr ({}, no_struct_expr);
!   if (!expr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse iterator expression in for loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
    // TODO: check to ensure this isn't struct expr? Or in semantic analysis.
  
    // parse loop body, which is required
!   auto body = parse_block_expr ();
!   if (!body)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse loop body block expression in for loop");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
    return std::unique_ptr<AST::ForLoopExpr> (
!     new AST::ForLoopExpr (std::move (pattern), std::move (expr.value ()),
! 			  std::move (body.value ()), locus, std::move (label),
  			  std::move (outer_attrs)));
  }
  
  // Parses a loop expression with label (any kind of loop - disambiguates).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_labelled_loop_expr (const_TokenPtr tok,
  						      AST::AttrVec outer_attrs)
  {
    // parse loop label (required)
    auto parsed_label = parse_loop_label (tok);
    if (!parsed_label)
      {
!       /* TODO: decide whether it should not work if there is no label, or parse
!        * it with no label at the moment, I will make it not work with no label
!        * because that's the implication. */
  
!       if (parsed_label.error ().kind
! 	  == Parse::Error::LoopLabel::Kind::NOT_LOOP_LABEL)
! 	{
! 	  Error error (tok->get_locus (),
! 		       "expected lifetime in labelled loop expr (to parse loop "
! 		       "label) - found %qs",
! 		       tok->get_token_description ());
! 	  add_error (std::move (error));
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
! 	}
! 
!       else
! 	{
! 	  Error error (lexer.peek_token ()->get_locus (),
! 		       "failed to parse loop label in labelled loop expr");
! 	  add_error (std::move (error));
! 
! 	  // skip?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
! 	}
      }
  
    auto label = parsed_label
*************** Parser<ManagedTokenSource>::parse_labell
*** 1150,1164 ****
      case WHILE:
        // further disambiguate into while vs while let
        if (lexer.peek_token (1)->get_id () == LET)
! 	{
! 	  return parse_while_let_loop_expr (std::move (outer_attrs),
! 					    std::move (label));
! 	}
        else
! 	{
! 	  return parse_while_loop_expr (std::move (outer_attrs),
! 					std::move (label));
! 	}
      case LEFT_CURLY:
        return parse_block_expr (std::move (outer_attrs), std::move (label));
      default:
--- 1195,1205 ----
      case WHILE:
        // further disambiguate into while vs while let
        if (lexer.peek_token (1)->get_id () == LET)
! 	return parse_while_let_loop_expr (std::move (outer_attrs),
! 					  std::move (label));
        else
! 	return parse_while_loop_expr (std::move (outer_attrs),
! 				      std::move (label));
      case LEFT_CURLY:
        return parse_block_expr (std::move (outer_attrs), std::move (label));
      default:
*************** Parser<ManagedTokenSource>::parse_labell
*** 1168,1180 ****
  			t->get_token_description ()));
  
        // skip?
!       return nullptr;
      }
  }
  
  // Parses a match expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::MatchExpr>
  Parser<ManagedTokenSource>::parse_match_expr (AST::AttrVec outer_attrs,
  					      location_t pratt_parsed_loc)
  {
--- 1209,1222 ----
  			t->get_token_description ()));
  
        // skip?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  }
  
  // Parses a match expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::MatchExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_match_expr (AST::AttrVec outer_attrs,
  					      location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_match_
*** 1189,1203 ****
     * expr) */
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   std::unique_ptr<AST::Expr> scrutinee = parse_expr ({}, no_struct_expr);
!   if (scrutinee == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse scrutinee expression in match expression");
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
    /* TODO: check for scrutinee expr not being struct expr? or do so in
     * semantic analysis */
--- 1231,1246 ----
     * expr) */
    ParseRestrictions no_struct_expr;
    no_struct_expr.can_be_struct_expr = false;
!   auto scrutinee = parse_expr ({}, no_struct_expr);
!   if (!scrutinee)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse scrutinee expression in match expression");
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
    /* TODO: check for scrutinee expr not being struct expr? or do so in
     * semantic analysis */
*************** Parser<ManagedTokenSource>::parse_match_
*** 1205,1211 ****
    if (!skip_token (LEFT_CURLY))
      {
        // skip somewhere?
!       return nullptr;
      }
  
    // parse inner attributes (if they exist)
--- 1248,1254 ----
    if (!skip_token (LEFT_CURLY))
      {
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    // parse inner attributes (if they exist)
*************** Parser<ManagedTokenSource>::parse_match_
*** 1227,1260 ****
  		       "failed to parse match arm in match arms");
  	  add_error (std::move (error));
  
! 	  return nullptr;
  	}
  
        if (!skip_token (MATCH_ARROW))
  	{
  	  // skip after somewhere?
  	  // TODO is returning here a good idea? or is break better?
! 	  return nullptr;
  	}
  
        ParseRestrictions restrictions;
        restrictions.expr_can_be_stmt = true;
  
!       std::unique_ptr<AST::Expr> expr = parse_expr ({}, restrictions);
  
!       if (expr == nullptr)
  	{
  	  Error error (lexer.peek_token ()->get_locus (),
  		       "failed to parse expr in match arm in match expr");
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
  
!       bool is_expr_without_block = expr->is_expr_without_block ();
  
!       match_arms.push_back (AST::MatchCase (std::move (arm), std::move (expr)));
  
        // handle comma presence
        if (lexer.peek_token ()->get_id () != COMMA)
--- 1270,1307 ----
  		       "failed to parse match arm in match arms");
  	  add_error (std::move (error));
  
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  	}
  
        if (!skip_token (MATCH_ARROW))
  	{
  	  // skip after somewhere?
  	  // TODO is returning here a good idea? or is break better?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
  
        ParseRestrictions restrictions;
        restrictions.expr_can_be_stmt = true;
  
!       auto expr = parse_expr ({}, restrictions);
  
!       if (!expr)
  	{
  	  Error error (lexer.peek_token ()->get_locus (),
  		       "failed to parse expr in match arm in match expr");
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  	}
  
!       bool is_expr_without_block = expr.value ()->is_expr_without_block ();
  
!       match_arms.push_back (
! 	AST::MatchCase (std::move (arm), std::move (expr.value ())));
  
        // handle comma presence
        if (lexer.peek_token ()->get_id () != COMMA)
*************** Parser<ManagedTokenSource>::parse_match_
*** 1273,1279 ****
  			   "expression in match arm (if not final case)");
  	      add_error (std::move (error));
  
! 	      return nullptr;
  	    }
  	  else
  	    {
--- 1320,1327 ----
  			   "expression in match arm (if not final case)");
  	      add_error (std::move (error));
  
! 	      return tl::unexpected<Parse::Error::Node> (
! 		Parse::Error::Node::MALFORMED);
  	    }
  	  else
  	    {
*************** Parser<ManagedTokenSource>::parse_match_
*** 1287,1306 ****
    if (!skip_token (RIGHT_CURLY))
      {
        // skip somewhere?
!       return nullptr;
      }
  
    match_arms.shrink_to_fit ();
  
    return std::unique_ptr<AST::MatchExpr> (
!     new AST::MatchExpr (std::move (scrutinee), std::move (match_arms),
  			std::move (inner_attrs), std::move (outer_attrs),
  			locus));
  }
  
  // Parses an async block expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::AsyncBlockExpr>
  Parser<ManagedTokenSource>::parse_async_block_expr (AST::AttrVec outer_attrs)
  {
    location_t locus = lexer.peek_token ()->get_locus ();
--- 1335,1354 ----
    if (!skip_token (RIGHT_CURLY))
      {
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    match_arms.shrink_to_fit ();
  
    return std::unique_ptr<AST::MatchExpr> (
!     new AST::MatchExpr (std::move (scrutinee.value ()), std::move (match_arms),
  			std::move (inner_attrs), std::move (outer_attrs),
  			locus));
  }
  
  // Parses an async block expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::AsyncBlockExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_async_block_expr (AST::AttrVec outer_attrs)
  {
    location_t locus = lexer.peek_token ()->get_locus ();
*************** Parser<ManagedTokenSource>::parse_async_
*** 1315,1322 ****
      }
  
    // parse block expression (required)
!   std::unique_ptr<AST::BlockExpr> block_expr = parse_block_expr ();
!   if (block_expr == nullptr)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
--- 1363,1370 ----
      }
  
    // parse block expression (required)
!   auto block_expr = parse_block_expr ();
!   if (!block_expr)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_async_
*** 1324,1340 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
    return std::unique_ptr<AST::AsyncBlockExpr> (
!     new AST::AsyncBlockExpr (std::move (block_expr), has_move,
  			     std::move (outer_attrs), locus));
  }
  
  // Parses an unsafe block expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::UnsafeBlockExpr>
  Parser<ManagedTokenSource>::parse_unsafe_block_expr (
    AST::AttrVec outer_attrs, location_t pratt_parsed_loc)
  {
--- 1372,1389 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
    return std::unique_ptr<AST::AsyncBlockExpr> (
!     new AST::AsyncBlockExpr (std::move (block_expr.value ()), has_move,
  			     std::move (outer_attrs), locus));
  }
  
  // Parses an unsafe block expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::UnsafeBlockExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_unsafe_block_expr (
    AST::AttrVec outer_attrs, location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_unsafe
*** 1346,1353 ****
      }
  
    // parse block expression (required)
!   std::unique_ptr<AST::BlockExpr> block_expr = parse_block_expr ();
!   if (block_expr == nullptr)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
--- 1395,1402 ----
      }
  
    // parse block expression (required)
!   auto block_expr = parse_block_expr ();
!   if (!block_expr)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_unsafe
*** 1355,1371 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
- 
    return std::unique_ptr<AST::UnsafeBlockExpr> (
!     new AST::UnsafeBlockExpr (std::move (block_expr), std::move (outer_attrs),
! 			      locus));
  }
  
  // Parses an array definition expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArrayExpr>
  Parser<ManagedTokenSource>::parse_array_expr (AST::AttrVec outer_attrs,
  					      location_t pratt_parsed_loc)
  {
--- 1404,1420 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
    return std::unique_ptr<AST::UnsafeBlockExpr> (
!     new AST::UnsafeBlockExpr (std::move (block_expr.value ()),
! 			      std::move (outer_attrs), locus));
  }
  
  // Parses an array definition expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArrayExpr>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_array_expr (AST::AttrVec outer_attrs,
  					      location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_array_
*** 1396,1403 ****
      {
        // should have array elements
        // parse initial expression, which is required for either
!       std::unique_ptr<AST::Expr> initial_expr = parse_expr ();
!       if (initial_expr == nullptr)
  	{
  	  Error error (lexer.peek_token ()->get_locus (),
  		       "could not parse expression in array expression "
--- 1445,1452 ----
      {
        // should have array elements
        // parse initial expression, which is required for either
!       auto initial_expr = parse_expr ();
!       if (!initial_expr)
  	{
  	  Error error (lexer.peek_token ()->get_locus (),
  		       "could not parse expression in array expression "
*************** Parser<ManagedTokenSource>::parse_array_
*** 1405,1411 ****
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
  
        if (lexer.peek_token ()->get_id () == SEMICOLON)
--- 1454,1461 ----
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  	}
  
        if (lexer.peek_token ()->get_id () == SEMICOLON)
*************** Parser<ManagedTokenSource>::parse_array_
*** 1414,1421 ****
  	  lexer.skip_token ();
  
  	  // parse copy amount expression (required)
! 	  std::unique_ptr<AST::Expr> copy_amount = parse_expr ();
! 	  if (copy_amount == nullptr)
  	    {
  	      Error error (lexer.peek_token ()->get_locus (),
  			   "could not parse copy amount expression in array "
--- 1464,1471 ----
  	  lexer.skip_token ();
  
  	  // parse copy amount expression (required)
! 	  auto copy_amount = parse_expr ();
! 	  if (!copy_amount)
  	    {
  	      Error error (lexer.peek_token ()->get_locus (),
  			   "could not parse copy amount expression in array "
*************** Parser<ManagedTokenSource>::parse_array_
*** 1423,1436 ****
  	      add_error (std::move (error));
  
  	      // skip somewhere?
! 	      return nullptr;
  	    }
  
  	  skip_token (RIGHT_SQUARE);
  
  	  std::unique_ptr<AST::ArrayElemsCopied> copied_array_elems (
! 	    new AST::ArrayElemsCopied (std::move (initial_expr),
! 				       std::move (copy_amount), locus));
  	  return std::unique_ptr<AST::ArrayExpr> (
  	    new AST::ArrayExpr (std::move (copied_array_elems),
  				std::move (inner_attrs),
--- 1473,1488 ----
  	      add_error (std::move (error));
  
  	      // skip somewhere?
! 	      return tl::unexpected<Parse::Error::Node> (
! 		Parse::Error::Node::CHILD_ERROR);
  	    }
  
  	  skip_token (RIGHT_SQUARE);
  
  	  std::unique_ptr<AST::ArrayElemsCopied> copied_array_elems (
! 	    new AST::ArrayElemsCopied (std::move (initial_expr.value ()),
! 				       std::move (copy_amount.value ()),
! 				       locus));
  	  return std::unique_ptr<AST::ArrayExpr> (
  	    new AST::ArrayExpr (std::move (copied_array_elems),
  				std::move (inner_attrs),
*************** Parser<ManagedTokenSource>::parse_array_
*** 1441,1447 ****
  	  // single-element array expression
  	  std::vector<std::unique_ptr<AST::Expr>> exprs;
  	  exprs.reserve (1);
! 	  exprs.push_back (std::move (initial_expr));
  	  exprs.shrink_to_fit ();
  
  	  skip_token (RIGHT_SQUARE);
--- 1493,1499 ----
  	  // single-element array expression
  	  std::vector<std::unique_ptr<AST::Expr>> exprs;
  	  exprs.reserve (1);
! 	  exprs.push_back (std::move (initial_expr.value ()));
  	  exprs.shrink_to_fit ();
  
  	  skip_token (RIGHT_SQUARE);
*************** Parser<ManagedTokenSource>::parse_array_
*** 1457,1463 ****
  	{
  	  // multi-element array expression (or trailing comma)
  	  std::vector<std::unique_ptr<AST::Expr>> exprs;
! 	  exprs.push_back (std::move (initial_expr));
  
  	  const_TokenPtr t = lexer.peek_token ();
  	  while (t->get_id () == COMMA)
--- 1509,1515 ----
  	{
  	  // multi-element array expression (or trailing comma)
  	  std::vector<std::unique_ptr<AST::Expr>> exprs;
! 	  exprs.push_back (std::move (initial_expr.value ()));
  
  	  const_TokenPtr t = lexer.peek_token ();
  	  while (t->get_id () == COMMA)
*************** Parser<ManagedTokenSource>::parse_array_
*** 1469,1485 ****
  		break;
  
  	      // parse expression (required)
! 	      std::unique_ptr<AST::Expr> expr = parse_expr ();
! 	      if (expr == nullptr)
  		{
  		  Error error (lexer.peek_token ()->get_locus (),
  			       "failed to parse element in array expression");
  		  add_error (std::move (error));
  
  		  // skip somewhere?
! 		  return nullptr;
  		}
! 	      exprs.push_back (std::move (expr));
  
  	      t = lexer.peek_token ();
  	    }
--- 1521,1538 ----
  		break;
  
  	      // parse expression (required)
! 	      auto expr = parse_expr ();
! 	      if (!expr)
  		{
  		  Error error (lexer.peek_token ()->get_locus (),
  			       "failed to parse element in array expression");
  		  add_error (std::move (error));
  
  		  // skip somewhere?
! 		  return tl::unexpected<Parse::Error::Node> (
! 		    Parse::Error::Node::CHILD_ERROR);
  		}
! 	      exprs.push_back (std::move (expr.value ()));
  
  	      t = lexer.peek_token ();
  	    }
*************** Parser<ManagedTokenSource>::parse_array_
*** 1504,1517 ****
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
      }
  }
  
  // Parses a grouped or tuple expression (disambiguates).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ExprWithoutBlock>
  Parser<ManagedTokenSource>::parse_grouped_or_tuple_expr (
    AST::AttrVec outer_attrs, location_t pratt_parsed_loc)
  {
--- 1557,1571 ----
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::MALFORMED);
  	}
      }
  }
  
  // Parses a grouped or tuple expression (disambiguates).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ExprWithoutBlock>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_grouped_or_tuple_expr (
    AST::AttrVec outer_attrs, location_t pratt_parsed_loc)
  {
*************** Parser<ManagedTokenSource>::parse_groupe
*** 1539,1553 ****
      }
  
    // parse first expression (required)
!   std::unique_ptr<AST::Expr> first_expr = parse_expr ();
!   if (first_expr == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse expression in grouped or tuple expression");
        add_error (std::move (error));
  
        // skip after somewhere?
!       return nullptr;
      }
  
    // detect whether grouped expression with right parentheses as next token
--- 1593,1608 ----
      }
  
    // parse first expression (required)
!   auto first_expr = parse_expr ();
!   if (!first_expr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse expression in grouped or tuple expression");
        add_error (std::move (error));
  
        // skip after somewhere?
!       return tl::unexpected<Parse::Error::Node> (
! 	Parse::Error::Node::CHILD_ERROR);
      }
  
    // detect whether grouped expression with right parentheses as next token
*************** Parser<ManagedTokenSource>::parse_groupe
*** 1558,1571 ****
  
        // create grouped expr
        return std::unique_ptr<AST::GroupedExpr> (
! 	new AST::GroupedExpr (std::move (first_expr), std::move (inner_attrs),
! 			      std::move (outer_attrs), locus));
      }
    else if (lexer.peek_token ()->get_id () == COMMA)
      {
        // tuple expr
        std::vector<std::unique_ptr<AST::Expr>> exprs;
!       exprs.push_back (std::move (first_expr));
  
        // parse potential other tuple exprs
        const_TokenPtr t = lexer.peek_token ();
--- 1613,1627 ----
  
        // create grouped expr
        return std::unique_ptr<AST::GroupedExpr> (
! 	new AST::GroupedExpr (std::move (first_expr.value ()),
! 			      std::move (inner_attrs), std::move (outer_attrs),
! 			      locus));
      }
    else if (lexer.peek_token ()->get_id () == COMMA)
      {
        // tuple expr
        std::vector<std::unique_ptr<AST::Expr>> exprs;
!       exprs.push_back (std::move (first_expr.value ()));
  
        // parse potential other tuple exprs
        const_TokenPtr t = lexer.peek_token ();
*************** Parser<ManagedTokenSource>::parse_groupe
*** 1578,1594 ****
  	    break;
  
  	  // parse expr, which is now required
! 	  std::unique_ptr<AST::Expr> expr = parse_expr ();
! 	  if (expr == nullptr)
  	    {
  	      Error error (lexer.peek_token ()->get_locus (),
  			   "failed to parse expr in tuple expr");
  	      add_error (std::move (error));
  
  	      // skip somewhere?
! 	      return nullptr;
  	    }
! 	  exprs.push_back (std::move (expr));
  
  	  t = lexer.peek_token ();
  	}
--- 1634,1651 ----
  	    break;
  
  	  // parse expr, which is now required
! 	  auto expr = parse_expr ();
! 	  if (!expr)
  	    {
  	      Error error (lexer.peek_token ()->get_locus (),
  			   "failed to parse expr in tuple expr");
  	      add_error (std::move (error));
  
  	      // skip somewhere?
! 	      return tl::unexpected<Parse::Error::Node> (
! 		Parse::Error::Node::CHILD_ERROR);
  	    }
! 	  exprs.push_back (std::move (expr.value ()));
  
  	  t = lexer.peek_token ();
  	}
*************** Parser<ManagedTokenSource>::parse_groupe
*** 1612,1624 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  }
  
  // Parses a struct expression field.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::StructExprField>
  Parser<ManagedTokenSource>::parse_struct_expr_field ()
  {
    AST::AttrVec outer_attrs = parse_outer_attributes ();
--- 1669,1682 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  }
  
  // Parses a struct expression field.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::StructExprField>,
! 	     Parse::Error::StructExprField>
  Parser<ManagedTokenSource>::parse_struct_expr_field ()
  {
    AST::AttrVec outer_attrs = parse_outer_attributes ();
*************** Parser<ManagedTokenSource>::parse_struct
*** 1633,1652 ****
  	  lexer.skip_token (1);
  
  	  // parse expression (required)
! 	  std::unique_ptr<AST::Expr> expr = parse_expr ();
! 	  if (expr == nullptr)
  	    {
  	      Error error (t->get_locus (),
  			   "failed to parse struct expression field with "
  			   "identifier and expression");
  	      add_error (std::move (error));
  
! 	      return nullptr;
  	    }
  
  	  return std::unique_ptr<AST::StructExprFieldIdentifierValue> (
  	    new AST::StructExprFieldIdentifierValue (std::move (ident),
! 						     std::move (expr),
  						     std::move (outer_attrs),
  						     t->get_locus ()));
  	}
--- 1691,1711 ----
  	  lexer.skip_token (1);
  
  	  // parse expression (required)
! 	  auto expr = parse_expr ();
! 	  if (!expr)
  	    {
  	      Error error (t->get_locus (),
  			   "failed to parse struct expression field with "
  			   "identifier and expression");
  	      add_error (std::move (error));
  
! 	      return tl::unexpected<Parse::Error::StructExprField> (
! 		Parse::Error::StructExprField::CHILD_ERROR);
  	    }
  
  	  return std::unique_ptr<AST::StructExprFieldIdentifierValue> (
  	    new AST::StructExprFieldIdentifierValue (std::move (ident),
! 						     std::move (expr.value ()),
  						     std::move (outer_attrs),
  						     t->get_locus ()));
  	}
*************** Parser<ManagedTokenSource>::parse_struct
*** 1670,1692 ****
  	if (!skip_token (COLON))
  	  {
  	    // skip somewhere?
! 	    return nullptr;
  	  }
  
  	// parse field expression (required)
! 	std::unique_ptr<AST::Expr> expr = parse_expr ();
! 	if (expr == nullptr)
  	  {
  	    Error error (t->get_locus (),
  			 "failed to parse expr in struct (or enum) expr "
  			 "field with tuple index");
  	    add_error (std::move (error));
  
! 	    return nullptr;
  	  }
  
  	return std::unique_ptr<AST::StructExprFieldIndexValue> (
! 	  new AST::StructExprFieldIndexValue (index, std::move (expr),
  					      std::move (outer_attrs),
  					      t->get_locus ()));
        }
--- 1729,1753 ----
  	if (!skip_token (COLON))
  	  {
  	    // skip somewhere?
! 	    return tl::unexpected<Parse::Error::StructExprField> (
! 	      Parse::Error::StructExprField::MALFORMED);
  	  }
  
  	// parse field expression (required)
! 	auto expr = parse_expr ();
! 	if (!expr)
  	  {
  	    Error error (t->get_locus (),
  			 "failed to parse expr in struct (or enum) expr "
  			 "field with tuple index");
  	    add_error (std::move (error));
  
! 	    return tl::unexpected<Parse::Error::StructExprField> (
! 	      Parse::Error::StructExprField::CHILD_ERROR);
  	  }
  
  	return std::unique_ptr<AST::StructExprFieldIndexValue> (
! 	  new AST::StructExprFieldIndexValue (index, std::move (expr.value ()),
  					      std::move (outer_attrs),
  					      t->get_locus ()));
        }
*************** Parser<ManagedTokenSource>::parse_struct
*** 1694,1700 ****
        /* this is a struct base and can't be parsed here, so just return
         * nothing without erroring */
  
!       return nullptr;
      default:
        add_error (
  	Error (t->get_locus (),
--- 1755,1762 ----
        /* this is a struct base and can't be parsed here, so just return
         * nothing without erroring */
  
!       return tl::unexpected<Parse::Error::StructExprField> (
! 	Parse::Error::StructExprField::STRUCT_BASE);
      default:
        add_error (
  	Error (t->get_locus (),
*************** Parser<ManagedTokenSource>::parse_struct
*** 1702,1715 ****
  	       "expected identifier or integer literal",
  	       t->get_token_description ()));
  
!       return nullptr;
      }
  }
  
  /* Pratt parser impl of parse_expr. FIXME: this is only provisional and
   * probably will be changed. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Expr>
  Parser<ManagedTokenSource>::parse_expr (int right_binding_power,
  					AST::AttrVec outer_attrs,
  					ParseRestrictions restrictions)
--- 1764,1778 ----
  	       "expected identifier or integer literal",
  	       t->get_token_description ()));
  
!       return tl::unexpected<Parse::Error::StructExprField> (
! 	Parse::Error::StructExprField::MALFORMED);
      }
  }
  
  /* Pratt parser impl of parse_expr. FIXME: this is only provisional and
   * probably will be changed. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_expr (int right_binding_power,
  					AST::AttrVec outer_attrs,
  					ParseRestrictions restrictions)
*************** Parser<ManagedTokenSource>::parse_expr (
*** 1725,1741 ****
        TokenId id = current_token->get_id ();
        if (id == SEMICOLON || id == RIGHT_PAREN || id == RIGHT_CURLY
  	  || id == RIGHT_SQUARE || id == COMMA || id == LEFT_CURLY)
! 	return nullptr;
      }
  
    ParseRestrictions null_denotation_restrictions = restrictions;
    null_denotation_restrictions.expr_can_be_stmt = false;
  
    // parse null denotation (unary part of expression)
!   std::unique_ptr<AST::Expr> expr
      = null_denotation ({}, null_denotation_restrictions);
!   if (expr == nullptr)
!     return nullptr;
  
    return left_denotations (std::move (expr), right_binding_power,
  			   std::move (outer_attrs), restrictions);
--- 1788,1805 ----
        TokenId id = current_token->get_id ();
        if (id == SEMICOLON || id == RIGHT_PAREN || id == RIGHT_CURLY
  	  || id == RIGHT_SQUARE || id == COMMA || id == LEFT_CURLY)
! 	return tl::unexpected<Parse::Error::Expr> (
! 	  Parse::Error::Expr::NULL_EXPR);
      }
  
    ParseRestrictions null_denotation_restrictions = restrictions;
    null_denotation_restrictions.expr_can_be_stmt = false;
  
    // parse null denotation (unary part of expression)
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr> expr
      = null_denotation ({}, null_denotation_restrictions);
!   if (!expr)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    return left_denotations (std::move (expr), right_binding_power,
  			   std::move (outer_attrs), restrictions);
*************** Parser<ManagedTokenSource>::parse_expr (
*** 1743,1749 ****
  
  // Parse expression with lowest left binding power.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Expr>
  Parser<ManagedTokenSource>::parse_expr (AST::AttrVec outer_attrs,
  					ParseRestrictions restrictions)
  {
--- 1807,1813 ----
  
  // Parse expression with lowest left binding power.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_expr (AST::AttrVec outer_attrs,
  					ParseRestrictions restrictions)
  {
*************** Parser<ManagedTokenSource>::parse_expr (
*** 1751,1777 ****
  }
  
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Expr>
! Parser<ManagedTokenSource>::left_denotations (std::unique_ptr<AST::Expr> expr,
! 					      int right_binding_power,
! 					      AST::AttrVec outer_attrs,
! 					      ParseRestrictions restrictions)
  {
!   if (expr == nullptr)
      {
        // DEBUG
        rust_debug ("null denotation is null; returning null for parse_expr");
!       return nullptr;
      }
  
    const_TokenPtr current_token = lexer.peek_token ();
  
!   if (restrictions.expr_can_be_stmt && !expr->is_expr_without_block ()
        && current_token->get_id () != DOT
        && current_token->get_id () != QUESTION_MARK)
      {
        rust_debug ("statement expression with block");
!       expr->set_outer_attrs (std::move (outer_attrs));
        return expr;
      }
  
--- 1815,1842 ----
  }
  
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
! Parser<ManagedTokenSource>::left_denotations (
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr> expr,
!   int right_binding_power, AST::AttrVec outer_attrs,
!   ParseRestrictions restrictions)
  {
!   if (!expr)
      {
        // DEBUG
        rust_debug ("null denotation is null; returning null for parse_expr");
!       return tl::unexpected<Parse::Error::Expr> (
! 	Parse::Error::Expr::NULL_DENOTATION);
      }
  
    const_TokenPtr current_token = lexer.peek_token ();
  
!   if (restrictions.expr_can_be_stmt && !expr.value ()->is_expr_without_block ()
        && current_token->get_id () != DOT
        && current_token->get_id () != QUESTION_MARK)
      {
        rust_debug ("statement expression with block");
!       expr.value ()->set_outer_attrs (std::move (outer_attrs));
        return expr;
      }
  
*************** Parser<ManagedTokenSource>::left_denotat
*** 1783,1797 ****
        lexer.skip_token ();
  
        // FIXME attributes should generally be applied to the null denotation.
!       expr = left_denotation (current_token, std::move (expr),
  			      std::move (outer_attrs), restrictions);
  
!       if (expr == nullptr)
  	{
  	  // DEBUG
  	  rust_debug ("left denotation is null; returning null for parse_expr");
  
! 	  return nullptr;
  	}
  
        current_token = lexer.peek_token ();
--- 1848,1863 ----
        lexer.skip_token ();
  
        // FIXME attributes should generally be applied to the null denotation.
!       expr = left_denotation (current_token, std::move (expr.value ()),
  			      std::move (outer_attrs), restrictions);
  
!       if (!expr)
  	{
  	  // DEBUG
  	  rust_debug ("left denotation is null; returning null for parse_expr");
  
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::LEFT_DENOTATION);
  	}
  
        current_token = lexer.peek_token ();
*************** Parser<ManagedTokenSource>::left_denotat
*** 1802,1808 ****
  
  /* Determines action to take when finding token at beginning of expression. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Expr>
  Parser<ManagedTokenSource>::null_denotation (AST::AttrVec outer_attrs,
  					     ParseRestrictions restrictions)
  {
--- 1868,1874 ----
  
  /* Determines action to take when finding token at beginning of expression. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::null_denotation (AST::AttrVec outer_attrs,
  					     ParseRestrictions restrictions)
  {
*************** Parser<ManagedTokenSource>::null_denotat
*** 1835,1840 ****
--- 1901,1932 ----
  	return null_denotation_path (std::move (path), std::move (outer_attrs),
  				     restrictions);
        }
+     case HASH:
+       {
+ 	// Parse outer attributes and then the expression that follows
+ 	AST::AttrVec attrs = parse_outer_attributes ();
+ 
+ 	// Merge with any existing outer attributes
+ 	if (!outer_attrs.empty ())
+ 	  attrs.insert (attrs.begin (), outer_attrs.begin (),
+ 			outer_attrs.end ());
+ 
+ 	// Try to parse the expression that should follow the attributes
+ 	auto expr = parse_expr (std::move (attrs), restrictions);
+ 	if (!expr)
+ 	  {
+ 	    /* If parsing failed and we're at a semicolon, provide a better
+ 	     * error
+ 	     */
+ 	    const_TokenPtr next_tok = lexer.peek_token ();
+ 	    if (next_tok->get_id () == SEMICOLON)
+ 	      add_error (Error (next_tok->get_locus (),
+ 				"expected expression, found %<;%>"));
+ 	    return tl::unexpected<Parse::Error::Expr> (
+ 	      Parse::Error::Expr::CHILD_ERROR);
+ 	  }
+ 	return expr;
+       }
      default:
        if (tok->get_id () == LEFT_SHIFT)
  	{
*************** Parser<ManagedTokenSource>::null_denotat
*** 1850,1856 ****
  
  // Handling of expresions that start with a path for `null_denotation`.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Expr>
  Parser<ManagedTokenSource>::null_denotation_path (
    AST::PathInExpression path, AST::AttrVec outer_attrs,
    ParseRestrictions restrictions)
--- 1942,1948 ----
  
  // Handling of expresions that start with a path for `null_denotation`.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::null_denotation_path (
    AST::PathInExpression path, AST::AttrVec outer_attrs,
    ParseRestrictions restrictions)
*************** Parser<ManagedTokenSource>::null_denotat
*** 1863,1870 ****
      {
        // HACK: add outer attrs to path
        path.set_outer_attrs (std::move (outer_attrs));
!       return std::unique_ptr<AST::PathInExpression> (
! 	new AST::PathInExpression (std::move (path)));
      }
  
    // branch on next token
--- 1955,1961 ----
      {
        // HACK: add outer attrs to path
        path.set_outer_attrs (std::move (outer_attrs));
!       return std::make_unique<AST::PathInExpression> (std::move (path));
      }
  
    // branch on next token
*************** Parser<ManagedTokenSource>::null_denotat
*** 1918,1925 ****
  	  // assume path is returned
  	  // HACK: add outer attributes to path
  	  path.set_outer_attrs (std::move (outer_attrs));
! 	  return std::unique_ptr<AST::PathInExpression> (
! 	    new AST::PathInExpression (std::move (path)));
  	}
        return parse_struct_expr_tuple_partial (std::move (path),
  					      std::move (outer_attrs));
--- 2009,2015 ----
  	  // assume path is returned
  	  // HACK: add outer attributes to path
  	  path.set_outer_attrs (std::move (outer_attrs));
! 	  return std::make_unique<AST::PathInExpression> (std::move (path));
  	}
        return parse_struct_expr_tuple_partial (std::move (path),
  					      std::move (outer_attrs));
*************** Parser<ManagedTokenSource>::null_denotat
*** 1944,1950 ****
  
  // Handling of expresions that do not start with a path for `null_denotation`.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Expr>
  Parser<ManagedTokenSource>::null_denotation_not_path (
    const_TokenPtr tok, AST::AttrVec outer_attrs, ParseRestrictions restrictions)
  {
--- 2034,2040 ----
  
  // Handling of expresions that do not start with a path for `null_denotation`.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::null_denotation_not_path (
    const_TokenPtr tok, AST::AttrVec outer_attrs, ParseRestrictions restrictions)
  {
*************** Parser<ManagedTokenSource>::null_denotat
*** 1959,1966 ****
  	AST::QualifiedPathInExpression path
  	  = parse_qualified_path_in_expression (tok->get_locus ());
  	path.set_outer_attrs (std::move (outer_attrs));
! 	return std::unique_ptr<AST::QualifiedPathInExpression> (
! 	  new AST::QualifiedPathInExpression (std::move (path)));
        }
      // FIXME: delegate to parse_literal_expr instead? would have to rejig
      // tokens and whatever.
--- 2049,2056 ----
  	AST::QualifiedPathInExpression path
  	  = parse_qualified_path_in_expression (tok->get_locus ());
  	path.set_outer_attrs (std::move (outer_attrs));
! 	return std::make_unique<AST::QualifiedPathInExpression> (
! 	  std::move (path));
        }
      // FIXME: delegate to parse_literal_expr instead? would have to rejig
      // tokens and whatever.
*************** Parser<ManagedTokenSource>::null_denotat
*** 2008,2015 ****
  			      AST::Literal::BOOL, tok->get_type_hint (), {},
  			      tok->get_locus ()));
      case LEFT_PAREN:
!       return parse_grouped_or_tuple_expr (std::move (outer_attrs),
! 					  tok->get_locus ());
  
      /*case PLUS: { // unary plus operator
  	// invoke parse_expr recursively with appropriate priority, etc. for
--- 2098,2113 ----
  			      AST::Literal::BOOL, tok->get_type_hint (), {},
  			      tok->get_locus ()));
      case LEFT_PAREN:
!       {
! 	auto grouped_or_tuple_expr
! 	  = parse_grouped_or_tuple_expr (std::move (outer_attrs),
! 					 tok->get_locus ());
! 	if (grouped_or_tuple_expr)
! 	  return std::move (grouped_or_tuple_expr.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
  
      /*case PLUS: { // unary plus operator
  	// invoke parse_expr recursively with appropriate priority, etc. for
*************** Parser<ManagedTokenSource>::null_denotat
*** 2033,2043 ****
  	entered_from_unary.entered_from_unary = true;
  	if (!restrictions.can_be_struct_expr)
  	  entered_from_unary.can_be_struct_expr = false;
! 	std::unique_ptr<AST::Expr> expr
! 	  = parse_expr (LBP_UNARY_MINUS, {}, entered_from_unary);
  
! 	if (expr == nullptr)
! 	  return nullptr;
  	// can only apply to integer and float expressions
  	/*if (expr.get_type() != integer_type_node || expr.get_type() !=
  	float_type_node) { rust_error_at(tok->get_locus(), "operand of unary
--- 2131,2141 ----
  	entered_from_unary.entered_from_unary = true;
  	if (!restrictions.can_be_struct_expr)
  	  entered_from_unary.can_be_struct_expr = false;
! 	auto expr = parse_expr (LBP_UNARY_MINUS, {}, entered_from_unary);
  
! 	if (!expr)
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	// can only apply to integer and float expressions
  	/*if (expr.get_type() != integer_type_node || expr.get_type() !=
  	float_type_node) { rust_error_at(tok->get_locus(), "operand of unary
*************** Parser<ManagedTokenSource>::null_denotat
*** 2051,2059 ****
  
  	/* FIXME: allow outer attributes on these expressions by having an
  	 * outer attrs parameter in function*/
! 	return std::unique_ptr<AST::NegationExpr> (
! 	  new AST::NegationExpr (std::move (expr), NegationOperator::NEGATE,
! 				 std::move (outer_attrs), tok->get_locus ()));
        }
      case EXCLAM:
        { // logical or bitwise not
--- 2149,2158 ----
  
  	/* FIXME: allow outer attributes on these expressions by having an
  	 * outer attrs parameter in function*/
! 	return std::make_unique<AST::NegationExpr> (std::move (expr.value ()),
! 						    NegationOperator::NEGATE,
! 						    std::move (outer_attrs),
! 						    tok->get_locus ());
        }
      case EXCLAM:
        { // logical or bitwise not
*************** Parser<ManagedTokenSource>::null_denotat
*** 2061,2071 ****
  	entered_from_unary.entered_from_unary = true;
  	if (!restrictions.can_be_struct_expr)
  	  entered_from_unary.can_be_struct_expr = false;
! 	std::unique_ptr<AST::Expr> expr
! 	  = parse_expr (LBP_UNARY_EXCLAM, {}, entered_from_unary);
  
! 	if (expr == nullptr)
! 	  return nullptr;
  	// can only apply to boolean expressions
  	/*if (expr.get_type() != boolean_type_node) {
  	    rust_error_at(tok->get_locus(),
--- 2160,2170 ----
  	entered_from_unary.entered_from_unary = true;
  	if (!restrictions.can_be_struct_expr)
  	  entered_from_unary.can_be_struct_expr = false;
! 	auto expr = parse_expr (LBP_UNARY_EXCLAM, {}, entered_from_unary);
  
! 	if (!expr)
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	// can only apply to boolean expressions
  	/*if (expr.get_type() != boolean_type_node) {
  	    rust_error_at(tok->get_locus(),
*************** Parser<ManagedTokenSource>::null_denotat
*** 2077,2085 ****
  	 * analysis */
  
  	// FIXME: allow outer attributes on these expressions
! 	return std::unique_ptr<AST::NegationExpr> (
! 	  new AST::NegationExpr (std::move (expr), NegationOperator::NOT,
! 				 std::move (outer_attrs), tok->get_locus ()));
        }
      case ASTERISK:
        {
--- 2176,2185 ----
  	 * analysis */
  
  	// FIXME: allow outer attributes on these expressions
! 	return std::make_unique<AST::NegationExpr> (std::move (expr.value ()),
! 						    NegationOperator::NOT,
! 						    std::move (outer_attrs),
! 						    tok->get_locus ());
        }
      case ASTERISK:
        {
*************** Parser<ManagedTokenSource>::null_denotat
*** 2088,2104 ****
  	ParseRestrictions entered_from_unary;
  	entered_from_unary.entered_from_unary = true;
  	entered_from_unary.can_be_struct_expr = false;
! 	std::unique_ptr<AST::Expr> expr
! 	  = parse_expr (LBP_UNARY_ASTERISK, {}, entered_from_unary);
  	// FIXME: allow outer attributes on expression
! 	return std::unique_ptr<AST::DereferenceExpr> (
! 	  new AST::DereferenceExpr (std::move (expr), std::move (outer_attrs),
! 				    tok->get_locus ()));
        }
      case AMP:
        {
  	// (single) "borrow" expression - shared (mutable) or immutable
! 	std::unique_ptr<AST::Expr> expr = nullptr;
  	Mutability mutability = Mutability::Imm;
  	bool raw_borrow = false;
  
--- 2188,2208 ----
  	ParseRestrictions entered_from_unary;
  	entered_from_unary.entered_from_unary = true;
  	entered_from_unary.can_be_struct_expr = false;
! 	auto expr = parse_expr (LBP_UNARY_ASTERISK, {}, entered_from_unary);
! 	if (!expr)
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	// FIXME: allow outer attributes on expression
! 	return std::make_unique<AST::DereferenceExpr> (std::move (
! 							 expr.value ()),
! 						       std::move (outer_attrs),
! 						       tok->get_locus ());
        }
      case AMP:
        {
  	// (single) "borrow" expression - shared (mutable) or immutable
! 	tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr> expr
! 	  = tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
  	Mutability mutability = Mutability::Imm;
  	bool raw_borrow = false;
  
*************** Parser<ManagedTokenSource>::null_denotat
*** 2132,2157 ****
  			       "raw borrow should be either const or mut");
  	      }
  	    lexer.skip_token ();
! 	    expr = parse_expr (LBP_UNARY_AMP_MUT, {}, entered_from_unary);
  	    raw_borrow = true;
  	  }
  	else if (t->get_id () == MUT)
  	  {
  	    lexer.skip_token ();
! 	    expr = parse_expr (LBP_UNARY_AMP_MUT, {}, entered_from_unary);
  	    mutability = Mutability::Mut;
  	    raw_borrow = false;
  	  }
  	else
  	  {
! 	    expr = parse_expr (LBP_UNARY_AMP, {}, entered_from_unary);
  	    raw_borrow = false;
  	  }
  
  	// FIXME: allow outer attributes on expression
! 	return std::unique_ptr<AST::BorrowExpr> (
! 	  new AST::BorrowExpr (std::move (expr), mutability, raw_borrow, false,
! 			       std::move (outer_attrs), tok->get_locus ()));
        }
      case LOGICAL_AND:
        {
--- 2236,2280 ----
  			       "raw borrow should be either const or mut");
  	      }
  	    lexer.skip_token ();
! 	    auto expr_result
! 	      = parse_expr (LBP_UNARY_AMP_MUT, {}, entered_from_unary);
! 	    if (expr_result)
! 	      expr = std::move (expr_result.value ());
! 	    else
! 	      return tl::unexpected<Parse::Error::Expr> (
! 		Parse::Error::Expr::CHILD_ERROR);
  	    raw_borrow = true;
  	  }
  	else if (t->get_id () == MUT)
  	  {
  	    lexer.skip_token ();
! 	    auto expr_result
! 	      = parse_expr (LBP_UNARY_AMP_MUT, {}, entered_from_unary);
! 	    if (expr_result)
! 	      expr = std::move (expr_result.value ());
! 	    else
! 	      return tl::unexpected<Parse::Error::Expr> (
! 		Parse::Error::Expr::CHILD_ERROR);
  	    mutability = Mutability::Mut;
  	    raw_borrow = false;
  	  }
  	else
  	  {
! 	    auto expr_result
! 	      = parse_expr (LBP_UNARY_AMP, {}, entered_from_unary);
! 	    if (expr_result)
! 	      expr = std::move (expr_result.value ());
! 	    else
! 	      return tl::unexpected<Parse::Error::Expr> (
! 		Parse::Error::Expr::CHILD_ERROR);
  	    raw_borrow = false;
  	  }
  
  	// FIXME: allow outer attributes on expression
! 	return std::make_unique<AST::BorrowExpr> (std::move (expr.value ()),
! 						  mutability, raw_borrow, false,
! 						  std::move (outer_attrs),
! 						  tok->get_locus ());
        }
      case LOGICAL_AND:
        {
*************** Parser<ManagedTokenSource>::null_denotat
*** 2165,2265 ****
  	if (lexer.peek_token ()->get_id () == MUT)
  	  {
  	    lexer.skip_token ();
! 	    expr = parse_expr (LBP_UNARY_AMP_MUT, {}, entered_from_unary);
  	    mutability = Mutability::Mut;
  	  }
  	else
  	  {
! 	    expr = parse_expr (LBP_UNARY_AMP, {}, entered_from_unary);
  	    mutability = Mutability::Imm;
  	  }
  
  	// FIXME: allow outer attributes on expression
! 	return std::unique_ptr<AST::BorrowExpr> (
! 	  new AST::BorrowExpr (std::move (expr), mutability, false, true,
! 			       std::move (outer_attrs), tok->get_locus ()));
        }
      case OR:
      case PIPE:
      case MOVE:
        // closure expression
!       return parse_closure_expr_pratt (tok, std::move (outer_attrs));
      case DOT_DOT:
        // either "range to" or "range full" expressions
!       return parse_nud_range_exclusive_expr (tok, std::move (outer_attrs));
      case DOT_DOT_EQ:
        // range to inclusive expr
!       return parse_range_to_inclusive_expr (tok, std::move (outer_attrs));
      case RETURN_KW:
        // FIXME: is this really a null denotation expression?
!       return parse_return_expr (std::move (outer_attrs), tok->get_locus ());
      case TRY:
        // FIXME: is this really a null denotation expression?
!       return parse_try_expr (std::move (outer_attrs), tok->get_locus ());
      case BREAK:
        // FIXME: is this really a null denotation expression?
!       return parse_break_expr (std::move (outer_attrs), tok->get_locus ());
      case CONTINUE:
        return parse_continue_expr (std::move (outer_attrs), tok->get_locus ());
      case LEFT_CURLY:
        // ok - this is an expression with block for once.
!       return parse_block_expr (std::move (outer_attrs), tl::nullopt,
! 			       tok->get_locus ());
      case IF:
        // if or if let, so more lookahead to find out
        if (lexer.peek_token ()->get_id () == LET)
  	{
  	  // if let expr
! 	  return parse_if_let_expr (std::move (outer_attrs), tok->get_locus ());
  	}
        else
  	{
  	  // if expr
! 	  return parse_if_expr (std::move (outer_attrs), tok->get_locus ());
  	}
      case LIFETIME:
!       return parse_labelled_loop_expr (tok, std::move (outer_attrs));
      case LOOP:
!       return parse_loop_expr (std::move (outer_attrs), tl::nullopt,
! 			      tok->get_locus ());
      case WHILE:
        if (lexer.peek_token ()->get_id () == LET)
  	{
! 	  return parse_while_let_loop_expr (std::move (outer_attrs));
  	}
        else
  	{
! 	  return parse_while_loop_expr (std::move (outer_attrs), tl::nullopt,
! 					tok->get_locus ());
  	}
      case FOR:
!       return parse_for_loop_expr (std::move (outer_attrs), tl::nullopt);
      case MATCH_KW:
        // also an expression with block
!       return parse_match_expr (std::move (outer_attrs), tok->get_locus ());
      case LEFT_SQUARE:
        // array definition expr (not indexing)
!       return parse_array_expr (std::move (outer_attrs), tok->get_locus ());
      case UNSAFE:
!       return parse_unsafe_block_expr (std::move (outer_attrs),
! 				      tok->get_locus ());
      case BOX:
!       return parse_box_expr (std::move (outer_attrs), tok->get_locus ());
      case UNDERSCORE:
        add_error (
  	Error (tok->get_locus (),
  	       "use of %qs is not allowed on the right-side of an assignment",
  	       tok->get_token_description ()));
!       return nullptr;
      case CONST:
!       return parse_const_block_expr (std::move (outer_attrs),
! 				     tok->get_locus ());
      default:
        if (!restrictions.expr_can_be_null)
  	add_error (Error (tok->get_locus (),
  			  "found unexpected token %qs in null denotation",
  			  tok->get_token_description ()));
!       return nullptr;
      }
  }
  
--- 2288,2532 ----
  	if (lexer.peek_token ()->get_id () == MUT)
  	  {
  	    lexer.skip_token ();
! 	    auto expr_res
! 	      = parse_expr (LBP_UNARY_AMP_MUT, {}, entered_from_unary);
! 	    if (!expr_res)
! 	      return tl::unexpected<Parse::Error::Expr> (
! 		Parse::Error::Expr::CHILD_ERROR);
! 	    expr = std::move (expr_res.value ());
  	    mutability = Mutability::Mut;
  	  }
  	else
  	  {
! 	    auto expr_result
! 	      = parse_expr (LBP_UNARY_AMP, {}, entered_from_unary);
! 	    if (expr_result)
! 	      expr = std::move (expr_result.value ());
! 	    else
! 	      return tl::unexpected<Parse::Error::Expr> (
! 		Parse::Error::Expr::CHILD_ERROR);
  	    mutability = Mutability::Imm;
  	  }
  
  	// FIXME: allow outer attributes on expression
! 	return std::make_unique<AST::BorrowExpr> (std::move (expr), mutability,
! 						  false, true,
! 						  std::move (outer_attrs),
! 						  tok->get_locus ());
        }
      case OR:
      case PIPE:
      case MOVE:
        // closure expression
!       {
! 	auto ret = parse_closure_expr_pratt (tok, std::move (outer_attrs));
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case DOT_DOT:
        // either "range to" or "range full" expressions
!       {
! 	auto ret
! 	  = parse_nud_range_exclusive_expr (tok, std::move (outer_attrs));
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case DOT_DOT_EQ:
        // range to inclusive expr
!       {
! 	auto ret = parse_range_to_inclusive_expr (tok, std::move (outer_attrs));
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case RETURN_KW:
        // FIXME: is this really a null denotation expression?
!       {
! 	auto ret
! 	  = parse_return_expr (std::move (outer_attrs), tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case TRY:
        // FIXME: is this really a null denotation expression?
!       {
! 	auto ret = parse_try_expr (std::move (outer_attrs), tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case BREAK:
        // FIXME: is this really a null denotation expression?
!       {
! 	auto ret
! 	  = parse_break_expr (std::move (outer_attrs), tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case CONTINUE:
        return parse_continue_expr (std::move (outer_attrs), tok->get_locus ());
      case LEFT_CURLY:
        // ok - this is an expression with block for once.
!       {
! 	auto ret = parse_block_expr (std::move (outer_attrs), tl::nullopt,
! 				     tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case IF:
        // if or if let, so more lookahead to find out
        if (lexer.peek_token ()->get_id () == LET)
  	{
  	  // if let expr
! 	  auto ret
! 	    = parse_if_let_expr (std::move (outer_attrs), tok->get_locus ());
! 	  if (ret)
! 	    return std::move (ret.value ());
! 	  else
! 	    return tl::unexpected<Parse::Error::Expr> (
! 	      Parse::Error::Expr::CHILD_ERROR);
  	}
        else
  	{
  	  // if expr
! 	  auto ret = parse_if_expr (std::move (outer_attrs), tok->get_locus ());
! 	  if (ret)
! 	    return std::move (ret.value ());
! 	  else
! 	    return tl::unexpected<Parse::Error::Expr> (
! 	      Parse::Error::Expr::CHILD_ERROR);
  	}
      case LIFETIME:
!       {
! 	auto ret = parse_labelled_loop_expr (tok, std::move (outer_attrs));
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case LOOP:
!       {
! 	auto ret = parse_loop_expr (std::move (outer_attrs), tl::nullopt,
! 				    tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case WHILE:
        if (lexer.peek_token ()->get_id () == LET)
  	{
! 	  auto ret = parse_while_let_loop_expr (std::move (outer_attrs));
! 	  if (ret)
! 	    return std::move (ret.value ());
! 	  else
! 	    return tl::unexpected<Parse::Error::Expr> (
! 	      Parse::Error::Expr::CHILD_ERROR);
  	}
        else
  	{
! 	  auto ret = parse_while_loop_expr (std::move (outer_attrs),
! 					    tl::nullopt, tok->get_locus ());
! 	  if (ret)
! 	    return std::move (ret.value ());
! 	  else
! 	    return tl::unexpected<Parse::Error::Expr> (
! 	      Parse::Error::Expr::CHILD_ERROR);
  	}
      case FOR:
!       {
! 	auto ret = parse_for_loop_expr (std::move (outer_attrs), tl::nullopt);
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case MATCH_KW:
        // also an expression with block
!       {
! 	auto ret
! 	  = parse_match_expr (std::move (outer_attrs), tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
! 
      case LEFT_SQUARE:
        // array definition expr (not indexing)
!       {
! 	auto ret
! 	  = parse_array_expr (std::move (outer_attrs), tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case UNSAFE:
!       {
! 	auto ret = parse_unsafe_block_expr (std::move (outer_attrs),
! 					    tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case BOX:
!       {
! 	auto ret = parse_box_expr (std::move (outer_attrs), tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      case UNDERSCORE:
        add_error (
  	Error (tok->get_locus (),
  	       "use of %qs is not allowed on the right-side of an assignment",
  	       tok->get_token_description ()));
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      case CONST:
!       {
! 	auto ret
! 	  = parse_const_block_expr (std::move (outer_attrs), tok->get_locus ());
! 	if (ret)
! 	  return std::move (ret.value ());
! 	else
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
!       }
      default:
        if (!restrictions.expr_can_be_null)
  	add_error (Error (tok->get_locus (),
  			  "found unexpected token %qs in null denotation",
  			  tok->get_token_description ()));
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  }
  
*************** Parser<ManagedTokenSource>::null_denotat
*** 2267,2273 ****
   * operators or other punctuation. Returns a function pointer to member
   * function that implements the left denotation for the token given. */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Expr>
  Parser<ManagedTokenSource>::left_denotation (const_TokenPtr tok,
  					     std::unique_ptr<AST::Expr> left,
  					     AST::AttrVec outer_attrs,
--- 2534,2540 ----
   * operators or other punctuation. Returns a function pointer to member
   * function that implements the left denotation for the token given. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::left_denotation (const_TokenPtr tok,
  					     std::unique_ptr<AST::Expr> left,
  					     AST::AttrVec outer_attrs,
*************** Parser<ManagedTokenSource>::left_denotat
*** 2281,2289 ****
        {
  	location_t left_locus = left->get_locus ();
  	// error propagation expression - unary postfix
! 	return std::unique_ptr<AST::ErrorPropagationExpr> (
! 	  new AST::ErrorPropagationExpr (std::move (left),
! 					 std::move (outer_attrs), left_locus));
        }
      case PLUS:
        // sum expression - binary infix
--- 2548,2555 ----
        {
  	location_t left_locus = left->get_locus ();
  	// error propagation expression - unary postfix
! 	return std::make_unique<AST::ErrorPropagationExpr> (
! 	  std::move (left), std::move (outer_attrs), left_locus);
        }
      case PLUS:
        // sum expression - binary infix
*************** Parser<ManagedTokenSource>::left_denotat
*** 2531,2537 ****
  	       "found scope resolution operator in left denotation "
  	       "function - this should probably be handled elsewhere"));
  
!       return nullptr;
      case DOT:
        {
  	/* field expression or method call - relies on parentheses after next
--- 2797,2803 ----
  	       "found scope resolution operator in left denotation "
  	       "function - this should probably be handled elsewhere"));
  
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      case DOT:
        {
  	/* field expression or method call - relies on parentheses after next
*************** Parser<ManagedTokenSource>::left_denotat
*** 2612,2618 ****
  			"found unexpected token %qs in left denotation",
  			tok->get_token_description ()));
  
!       return nullptr;
      }
  }
  
--- 2878,2884 ----
  			"found unexpected token %qs in left denotation",
  			tok->get_token_description ()));
  
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  }
  
*************** get_lbp_for_arithmetic_or_logical_expr (
*** 2654,2900 ****
  
  // Parses an arithmetic or logical expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_arithmetic_or_logical_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> left, AST::AttrVec,
    AST::ArithmeticOrLogicalExpr::ExprType expr_type,
    ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (get_lbp_for_arithmetic_or_logical_expr (expr_type),
! 		  AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      expr_type, locus));
  }
  
  // Parses a binary addition expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_binary_plus_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_PLUS, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::ADD, locus));
  }
  
  // Parses a binary subtraction expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_binary_minus_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_MINUS, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::SUBTRACT,
! 				      locus));
  }
  
  // Parses a binary multiplication expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_binary_mult_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_MUL, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::MULTIPLY,
! 				      locus));
  }
  
  // Parses a binary division expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_binary_div_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_DIV, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::DIVIDE,
! 				      locus));
  }
  
  // Parses a binary modulo expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_binary_mod_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_MOD, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::MODULUS,
! 				      locus));
  }
  
  /* Parses a binary bitwise (or eager logical) and expression (with Pratt
   * parsing). */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_bitwise_and_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_AMP, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::BITWISE_AND,
! 				      locus));
  }
  
  /* Parses a binary bitwise (or eager logical) or expression (with Pratt
   * parsing). */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_bitwise_or_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_PIPE, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::BITWISE_OR,
! 				      locus));
  }
  
  /* Parses a binary bitwise (or eager logical) xor expression (with Pratt
   * parsing). */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_bitwise_xor_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_CARET, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::BITWISE_XOR,
! 				      locus));
  }
  
  // Parses a binary left shift expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_left_shift_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_L_SHIFT, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::LEFT_SHIFT,
! 				      locus));
  }
  
  // Parses a binary right shift expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArithmeticOrLogicalExpr>
  Parser<ManagedTokenSource>::parse_right_shift_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_R_SHIFT, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ArithmeticOrLogicalExpr> (
!     new AST::ArithmeticOrLogicalExpr (std::move (left), std::move (right),
! 				      ArithmeticOrLogicalOperator::RIGHT_SHIFT,
! 				      locus));
  }
  
  /* Returns the left binding power for the given ComparisonExpr type.
--- 2920,3145 ----
  
  // Parses an arithmetic or logical expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_arithmetic_or_logical_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> left, AST::AttrVec,
    AST::ArithmeticOrLogicalExpr::ExprType expr_type,
    ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (get_lbp_for_arithmetic_or_logical_expr (expr_type),
! 			   AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()), expr_type, locus);
  }
  
  // Parses a binary addition expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_plus_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_PLUS, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::ADD, locus);
  }
  
  // Parses a binary subtraction expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_minus_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_MINUS, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::SUBTRACT, locus);
  }
  
  // Parses a binary multiplication expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_mult_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_MUL, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::MULTIPLY, locus);
  }
  
  // Parses a binary division expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_div_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_DIV, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::DIVIDE, locus);
  }
  
  // Parses a binary modulo expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_mod_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_MOD, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::MODULUS, locus);
  }
  
  /* Parses a binary bitwise (or eager logical) and expression (with Pratt
   * parsing). */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_bitwise_and_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_AMP, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::BITWISE_AND, locus);
  }
  
  /* Parses a binary bitwise (or eager logical) or expression (with Pratt
   * parsing). */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_bitwise_or_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_PIPE, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::BITWISE_OR, locus);
  }
  
  /* Parses a binary bitwise (or eager logical) xor expression (with Pratt
   * parsing). */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_bitwise_xor_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_CARET, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::BITWISE_XOR, locus);
  }
  
  // Parses a binary left shift expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_left_shift_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_L_SHIFT, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::LEFT_SHIFT, locus);
  }
  
  // Parses a binary right shift expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_right_shift_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_R_SHIFT, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ArithmeticOrLogicalExpr> (
!     std::move (left), std::move (right.value ()),
!     ArithmeticOrLogicalOperator::RIGHT_SHIFT, locus);
  }
  
  /* Returns the left binding power for the given ComparisonExpr type.
*************** get_lbp_for_comparison_expr (AST::Compar
*** 2928,3162 ****
   * specify one and have the other looked up - e.g. specify ExprType and
   * binding power is looked up? */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ComparisonExpr>
  Parser<ManagedTokenSource>::parse_comparison_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> left, AST::AttrVec,
    AST::ComparisonExpr::ExprType expr_type, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (get_lbp_for_comparison_expr (expr_type), AST::AttrVec (),
! 		  restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ComparisonExpr> (
!     new AST::ComparisonExpr (std::move (left), std::move (right), expr_type,
! 			     locus));
  }
  
  // Parses a binary equal to expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ComparisonExpr>
  Parser<ManagedTokenSource>::parse_binary_equal_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_EQUAL, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ComparisonExpr> (
!     new AST::ComparisonExpr (std::move (left), std::move (right),
! 			     ComparisonOperator::EQUAL, locus));
  }
  
  // Parses a binary not equal to expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ComparisonExpr>
  Parser<ManagedTokenSource>::parse_binary_not_equal_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_NOT_EQUAL, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ComparisonExpr> (
!     new AST::ComparisonExpr (std::move (left), std::move (right),
! 			     ComparisonOperator::NOT_EQUAL, locus));
  }
  
  // Parses a binary greater than expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ComparisonExpr>
  Parser<ManagedTokenSource>::parse_binary_greater_than_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_GREATER_THAN, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ComparisonExpr> (
!     new AST::ComparisonExpr (std::move (left), std::move (right),
! 			     ComparisonOperator::GREATER_THAN, locus));
  }
  
  // Parses a binary less than expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ComparisonExpr>
  Parser<ManagedTokenSource>::parse_binary_less_than_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_SMALLER_THAN, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ComparisonExpr> (
!     new AST::ComparisonExpr (std::move (left), std::move (right),
! 			     ComparisonOperator::LESS_THAN, locus));
  }
  
  // Parses a binary greater than or equal to expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ComparisonExpr>
  Parser<ManagedTokenSource>::parse_binary_greater_equal_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_GREATER_EQUAL, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ComparisonExpr> (
!     new AST::ComparisonExpr (std::move (left), std::move (right),
! 			     ComparisonOperator::GREATER_OR_EQUAL, locus));
  }
  
  // Parses a binary less than or equal to expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ComparisonExpr>
  Parser<ManagedTokenSource>::parse_binary_less_equal_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_SMALLER_EQUAL, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::ComparisonExpr> (
!     new AST::ComparisonExpr (std::move (left), std::move (right),
! 			     ComparisonOperator::LESS_OR_EQUAL, locus));
  }
  
  // Parses a binary lazy boolean or expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::LazyBooleanExpr>
  Parser<ManagedTokenSource>::parse_lazy_or_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_LOGICAL_OR, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::LazyBooleanExpr> (
!     new AST::LazyBooleanExpr (std::move (left), std::move (right),
! 			      LazyBooleanOperator::LOGICAL_OR, locus));
  }
  
  // Parses a binary lazy boolean and expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::LazyBooleanExpr>
  Parser<ManagedTokenSource>::parse_lazy_and_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_LOGICAL_AND, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::LazyBooleanExpr> (
!     new AST::LazyBooleanExpr (std::move (left), std::move (right),
! 			      LazyBooleanOperator::LOGICAL_AND, locus));
  }
  
  // Parses a pseudo-binary infix type cast expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::TypeCastExpr>
  Parser<ManagedTokenSource>::parse_type_cast_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> expr_to_cast,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED,
    ParseRestrictions restrictions ATTRIBUTE_UNUSED)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::TypeNoBounds> type = parse_type_no_bounds ();
!   if (type == nullptr)
!     return nullptr;
    // FIXME: how do I get precedence put in here?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = expr_to_cast->get_locus ();
  
!   return std::unique_ptr<AST::TypeCastExpr> (
!     new AST::TypeCastExpr (std::move (expr_to_cast), std::move (type), locus));
  }
  
  // Parses a binary assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::AssignmentExpr>
  Parser<ManagedTokenSource>::parse_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
-   // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::AssignmentExpr> (
!     new AST::AssignmentExpr (std::move (left), std::move (right),
! 			     std::move (outer_attrs), locus));
  }
  
  /* Returns the left binding power for the given CompoundAssignmentExpr type.
--- 3173,3399 ----
   * specify one and have the other looked up - e.g. specify ExprType and
   * binding power is looked up? */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_comparison_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> left, AST::AttrVec,
    AST::ComparisonExpr::ExprType expr_type, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (get_lbp_for_comparison_expr (expr_type),
! 			   AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ComparisonExpr> (std::move (left),
! 						std::move (right.value ()),
! 						expr_type, locus);
  }
  
  // Parses a binary equal to expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_equal_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_EQUAL, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ComparisonExpr> (std::move (left),
! 						std::move (right.value ()),
! 						ComparisonOperator::EQUAL,
! 						locus);
  }
  
  // Parses a binary not equal to expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_not_equal_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_NOT_EQUAL, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ComparisonExpr> (std::move (left),
! 						std::move (right.value ()),
! 						ComparisonOperator::NOT_EQUAL,
! 						locus);
  }
  
  // Parses a binary greater than expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_greater_than_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_GREATER_THAN, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ComparisonExpr> (
!     std::move (left), std::move (right.value ()),
!     ComparisonOperator::GREATER_THAN, locus);
  }
  
  // Parses a binary less than expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_less_than_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_SMALLER_THAN, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ComparisonExpr> (std::move (left),
! 						std::move (right.value ()),
! 						ComparisonOperator::LESS_THAN,
! 						locus);
  }
  
  // Parses a binary greater than or equal to expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_greater_equal_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_GREATER_EQUAL, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ComparisonExpr> (
!     std::move (left), std::move (right.value ()),
!     ComparisonOperator::GREATER_OR_EQUAL, locus);
  }
  
  // Parses a binary less than or equal to expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_binary_less_equal_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_SMALLER_EQUAL, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::ComparisonExpr> (
!     std::move (left), std::move (right.value ()),
!     ComparisonOperator::LESS_OR_EQUAL, locus);
  }
  
  // Parses a binary lazy boolean or expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::LazyBooleanExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_lazy_or_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_LOGICAL_OR, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::LazyBooleanExpr> (
!     std::move (left), std::move (right.value ()),
!     LazyBooleanOperator::LOGICAL_OR, locus);
  }
  
  // Parses a binary lazy boolean and expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::LazyBooleanExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_lazy_and_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_LOGICAL_AND, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::LazyBooleanExpr> (
!     std::move (left), std::move (right.value ()),
!     LazyBooleanOperator::LOGICAL_AND, locus);
  }
  
  // Parses a pseudo-binary infix type cast expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::TypeCastExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_type_cast_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> expr_to_cast,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED,
    ParseRestrictions restrictions ATTRIBUTE_UNUSED)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto type = parse_type_no_bounds ();
!   if (!type)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: how do I get precedence put in here?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = expr_to_cast->get_locus ();
  
!   return std::make_unique<AST::TypeCastExpr> (std::move (expr_to_cast),
! 					      std::move (type), locus);
  }
  
  // Parses a binary assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::AssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::AssignmentExpr> (std::move (left),
! 						std::move (right.value ()),
! 						std::move (outer_attrs), locus);
  }
  
  /* Returns the left binding power for the given CompoundAssignmentExpr type.
*************** get_lbp_for_compound_assignment_expr (
*** 3197,3456 ****
  
  // Parses a compound assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_compound_assignment_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> left, AST::AttrVec,
    AST::CompoundAssignmentExpr::ExprType expr_type,
    ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (get_lbp_for_compound_assignment_expr (expr_type) - 1,
! 		  AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     expr_type, locus));
  }
  
  // Parses a binary add-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_plus_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_PLUS_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::ADD, locus));
  }
  
  // Parses a binary minus-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_minus_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_MINUS_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::SUBTRACT,
! 				     locus));
  }
  
  // Parses a binary multiplication-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_mult_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_MULT_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::MULTIPLY,
! 				     locus));
  }
  
  // Parses a binary division-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_div_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_DIV_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::DIVIDE,
! 				     locus));
  }
  
  // Parses a binary modulo-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_mod_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_MOD_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::MODULUS,
! 				     locus));
  }
  
  // Parses a binary and-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_and_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_AMP_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::BITWISE_AND,
! 				     locus));
  }
  
  // Parses a binary or-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_or_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_PIPE_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::BITWISE_OR,
! 				     locus));
  }
  
  // Parses a binary xor-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_xor_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_CARET_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::BITWISE_XOR,
! 				     locus));
  }
  
  // Parses a binary left shift-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_left_shift_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
      = parse_expr (LBP_L_SHIFT_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::LEFT_SHIFT,
! 				     locus));
  }
  
  // Parses a binary right shift-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CompoundAssignmentExpr>
  Parser<ManagedTokenSource>::parse_right_shift_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
      = parse_expr (LBP_R_SHIFT_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::CompoundAssignmentExpr> (
!     new AST::CompoundAssignmentExpr (std::move (left), std::move (right),
! 				     CompoundAssignmentOperator::RIGHT_SHIFT,
! 				     locus));
  }
  
  // Parses a postfix unary await expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::AwaitExpr>
  Parser<ManagedTokenSource>::parse_await_expr (
    const_TokenPtr tok, std::unique_ptr<AST::Expr> expr_to_await,
    AST::AttrVec outer_attrs)
--- 3434,3674 ----
  
  // Parses a compound assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_compound_assignment_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> left, AST::AttrVec,
    AST::CompoundAssignmentExpr::ExprType expr_type,
    ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (get_lbp_for_compound_assignment_expr (expr_type) - 1,
! 			   AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()), expr_type, locus);
  }
  
  // Parses a binary add-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_plus_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_PLUS_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::ADD, locus);
  }
  
  // Parses a binary minus-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_minus_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_MINUS_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::SUBTRACT, locus);
  }
  
  // Parses a binary multiplication-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_mult_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_MULT_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::MULTIPLY, locus);
  }
  
  // Parses a binary division-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_div_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_DIV_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::DIVIDE, locus);
  }
  
  // Parses a binary modulo-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_mod_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_MOD_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::MODULUS, locus);
  }
  
  // Parses a binary and-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_and_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_AMP_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::BITWISE_AND, locus);
  }
  
  // Parses a binary or-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_or_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_PIPE_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::BITWISE_OR, locus);
  }
  
  // Parses a binary xor-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_xor_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_CARET_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::BITWISE_XOR, locus);
  }
  
  // Parses a binary left shift-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_left_shift_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right
      = parse_expr (LBP_L_SHIFT_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::LEFT_SHIFT, locus);
  }
  
  // Parses a binary right shift-assignment expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_right_shift_assig_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right
      = parse_expr (LBP_R_SHIFT_ASSIG - 1, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: ensure right-associativity for this - 'LBP - 1' may do this?
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::CompoundAssignmentExpr> (
!     std::move (left), std::move (right.value ()),
!     CompoundAssignmentOperator::RIGHT_SHIFT, locus);
  }
  
  // Parses a postfix unary await expression (with Pratt parsing).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::AwaitExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_await_expr (
    const_TokenPtr tok, std::unique_ptr<AST::Expr> expr_to_await,
    AST::AttrVec outer_attrs)
*************** Parser<ManagedTokenSource>::parse_await_
*** 3465,3471 ****
        add_error (std::move (error));
  
        // skip somewhere?
!       return nullptr;
      }
  
    // TODO: check inside async block in semantic analysis
--- 3683,3689 ----
        add_error (std::move (error));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    // TODO: check inside async block in semantic analysis
*************** Parser<ManagedTokenSource>::parse_await_
*** 3479,3485 ****
  /* Parses an exclusive range ('..') in left denotation position (i.e.
   * RangeFromExpr or RangeFromToExpr). */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::RangeExpr>
  Parser<ManagedTokenSource>::parse_led_range_exclusive_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
--- 3697,3703 ----
  /* Parses an exclusive range ('..') in left denotation position (i.e.
   * RangeFromExpr or RangeFromToExpr). */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::RangeExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_led_range_exclusive_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
*************** Parser<ManagedTokenSource>::parse_led_ra
*** 3489,3509 ****
    // Can be nullptr, in which case it is a RangeFromExpr, otherwise a
    // RangeFromToExpr.
    restrictions.expr_can_be_null = true;
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_DOT_DOT, AST::AttrVec (), restrictions);
  
    location_t locus = left->get_locus ();
  
!   if (right == nullptr)
      {
        // range from expr
!       return std::unique_ptr<AST::RangeFromExpr> (
! 	new AST::RangeFromExpr (std::move (left), locus));
      }
    else
      {
!       return std::unique_ptr<AST::RangeFromToExpr> (
! 	new AST::RangeFromToExpr (std::move (left), std::move (right), locus));
      }
    // FIXME: make non-associative
  }
--- 3707,3726 ----
    // Can be nullptr, in which case it is a RangeFromExpr, otherwise a
    // RangeFromToExpr.
    restrictions.expr_can_be_null = true;
!   auto right = parse_expr (LBP_DOT_DOT, AST::AttrVec (), restrictions);
  
    location_t locus = left->get_locus ();
  
!   if (!right)
      {
        // range from expr
!       return std::make_unique<AST::RangeFromExpr> (std::move (left), locus);
      }
    else
      {
!       return std::make_unique<AST::RangeFromToExpr> (std::move (left),
! 						     std::move (right.value ()),
! 						     locus);
      }
    // FIXME: make non-associative
  }
*************** Parser<ManagedTokenSource>::parse_led_ra
*** 3511,3517 ****
  /* Parses an exclusive range ('..') in null denotation position (i.e.
   * RangeToExpr or RangeFullExpr). */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::RangeExpr>
  Parser<ManagedTokenSource>::parse_nud_range_exclusive_expr (
    const_TokenPtr tok, AST::AttrVec outer_attrs ATTRIBUTE_UNUSED)
  {
--- 3728,3734 ----
  /* Parses an exclusive range ('..') in null denotation position (i.e.
   * RangeToExpr or RangeFullExpr). */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::RangeExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_nud_range_exclusive_expr (
    const_TokenPtr tok, AST::AttrVec outer_attrs ATTRIBUTE_UNUSED)
  {
*************** Parser<ManagedTokenSource>::parse_nud_ra
*** 3520,3586 ****
  
    // FIXME: this probably parses expressions accidently or whatever
    // try parsing RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_DOT_DOT, AST::AttrVec (), restrictions);
  
    location_t locus = tok->get_locus ();
  
!   if (right == nullptr)
      {
        // range from expr
!       return std::unique_ptr<AST::RangeFullExpr> (
! 	new AST::RangeFullExpr (locus));
      }
    else
      {
!       return std::unique_ptr<AST::RangeToExpr> (
! 	new AST::RangeToExpr (std::move (right), locus));
      }
    // FIXME: make non-associative
  }
  
  // Parses a full binary range inclusive expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::RangeFromToInclExpr>
  Parser<ManagedTokenSource>::parse_range_inclusive_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right
!     = parse_expr (LBP_DOT_DOT_EQ, AST::AttrVec (), restrictions);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: make non-associative
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::unique_ptr<AST::RangeFromToInclExpr> (
!     new AST::RangeFromToInclExpr (std::move (left), std::move (right), locus));
  }
  
  // Parses an inclusive range-to prefix unary expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::RangeToInclExpr>
  Parser<ManagedTokenSource>::parse_range_to_inclusive_expr (
    const_TokenPtr tok, AST::AttrVec outer_attrs ATTRIBUTE_UNUSED)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   std::unique_ptr<AST::Expr> right = parse_expr (LBP_DOT_DOT_EQ);
!   if (right == nullptr)
!     return nullptr;
    // FIXME: make non-associative
  
    // TODO: check types. actually, do so during semantic analysis
  
!   return std::unique_ptr<AST::RangeToInclExpr> (
!     new AST::RangeToInclExpr (std::move (right), tok->get_locus ()));
  }
  
  // Parses a pseudo-binary infix tuple index expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::TupleIndexExpr>
  Parser<ManagedTokenSource>::parse_tuple_index_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> tuple_expr,
    AST::AttrVec outer_attrs, ParseRestrictions restrictions ATTRIBUTE_UNUSED)
--- 3737,3801 ----
  
    // FIXME: this probably parses expressions accidently or whatever
    // try parsing RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_DOT_DOT, AST::AttrVec (), restrictions);
  
    location_t locus = tok->get_locus ();
  
!   if (!right)
      {
        // range from expr
!       return std::make_unique<AST::RangeFullExpr> (locus);
      }
    else
      {
!       return std::make_unique<AST::RangeToExpr> (std::move (right.value ()),
! 						 locus);
      }
    // FIXME: make non-associative
  }
  
  // Parses a full binary range inclusive expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::RangeFromToInclExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_range_inclusive_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> left,
    AST::AttrVec outer_attrs ATTRIBUTE_UNUSED, ParseRestrictions restrictions)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_DOT_DOT_EQ, AST::AttrVec (), restrictions);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: make non-associative
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = left->get_locus ();
  
!   return std::make_unique<AST::RangeFromToInclExpr> (std::move (left),
! 						     std::move (right.value ()),
! 						     locus);
  }
  
  // Parses an inclusive range-to prefix unary expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::RangeToInclExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_range_to_inclusive_expr (
    const_TokenPtr tok, AST::AttrVec outer_attrs ATTRIBUTE_UNUSED)
  {
    // parse RHS (as tok has already been consumed in parse_expression)
!   auto right = parse_expr (LBP_DOT_DOT_EQ);
!   if (!right)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
    // FIXME: make non-associative
  
    // TODO: check types. actually, do so during semantic analysis
  
!   return std::make_unique<AST::RangeToInclExpr> (std::move (right.value ()),
! 						 tok->get_locus ());
  }
  
  // Parses a pseudo-binary infix tuple index expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::TupleIndexExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_tuple_index_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> tuple_expr,
    AST::AttrVec outer_attrs, ParseRestrictions restrictions ATTRIBUTE_UNUSED)
*************** Parser<ManagedTokenSource>::parse_tuple_
*** 3588,3596 ****
    // parse int literal (as token already skipped)
    const_TokenPtr index_tok = expect_token (INT_LITERAL);
    if (index_tok == nullptr)
!     {
!       return nullptr;
!     }
    std::string index = index_tok->get_str ();
  
    // convert to integer
--- 3803,3810 ----
    // parse int literal (as token already skipped)
    const_TokenPtr index_tok = expect_token (INT_LITERAL);
    if (index_tok == nullptr)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
! 
    std::string index = index_tok->get_str ();
  
    // convert to integer
*************** Parser<ManagedTokenSource>::parse_tuple_
*** 3604,3617 ****
  
    location_t locus = tuple_expr->get_locus ();
  
!   return std::unique_ptr<AST::TupleIndexExpr> (
!     new AST::TupleIndexExpr (std::move (tuple_expr), index_int,
! 			     std::move (outer_attrs), locus));
  }
  
  // Parses a pseudo-binary infix array (or slice) index expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ArrayIndexExpr>
  Parser<ManagedTokenSource>::parse_index_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> array_expr,
    AST::AttrVec outer_attrs, ParseRestrictions)
--- 3818,3831 ----
  
    location_t locus = tuple_expr->get_locus ();
  
!   return std::make_unique<AST::TupleIndexExpr> (std::move (tuple_expr),
! 						index_int,
! 						std::move (outer_attrs), locus);
  }
  
  // Parses a pseudo-binary infix array (or slice) index expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ArrayIndexExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_index_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> array_expr,
    AST::AttrVec outer_attrs, ParseRestrictions)
*************** Parser<ManagedTokenSource>::parse_index_
*** 3621,3648 ****
      = parse_expr (LBP_ARRAY_REF, AST::AttrVec (),
      restrictions);*/
    // TODO: conceptually, should treat [] as brackets, so just parse all expr
!   std::unique_ptr<AST::Expr> index_expr = parse_expr ();
!   if (index_expr == nullptr)
!     return nullptr;
  
    // skip ']' at end of array
    if (!skip_token (RIGHT_SQUARE))
      {
        // skip somewhere?
!       return nullptr;
      }
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = array_expr->get_locus ();
  
!   return std::unique_ptr<AST::ArrayIndexExpr> (
!     new AST::ArrayIndexExpr (std::move (array_expr), std::move (index_expr),
! 			     std::move (outer_attrs), locus));
  }
  
  // Parses a pseudo-binary infix struct field access expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::FieldAccessExpr>
  Parser<ManagedTokenSource>::parse_field_access_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> struct_expr,
    AST::AttrVec outer_attrs, ParseRestrictions restrictions ATTRIBUTE_UNUSED)
--- 3835,3862 ----
      = parse_expr (LBP_ARRAY_REF, AST::AttrVec (),
      restrictions);*/
    // TODO: conceptually, should treat [] as brackets, so just parse all expr
!   auto index_expr = parse_expr ();
!   if (!index_expr)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::CHILD_ERROR);
  
    // skip ']' at end of array
    if (!skip_token (RIGHT_SQUARE))
      {
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = array_expr->get_locus ();
  
!   return std::make_unique<AST::ArrayIndexExpr> (std::move (array_expr),
! 						std::move (index_expr.value ()),
! 						std::move (outer_attrs), locus);
  }
  
  // Parses a pseudo-binary infix struct field access expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::FieldAccessExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_field_access_expr (
    const_TokenPtr tok ATTRIBUTE_UNUSED, std::unique_ptr<AST::Expr> struct_expr,
    AST::AttrVec outer_attrs, ParseRestrictions restrictions ATTRIBUTE_UNUSED)
*************** Parser<ManagedTokenSource>::parse_field_
*** 3651,3671 ****
     * not await, for instance) */
    const_TokenPtr ident_tok = expect_token (IDENTIFIER);
    if (ident_tok == nullptr)
!     return nullptr;
  
    Identifier ident{ident_tok};
  
    location_t locus = struct_expr->get_locus ();
  
    // TODO: check types. actually, do so during semantic analysis
!   return std::unique_ptr<AST::FieldAccessExpr> (
!     new AST::FieldAccessExpr (std::move (struct_expr), std::move (ident),
! 			      std::move (outer_attrs), locus));
  }
  
  // Parses a pseudo-binary infix method call expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::MethodCallExpr>
  Parser<ManagedTokenSource>::parse_method_call_expr (
    const_TokenPtr tok, std::unique_ptr<AST::Expr> receiver_expr,
    AST::AttrVec outer_attrs, ParseRestrictions)
--- 3865,3886 ----
     * not await, for instance) */
    const_TokenPtr ident_tok = expect_token (IDENTIFIER);
    if (ident_tok == nullptr)
!     return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
  
    Identifier ident{ident_tok};
  
    location_t locus = struct_expr->get_locus ();
  
    // TODO: check types. actually, do so during semantic analysis
!   return std::make_unique<AST::FieldAccessExpr> (std::move (struct_expr),
! 						 std::move (ident),
! 						 std::move (outer_attrs),
! 						 locus);
  }
  
  // Parses a pseudo-binary infix method call expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::MethodCallExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_method_call_expr (
    const_TokenPtr tok, std::unique_ptr<AST::Expr> receiver_expr,
    AST::AttrVec outer_attrs, ParseRestrictions)
*************** Parser<ManagedTokenSource>::parse_method
*** 3678,3690 ****
  		   "failed to parse path expr segment of method call expr");
        add_error (std::move (error));
  
!       return nullptr;
      }
  
    // skip left parentheses
    if (!skip_token (LEFT_PAREN))
      {
!       return nullptr;
      }
  
    // parse method params (if they exist)
--- 3893,3906 ----
  		   "failed to parse path expr segment of method call expr");
        add_error (std::move (error));
  
!       return tl::unexpected<Parse::Error::Expr> (
! 	Parse::Error::Expr::CHILD_ERROR);
      }
  
    // skip left parentheses
    if (!skip_token (LEFT_PAREN))
      {
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    // parse method params (if they exist)
*************** Parser<ManagedTokenSource>::parse_method
*** 3693,3708 ****
    const_TokenPtr t = lexer.peek_token ();
    while (t->get_id () != RIGHT_PAREN)
      {
!       std::unique_ptr<AST::Expr> param = parse_expr ();
!       if (param == nullptr)
  	{
  	  Error error (t->get_locus (),
  		       "failed to parse method param in method call");
  	  add_error (std::move (error));
  
! 	  return nullptr;
  	}
!       params.push_back (std::move (param));
  
        if (lexer.peek_token ()->get_id () != COMMA)
  	break;
--- 3909,3925 ----
    const_TokenPtr t = lexer.peek_token ();
    while (t->get_id () != RIGHT_PAREN)
      {
!       auto param = parse_expr ();
!       if (!param)
  	{
  	  Error error (t->get_locus (),
  		       "failed to parse method param in method call");
  	  add_error (std::move (error));
  
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	}
!       params.push_back (std::move (param.value ()));
  
        if (lexer.peek_token ()->get_id () != COMMA)
  	break;
*************** Parser<ManagedTokenSource>::parse_method
*** 3714,3734 ****
    // skip right paren
    if (!skip_token (RIGHT_PAREN))
      {
!       return nullptr;
      }
  
    // TODO: check types. actually do so in semantic analysis pass.
    location_t locus = receiver_expr->get_locus ();
  
!   return std::unique_ptr<AST::MethodCallExpr> (
!     new AST::MethodCallExpr (std::move (receiver_expr), std::move (segment),
! 			     std::move (params), std::move (outer_attrs),
! 			     locus));
  }
  
  // Parses a pseudo-binary infix function call expression.
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CallExpr>
  Parser<ManagedTokenSource>::parse_function_call_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> function_expr,
    AST::AttrVec outer_attrs, ParseRestrictions)
--- 3931,3951 ----
    // skip right paren
    if (!skip_token (RIGHT_PAREN))
      {
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    // TODO: check types. actually do so in semantic analysis pass.
    location_t locus = receiver_expr->get_locus ();
  
!   return std::make_unique<AST::MethodCallExpr> (std::move (receiver_expr),
! 						std::move (segment),
! 						std::move (params),
! 						std::move (outer_attrs), locus);
  }
  
  // Parses a pseudo-binary infix function call expression.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CallExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_function_call_expr (
    const_TokenPtr, std::unique_ptr<AST::Expr> function_expr,
    AST::AttrVec outer_attrs, ParseRestrictions)
*************** Parser<ManagedTokenSource>::parse_functi
*** 3739,3754 ****
    const_TokenPtr t = lexer.peek_token ();
    while (t->get_id () != RIGHT_PAREN)
      {
!       std::unique_ptr<AST::Expr> param = parse_expr ();
!       if (param == nullptr)
  	{
  	  Error error (t->get_locus (),
  		       "failed to parse function param in function call");
  	  add_error (std::move (error));
  
! 	  return nullptr;
  	}
!       params.push_back (std::move (param));
  
        if (lexer.peek_token ()->get_id () != COMMA)
  	break;
--- 3956,3972 ----
    const_TokenPtr t = lexer.peek_token ();
    while (t->get_id () != RIGHT_PAREN)
      {
!       auto param = parse_expr ();
!       if (!param)
  	{
  	  Error error (t->get_locus (),
  		       "failed to parse function param in function call");
  	  add_error (std::move (error));
  
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	}
!       params.push_back (std::move (param.value ()));
  
        if (lexer.peek_token ()->get_id () != COMMA)
  	break;
*************** Parser<ManagedTokenSource>::parse_functi
*** 3761,3782 ****
    if (!skip_token (RIGHT_PAREN))
      {
        // skip somewhere?
!       return nullptr;
      }
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = function_expr->get_locus ();
  
!   return std::unique_ptr<AST::CallExpr> (
!     new AST::CallExpr (std::move (function_expr), std::move (params),
! 		       std::move (outer_attrs), locus));
  }
  
  /* Parses a struct expr struct with a path in expression already parsed (but
   * not
   * '{' token). */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::StructExprStruct>
  Parser<ManagedTokenSource>::parse_struct_expr_struct_partial (
    AST::PathInExpression path, AST::AttrVec outer_attrs)
  {
--- 3979,4000 ----
    if (!skip_token (RIGHT_PAREN))
      {
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    // TODO: check types. actually, do so during semantic analysis
    location_t locus = function_expr->get_locus ();
  
!   return std::make_unique<AST::CallExpr> (std::move (function_expr),
! 					  std::move (params),
! 					  std::move (outer_attrs), locus);
  }
  
  /* Parses a struct expr struct with a path in expression already parsed (but
   * not
   * '{' token). */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::StructExprStruct>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_struct_expr_struct_partial (
    AST::PathInExpression path, AST::AttrVec outer_attrs)
  {
*************** Parser<ManagedTokenSource>::parse_struct
*** 3784,3790 ****
    // lookup) again, make statement if final ';'
    if (!skip_token (LEFT_CURLY))
      {
!       return nullptr;
      }
  
    // parse inner attributes
--- 4002,4008 ----
    // lookup) again, make statement if final ';'
    if (!skip_token (LEFT_CURLY))
      {
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    // parse inner attributes
*************** Parser<ManagedTokenSource>::parse_struct
*** 3799,3807 ****
        // struct with no body
        lexer.skip_token ();
  
!       return std::unique_ptr<AST::StructExprStruct> (
! 	new AST::StructExprStruct (std::move (path), std::move (inner_attrs),
! 				   std::move (outer_attrs), path_locus));
      case DOT_DOT:
        /* technically this would give a struct base-only struct, but this
         * algorithm should work too. As such, AST type not happening. */
--- 4017,4026 ----
        // struct with no body
        lexer.skip_token ();
  
!       return std::make_unique<AST::StructExprStruct> (std::move (path),
! 						      std::move (inner_attrs),
! 						      std::move (outer_attrs),
! 						      path_locus);
      case DOT_DOT:
        /* technically this would give a struct base-only struct, but this
         * algorithm should work too. As such, AST type not happening. */
*************** Parser<ManagedTokenSource>::parse_struct
*** 3816,3836 ****
  
  	while (t->get_id () != RIGHT_CURLY && t->get_id () != DOT_DOT)
  	  {
! 	    std::unique_ptr<AST::StructExprField> field
! 	      = parse_struct_expr_field ();
! 	    if (field == nullptr)
  	      {
  		Error error (t->get_locus (),
  			     "failed to parse struct (or enum) expr field");
  		add_error (std::move (error));
  
! 		return nullptr;
  	      }
  
  	    // DEBUG:
  	    rust_debug ("struct/enum expr field validated to not be null");
  
! 	    fields.push_back (std::move (field));
  
  	    // DEBUG:
  	    rust_debug ("struct/enum expr field pushed back");
--- 4035,4056 ----
  
  	while (t->get_id () != RIGHT_CURLY && t->get_id () != DOT_DOT)
  	  {
! 	    auto field = parse_struct_expr_field ();
! 	    if (!field
! 		&& field.error () != Parse::Error::StructExprField::STRUCT_BASE)
  	      {
  		Error error (t->get_locus (),
  			     "failed to parse struct (or enum) expr field");
  		add_error (std::move (error));
  
! 		return tl::unexpected<Parse::Error::Expr> (
! 		  Parse::Error::Expr::CHILD_ERROR);
  	      }
  
  	    // DEBUG:
  	    rust_debug ("struct/enum expr field validated to not be null");
  
! 	    fields.push_back (std::move (field.value ()));
  
  	    // DEBUG:
  	    rust_debug ("struct/enum expr field pushed back");
*************** Parser<ManagedTokenSource>::parse_struct
*** 3861,3882 ****
  	    lexer.skip_token ();
  
  	    // parse required struct base expr
! 	    std::unique_ptr<AST::Expr> base_expr = parse_expr ();
! 	    if (base_expr == nullptr)
  	      {
  		Error error (lexer.peek_token ()->get_locus (),
  			     "failed to parse struct base expression in struct "
  			     "expression");
  		add_error (std::move (error));
  
! 		return nullptr;
  	      }
  
  	    // DEBUG:
  	    rust_debug ("struct/enum expr - parsed and validated base expr");
  
! 	    struct_base
! 	      = AST::StructBase (std::move (base_expr), dot_dot_location);
  
  	    // DEBUG:
  	    rust_debug ("assigned struct base to new struct base ");
--- 4081,4103 ----
  	    lexer.skip_token ();
  
  	    // parse required struct base expr
! 	    auto base_expr = parse_expr ();
! 	    if (!base_expr)
  	      {
  		Error error (lexer.peek_token ()->get_locus (),
  			     "failed to parse struct base expression in struct "
  			     "expression");
  		add_error (std::move (error));
  
! 		return tl::unexpected<Parse::Error::Expr> (
! 		  Parse::Error::Expr::CHILD_ERROR);
  	      }
  
  	    // DEBUG:
  	    rust_debug ("struct/enum expr - parsed and validated base expr");
  
! 	    struct_base = AST::StructBase (std::move (base_expr.value ()),
! 					   dot_dot_location);
  
  	    // DEBUG:
  	    rust_debug ("assigned struct base to new struct base ");
*************** Parser<ManagedTokenSource>::parse_struct
*** 3884,3901 ****
  
  	if (!skip_token (RIGHT_CURLY))
  	  {
! 	    return nullptr;
  	  }
  
  	// DEBUG:
  	rust_debug (
  	  "struct/enum expr skipped right curly - done and ready to return");
  
! 	return std::unique_ptr<AST::StructExprStructFields> (
! 	  new AST::StructExprStructFields (std::move (path), std::move (fields),
! 					   path_locus, std::move (struct_base),
! 					   std::move (inner_attrs),
! 					   std::move (outer_attrs)));
        }
      default:
        add_error (
--- 4105,4122 ----
  
  	if (!skip_token (RIGHT_CURLY))
  	  {
! 	    return tl::unexpected<Parse::Error::Expr> (
! 	      Parse::Error::Expr::MALFORMED);
  	  }
  
  	// DEBUG:
  	rust_debug (
  	  "struct/enum expr skipped right curly - done and ready to return");
  
! 	return std::make_unique<AST::StructExprStructFields> (
! 	  std::move (path), std::move (fields), path_locus,
! 	  std::move (struct_base), std::move (inner_attrs),
! 	  std::move (outer_attrs));
        }
      default:
        add_error (
*************** Parser<ManagedTokenSource>::parse_struct
*** 3904,3910 ****
  	       "expected %<}%>, identifier, integer literal, or %<..%>",
  	       t->get_token_description ()));
  
!       return nullptr;
      }
  }
  
--- 4125,4131 ----
  	       "expected %<}%>, identifier, integer literal, or %<..%>",
  	       t->get_token_description ()));
  
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  }
  
*************** Parser<ManagedTokenSource>::parse_struct
*** 3915,3927 ****
   * A better solution would be to just get this to call that function directly.
   * */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::CallExpr>
  Parser<ManagedTokenSource>::parse_struct_expr_tuple_partial (
    AST::PathInExpression path, AST::AttrVec outer_attrs)
  {
    if (!skip_token (LEFT_PAREN))
      {
!       return nullptr;
      }
  
    AST::AttrVec inner_attrs = parse_inner_attributes ();
--- 4136,4148 ----
   * A better solution would be to just get this to call that function directly.
   * */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::CallExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_struct_expr_tuple_partial (
    AST::PathInExpression path, AST::AttrVec outer_attrs)
  {
    if (!skip_token (LEFT_PAREN))
      {
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    AST::AttrVec inner_attrs = parse_inner_attributes ();
*************** Parser<ManagedTokenSource>::parse_struct
*** 3932,3947 ****
    while (t->get_id () != RIGHT_PAREN)
      {
        // parse expression (required)
!       std::unique_ptr<AST::Expr> expr = parse_expr ();
!       if (expr == nullptr)
  	{
  	  Error error (t->get_locus (), "failed to parse expression in "
  					"struct (or enum) expression tuple");
  	  add_error (std::move (error));
  
! 	  return nullptr;
  	}
!       exprs.push_back (std::move (expr));
  
        if (lexer.peek_token ()->get_id () != COMMA)
  	break;
--- 4153,4169 ----
    while (t->get_id () != RIGHT_PAREN)
      {
        // parse expression (required)
!       auto expr = parse_expr ();
!       if (!expr)
  	{
  	  Error error (t->get_locus (), "failed to parse expression in "
  					"struct (or enum) expression tuple");
  	  add_error (std::move (error));
  
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	}
!       exprs.push_back (std::move (expr.value ()));
  
        if (lexer.peek_token ()->get_id () != COMMA)
  	break;
*************** Parser<ManagedTokenSource>::parse_struct
*** 3953,3974 ****
  
    if (!skip_token (RIGHT_PAREN))
      {
!       return nullptr;
      }
  
    location_t path_locus = path.get_locus ();
  
!   auto pathExpr = std::unique_ptr<AST::PathInExpression> (
!     new AST::PathInExpression (std::move (path)));
  
!   return std::unique_ptr<AST::CallExpr> (
!     new AST::CallExpr (std::move (pathExpr), std::move (exprs),
! 		       std::move (outer_attrs), path_locus));
  }
  
  // Parses a closure expression with pratt parsing (from null denotation).
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::ClosureExpr>
  Parser<ManagedTokenSource>::parse_closure_expr_pratt (const_TokenPtr tok,
  						      AST::AttrVec outer_attrs)
  {
--- 4175,4195 ----
  
    if (!skip_token (RIGHT_PAREN))
      {
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    location_t path_locus = path.get_locus ();
  
!   auto pathExpr = std::make_unique<AST::PathInExpression> (std::move (path));
  
!   return std::make_unique<AST::CallExpr> (std::move (pathExpr),
! 					  std::move (exprs),
! 					  std::move (outer_attrs), path_locus);
  }
  
  // Parses a closure expression with pratt parsing (from null denotation).
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::ClosureExpr>, Parse::Error::Expr>
  Parser<ManagedTokenSource>::parse_closure_expr_pratt (const_TokenPtr tok,
  						      AST::AttrVec outer_attrs)
  {
*************** Parser<ManagedTokenSource>::parse_closur
*** 4006,4012 ****
  		Error error (t->get_locus (), "could not parse closure param");
  		add_error (std::move (error));
  
! 		return nullptr;
  	      }
  	    params.push_back (std::move (param));
  
--- 4227,4234 ----
  		Error error (t->get_locus (), "could not parse closure param");
  		add_error (std::move (error));
  
! 		return tl::unexpected<Parse::Error::Expr> (
! 		  Parse::Error::Expr::CHILD_ERROR);
  	      }
  	    params.push_back (std::move (param));
  
*************** Parser<ManagedTokenSource>::parse_closur
*** 4028,4034 ****
  
  	if (!skip_token (PIPE))
  	  {
! 	    return nullptr;
  	  }
  	break;
        }
--- 4250,4257 ----
  
  	if (!skip_token (PIPE))
  	  {
! 	    return tl::unexpected<Parse::Error::Expr> (
! 	      Parse::Error::Expr::MALFORMED);
  	  }
  	break;
        }
*************** Parser<ManagedTokenSource>::parse_closur
*** 4039,4045 ****
  			tok->get_token_description ()));
  
        // skip somewhere?
!       return nullptr;
      }
  
    // again branch based on next token
--- 4262,4268 ----
  			tok->get_token_description ()));
  
        // skip somewhere?
!       return tl::unexpected<Parse::Error::Expr> (Parse::Error::Expr::MALFORMED);
      }
  
    // again branch based on next token
*************** Parser<ManagedTokenSource>::parse_closur
*** 4052,4071 ****
        lexer.skip_token ();
  
        // parse actual type, which is required
!       std::unique_ptr<AST::TypeNoBounds> type = parse_type_no_bounds ();
!       if (type == nullptr)
  	{
  	  // error
  	  Error error (tok->get_locus (), "failed to parse type for closure");
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
  
        // parse block expr, which is required
!       std::unique_ptr<AST::BlockExpr> block = parse_block_expr ();
!       if (block == nullptr)
  	{
  	  // error
  	  Error error (lexer.peek_token ()->get_locus (),
--- 4275,4295 ----
        lexer.skip_token ();
  
        // parse actual type, which is required
!       auto type = parse_type_no_bounds ();
!       if (!type)
  	{
  	  // error
  	  Error error (tok->get_locus (), "failed to parse type for closure");
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	}
  
        // parse block expr, which is required
!       auto block = parse_block_expr ();
!       if (!block)
  	{
  	  // error
  	  Error error (lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_closur
*** 4073,4105 ****
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
  
!       return std::unique_ptr<AST::ClosureExprInnerTyped> (
! 	new AST::ClosureExprInnerTyped (std::move (type), std::move (block),
! 					std::move (params), locus, has_move,
! 					std::move (outer_attrs)));
      }
    else
      {
        // must be expr-only closure
  
        // parse expr, which is required
!       std::unique_ptr<AST::Expr> expr = parse_expr ();
!       if (expr == nullptr)
  	{
  	  Error error (tok->get_locus (),
  		       "failed to parse expression in closure");
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return nullptr;
  	}
  
!       return std::unique_ptr<AST::ClosureExprInner> (
! 	new AST::ClosureExprInner (std::move (expr), std::move (params), locus,
! 				   has_move, std::move (outer_attrs)));
      }
  }
  
--- 4297,4331 ----
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	}
  
!       return std::make_unique<AST::ClosureExprInnerTyped> (
! 	std::move (type), std::move (block.value ()), std::move (params), locus,
! 	has_move, std::move (outer_attrs));
      }
    else
      {
        // must be expr-only closure
  
        // parse expr, which is required
!       auto expr = parse_expr ();
!       if (!expr)
  	{
  	  Error error (tok->get_locus (),
  		       "failed to parse expression in closure");
  	  add_error (std::move (error));
  
  	  // skip somewhere?
! 	  return tl::unexpected<Parse::Error::Expr> (
! 	    Parse::Error::Expr::CHILD_ERROR);
  	}
  
!       return std::make_unique<AST::ClosureExprInner> (std::move (expr.value ()),
! 						      std::move (params), locus,
! 						      has_move,
! 						      std::move (outer_attrs));
      }
  }
  
diff -Nrcpad gcc-16-20260111/gcc/rust/parse/rust-parse-impl-path.hxx gcc-16-20260118/gcc/rust/parse/rust-parse-impl-path.hxx
*** gcc-16-20260111/gcc/rust/parse/rust-parse-impl-path.hxx	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/parse/rust-parse-impl-path.hxx	Sun Jan 18 22:32:08 2026
*************** namespace Rust {
*** 26,32 ****
  
  // Parses a SimplePath AST node, if it exists. Does nothing otherwise.
  template <typename ManagedTokenSource>
! tl::expected<AST::SimplePath, Parse::Error::SimplePath>
  Parser<ManagedTokenSource>::parse_simple_path ()
  {
    bool has_opening_scope_resolution = false;
--- 26,32 ----
  
  // Parses a SimplePath AST node, if it exists. Does nothing otherwise.
  template <typename ManagedTokenSource>
! tl::expected<AST::SimplePath, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_simple_path ()
  {
    bool has_opening_scope_resolution = false;
*************** Parser<ManagedTokenSource>::parse_simple
*** 37,43 ****
    // don't parse anything if not a path upfront
    if (!is_simple_path_segment (lexer.peek_token ()->get_id ())
        && !is_simple_path_segment (lexer.peek_token (1)->get_id ()))
!     return Parse::Error::SimplePath::make_malformed ();
  
    /* Checks for opening scope resolution (i.e. global scope fully-qualified
     * path) */
--- 37,43 ----
    // don't parse anything if not a path upfront
    if (!is_simple_path_segment (lexer.peek_token ()->get_id ())
        && !is_simple_path_segment (lexer.peek_token (1)->get_id ()))
!     return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
  
    /* Checks for opening scope resolution (i.e. global scope fully-qualified
     * path) */
*************** Parser<ManagedTokenSource>::parse_simple
*** 54,60 ****
    auto segment = parse_simple_path_segment ();
  
    if (!segment)
!     return Parse::Error::SimplePath::make_malformed ();
  
    // get location if not gotten already
    if (locus == UNKNOWN_LOCATION)
--- 54,60 ----
    auto segment = parse_simple_path_segment ();
  
    if (!segment)
!     return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::CHILD_ERROR);
  
    // get location if not gotten already
    if (locus == UNKNOWN_LOCATION)
*************** Parser<ManagedTokenSource>::parse_simple
*** 75,81 ****
  	  if (new_segment.error ().kind == Error::INVALID_SIMPLE_PATH_TOKEN)
  	    break; /* Could be end of path */
  	  else	   /* Any other error is an hard error */
! 	    return Parse::Error::SimplePath::make_malformed ();
  	}
  
        segments.push_back (std::move (new_segment.value ()));
--- 75,82 ----
  	  if (new_segment.error ().kind == Error::INVALID_SIMPLE_PATH_TOKEN)
  	    break; /* Could be end of path */
  	  else	   /* Any other error is an hard error */
! 	    return tl::unexpected<Parse::Error::Node> (
! 	      Parse::Error::Node::CHILD_ERROR);
  	}
  
        segments.push_back (std::move (new_segment.value ()));
diff -Nrcpad gcc-16-20260111/gcc/rust/parse/rust-parse-impl-ttree.hxx gcc-16-20260118/gcc/rust/parse/rust-parse-impl-ttree.hxx
*** gcc-16-20260111/gcc/rust/parse/rust-parse-impl-ttree.hxx	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/parse/rust-parse-impl-ttree.hxx	Sun Jan 18 22:32:08 2026
*************** namespace Rust {
*** 29,35 ****
  /* Parses a TokenTree syntactical production. This is either a delimited token
   * tree or a non-delimiter token. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::TokenTree>, Parse::Error::TokenTree>
  Parser<ManagedTokenSource>::parse_token_tree ()
  {
    const_TokenPtr t = lexer.peek_token ();
--- 29,35 ----
  /* Parses a TokenTree syntactical production. This is either a delimited token
   * tree or a non-delimiter token. */
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::TokenTree>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_token_tree ()
  {
    const_TokenPtr t = lexer.peek_token ();
*************** Parser<ManagedTokenSource>::parse_token_
*** 43,50 ****
  	// Parse delimited token tree
  	auto delim_token_tree = parse_delim_token_tree ();
  	if (!delim_token_tree)
! 	  return Parse::Error::TokenTree::
! 	    make_malformed_delimited_token_tree ();
  
  	// TODO: use move rather than copy constructor
  	return std::unique_ptr<AST::DelimTokenTree> (
--- 43,50 ----
  	// Parse delimited token tree
  	auto delim_token_tree = parse_delim_token_tree ();
  	if (!delim_token_tree)
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  
  	// TODO: use move rather than copy constructor
  	return std::unique_ptr<AST::DelimTokenTree> (
*************** Parser<ManagedTokenSource>::parse_token_
*** 62,68 ****
  			"non-delimiter tokens"));
  
        lexer.skip_token ();
!       return Parse::Error::TokenTree::make_malformed ();
      default:
        // parse token itself as TokenTree
        lexer.skip_token ();
--- 62,68 ----
  			"non-delimiter tokens"));
  
        lexer.skip_token ();
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      default:
        // parse token itself as TokenTree
        lexer.skip_token ();
*************** Parser<ManagedTokenSource>::parse_token_
*** 72,78 ****
  
  // Parses a delimited token tree
  template <typename ManagedTokenSource>
! tl::expected<AST::DelimTokenTree, Parse::Error::DelimTokenTree>
  Parser<ManagedTokenSource>::parse_delim_token_tree ()
  {
    const_TokenPtr t = lexer.peek_token ();
--- 72,78 ----
  
  // Parses a delimited token tree
  template <typename ManagedTokenSource>
! tl::expected<AST::DelimTokenTree, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_delim_token_tree ()
  {
    const_TokenPtr t = lexer.peek_token ();
*************** Parser<ManagedTokenSource>::parse_delim_
*** 100,106 ****
  			"delimited token tree)",
  			t->get_token_description ()));
  
!       return Parse::Error::DelimTokenTree::make_expected_delimiter ();
      }
  
    // parse actual token tree vector - 0 or more
--- 100,106 ----
  			"delimited token tree)",
  			t->get_token_description ()));
  
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  
    // parse actual token tree vector - 0 or more
*************** Parser<ManagedTokenSource>::parse_delim_
*** 116,122 ****
      {
        auto tok_tree = parse_token_tree ();
        if (!tok_tree)
! 	return Parse::Error::DelimTokenTree::make_invalid_token_tree ();
  
        token_trees_in_tree.push_back (std::move (tok_tree.value ()));
  
--- 116,123 ----
      {
        auto tok_tree = parse_token_tree ();
        if (!tok_tree)
! 	return tl::unexpected<Parse::Error::Node> (
! 	  Parse::Error::Node::CHILD_ERROR);
  
        token_trees_in_tree.push_back (std::move (tok_tree.value ()));
  
*************** Parser<ManagedTokenSource>::parse_delim_
*** 151,157 ****
  		      : (delim_type == AST::SQUARE ? "]" : "}")));
        add_error (std::move (error));
  
!       return Parse::Error::DelimTokenTree::make_mismatched_delimiters ();
      }
  }
  
--- 152,158 ----
  		      : (delim_type == AST::SQUARE ? "]" : "}")));
        add_error (std::move (error));
  
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  }
  
diff -Nrcpad gcc-16-20260111/gcc/rust/parse/rust-parse-impl.hxx gcc-16-20260118/gcc/rust/parse/rust-parse-impl.hxx
*** gcc-16-20260111/gcc/rust/parse/rust-parse-impl.hxx	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/parse/rust-parse-impl.hxx	Sun Jan 18 22:32:08 2026
*************** Parser<ManagedTokenSource>::parse_crate
*** 314,320 ****
  
  // Parses an identifier/keyword as a Token
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Token>, Parse::Error::Token>
  Parser<ManagedTokenSource>::parse_identifier_or_keyword_token ()
  {
    const_TokenPtr t = lexer.peek_token ();
--- 314,320 ----
  
  // Parses an identifier/keyword as a Token
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Token>, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_identifier_or_keyword_token ()
  {
    const_TokenPtr t = lexer.peek_token ();
*************** Parser<ManagedTokenSource>::parse_identi
*** 327,333 ****
    else
      {
        add_error (Error (t->get_locus (), "expected keyword or identifier"));
!       return Parse::Error::Token::make_malformed ();
      }
  }
  
--- 327,333 ----
    else
      {
        add_error (Error (t->get_locus (), "expected keyword or identifier"));
!       return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::MALFORMED);
      }
  }
  
*************** Parser<ManagedTokenSource>::parse_functi
*** 1588,1594 ****
    auto initial_param = parse_self_param ();
  
    if (!initial_param.has_value ()
!       && initial_param.error () != ParseSelfError::NOT_SELF)
      return nullptr;
  
    if (initial_param.has_value () && lexer.peek_token ()->get_id () == COMMA)
--- 1588,1594 ----
    auto initial_param = parse_self_param ();
  
    if (!initial_param.has_value ()
!       && initial_param.error ().kind != Parse::Error::Self::Kind::NOT_SELF)
      return nullptr;
  
    if (initial_param.has_value () && lexer.peek_token ()->get_id () == COMMA)
*************** Parser<ManagedTokenSource>::parse_functi
*** 1627,1636 ****
      lexer.skip_token ();
    else
      {
!       std::unique_ptr<AST::BlockExpr> block_expr = parse_block_expr ();
!       if (block_expr == nullptr)
  	return nullptr;
!       body = std::move (block_expr);
      }
  
    return std::unique_ptr<AST::Function> (
--- 1627,1636 ----
      lexer.skip_token ();
    else
      {
!       auto block_expr = parse_block_expr ();
!       if (!block_expr)
  	return nullptr;
!       body = std::move (block_expr.value ());
      }
  
    return std::unique_ptr<AST::Function> (
*************** Parser<ManagedTokenSource>::parse_generi
*** 1749,1757 ****
  	auto lifetime = parse_lifetime (false);
  	if (!lifetime)
  	  {
! 	    rust_error_at (
! 	      token->get_locus (),
! 	      "failed to parse lifetime in generic parameter list");
  	    return nullptr;
  	  }
  
--- 1749,1758 ----
  	auto lifetime = parse_lifetime (false);
  	if (!lifetime)
  	  {
! 	    Error error (token->get_locus (),
! 			 "failed to parse lifetime in generic parameter list");
! 	    add_error (std::move (error));
! 
  	    return nullptr;
  	  }
  
*************** Parser<ManagedTokenSource>::parse_generi
*** 1794,1802 ****
  	    type = parse_type ();
  	    if (!type)
  	      {
! 		rust_error_at (
  		  lexer.peek_token ()->get_locus (),
  		  "failed to parse type in type param in generic params");
  		return nullptr;
  	      }
  	  }
--- 1795,1805 ----
  	    type = parse_type ();
  	    if (!type)
  	      {
! 		Error error (
  		  lexer.peek_token ()->get_locus (),
  		  "failed to parse type in type param in generic params");
+ 		add_error (std::move (error));
+ 
  		return nullptr;
  	      }
  	  }
*************** Parser<ManagedTokenSource>::parse_generi
*** 1830,1840 ****
  
  	    if (!default_expr)
  	      {
! 		rust_error_at (tok->get_locus (),
! 			       "invalid token for start of default value for "
! 			       "const generic parameter: expected %<block%>, "
! 			       "%<identifier%> or %<literal%>, got %qs",
! 			       token_id_to_str (tok->get_id ()));
  		return nullptr;
  	      }
  
--- 1833,1845 ----
  
  	    if (!default_expr)
  	      {
! 		Error error (tok->get_locus (),
! 			     "invalid token for start of default value for "
! 			     "const generic parameter: expected %<block%>, "
! 			     "%<identifier%> or %<literal%>, got %qs",
! 			     token_id_to_str (tok->get_id ()));
! 
! 		add_error (std::move (error));
  		return nullptr;
  	      }
  
*************** Parser<ManagedTokenSource>::parse_generi
*** 1854,1862 ****
        }
      default:
        // FIXME: Can we clean this last call with a method call?
!       rust_error_at (token->get_locus (),
! 		     "unexpected token when parsing generic parameters: %qs",
! 		     token->as_string ().c_str ());
        return nullptr;
      }
  
--- 1859,1869 ----
        }
      default:
        // FIXME: Can we clean this last call with a method call?
!       Error error (token->get_locus (),
! 		   "unexpected token when parsing generic parameters: %qs",
! 		   token->as_string ().c_str ());
!       add_error (std::move (error));
! 
        return nullptr;
      }
  
*************** Parser<ManagedTokenSource>::parse_non_pt
*** 2138,2144 ****
  
  /* Parses a single lifetime generic parameter (not including comma). */
  template <typename ManagedTokenSource>
! tl::expected<AST::LifetimeParam, ParseLifetimeParamError>
  Parser<ManagedTokenSource>::parse_lifetime_param ()
  {
    // parse outer attributes, which are optional and may not exist
--- 2145,2151 ----
  
  /* Parses a single lifetime generic parameter (not including comma). */
  template <typename ManagedTokenSource>
! tl::expected<AST::LifetimeParam, Parse::Error::LifetimeParam>
  Parser<ManagedTokenSource>::parse_lifetime_param ()
  {
    // parse outer attributes, which are optional and may not exist
*************** Parser<ManagedTokenSource>::parse_lifeti
*** 2149,2155 ****
    if (lifetime_tok->get_id () != LIFETIME)
      {
        // if lifetime is missing, must not be a lifetime param, so return error
!       return tl::make_unexpected<ParseLifetimeParamError> ({});
      }
    lexer.skip_token ();
    AST::Lifetime lifetime (AST::Lifetime::NAMED, lifetime_tok->get_str (),
--- 2156,2162 ----
    if (lifetime_tok->get_id () != LIFETIME)
      {
        // if lifetime is missing, must not be a lifetime param, so return error
!       return Parse::Error::LifetimeParam::make_not_a_lifetime_param ();
      }
    lexer.skip_token ();
    AST::Lifetime lifetime (AST::Lifetime::NAMED, lifetime_tok->get_str (),
*************** Parser<ManagedTokenSource>::parse_lifeti
*** 2827,2833 ****
  /* Parses a lifetime token (named, 'static, or '_). Also handles lifetime not
   * existing. */
  template <typename ManagedTokenSource>
! tl::expected<AST::Lifetime, ParseLifetimeError>
  Parser<ManagedTokenSource>::parse_lifetime (bool allow_elided)
  {
    const_TokenPtr lifetime_tok = lexer.peek_token ();
--- 2834,2840 ----
  /* Parses a lifetime token (named, 'static, or '_). Also handles lifetime not
   * existing. */
  template <typename ManagedTokenSource>
! tl::expected<AST::Lifetime, Parse::Error::Lifetime>
  Parser<ManagedTokenSource>::parse_lifetime (bool allow_elided)
  {
    const_TokenPtr lifetime_tok = lexer.peek_token ();
*************** Parser<ManagedTokenSource>::parse_lifeti
*** 2839,2845 ****
  	}
        else
  	{
! 	  return tl::make_unexpected<ParseLifetimeError> ({});
  	}
      }
    lexer.skip_token ();
--- 2846,2852 ----
  	}
        else
  	{
! 	  return tl::make_unexpected<Parse::Error::Lifetime> ({});
  	}
      }
    lexer.skip_token ();
*************** Parser<ManagedTokenSource>::parse_enum_i
*** 3490,3500 ****
  	// discriminant enum item
  	lexer.skip_token ();
  
! 	std::unique_ptr<AST::Expr> discriminant_expr = parse_expr ();
  
  	return std::unique_ptr<AST::EnumItemDiscriminant> (
  	  new AST::EnumItemDiscriminant (std::move (item_name), std::move (vis),
! 					 std::move (discriminant_expr),
  					 std::move (outer_attrs),
  					 item_name_tok->get_locus ()));
        }
--- 3497,3509 ----
  	// discriminant enum item
  	lexer.skip_token ();
  
! 	auto discriminant_expr = parse_expr ();
! 	if (!discriminant_expr)
! 	  return nullptr;
  
  	return std::unique_ptr<AST::EnumItemDiscriminant> (
  	  new AST::EnumItemDiscriminant (std::move (item_name), std::move (vis),
! 					 std::move (discriminant_expr.value ()),
  					 std::move (outer_attrs),
  					 item_name_tok->get_locus ()));
        }
*************** Parser<ManagedTokenSource>::parse_const_
*** 3620,3626 ****
      }
  
    // parse constant expression (required)
!   std::unique_ptr<AST::Expr> expr = parse_expr ();
  
    if (!skip_token (SEMICOLON))
      {
--- 3629,3637 ----
      }
  
    // parse constant expression (required)
!   auto expr = parse_expr ();
!   if (!expr)
!     return nullptr;
  
    if (!skip_token (SEMICOLON))
      {
*************** Parser<ManagedTokenSource>::parse_const_
*** 3630,3636 ****
  
    return std::unique_ptr<AST::ConstantItem> (
      new AST::ConstantItem (std::move (ident), std::move (vis), std::move (type),
! 			   std::move (expr), std::move (outer_attrs), locus));
  }
  
  // Parses a "static item" (static storage item, with 'static lifetime).
--- 3641,3648 ----
  
    return std::unique_ptr<AST::ConstantItem> (
      new AST::ConstantItem (std::move (ident), std::move (vis), std::move (type),
! 			   std::move (expr.value ()), std::move (outer_attrs),
! 			   locus));
  }
  
  // Parses a "static item" (static storage item, with 'static lifetime).
*************** Parser<ManagedTokenSource>::parse_static
*** 3672,3678 ****
      }
  
    // parse static item expression (required)
!   std::unique_ptr<AST::Expr> expr = parse_expr ();
  
    if (!skip_token (SEMICOLON))
      {
--- 3684,3692 ----
      }
  
    // parse static item expression (required)
!   auto expr = parse_expr ();
!   if (!expr)
!     return nullptr;
  
    if (!skip_token (SEMICOLON))
      {
*************** Parser<ManagedTokenSource>::parse_static
*** 3682,3688 ****
  
    return std::unique_ptr<AST::StaticItem> (
      new AST::StaticItem (std::move (ident), is_mut, std::move (type),
! 			 std::move (expr), std::move (vis),
  			 std::move (outer_attrs), locus));
  }
  
--- 3696,3702 ----
  
    return std::unique_ptr<AST::StaticItem> (
      new AST::StaticItem (std::move (ident), is_mut, std::move (type),
! 			 std::move (expr.value ()), std::move (vis),
  			 std::move (outer_attrs), locus));
  }
  
*************** Parser<ManagedTokenSource>::parse_trait_
*** 3916,3922 ****
        lexer.skip_token ();
  
        // expression must exist, so parse it
!       const_body = parse_expr ();
      }
  
    if (!skip_token (SEMICOLON))
--- 3930,3939 ----
        lexer.skip_token ();
  
        // expression must exist, so parse it
!       auto expr = parse_expr ();
!       if (!expr)
! 	return nullptr;
!       const_body = std::move (expr.value ());
      }
  
    if (!skip_token (SEMICOLON))
*************** Parser<ManagedTokenSource>::parse_inhere
*** 4286,4292 ****
    auto initial_param = parse_self_param ();
  
    if (!initial_param.has_value ()
!       && initial_param.error () != ParseSelfError::NOT_SELF)
      return nullptr;
  
    /* FIXME: ensure that self param doesn't accidently consume tokens for a
--- 4303,4309 ----
    auto initial_param = parse_self_param ();
  
    if (!initial_param.has_value ()
!       && initial_param.error ().kind != Parse::Error::Self::Kind::NOT_SELF)
      return nullptr;
  
    /* FIXME: ensure that self param doesn't accidently consume tokens for a
*************** Parser<ManagedTokenSource>::parse_inhere
*** 4331,4337 ****
      {
        auto result = parse_block_expr ();
  
!       if (result == nullptr)
  	{
  	  Error error (
  	    lexer.peek_token ()->get_locus (),
--- 4348,4354 ----
      {
        auto result = parse_block_expr ();
  
!       if (!result)
  	{
  	  Error error (
  	    lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_inhere
*** 4342,4348 ****
  	  skip_after_end_block ();
  	  return nullptr;
  	}
!       body = std::move (result);
      }
  
    return std::unique_ptr<AST::Function> (
--- 4359,4365 ----
  	  skip_after_end_block ();
  	  return nullptr;
  	}
!       body = std::move (result.value ());
      }
  
    return std::unique_ptr<AST::Function> (
*************** Parser<ManagedTokenSource>::parse_trait_
*** 4487,4493 ****
    auto initial_param = parse_self_param ();
  
    if (!initial_param.has_value ()
!       && initial_param.error () != ParseSelfError::NOT_SELF)
      return nullptr;
  
    // FIXME: ensure that self param doesn't accidently consume tokens for a
--- 4504,4510 ----
    auto initial_param = parse_self_param ();
  
    if (!initial_param.has_value ()
!       && initial_param.error ().kind != Parse::Error::Self::Kind::NOT_SELF)
      return nullptr;
  
    // FIXME: ensure that self param doesn't accidently consume tokens for a
*************** Parser<ManagedTokenSource>::parse_trait_
*** 4569,4575 ****
    else
      {
        auto result = parse_block_expr ();
!       if (result == nullptr)
  	{
  	  Error error (lexer.peek_token ()->get_locus (),
  		       "could not parse definition in trait impl %s definition",
--- 4586,4592 ----
    else
      {
        auto result = parse_block_expr ();
!       if (!result)
  	{
  	  Error error (lexer.peek_token ()->get_locus (),
  		       "could not parse definition in trait impl %s definition",
*************** Parser<ManagedTokenSource>::parse_trait_
*** 4579,4585 ****
  	  skip_after_end_block ();
  	  return nullptr;
  	}
!       body = std::move (result);
      }
  
    return std::unique_ptr<AST::Function> (
--- 4596,4602 ----
  	  skip_after_end_block ();
  	  return nullptr;
  	}
!       body = std::move (result.value ());
      }
  
    return std::unique_ptr<AST::Function> (
*************** Parser<ManagedTokenSource>::parse_let_st
*** 4873,4889 ****
        // must have an expression
        lexer.skip_token ();
  
!       expr = parse_expr ();
!       if (expr == nullptr)
  	{
  	  skip_after_semicolon ();
  	  return nullptr;
  	}
      }
  
    tl::optional<std::unique_ptr<AST::Expr>> else_expr = tl::nullopt;
    if (maybe_skip_token (ELSE))
!     else_expr = parse_block_expr ();
  
    if (restrictions.consume_semi)
      {
--- 4890,4914 ----
        // must have an expression
        lexer.skip_token ();
  
!       auto expr_res = parse_expr ();
!       if (!expr_res)
  	{
  	  skip_after_semicolon ();
  	  return nullptr;
  	}
+       expr = std::move (expr_res.value ());
      }
  
    tl::optional<std::unique_ptr<AST::Expr>> else_expr = tl::nullopt;
    if (maybe_skip_token (ELSE))
!     {
!       auto block_expr = parse_block_expr ();
!       if (block_expr)
! 	else_expr = tl::optional<std::unique_ptr<AST::Expr>>{
! 	  std::move (block_expr.value ())};
!       else
! 	else_expr = tl::nullopt;
!     }
  
    if (restrictions.consume_semi)
      {
*************** Parser<ManagedTokenSource>::parse_generi
*** 4949,4955 ****
  						  tok->get_locus ());
        }
      case LEFT_CURLY:
!       expr = parse_block_expr ();
        break;
      case MINUS:
      case STRING_LITERAL:
--- 4974,4986 ----
  						  tok->get_locus ());
        }
      case LEFT_CURLY:
!       {
! 	auto res = parse_block_expr ();
! 	if (res)
! 	  expr = std::move (res.value ());
! 	else
! 	  return tl::nullopt;
!       }
        break;
      case MINUS:
      case STRING_LITERAL:
*************** Parser<ManagedTokenSource>::parse_generi
*** 4958,4964 ****
      case FLOAT_LITERAL:
      case TRUE_LITERAL:
      case FALSE_LITERAL:
!       expr = parse_literal_expr ();
        break;
      // FIXME: Because of this, error reporting is garbage for const generic
      // parameter's default values
--- 4989,5001 ----
      case FLOAT_LITERAL:
      case TRUE_LITERAL:
      case FALSE_LITERAL:
!       {
! 	auto res = parse_literal_expr ();
! 	if (res)
! 	  expr = std::move (res.value ());
! 	else
! 	  return tl::nullopt;
!       }
        break;
      // FIXME: Because of this, error reporting is garbage for const generic
      // parameter's default values
*************** Parser<ManagedTokenSource>::parse_generi
*** 5132,5138 ****
  
  // Parses a self param. Also handles self param not existing.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Param>, ParseSelfError>
  Parser<ManagedTokenSource>::parse_self_param ()
  {
    bool has_reference = false;
--- 5169,5175 ----
  
  // Parses a self param. Also handles self param not existing.
  template <typename ManagedTokenSource>
! tl::expected<std::unique_ptr<AST::Param>, Parse::Error::Self>
  Parser<ManagedTokenSource>::parse_self_param ()
  {
    bool has_reference = false;
*************** Parser<ManagedTokenSource>::parse_self_p
*** 5154,5162 ****
  	  break;
        if (i == s.size ())
  	{
! 	  rust_error_at (lexer.peek_token ()->get_locus (),
! 			 "cannot pass %<self%> by raw pointer");
! 	  return tl::make_unexpected (ParseSelfError::SELF_PTR);
  	}
      }
  
--- 5191,5200 ----
  	  break;
        if (i == s.size ())
  	{
! 	  Error error (lexer.peek_token ()->get_locus (),
! 		       "cannot pass %<self%> by raw pointer");
! 	  add_error (std::move (error));
! 	  return Parse::Error::Self::make_self_raw_pointer ();
  	}
      }
  
*************** Parser<ManagedTokenSource>::parse_self_p
*** 5177,5183 ****
        is_self = true;
  
    if (!is_self)
!     return tl::make_unexpected (ParseSelfError::NOT_SELF);
  
    // test if self is a reference parameter
    if (lexer.peek_token ()->get_id () == AMP)
--- 5215,5221 ----
        is_self = true;
  
    if (!is_self)
!     return Parse::Error::Self::make_not_self ();
  
    // test if self is a reference parameter
    if (lexer.peek_token ()->get_id () == AMP)
*************** Parser<ManagedTokenSource>::parse_self_p
*** 5200,5206 ****
  	      add_error (std::move (error));
  
  	      // skip after somewhere?
! 	      return tl::make_unexpected (ParseSelfError::PARSING);
  	    }
  	}
      }
--- 5238,5244 ----
  	      add_error (std::move (error));
  
  	      // skip after somewhere?
! 	      return Parse::Error::Self::make_parsing_error ();
  	    }
  	}
      }
*************** Parser<ManagedTokenSource>::parse_self_p
*** 5218,5224 ****
    if (self_tok->get_id () != SELF)
      {
        // skip after somewhere?
!       return tl::make_unexpected (ParseSelfError::NOT_SELF);
      }
    lexer.skip_token ();
  
--- 5256,5262 ----
    if (self_tok->get_id () != SELF)
      {
        // skip after somewhere?
!       return Parse::Error::Self::make_not_self ();
      }
    lexer.skip_token ();
  
*************** Parser<ManagedTokenSource>::parse_self_p
*** 5237,5248 ****
  	  add_error (std::move (error));
  
  	  // skip after somewhere?
! 	  return tl::make_unexpected (ParseSelfError::PARSING);
  	}
      }
  
    // ensure that cannot have both type and reference
!   if (type != nullptr && has_reference)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
--- 5275,5286 ----
  	  add_error (std::move (error));
  
  	  // skip after somewhere?
! 	  return Parse::Error::Self::make_parsing_error ();
  	}
      }
  
    // ensure that cannot have both type and reference
!   if (type && has_reference)
      {
        Error error (
  	lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_self_p
*** 5250,5256 ****
        add_error (std::move (error));
  
        // skip after somewhere?
!       return tl::make_unexpected (ParseSelfError::PARSING);
      }
  
    if (has_reference)
--- 5288,5294 ----
        add_error (std::move (error));
  
        // skip after somewhere?
!       return Parse::Error::Self::make_parsing_error ();
      }
  
    if (has_reference)
*************** Parser<ManagedTokenSource>::parse_expr_s
*** 5274,5280 ****
  {
    location_t locus = lexer.peek_token ()->get_locus ();
  
!   std::unique_ptr<AST::Expr> expr;
  
    switch (lexer.peek_token ()->get_id ())
      {
--- 5312,5318 ----
  {
    location_t locus = lexer.peek_token ()->get_locus ();
  
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr> expr;
  
    switch (lexer.peek_token ()->get_id ())
      {
*************** Parser<ManagedTokenSource>::parse_expr_s
*** 5287,5293 ****
      case SCOPE_RESOLUTION:
        {
  	AST::PathInExpression path = parse_path_in_expression ();
! 	std::unique_ptr<AST::Expr> null_denotation;
  
  	if (lexer.peek_token ()->get_id () == EXCLAM)
  	  {
--- 5325,5332 ----
      case SCOPE_RESOLUTION:
        {
  	AST::PathInExpression path = parse_path_in_expression ();
! 	tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
! 	  null_denotation;
  
  	if (lexer.peek_token ()->get_id () == EXCLAM)
  	  {
*************** Parser<ManagedTokenSource>::parse_expr_s
*** 5335,5341 ****
        break;
      }
  
!   if (expr == nullptr)
      {
        // expr is required, error
        Error error (lexer.peek_token ()->get_locus (),
--- 5374,5380 ----
        break;
      }
  
!   if (!expr)
      {
        // expr is required, error
        Error error (lexer.peek_token ()->get_locus (),
*************** Parser<ManagedTokenSource>::parse_expr_s
*** 5354,5360 ****
  	{
  	  has_semi = true;
  	}
!       else if (expr->is_expr_without_block ())
  	{
  	  if (restrictions.allow_close_after_expr_stmt)
  	    {
--- 5393,5399 ----
  	{
  	  has_semi = true;
  	}
!       else if (expr.value ()->is_expr_without_block ())
  	{
  	  if (restrictions.allow_close_after_expr_stmt)
  	    {
*************** Parser<ManagedTokenSource>::parse_expr_s
*** 5373,5393 ****
  	}
      }
  
!   return std::unique_ptr<AST::ExprStmt> (
!     new AST::ExprStmt (std::move (expr), locus, has_semi));
  }
  
  // Parses a loop label used in loop expressions.
  template <typename ManagedTokenSource>
! tl::expected<AST::LoopLabel, ParseLoopLabelError>
  Parser<ManagedTokenSource>::parse_loop_label (const_TokenPtr tok)
  {
    // parse lifetime - if doesn't exist, assume no label
    if (tok->get_id () != LIFETIME)
      {
        // not necessarily an error
!       return tl::unexpected<ParseLoopLabelError> (
! 	ParseLoopLabelError::NOT_LOOP_LABEL);
      }
    /* FIXME: check for named lifetime requirement here? or check in semantic
     * analysis phase? */
--- 5412,5431 ----
  	}
      }
  
!   return std::make_unique<AST::ExprStmt> (std::move (expr.value ()), locus,
! 					  has_semi);
  }
  
  // Parses a loop label used in loop expressions.
  template <typename ManagedTokenSource>
! tl::expected<AST::LoopLabel, Parse::Error::LoopLabel>
  Parser<ManagedTokenSource>::parse_loop_label (const_TokenPtr tok)
  {
    // parse lifetime - if doesn't exist, assume no label
    if (tok->get_id () != LIFETIME)
      {
        // not necessarily an error
!       return Parse::Error::LoopLabel::make_not_loop_label ();
      }
    /* FIXME: check for named lifetime requirement here? or check in semantic
     * analysis phase? */
*************** Parser<ManagedTokenSource>::parse_loop_l
*** 5396,5406 ****
    if (!skip_token (COLON))
      {
        // skip somewhere?
!       return tl::unexpected<ParseLoopLabelError> (
! 	ParseLoopLabelError::MISSING_COLON);
      }
  
!   return tl::expected<AST::LoopLabel, ParseLoopLabelError> (
      AST::LoopLabel (std::move (label), tok->get_locus ()));
  }
  
--- 5434,5443 ----
    if (!skip_token (COLON))
      {
        // skip somewhere?
!       Parse::Error::LoopLabel::make_missing_colon ();
      }
  
!   return tl::expected<AST::LoopLabel, Parse::Error::LoopLabel> (
      AST::LoopLabel (std::move (label), tok->get_locus ()));
  }
  
*************** Parser<ManagedTokenSource>::parse_match_
*** 5423,5431 ****
      }
  
    // parse match arm patterns - at least 1 is required
!   std::vector<std::unique_ptr<AST::Pattern>> match_arm_patterns
!     = parse_match_arm_patterns (RIGHT_CURLY);
!   if (match_arm_patterns.empty ())
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse any patterns in match arm");
--- 5460,5468 ----
      }
  
    // parse match arm patterns - at least 1 is required
!   std::unique_ptr<AST::Pattern> match_arm_pattern
!     = parse_match_arm_pattern (RIGHT_CURLY);
!   if (match_arm_pattern == nullptr)
      {
        Error error (lexer.peek_token ()->get_locus (),
  		   "failed to parse any patterns in match arm");
*************** Parser<ManagedTokenSource>::parse_match_
*** 5444,5451 ****
      {
        lexer.skip_token ();
  
!       guard_expr = parse_expr ();
!       if (guard_expr == nullptr)
  	{
  	  Error error (lexer.peek_token ()->get_locus (),
  		       "failed to parse guard expression in match arm");
--- 5481,5488 ----
      {
        lexer.skip_token ();
  
!       auto guard_expr_res = parse_expr ();
!       if (!guard_expr_res)
  	{
  	  Error error (lexer.peek_token ()->get_locus (),
  		       "failed to parse guard expression in match arm");
*************** Parser<ManagedTokenSource>::parse_match_
*** 5454,5465 ****
  	  // skip somewhere?
  	  return AST::MatchArm::create_error ();
  	}
      }
  
    // DEBUG
    rust_debug ("successfully parsed match arm");
  
!   return AST::MatchArm (std::move (match_arm_patterns),
  			lexer.peek_token ()->get_locus (),
  			std::move (guard_expr), std::move (outer_attrs));
  }
--- 5491,5503 ----
  	  // skip somewhere?
  	  return AST::MatchArm::create_error ();
  	}
+       guard_expr = std::move (guard_expr_res.value ());
      }
  
    // DEBUG
    rust_debug ("successfully parsed match arm");
  
!   return AST::MatchArm (std::move (match_arm_pattern),
  			lexer.peek_token ()->get_locus (),
  			std::move (guard_expr), std::move (outer_attrs));
  }
*************** Parser<ManagedTokenSource>::parse_match_
*** 5468,5475 ****
   * token that would exist after the patterns are done (e.g. '}' for match
   * expr, '=' for if let and while let). */
  template <typename ManagedTokenSource>
! std::vector<std::unique_ptr<AST::Pattern>>
! Parser<ManagedTokenSource>::parse_match_arm_patterns (TokenId end_token_id)
  {
    // skip optional leading '|'
    if (lexer.peek_token ()->get_id () == PIPE)
--- 5506,5513 ----
   * token that would exist after the patterns are done (e.g. '}' for match
   * expr, '=' for if let and while let). */
  template <typename ManagedTokenSource>
! std::unique_ptr<AST::Pattern>
! Parser<ManagedTokenSource>::parse_match_arm_pattern (TokenId end_token_id)
  {
    // skip optional leading '|'
    if (lexer.peek_token ()->get_id () == PIPE)
*************** Parser<ManagedTokenSource>::parse_match_
*** 5478,5533 ****
     * If semantically different, I need a wrapped "match arm patterns" object
     * for this. */
  
!   std::vector<std::unique_ptr<AST::Pattern>> patterns;
  
    // quick break out if end_token_id
    if (lexer.peek_token ()->get_id () == end_token_id)
!     return patterns;
  
    // parse required pattern - if doesn't exist, return empty
    std::unique_ptr<AST::Pattern> initial_pattern = parse_pattern ();
    if (initial_pattern == nullptr)
      {
        // FIXME: should this be an error?
!       return patterns;
!     }
!   patterns.push_back (std::move (initial_pattern));
! 
!   // DEBUG
!   rust_debug ("successfully parsed initial match arm pattern");
! 
!   // parse new patterns as long as next char is '|'
!   const_TokenPtr t = lexer.peek_token ();
!   while (t->get_id () == PIPE)
!     {
!       // skip pipe token
!       lexer.skip_token ();
! 
!       // break if hit end token id
!       if (lexer.peek_token ()->get_id () == end_token_id)
! 	break;
! 
!       // parse pattern
!       std::unique_ptr<AST::Pattern> pattern = parse_pattern ();
!       if (pattern == nullptr)
! 	{
! 	  // this is an error
! 	  Error error (lexer.peek_token ()->get_locus (),
! 		       "failed to parse pattern in match arm patterns");
! 	  add_error (std::move (error));
! 
! 	  // skip somewhere?
! 	  return {};
! 	}
! 
!       patterns.push_back (std::move (pattern));
! 
!       t = lexer.peek_token ();
      }
  
!   patterns.shrink_to_fit ();
! 
!   return patterns;
  }
  
  // Parses a single parameter used in a closure definition.
--- 5516,5536 ----
     * If semantically different, I need a wrapped "match arm patterns" object
     * for this. */
  
!   std::unique_ptr<AST::Pattern> pattern;
  
    // quick break out if end_token_id
    if (lexer.peek_token ()->get_id () == end_token_id)
!     return pattern;
  
    // parse required pattern - if doesn't exist, return empty
    std::unique_ptr<AST::Pattern> initial_pattern = parse_pattern ();
    if (initial_pattern == nullptr)
      {
        // FIXME: should this be an error?
!       return pattern;
      }
  
!   return initial_pattern;
  }
  
  // Parses a single parameter used in a closure definition.
*************** Parser<ManagedTokenSource>::parse_tuple_
*** 6970,6976 ****
   * exists). Useful for block expressions where it cannot be determined through
   * lookahead whether it is a statement or expression to be parsed. */
  template <typename ManagedTokenSource>
! ExprOrStmt
  Parser<ManagedTokenSource>::parse_stmt_or_expr ()
  {
    // quick exit for empty statement
--- 6973,6979 ----
   * exists). Useful for block expressions where it cannot be determined through
   * lookahead whether it is a statement or expression to be parsed. */
  template <typename ManagedTokenSource>
! tl::expected<ExprOrStmt, Parse::Error::Node>
  Parser<ManagedTokenSource>::parse_stmt_or_expr ()
  {
    // quick exit for empty statement
*************** Parser<ManagedTokenSource>::parse_stmt_o
*** 6987,6993 ****
    AST::AttrVec outer_attrs = parse_outer_attributes ();
    ParseRestrictions restrictions;
    restrictions.expr_can_be_stmt = true;
!   std::unique_ptr<AST::Expr> expr;
  
    // parsing this will be annoying because of the many different possibilities
    /* best may be just to copy paste in parse_item switch, and failing that try
--- 6990,6998 ----
    AST::AttrVec outer_attrs = parse_outer_attributes ();
    ParseRestrictions restrictions;
    restrictions.expr_can_be_stmt = true;
! 
!   // Defered child error checking: we need to check for a semicolon
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr> expr;
  
    // parsing this will be annoying because of the many different possibilities
    /* best may be just to copy paste in parse_item switch, and failing that try
*************** Parser<ManagedTokenSource>::parse_stmt_o
*** 7077,7083 ****
  			      t->get_token_description ()));
  
  	    // skip somewhere?
! 	    return ExprOrStmt::create_error ();
  	  }
  	break;
        }
--- 7082,7089 ----
  			      t->get_token_description ()));
  
  	    // skip somewhere?
! 	    return tl::unexpected<Parse::Error::Node> (
! 	      Parse::Error::Node::MALFORMED);
  	  }
  	break;
        }
*************** Parser<ManagedTokenSource>::parse_stmt_o
*** 7112,7118 ****
      case DOLLAR_SIGN:
        {
  	AST::PathInExpression path = parse_path_in_expression ();
! 	std::unique_ptr<AST::Expr> null_denotation;
  
  	if (lexer.peek_token ()->get_id () == EXCLAM)
  	  {
--- 7118,7125 ----
      case DOLLAR_SIGN:
        {
  	AST::PathInExpression path = parse_path_in_expression ();
! 	tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
! 	  null_denotation;
  
  	if (lexer.peek_token ()->get_id () == EXCLAM)
  	  {
*************** Parser<ManagedTokenSource>::parse_stmt_o
*** 7120,7126 ****
  	      = parse_macro_invocation_partial (std::move (path),
  						std::move (outer_attrs));
  	    if (invoc == nullptr)
! 	      return ExprOrStmt::create_error ();
  
  	    if (restrictions.consume_semi && maybe_skip_token (SEMICOLON))
  	      {
--- 7127,7134 ----
  	      = parse_macro_invocation_partial (std::move (path),
  						std::move (outer_attrs));
  	    if (invoc == nullptr)
! 	      return tl::unexpected<Parse::Error::Node> (
! 		Parse::Error::Node::CHILD_ERROR);
  
  	    if (restrictions.consume_semi && maybe_skip_token (SEMICOLON))
  	      {
*************** Parser<ManagedTokenSource>::parse_stmt_o
*** 7171,7197 ****
  
        if (expr)
  	{
! 	  std::unique_ptr<AST::ExprStmt> stmt (
! 	    new AST::ExprStmt (std::move (expr), t->get_locus (), true));
! 	  return ExprOrStmt (std::move (stmt));
  	}
        else
  	{
! 	  return ExprOrStmt::create_error ();
  	}
      }
  
!   if (expr && !expr->is_expr_without_block ()
!       && after_expr->get_id () != RIGHT_CURLY)
      {
        // block expression statement.
!       std::unique_ptr<AST::ExprStmt> stmt (
! 	new AST::ExprStmt (std::move (expr), t->get_locus (), false));
!       return ExprOrStmt (std::move (stmt));
      }
  
    // return expression
!   return ExprOrStmt (std::move (expr));
  }
  
  } // namespace Rust
--- 7179,7210 ----
  
        if (expr)
  	{
! 	  return ExprOrStmt (
! 	    std::make_unique<AST::ExprStmt> (std::move (expr.value ()),
! 					     t->get_locus (), true));
  	}
        else
  	{
! 	  return tl::unexpected<Parse::Error::Node> (
! 	    Parse::Error::Node::CHILD_ERROR);
  	}
      }
  
!   if (expr)
      {
        // block expression statement.
!       if (!expr.value ()->is_expr_without_block ()
! 	  && after_expr->get_id () != RIGHT_CURLY)
! 	return ExprOrStmt (
! 	  std::make_unique<AST::ExprStmt> (std::move (expr.value ()),
! 					   t->get_locus (), false));
      }
  
    // return expression
!   if (expr)
!     return ExprOrStmt (std::move (expr.value ()));
!   else
!     return tl::unexpected<Parse::Error::Node> (Parse::Error::Node::CHILD_ERROR);
  }
  
  } // namespace Rust
diff -Nrcpad gcc-16-20260111/gcc/rust/parse/rust-parse.h gcc-16-20260118/gcc/rust/parse/rust-parse.h
*** gcc-16-20260111/gcc/rust/parse/rust-parse.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/parse/rust-parse.h	Sun Jan 18 22:32:08 2026
*************** along with GCC; see the file COPYING3.
*** 29,60 ****
  
  namespace Rust {
  
- class ParseLifetimeParamError
- {
- };
- 
- class ParseLifetimeError
- {
- };
- 
- enum class AnonConstError
- {
-   InvalidSizeExpr,
- };
- 
- enum class ParseLoopLabelError
- {
-   NOT_LOOP_LABEL,
-   MISSING_COLON,
- };
- 
- enum class ParseSelfError
- {
-   SELF_PTR,
-   PARSING,
-   NOT_SELF,
- };
- 
  // Left binding powers of operations.
  enum binding_powers
  {
--- 29,34 ----
*************** struct ExprOrStmt
*** 178,193 ****
      : expr (std::move (macro))
    {}
  
-   // Returns whether this object is in an error state.
-   bool is_error () const
-   {
-     return (expr == nullptr && stmt == nullptr)
- 	   || (expr != nullptr && stmt != nullptr);
-   }
- 
-   // Returns an error state object.
-   static ExprOrStmt create_error () { return ExprOrStmt (nullptr, nullptr); }
- 
    ~ExprOrStmt () = default;
  
    /* no copy constructors/assignment as simple object like this shouldn't
--- 152,157 ----
*************** public:
*** 263,283 ****
     */
    bool maybe_skip_token (TokenId t);
  
!   std::unique_ptr<AST::Expr>
    parse_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  	      ParseRestrictions restrictions = ParseRestrictions ());
  
!   std::unique_ptr<AST::LiteralExpr> parse_literal_expr (AST::AttrVec outer_attrs
! 							= AST::AttrVec ());
  
!   std::unique_ptr<AST::BlockExpr>
    parse_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		    tl::optional<AST::LoopLabel> = tl::nullopt,
  		    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
  
!   tl::expected<AST::AnonConst, AnonConstError> parse_anon_const ();
  
!   std::unique_ptr<AST::ConstBlock>
    parse_const_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			  location_t loc = UNKNOWN_LOCATION);
  
--- 227,247 ----
     */
    bool maybe_skip_token (TokenId t);
  
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
    parse_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  	      ParseRestrictions restrictions = ParseRestrictions ());
  
!   tl::expected<std::unique_ptr<AST::LiteralExpr>, Parse::Error::Node>
!   parse_literal_expr (AST::AttrVec outer_attrs = AST::AttrVec ());
  
!   tl::expected<std::unique_ptr<AST::BlockExpr>, Parse::Error::Node>
    parse_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		    tl::optional<AST::LoopLabel> = tl::nullopt,
  		    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
  
!   tl::expected<AST::AnonConst, Parse::Error::Node> parse_anon_const ();
  
!   tl::expected<std::unique_ptr<AST::ConstBlock>, Parse::Error::Node>
    parse_const_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			  location_t loc = UNKNOWN_LOCATION);
  
*************** public:
*** 307,315 ****
    std::vector<std::unique_ptr<AST::LifetimeParam>> parse_lifetime_params ();
    tl::expected<AST::Visibility, Parse::Error::Visibility> parse_visibility ();
    std::unique_ptr<AST::IdentifierPattern> parse_identifier_pattern ();
!   tl::expected<std::unique_ptr<AST::Token>, Parse::Error::Token>
    parse_identifier_or_keyword_token ();
!   tl::expected<std::unique_ptr<AST::TokenTree>, Parse::Error::TokenTree>
    parse_token_tree ();
  
    tl::expected<Parse::AttributeBody, Parse::Error::AttributeBody>
--- 271,279 ----
    std::vector<std::unique_ptr<AST::LifetimeParam>> parse_lifetime_params ();
    tl::expected<AST::Visibility, Parse::Error::Visibility> parse_visibility ();
    std::unique_ptr<AST::IdentifierPattern> parse_identifier_pattern ();
!   tl::expected<std::unique_ptr<AST::Token>, Parse::Error::Node>
    parse_identifier_or_keyword_token ();
!   tl::expected<std::unique_ptr<AST::TokenTree>, Parse::Error::Node>
    parse_token_tree ();
  
    tl::expected<Parse::AttributeBody, Parse::Error::AttributeBody>
*************** private:
*** 347,353 ****
    Parse::AttributeBody parse_doc_comment ();
  
    // Path-related
!   tl::expected<AST::SimplePath, Parse::Error::SimplePath> parse_simple_path ();
    tl::expected<AST::SimplePathSegment, Parse::Error::SimplePathSegment>
    parse_simple_path_segment (int base_peek = 0);
    AST::TypePath parse_type_path ();
--- 311,317 ----
    Parse::AttributeBody parse_doc_comment ();
  
    // Path-related
!   tl::expected<AST::SimplePath, Parse::Error::Node> parse_simple_path ();
    tl::expected<AST::SimplePathSegment, Parse::Error::SimplePathSegment>
    parse_simple_path_segment (int base_peek = 0);
    AST::TypePath parse_type_path ();
*************** private:
*** 370,376 ****
    AST::QualifiedPathInType parse_qualified_path_in_type ();
  
    // Token tree or macro related
!   tl::expected<AST::DelimTokenTree, Parse::Error::DelimTokenTree>
    parse_delim_token_tree ();
    std::unique_ptr<AST::MacroRulesDefinition>
    parse_macro_rules_def (AST::AttrVec outer_attrs);
--- 334,340 ----
    AST::QualifiedPathInType parse_qualified_path_in_type ();
  
    // Token tree or macro related
!   tl::expected<AST::DelimTokenTree, Parse::Error::Node>
    parse_delim_token_tree ();
    std::unique_ptr<AST::MacroRulesDefinition>
    parse_macro_rules_def (AST::AttrVec outer_attrs);
*************** private:
*** 420,426 ****
      ParseFunction parsing_function, EndTokenPred is_end_token,
      std::string error_msg = "failed to parse generic param in generic params")
      -> std::vector<decltype (parsing_function ())>;
!   tl::expected<AST::LifetimeParam, ParseLifetimeParamError>
    parse_lifetime_param ();
    std::vector<std::unique_ptr<AST::TypeParam>> parse_type_params ();
    template <typename EndTokenPred>
--- 384,390 ----
      ParseFunction parsing_function, EndTokenPred is_end_token,
      std::string error_msg = "failed to parse generic param in generic params")
      -> std::vector<decltype (parsing_function ())>;
!   tl::expected<AST::LifetimeParam, Parse::Error::LifetimeParam>
    parse_lifetime_param ();
    std::vector<std::unique_ptr<AST::TypeParam>> parse_type_params ();
    template <typename EndTokenPred>
*************** private:
*** 450,456 ****
    std::vector<AST::Lifetime> parse_lifetime_bounds ();
    template <typename EndTokenPred>
    std::vector<AST::Lifetime> parse_lifetime_bounds (EndTokenPred is_end_token);
!   tl::expected<AST::Lifetime, ParseLifetimeError>
    parse_lifetime (bool allow_elided);
    AST::Lifetime lifetime_from_token (const_TokenPtr tok);
    std::unique_ptr<AST::ExternalTypeItem>
--- 414,420 ----
    std::vector<AST::Lifetime> parse_lifetime_bounds ();
    template <typename EndTokenPred>
    std::vector<AST::Lifetime> parse_lifetime_bounds (EndTokenPred is_end_token);
!   tl::expected<AST::Lifetime, Parse::Error::Lifetime>
    parse_lifetime (bool allow_elided);
    AST::Lifetime lifetime_from_token (const_TokenPtr tok);
    std::unique_ptr<AST::ExternalTypeItem>
*************** private:
*** 486,492 ****
    std::unique_ptr<AST::ConstantItem>
    parse_trait_const (AST::AttrVec outer_attrs);
  
!   tl::expected<std::unique_ptr<AST::Param>, ParseSelfError> parse_self_param ();
  
    std::unique_ptr<AST::Impl> parse_impl (AST::Visibility vis,
  					 AST::AttrVec outer_attrs);
--- 450,457 ----
    std::unique_ptr<AST::ConstantItem>
    parse_trait_const (AST::AttrVec outer_attrs);
  
!   tl::expected<std::unique_ptr<AST::Param>, Parse::Error::Self>
!   parse_self_param ();
  
    std::unique_ptr<AST::Impl> parse_impl (AST::Visibility vis,
  					 AST::AttrVec outer_attrs);
*************** private:
*** 503,719 ****
  						   AST::AttrVec outer_attrs);
  
    // Expression-related (Pratt parsed)
!   std::unique_ptr<AST::Expr>
    parse_expr (int right_binding_power,
  	      AST::AttrVec outer_attrs = AST::AttrVec (),
  	      ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::Expr>
    null_denotation (AST::AttrVec outer_attrs = AST::AttrVec (),
  		   ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::Expr>
    null_denotation_path (AST::PathInExpression path, AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::Expr>
    null_denotation_not_path (const_TokenPtr t, AST::AttrVec outer_attrs,
  			    ParseRestrictions restrictions
  			    = ParseRestrictions ());
!   std::unique_ptr<AST::Expr>
!   left_denotations (std::unique_ptr<AST::Expr> null_denotation,
  		    int right_binding_power, AST::AttrVec outer_attrs,
  		    ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::Expr>
    left_denotation (const_TokenPtr t, std::unique_ptr<AST::Expr> left,
  		   AST::AttrVec outer_attrs = AST::AttrVec (),
  		   ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_arithmetic_or_logical_expr (
      const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
      AST::AttrVec outer_attrs, AST::ArithmeticOrLogicalExpr::ExprType expr_type,
      ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_binary_plus_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_binary_minus_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			   AST::AttrVec outer_attrs,
  			   ParseRestrictions restrictions
  			   = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_binary_mult_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_binary_div_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_binary_mod_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_bitwise_and_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_bitwise_or_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_bitwise_xor_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_left_shift_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ArithmeticOrLogicalExpr>
    parse_right_shift_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   std::unique_ptr<AST::ComparisonExpr>
    parse_comparison_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 AST::ComparisonExpr::ExprType expr_type,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ComparisonExpr>
    parse_binary_equal_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			   AST::AttrVec outer_attrs,
  			   ParseRestrictions restrictions
  			   = ParseRestrictions ());
!   std::unique_ptr<AST::ComparisonExpr> parse_binary_not_equal_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ComparisonExpr> parse_binary_greater_than_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ComparisonExpr> parse_binary_less_than_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ComparisonExpr> parse_binary_greater_equal_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ComparisonExpr> parse_binary_less_equal_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::LazyBooleanExpr>
    parse_lazy_or_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  		      AST::AttrVec outer_attrs,
  		      ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::LazyBooleanExpr>
    parse_lazy_and_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  		       AST::AttrVec outer_attrs,
  		       ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::TypeCastExpr>
    parse_type_cast_expr (const_TokenPtr tok,
  			std::unique_ptr<AST::Expr> expr_to_cast,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::AssignmentExpr>
    parse_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  		    AST::AttrVec outer_attrs,
  		    ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr> parse_compound_assignment_expr (
      const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
      AST::AttrVec outer_attrs, AST::CompoundAssignmentExpr::ExprType expr_type,
      ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr>
    parse_plus_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr>
    parse_minus_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr>
    parse_mult_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr>
    parse_div_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr>
    parse_mod_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr>
    parse_and_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr>
    parse_or_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  		       AST::AttrVec outer_attrs,
  		       ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr>
    parse_xor_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr> parse_left_shift_assig_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CompoundAssignmentExpr> parse_right_shift_assig_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::AwaitExpr>
    parse_await_expr (const_TokenPtr tok,
  		    std::unique_ptr<AST::Expr> expr_to_await,
  		    AST::AttrVec outer_attrs);
!   std::unique_ptr<AST::MethodCallExpr> parse_method_call_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> receiver_expr,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::CallExpr> parse_function_call_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> function_expr,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::RangeExpr> parse_led_range_exclusive_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::RangeExpr>
    parse_nud_range_exclusive_expr (const_TokenPtr tok, AST::AttrVec outer_attrs);
!   std::unique_ptr<AST::RangeFromToInclExpr> parse_range_inclusive_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::RangeToInclExpr>
    parse_range_to_inclusive_expr (const_TokenPtr tok, AST::AttrVec outer_attrs);
!   std::unique_ptr<AST::TupleIndexExpr> parse_tuple_index_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> tuple_expr,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::FieldAccessExpr> parse_field_access_expr (
!     const_TokenPtr tok, std::unique_ptr<AST::Expr> struct_expr,
!     AST::AttrVec outer_attrs,
!     ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::ArrayIndexExpr>
    parse_index_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> array_expr,
  		    AST::AttrVec outer_attrs,
  		    ParseRestrictions restrictions = ParseRestrictions ());
    std::unique_ptr<AST::MacroInvocation> parse_macro_invocation_partial (
      AST::PathInExpression path, AST::AttrVec outer_attrs,
      ParseRestrictions restrictions = ParseRestrictions ());
!   std::unique_ptr<AST::StructExprStruct>
    parse_struct_expr_struct_partial (AST::PathInExpression path,
  				    AST::AttrVec outer_attrs);
!   std::unique_ptr<AST::CallExpr>
    parse_struct_expr_tuple_partial (AST::PathInExpression path,
  				   AST::AttrVec outer_attrs);
!   std::unique_ptr<AST::ClosureExpr>
    parse_closure_expr_pratt (const_TokenPtr tok,
  			    AST::AttrVec outer_attrs = AST::AttrVec ());
    std::unique_ptr<AST::TupleIndexExpr> parse_tuple_index_expr_float (
--- 468,723 ----
  						   AST::AttrVec outer_attrs);
  
    // Expression-related (Pratt parsed)
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
    parse_expr (int right_binding_power,
  	      AST::AttrVec outer_attrs = AST::AttrVec (),
  	      ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
    null_denotation (AST::AttrVec outer_attrs = AST::AttrVec (),
  		   ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
    null_denotation_path (AST::PathInExpression path, AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
    null_denotation_not_path (const_TokenPtr t, AST::AttrVec outer_attrs,
  			    ParseRestrictions restrictions
  			    = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
!   left_denotations (tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
! 		      null_denotation,
  		    int right_binding_power, AST::AttrVec outer_attrs,
  		    ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Expr>
    left_denotation (const_TokenPtr t, std::unique_ptr<AST::Expr> left,
  		   AST::AttrVec outer_attrs = AST::AttrVec (),
  		   ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_arithmetic_or_logical_expr (
      const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
      AST::AttrVec outer_attrs, AST::ArithmeticOrLogicalExpr::ExprType expr_type,
      ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_binary_plus_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_binary_minus_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			   AST::AttrVec outer_attrs,
  			   ParseRestrictions restrictions
  			   = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_binary_mult_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_binary_div_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_binary_mod_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_bitwise_and_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_bitwise_or_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_bitwise_xor_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_left_shift_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArithmeticOrLogicalExpr>,
! 	       Parse::Error::Expr>
    parse_right_shift_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
    parse_comparison_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 AST::ComparisonExpr::ExprType expr_type,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
    parse_binary_equal_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			   AST::AttrVec outer_attrs,
  			   ParseRestrictions restrictions
  			   = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
!   parse_binary_not_equal_expr (const_TokenPtr tok,
! 			       std::unique_ptr<AST::Expr> left,
! 			       AST::AttrVec outer_attrs,
! 			       ParseRestrictions restrictions
! 			       = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
!   parse_binary_greater_than_expr (const_TokenPtr tok,
! 				  std::unique_ptr<AST::Expr> left,
! 				  AST::AttrVec outer_attrs,
! 				  ParseRestrictions restrictions
! 				  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
!   parse_binary_less_than_expr (const_TokenPtr tok,
! 			       std::unique_ptr<AST::Expr> left,
! 			       AST::AttrVec outer_attrs,
! 			       ParseRestrictions restrictions
! 			       = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
!   parse_binary_greater_equal_expr (const_TokenPtr tok,
! 				   std::unique_ptr<AST::Expr> left,
! 				   AST::AttrVec outer_attrs,
! 				   ParseRestrictions restrictions
! 				   = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ComparisonExpr>, Parse::Error::Expr>
!   parse_binary_less_equal_expr (const_TokenPtr tok,
! 				std::unique_ptr<AST::Expr> left,
! 				AST::AttrVec outer_attrs,
! 				ParseRestrictions restrictions
! 				= ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::LazyBooleanExpr>, Parse::Error::Expr>
    parse_lazy_or_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  		      AST::AttrVec outer_attrs,
  		      ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::LazyBooleanExpr>, Parse::Error::Expr>
    parse_lazy_and_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  		       AST::AttrVec outer_attrs,
  		       ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::TypeCastExpr>, Parse::Error::Expr>
    parse_type_cast_expr (const_TokenPtr tok,
  			std::unique_ptr<AST::Expr> expr_to_cast,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::AssignmentExpr>, Parse::Error::Expr>
    parse_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  		    AST::AttrVec outer_attrs,
  		    ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
!   parse_compound_assignment_expr (
      const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
      AST::AttrVec outer_attrs, AST::CompoundAssignmentExpr::ExprType expr_type,
      ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
    parse_plus_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
    parse_minus_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			  AST::AttrVec outer_attrs,
  			  ParseRestrictions restrictions
  			  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
    parse_mult_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			 AST::AttrVec outer_attrs,
  			 ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
    parse_div_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
    parse_mod_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
    parse_and_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
    parse_or_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  		       AST::AttrVec outer_attrs,
  		       ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
    parse_xor_assig_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> left,
  			AST::AttrVec outer_attrs,
  			ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
!   parse_left_shift_assig_expr (const_TokenPtr tok,
! 			       std::unique_ptr<AST::Expr> left,
! 			       AST::AttrVec outer_attrs,
! 			       ParseRestrictions restrictions
! 			       = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CompoundAssignmentExpr>, Parse::Error::Expr>
!   parse_right_shift_assig_expr (const_TokenPtr tok,
! 				std::unique_ptr<AST::Expr> left,
! 				AST::AttrVec outer_attrs,
! 				ParseRestrictions restrictions
! 				= ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::AwaitExpr>, Parse::Error::Expr>
    parse_await_expr (const_TokenPtr tok,
  		    std::unique_ptr<AST::Expr> expr_to_await,
  		    AST::AttrVec outer_attrs);
!   tl::expected<std::unique_ptr<AST::MethodCallExpr>, Parse::Error::Expr>
!   parse_method_call_expr (const_TokenPtr tok,
! 			  std::unique_ptr<AST::Expr> receiver_expr,
! 			  AST::AttrVec outer_attrs,
! 			  ParseRestrictions restrictions
! 			  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::CallExpr>, Parse::Error::Expr>
!   parse_function_call_expr (const_TokenPtr tok,
! 			    std::unique_ptr<AST::Expr> function_expr,
! 			    AST::AttrVec outer_attrs,
! 			    ParseRestrictions restrictions
! 			    = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::RangeExpr>, Parse::Error::Expr>
!   parse_led_range_exclusive_expr (const_TokenPtr tok,
! 				  std::unique_ptr<AST::Expr> left,
! 				  AST::AttrVec outer_attrs,
! 				  ParseRestrictions restrictions
! 				  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::RangeExpr>, Parse::Error::Expr>
    parse_nud_range_exclusive_expr (const_TokenPtr tok, AST::AttrVec outer_attrs);
!   tl::expected<std::unique_ptr<AST::RangeFromToInclExpr>, Parse::Error::Expr>
!   parse_range_inclusive_expr (const_TokenPtr tok,
! 			      std::unique_ptr<AST::Expr> left,
! 			      AST::AttrVec outer_attrs,
! 			      ParseRestrictions restrictions
! 			      = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::RangeToInclExpr>, Parse::Error::Expr>
    parse_range_to_inclusive_expr (const_TokenPtr tok, AST::AttrVec outer_attrs);
!   tl::expected<std::unique_ptr<AST::TupleIndexExpr>, Parse::Error::Expr>
!   parse_tuple_index_expr (const_TokenPtr tok,
! 			  std::unique_ptr<AST::Expr> tuple_expr,
! 			  AST::AttrVec outer_attrs,
! 			  ParseRestrictions restrictions
! 			  = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::FieldAccessExpr>, Parse::Error::Expr>
!   parse_field_access_expr (const_TokenPtr tok,
! 			   std::unique_ptr<AST::Expr> struct_expr,
! 			   AST::AttrVec outer_attrs,
! 			   ParseRestrictions restrictions
! 			   = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::ArrayIndexExpr>, Parse::Error::Expr>
    parse_index_expr (const_TokenPtr tok, std::unique_ptr<AST::Expr> array_expr,
  		    AST::AttrVec outer_attrs,
  		    ParseRestrictions restrictions = ParseRestrictions ());
    std::unique_ptr<AST::MacroInvocation> parse_macro_invocation_partial (
      AST::PathInExpression path, AST::AttrVec outer_attrs,
      ParseRestrictions restrictions = ParseRestrictions ());
!   tl::expected<std::unique_ptr<AST::StructExprStruct>, Parse::Error::Expr>
    parse_struct_expr_struct_partial (AST::PathInExpression path,
  				    AST::AttrVec outer_attrs);
!   tl::expected<std::unique_ptr<AST::CallExpr>, Parse::Error::Expr>
    parse_struct_expr_tuple_partial (AST::PathInExpression path,
  				   AST::AttrVec outer_attrs);
!   tl::expected<std::unique_ptr<AST::ClosureExpr>, Parse::Error::Expr>
    parse_closure_expr_pratt (const_TokenPtr tok,
  			    AST::AttrVec outer_attrs = AST::AttrVec ());
    std::unique_ptr<AST::TupleIndexExpr> parse_tuple_index_expr_float (
*************** private:
*** 724,796 ****
    // When given a pratt_parsed_loc, use it as the location of the
    // first token parsed in the expression (the parsing of that first
    // token should be skipped).
!   std::unique_ptr<AST::IfExpr>
    parse_if_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		 location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::IfLetExpr>
    parse_if_let_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		     location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::LoopExpr>
    parse_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		   tl::optional<AST::LoopLabel> label = tl::nullopt,
  		   location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::WhileLoopExpr>
    parse_while_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			 tl::optional<AST::LoopLabel> label = tl::nullopt,
  			 location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::WhileLetLoopExpr>
    parse_while_let_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			     tl::optional<AST::LoopLabel> label = tl::nullopt);
!   std::unique_ptr<AST::ForLoopExpr>
    parse_for_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		       tl::optional<AST::LoopLabel> label = tl::nullopt);
!   std::unique_ptr<AST::MatchExpr>
    parse_match_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
    AST::MatchArm parse_match_arm ();
!   std::vector<std::unique_ptr<AST::Pattern>>
!   parse_match_arm_patterns (TokenId end_token_id);
!   std::unique_ptr<AST::Expr> parse_labelled_loop_expr (const_TokenPtr tok,
! 						       AST::AttrVec outer_attrs
! 						       = AST::AttrVec ());
!   tl::expected<AST::LoopLabel, ParseLoopLabelError>
    parse_loop_label (const_TokenPtr tok);
!   std::unique_ptr<AST::AsyncBlockExpr>
    parse_async_block_expr (AST::AttrVec outer_attrs = AST::AttrVec ());
!   std::unique_ptr<AST::GroupedExpr> parse_grouped_expr (AST::AttrVec outer_attrs
! 							= AST::AttrVec ());
!   std::unique_ptr<AST::ClosureExpr> parse_closure_expr (AST::AttrVec outer_attrs
! 							= AST::AttrVec ());
    AST::ClosureParam parse_closure_param ();
  
!   std::unique_ptr<AST::BoxExpr> parse_box_expr (AST::AttrVec outer_attrs,
! 						location_t pratt_parsed_loc
! 						= UNKNOWN_LOCATION);
    // When given a pratt_parsed_loc, use it as the location of the
    // first token parsed in the expression (the parsing of that first
    // token should be skipped).
!   std::unique_ptr<AST::ReturnExpr>
    parse_return_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		     location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::TryExpr>
    parse_try_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		  location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::BreakExpr>
    parse_break_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
    std::unique_ptr<AST::ContinueExpr>
    parse_continue_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		       location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::UnsafeBlockExpr>
    parse_unsafe_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			   location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::ArrayExpr>
    parse_array_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::ExprWithoutBlock>
    parse_grouped_or_tuple_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			       location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   std::unique_ptr<AST::StructExprField> parse_struct_expr_field ();
    bool will_be_expr_with_block ();
  
    // Type-related
--- 728,801 ----
    // When given a pratt_parsed_loc, use it as the location of the
    // first token parsed in the expression (the parsing of that first
    // token should be skipped).
!   tl::expected<std::unique_ptr<AST::IfExpr>, Parse::Error::Node>
    parse_if_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		 location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::IfLetExpr>, Parse::Error::Node>
    parse_if_let_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		     location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::LoopExpr>, Parse::Error::Node>
    parse_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		   tl::optional<AST::LoopLabel> label = tl::nullopt,
  		   location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::WhileLoopExpr>, Parse::Error::Node>
    parse_while_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			 tl::optional<AST::LoopLabel> label = tl::nullopt,
  			 location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::WhileLetLoopExpr>, Parse::Error::Node>
    parse_while_let_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			     tl::optional<AST::LoopLabel> label = tl::nullopt);
!   tl::expected<std::unique_ptr<AST::ForLoopExpr>, Parse::Error::Node>
    parse_for_loop_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		       tl::optional<AST::LoopLabel> label = tl::nullopt);
!   tl::expected<std::unique_ptr<AST::MatchExpr>, Parse::Error::Node>
    parse_match_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
    AST::MatchArm parse_match_arm ();
!   std::unique_ptr<AST::Pattern> parse_match_arm_pattern (TokenId end_token_id);
!   tl::expected<std::unique_ptr<AST::Expr>, Parse::Error::Node>
!   parse_labelled_loop_expr (const_TokenPtr tok,
! 			    AST::AttrVec outer_attrs = AST::AttrVec ());
!   tl::expected<AST::LoopLabel, Parse::Error::LoopLabel>
    parse_loop_label (const_TokenPtr tok);
!   tl::expected<std::unique_ptr<AST::AsyncBlockExpr>, Parse::Error::Node>
    parse_async_block_expr (AST::AttrVec outer_attrs = AST::AttrVec ());
!   tl::expected<std::unique_ptr<AST::GroupedExpr>, Parse::Error::Node>
!   parse_grouped_expr (AST::AttrVec outer_attrs = AST::AttrVec ());
!   tl::expected<std::unique_ptr<AST::ClosureExpr>, Parse::Error::Node>
!   parse_closure_expr (AST::AttrVec outer_attrs = AST::AttrVec ());
    AST::ClosureParam parse_closure_param ();
  
!   tl::expected<std::unique_ptr<AST::BoxExpr>, Parse::Error::Node>
!   parse_box_expr (AST::AttrVec outer_attrs,
! 		  location_t pratt_parsed_loc = UNKNOWN_LOCATION);
    // When given a pratt_parsed_loc, use it as the location of the
    // first token parsed in the expression (the parsing of that first
    // token should be skipped).
!   tl::expected<std::unique_ptr<AST::ReturnExpr>, Parse::Error::Node>
    parse_return_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		     location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::TryExpr>, Parse::Error::Node>
    parse_try_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		  location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::BreakExpr>, Parse::Error::Node>
    parse_break_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
    std::unique_ptr<AST::ContinueExpr>
    parse_continue_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		       location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::UnsafeBlockExpr>, Parse::Error::Node>
    parse_unsafe_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			   location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::ArrayExpr>, Parse::Error::Node>
    parse_array_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  		    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::ExprWithoutBlock>, Parse::Error::Node>
    parse_grouped_or_tuple_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
  			       location_t pratt_parsed_loc = UNKNOWN_LOCATION);
!   tl::expected<std::unique_ptr<AST::StructExprField>,
! 	       Parse::Error::StructExprField>
!   parse_struct_expr_field ();
    bool will_be_expr_with_block ();
  
    // Type-related
*************** private:
*** 824,830 ****
    std::unique_ptr<AST::Stmt> parse_expr_stmt (AST::AttrVec outer_attrs,
  					      ParseRestrictions restrictions
  					      = ParseRestrictions ());
!   ExprOrStmt parse_stmt_or_expr ();
  
    // Pattern-related
    std::unique_ptr<AST::Pattern> parse_literal_or_range_pattern ();
--- 829,835 ----
    std::unique_ptr<AST::Stmt> parse_expr_stmt (AST::AttrVec outer_attrs,
  					      ParseRestrictions restrictions
  					      = ParseRestrictions ());
!   tl::expected<ExprOrStmt, Parse::Error::Node> parse_stmt_or_expr ();
  
    // Pattern-related
    std::unique_ptr<AST::Pattern> parse_literal_or_range_pattern ();
diff -Nrcpad gcc-16-20260111/gcc/rust/resolve/rust-default-resolver.cc gcc-16-20260118/gcc/rust/resolve/rust-default-resolver.cc
*** gcc-16-20260111/gcc/rust/resolve/rust-default-resolver.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/resolve/rust-default-resolver.cc	Sun Jan 18 22:32:08 2026
*************** DefaultResolver::visit (AST::ForLoopExpr
*** 91,98 ****
  void
  DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
  {
!   for (auto &pattern : expr.get_patterns ())
!     visit (pattern);
  }
  
  void
--- 91,97 ----
  void
  DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
  {
!   visit (expr.get_pattern ());
  }
  
  void
diff -Nrcpad gcc-16-20260111/gcc/rust/resolve/rust-early-name-resolver-2.0.cc gcc-16-20260118/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
*** gcc-16-20260111/gcc/rust/resolve/rust-early-name-resolver-2.0.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/resolve/rust-early-name-resolver-2.0.cc	Sun Jan 18 22:32:08 2026
*************** Early::visit_attributes (std::vector<AST
*** 356,362 ****
  	      // FIXME: Change to proper error message
  	      collect_error (
  		Error (attr.get_locus (),
! 		       "could not resolve attribute macro invocation"));
  	      return;
  	    }
  	  auto pm_def = mappings.lookup_attribute_proc_macro_def (
--- 356,363 ----
  	      // FIXME: Change to proper error message
  	      collect_error (
  		Error (attr.get_locus (),
! 		       "could not resolve attribute macro invocation %qs",
! 		       name.c_str ()));
  	      return;
  	    }
  	  auto pm_def = mappings.lookup_attribute_proc_macro_def (
*************** Early::finalize_glob_import (NameResolut
*** 410,415 ****
--- 411,424 ----
  
    rust_assert (container);
  
+   if (mapping.import_kind.is_prelude)
+     {
+       rust_assert (container.value ()->get_item_kind ()
+ 		   == AST::Item::Kind::Module);
+ 
+       ctx.prelude = container.value ()->get_node_id ();
+     }
+ 
    GlobbingVisitor (ctx).go (container.value ());
  }
  
diff -Nrcpad gcc-16-20260111/gcc/rust/resolve/rust-forever-stack.h gcc-16-20260118/gcc/rust/resolve/rust-forever-stack.h
*** gcc-16-20260111/gcc/rust/resolve/rust-forever-stack.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/resolve/rust-forever-stack.h	Sun Jan 18 22:32:08 2026
*************** public:
*** 668,673 ****
--- 668,675 ----
    tl::optional<Rib::Definition> get (const Identifier &name);
    tl::optional<Rib::Definition> get_lang_prelude (const Identifier &name);
    tl::optional<Rib::Definition> get_lang_prelude (const std::string &name);
+   tl::optional<Rib::Definition> get_from_prelude (NodeId prelude,
+ 						  const Identifier &name);
  
    /**
     * Resolve a path to its definition in the current `ForeverStack`
*************** public:
*** 682,687 ****
--- 684,694 ----
      const std::vector<S> &segments, ResolutionMode mode,
      std::function<void (const S &, NodeId)> insert_segment_resolution,
      std::vector<Error> &collect_errors);
+   template <typename S>
+   tl::optional<Rib::Definition> resolve_path (
+     const std::vector<S> &segments, ResolutionMode mode,
+     std::function<void (const S &, NodeId)> insert_segment_resolution,
+     std::vector<Error> &collect_errors, NodeId starting_point_id);
  
    // FIXME: Documentation
    tl::optional<Rib &> to_rib (NodeId rib_id);
*************** private:
*** 743,751 ****
      tl::optional<Node &> parent; // `None` only if the node is a root
    };
  
!   // private overload which allows specifying a starting point
    tl::optional<Rib::Definition> get (Node &start, const Identifier &name);
  
    /* Should we keep going upon seeing a Rib? */
    enum class KeepGoing
    {
--- 750,768 ----
      tl::optional<Node &> parent; // `None` only if the node is a root
    };
  
!   /**
!    * Private overloads which allow specifying a starting point
!    */
! 
    tl::optional<Rib::Definition> get (Node &start, const Identifier &name);
  
+   template <typename S>
+   tl::optional<Rib::Definition> resolve_path (
+     const std::vector<S> &segments, ResolutionMode mode,
+     std::function<void (const S &, NodeId)> insert_segment_resolution,
+     std::vector<Error> &collect_errors,
+     std::reference_wrapper<Node> starting_point);
+ 
    /* Should we keep going upon seeing a Rib? */
    enum class KeepGoing
    {
*************** private:
*** 777,782 ****
--- 794,800 ----
     * resolution
     */
    Node lang_prelude;
+ 
    /*
     * The extern prelude, used for resolving external crates
     */
*************** private:
*** 787,793 ****
    void stream_rib (std::stringstream &stream, const Rib &rib,
  		   const std::string &next, const std::string &next_next) const;
    void stream_node (std::stringstream &stream, unsigned indentation,
! 		    const Node &node) const;
  
    /* Helper types and functions for `resolve_path` */
  
--- 805,811 ----
    void stream_rib (std::stringstream &stream, const Rib &rib,
  		   const std::string &next, const std::string &next_next) const;
    void stream_node (std::stringstream &stream, unsigned indentation,
! 		    const Node &node, unsigned depth = 0) const;
  
    /* Helper types and functions for `resolve_path` */
  
diff -Nrcpad gcc-16-20260111/gcc/rust/resolve/rust-forever-stack.hxx gcc-16-20260118/gcc/rust/resolve/rust-forever-stack.hxx
*** gcc-16-20260111/gcc/rust/resolve/rust-forever-stack.hxx	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/resolve/rust-forever-stack.hxx	Sun Jan 18 22:32:08 2026
*************** ForeverStack<N>::get_lang_prelude (const
*** 343,348 ****
--- 343,359 ----
    return lang_prelude.rib.get (name);
  }
  
+ template <Namespace N>
+ tl::optional<Rib::Definition>
+ ForeverStack<N>::get_from_prelude (NodeId prelude, const Identifier &name)
+ {
+   auto starting_point = dfs_node (root, prelude);
+   if (!starting_point)
+     return tl::nullopt;
+ 
+   return get (*starting_point, name);
+ }
+ 
  template <>
  tl::optional<Rib::Definition> inline ForeverStack<Namespace::Labels>::get (
    const Identifier &name)
*************** tl::optional<Rib::Definition>
*** 653,663 ****
  ForeverStack<N>::resolve_path (
    const std::vector<S> &segments, ResolutionMode mode,
    std::function<void (const S &, NodeId)> insert_segment_resolution,
    std::vector<Error> &collect_errors)
  {
    rust_assert (!segments.empty ());
  
-   std::reference_wrapper<Node> starting_point = cursor ();
    switch (mode)
      {
      case ResolutionMode::Normal:
--- 664,707 ----
  ForeverStack<N>::resolve_path (
    const std::vector<S> &segments, ResolutionMode mode,
    std::function<void (const S &, NodeId)> insert_segment_resolution,
+   std::vector<Error> &collect_errors, NodeId starting_point_id)
+ {
+   auto starting_point = dfs_node (root, starting_point_id);
+ 
+   // We may have a prelude, but haven't visited it yet and thus it's not in our
+   // nodes
+   if (!starting_point)
+     return tl::nullopt;
+ 
+   return resolve_path (segments, mode, insert_segment_resolution,
+ 		       collect_errors, *starting_point);
+ }
+ 
+ template <Namespace N>
+ template <typename S>
+ tl::optional<Rib::Definition>
+ ForeverStack<N>::resolve_path (
+   const std::vector<S> &segments, ResolutionMode mode,
+   std::function<void (const S &, NodeId)> insert_segment_resolution,
    std::vector<Error> &collect_errors)
  {
+   std::reference_wrapper<Node> starting_point = cursor ();
+ 
+   return resolve_path (segments, mode, insert_segment_resolution,
+ 		       collect_errors, starting_point);
+ }
+ 
+ template <Namespace N>
+ template <typename S>
+ tl::optional<Rib::Definition>
+ ForeverStack<N>::resolve_path (
+   const std::vector<S> &segments, ResolutionMode mode,
+   std::function<void (const S &, NodeId)> insert_segment_resolution,
+   std::vector<Error> &collect_errors,
+   std::reference_wrapper<Node> starting_point)
+ {
    rust_assert (!segments.empty ());
  
    switch (mode)
      {
      case ResolutionMode::Normal:
*************** ForeverStack<N>::stream_rib (std::string
*** 963,969 ****
  template <Namespace N>
  void
  ForeverStack<N>::stream_node (std::stringstream &stream, unsigned indentation,
! 			      const ForeverStack<N>::Node &node) const
  {
    auto indent = std::string (indentation, ' ');
    auto next = std::string (indentation + 4, ' ');
--- 1007,1014 ----
  template <Namespace N>
  void
  ForeverStack<N>::stream_node (std::stringstream &stream, unsigned indentation,
! 			      const ForeverStack<N>::Node &node,
! 			      unsigned depth) const
  {
    auto indent = std::string (indentation, ' ');
    auto next = std::string (indentation + 4, ' ');
*************** ForeverStack<N>::stream_node (std::strin
*** 982,993 ****
      {
        auto link = kv.first;
        auto child = kv.second;
!       stream << indent << "Link (" << link.id << ", "
  	     << (link.path.has_value () ? link.path.value ().as_string ()
  					: "<anon>")
  	     << "):\n";
  
!       stream_node (stream, indentation + 4, child);
  
        stream << '\n';
      }
--- 1027,1038 ----
      {
        auto link = kv.first;
        auto child = kv.second;
!       stream << indent << "Link " << depth << " (" << link.id << ", "
  	     << (link.path.has_value () ? link.path.value ().as_string ()
  					: "<anon>")
  	     << "):\n";
  
!       stream_node (stream, indentation + 4, child, depth + 1);
  
        stream << '\n';
      }
diff -Nrcpad gcc-16-20260111/gcc/rust/resolve/rust-late-name-resolver-2.0.cc gcc-16-20260118/gcc/rust/resolve/rust-late-name-resolver-2.0.cc
*** gcc-16-20260111/gcc/rust/resolve/rust-late-name-resolver-2.0.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/resolve/rust-late-name-resolver-2.0.cc	Sun Jan 18 22:32:08 2026
*************** Late::visit (AST::MatchArm &arm)
*** 93,100 ****
  
    ctx.bindings.enter (BindingSource::Match);
  
!   for (auto &pattern : arm.get_patterns ())
!     visit (pattern);
  
    ctx.bindings.exit ();
  
--- 93,99 ----
  
    ctx.bindings.enter (BindingSource::Match);
  
!   visit (arm.get_pattern ());
  
    ctx.bindings.exit ();
  
*************** Late::visit (AST::WhileLetLoopExpr &whil
*** 153,160 ****
  
    ctx.bindings.enter (BindingSource::WhileLet);
  
!   for (auto &pattern : while_let.get_patterns ())
!     visit (pattern);
  
    ctx.bindings.exit ();
  
--- 152,158 ----
  
    ctx.bindings.enter (BindingSource::WhileLet);
  
!   visit (while_let.get_pattern ());
  
    ctx.bindings.exit ();
  
*************** Late::visit (AST::BreakExpr &expr)
*** 265,271 ****
  
    if (expr.has_break_expr ())
      {
!       auto &break_expr = expr.get_break_expr ();
        if (break_expr.get_expr_kind () == AST::Expr::Kind::Identifier)
  	{
  	  /* This is a break with an expression, and the expression is
--- 263,269 ----
  
    if (expr.has_break_expr ())
      {
!       auto &break_expr = expr.get_break_expr_unchecked ();
        if (break_expr.get_expr_kind () == AST::Expr::Kind::Identifier)
  	{
  	  /* This is a break with an expression, and the expression is
*************** Late::visit (AST::BreakExpr &expr)
*** 275,283 ****
  	     emit the error here though, because the identifier may still
  	     be in scope, and ICE'ing on valid programs would not be very
  	     funny.  */
! 	  std::string ident
! 	    = static_cast<AST::IdentifierExpr &> (expr.get_break_expr ())
! 		.as_string ();
  	  if (ident == "rust" || ident == "gcc")
  	    funny_error = true;
  	}
--- 273,281 ----
  	     emit the error here though, because the identifier may still
  	     be in scope, and ICE'ing on valid programs would not be very
  	     funny.  */
! 	  std::string ident = static_cast<AST::IdentifierExpr &> (
! 				expr.get_break_expr_unchecked ())
! 				.as_string ();
  	  if (ident == "rust" || ident == "gcc")
  	    funny_error = true;
  	}
*************** Late::visit (AST::IdentifierExpr &expr)
*** 348,354 ****
  	{
  	  resolved = type;
  	}
!       else
  	{
  	  rust_error_at (expr.get_locus (), ErrorCode::E0425,
  			 "cannot find value %qs in this scope",
--- 346,362 ----
  	{
  	  resolved = type;
  	}
!       else if (!resolved && ctx.prelude)
! 	{
! 	  resolved
! 	    = ctx.values.get_from_prelude (*ctx.prelude, expr.get_ident ());
! 
! 	  if (!resolved)
! 	    resolved
! 	      = ctx.types.get_from_prelude (*ctx.prelude, expr.get_ident ());
! 	}
! 
!       if (!resolved)
  	{
  	  rust_error_at (expr.get_locus (), ErrorCode::E0425,
  			 "cannot find value %qs in this scope",
diff -Nrcpad gcc-16-20260111/gcc/rust/resolve/rust-name-resolution-context.h gcc-16-20260118/gcc/rust/resolve/rust-name-resolution-context.h
*** gcc-16-20260111/gcc/rust/resolve/rust-name-resolution-context.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/resolve/rust-name-resolution-context.h	Sun Jan 18 22:32:08 2026
*************** public:
*** 560,582 ****
  	  if (resolved_nodes.find (Usage (seg_id)) == resolved_nodes.end ())
  	    map_usage (Usage (seg_id), Definition (id));
  	};
      switch (ns)
        {
        case Namespace::Values:
! 	return values.resolve_path (segments, mode, insert_segment_resolution,
! 				    collect_errors);
        case Namespace::Types:
! 	return types.resolve_path (segments, mode, insert_segment_resolution,
! 				   collect_errors);
        case Namespace::Macros:
! 	return macros.resolve_path (segments, mode, insert_segment_resolution,
! 				    collect_errors);
        case Namespace::Labels:
! 	return labels.resolve_path (segments, mode, insert_segment_resolution,
! 				    collect_errors);
        default:
  	rust_unreachable ();
        }
    }
  
    template <typename S, typename... Args>
--- 560,624 ----
  	  if (resolved_nodes.find (Usage (seg_id)) == resolved_nodes.end ())
  	    map_usage (Usage (seg_id), Definition (id));
  	};
+ 
+     tl::optional<Rib::Definition> resolved = tl::nullopt;
+ 
      switch (ns)
        {
        case Namespace::Values:
! 	resolved
! 	  = values.resolve_path (segments, mode, insert_segment_resolution,
! 				 collect_errors);
! 	break;
        case Namespace::Types:
! 	resolved
! 	  = types.resolve_path (segments, mode, insert_segment_resolution,
! 				collect_errors);
! 	break;
        case Namespace::Macros:
! 	resolved
! 	  = macros.resolve_path (segments, mode, insert_segment_resolution,
! 				 collect_errors);
! 	break;
        case Namespace::Labels:
! 	resolved
! 	  = labels.resolve_path (segments, mode, insert_segment_resolution,
! 				 collect_errors);
! 	break;
        default:
  	rust_unreachable ();
        }
+ 
+     // If it fails, switch to std prelude resolution if it exists
+     if (prelude && !resolved)
+       {
+ 	std::vector<Error> ignore_errors = {};
+ 
+ 	// TODO: Factor this with the above
+ 	switch (ns)
+ 	  {
+ 	  case Namespace::Values:
+ 	    return values.resolve_path (segments, mode,
+ 					insert_segment_resolution,
+ 					ignore_errors, *prelude);
+ 	  case Namespace::Types:
+ 	    return types.resolve_path (segments, mode,
+ 				       insert_segment_resolution, ignore_errors,
+ 				       *prelude);
+ 	  case Namespace::Macros:
+ 	    return macros.resolve_path (segments, mode,
+ 					insert_segment_resolution,
+ 					ignore_errors, *prelude);
+ 	  case Namespace::Labels:
+ 	    return labels.resolve_path (segments, mode,
+ 					insert_segment_resolution,
+ 					ignore_errors, *prelude);
+ 	  default:
+ 	    rust_unreachable ();
+ 	  }
+       }
+ 
+     return resolved;
    }
  
    template <typename S, typename... Args>
*************** public:
*** 676,681 ****
--- 718,726 ----
  			 std::forward<Args> (args)...);
    }
  
+   /* If declared with #[prelude_import], the current standard library module */
+   tl::optional<NodeId> prelude;
+ 
  private:
    /* Map of "usage" nodes which have been resolved to a "definition" node */
    std::map<Usage, Definition> resolved_nodes;
diff -Nrcpad gcc-16-20260111/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc gcc-16-20260118/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
*** gcc-16-20260111/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc	Sun Jan 18 22:32:08 2026
*************** flatten_glob (const AST::UseTreeGlob &gl
*** 496,501 ****
--- 496,511 ----
      paths.emplace_back (AST::SimplePath ({}, false, glob.get_locus ()));
  }
  
+ static bool
+ has_prelude_import (const std::vector<AST::Attribute> &attributes)
+ {
+   for (const auto &attr : attributes)
+     if (attr.get_path ().as_string () == "prelude_import")
+       return true;
+ 
+   return false;
+ }
+ 
  void
  TopLevel::visit (AST::UseDeclaration &use)
  {
*************** TopLevel::visit (AST::UseDeclaration &us
*** 523,529 ****
  
    for (auto &&glob : glob_path)
      imports.emplace_back (
!       ImportKind::Glob (std::move (glob), values_rib, types_rib, macros_rib));
  
    for (auto &&rebind : rebind_path)
      imports.emplace_back (
--- 533,540 ----
  
    for (auto &&glob : glob_path)
      imports.emplace_back (
!       ImportKind::Glob (std::move (glob), values_rib, types_rib, macros_rib,
! 			has_prelude_import (use.get_outer_attrs ())));
  
    for (auto &&rebind : rebind_path)
      imports.emplace_back (
diff -Nrcpad gcc-16-20260111/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h gcc-16-20260118/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h
*** gcc-16-20260111/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h	Sun Jan 18 22:32:08 2026
*************** public:
*** 67,76 ****
      } kind;
  
      static ImportKind Glob (AST::SimplePath &&to_resolve, Rib &values_rib,
! 			    Rib &types_rib, Rib &macros_rib)
      {
        return ImportKind (Kind::Glob, std::move (to_resolve), values_rib,
! 			 types_rib, macros_rib);
      }
  
      static ImportKind Simple (AST::SimplePath &&to_resolve, Rib &values_rib,
--- 67,76 ----
      } kind;
  
      static ImportKind Glob (AST::SimplePath &&to_resolve, Rib &values_rib,
! 			    Rib &types_rib, Rib &macros_rib, bool is_prelude)
      {
        return ImportKind (Kind::Glob, std::move (to_resolve), values_rib,
! 			 types_rib, macros_rib, is_prelude);
      }
  
      static ImportKind Simple (AST::SimplePath &&to_resolve, Rib &values_rib,
*************** public:
*** 84,91 ****
  			      AST::UseTreeRebind &&rebind, Rib &values_rib,
  			      Rib &types_rib, Rib &macros_rib)
      {
!       return ImportKind (Kind::Rebind, std::move (to_resolve), values_rib,
! 			 types_rib, macros_rib, std::move (rebind));
      }
  
      // The path for `Early` to resolve.
--- 84,93 ----
  			      AST::UseTreeRebind &&rebind, Rib &values_rib,
  			      Rib &types_rib, Rib &macros_rib)
      {
!       return ImportKind (
! 	Kind::Rebind, std::move (to_resolve), values_rib, types_rib, macros_rib,
! 	false /* is_prelude: rebind imports can never be preludes */,
! 	std::move (rebind));
      }
  
      // The path for `Early` to resolve.
*************** public:
*** 98,110 ****
      Rib &types_rib;
      Rib &macros_rib;
  
    private:
      ImportKind (Kind kind, AST::SimplePath &&to_resolve, Rib &values_rib,
! 		Rib &types_rib, Rib &macros_rib,
  		tl::optional<AST::UseTreeRebind> &&rebind = tl::nullopt)
        : kind (kind), to_resolve (std::move (to_resolve)),
  	rebind (std::move (rebind)), values_rib (values_rib),
! 	types_rib (types_rib), macros_rib (macros_rib)
      {}
    };
  
--- 100,116 ----
      Rib &types_rib;
      Rib &macros_rib;
  
+     // Can only be true if we are dealing with a glob import with the
+     // #[prelude_import] attribute
+     bool is_prelude = false;
+ 
    private:
      ImportKind (Kind kind, AST::SimplePath &&to_resolve, Rib &values_rib,
! 		Rib &types_rib, Rib &macros_rib, bool is_prelude = false,
  		tl::optional<AST::UseTreeRebind> &&rebind = tl::nullopt)
        : kind (kind), to_resolve (std::move (to_resolve)),
  	rebind (std::move (rebind)), values_rib (values_rib),
! 	types_rib (types_rib), macros_rib (macros_rib), is_prelude (is_prelude)
      {}
    };
  
diff -Nrcpad gcc-16-20260111/gcc/rust/typecheck/rust-hir-type-check-expr.cc gcc-16-20260118/gcc/rust/typecheck/rust-hir-type-check-expr.cc
*** gcc-16-20260111/gcc/rust/typecheck/rust-hir-type-check-expr.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/typecheck/rust-hir-type-check-expr.cc	Sun Jan 18 22:32:08 2026
*************** TypeCheckExpr::visit (HIR::ArrayExpr &ex
*** 1187,1217 ****
  void
  TypeCheckExpr::visit (HIR::StructExprStruct &struct_expr)
  {
!   TyTy::BaseType *struct_path_ty
!     = TypeCheckExpr::Resolve (struct_expr.get_struct_name ());
    if (struct_path_ty->get_kind () != TyTy::TypeKind::ADT)
      {
!       rust_error_at (struct_expr.get_struct_name ().get_locus (),
! 		     "expected an ADT type for constructor");
        return;
      }
  
    TyTy::ADTType *adt = static_cast<TyTy::ADTType *> (struct_path_ty);
!   for (auto variant : adt->get_variants ())
      {
!       if (!variant->get_fields ().empty ())
  	{
! 	  std::vector<std::string> field_names;
! 	  for (auto &field : variant->get_fields ())
! 	    field_names.push_back (field->get_name ());
! 	  Error missing_fields_error
! 	    = TypeCheckStructExpr::make_missing_field_error (
! 	      struct_expr.get_locus (), field_names,
! 	      struct_path_ty->get_name ());
! 	  // We might want to return or handle these in the future emit for now.
! 	  missing_fields_error.emit ();
  	  return;
  	}
      }
  
    infered = struct_path_ty;
--- 1187,1242 ----
  void
  TypeCheckExpr::visit (HIR::StructExprStruct &struct_expr)
  {
!   HIR::PathInExpression &path = struct_expr.get_struct_name ();
! 
!   TyTy::BaseType *struct_path_ty = TypeCheckExpr::Resolve (path);
    if (struct_path_ty->get_kind () != TyTy::TypeKind::ADT)
      {
!       rust_error_at (path.get_locus (), "expected an ADT type for constructor");
        return;
      }
  
    TyTy::ADTType *adt = static_cast<TyTy::ADTType *> (struct_path_ty);
!   TyTy::VariantDef *variant;
! 
!   // unwrap and type check the variant if it's an enum
!   if (adt->is_enum ())
      {
!       HirId variant_id;
!       bool ok = context->lookup_variant_definition (
! 	struct_expr.get_struct_name ().get_mappings ().get_hirid (),
! 	&variant_id);
!       if (!ok)
  	{
! 	  rich_location r (line_table, struct_expr.get_locus ());
! 	  r.add_range (struct_expr.get_struct_name ().get_locus ());
! 	  rust_error_at (
! 	    struct_expr.get_struct_name ().get_locus (), ErrorCode::E0574,
! 	    "expected a struct, variant or union type, found enum %qs",
! 	    adt->get_name ().c_str ());
  	  return;
  	}
+ 
+       ok = adt->lookup_variant_by_id (variant_id, &variant);
+       rust_assert (ok);
+     }
+   else
+     {
+       rust_assert (adt->number_of_variants () == 1);
+       variant = adt->get_variants ().at (0);
+     }
+ 
+   if (!variant->get_fields ().empty ())
+     {
+       std::vector<std::string> field_names;
+       for (auto &field : variant->get_fields ())
+ 	field_names.push_back (field->get_name ());
+       Error missing_fields_error
+ 	= TypeCheckStructExpr::make_missing_field_error (
+ 	  struct_expr.get_locus (), field_names, struct_path_ty->get_name ());
+       // We might want to return or handle these in the future emit for now.
+       missing_fields_error.emit ();
+       return;
      }
  
    infered = struct_path_ty;
*************** TypeCheckExpr::visit (HIR::MatchExpr &ex
*** 1744,1770 ****
      {
        // lets check the arms
        HIR::MatchArm &kase_arm = kase.get_arm ();
!       for (auto &pattern : kase_arm.get_patterns ())
  	{
! 	  TyTy::BaseType *kase_arm_ty
! 	    = TypeCheckPattern::Resolve (*pattern, scrutinee_tyty);
! 	  if (kase_arm_ty->get_kind () == TyTy ::TypeKind::ERROR)
! 	    {
! 	      saw_error = true;
! 	      continue;
! 	    }
  
! 	  TyTy::BaseType *checked_kase = unify_site (
! 	    expr.get_mappings ().get_hirid (),
! 	    TyTy::TyWithLocation (scrutinee_tyty,
! 				  expr.get_scrutinee_expr ().get_locus ()),
! 	    TyTy::TyWithLocation (kase_arm_ty, pattern->get_locus ()),
! 	    expr.get_locus ());
! 	  if (checked_kase->get_kind () == TyTy::TypeKind::ERROR)
! 	    {
! 	      saw_error = true;
! 	      continue;
! 	    }
  	}
  
        // check the kase type
--- 1769,1793 ----
      {
        // lets check the arms
        HIR::MatchArm &kase_arm = kase.get_arm ();
!       auto &pattern = kase_arm.get_pattern ();
!       TyTy::BaseType *kase_arm_ty
! 	= TypeCheckPattern::Resolve (*pattern, scrutinee_tyty);
!       if (kase_arm_ty->get_kind () == TyTy ::TypeKind::ERROR)
  	{
! 	  saw_error = true;
! 	  continue;
! 	}
  
!       TyTy::BaseType *checked_kase = unify_site (
! 	expr.get_mappings ().get_hirid (),
! 	TyTy::TyWithLocation (scrutinee_tyty,
! 			      expr.get_scrutinee_expr ().get_locus ()),
! 	TyTy::TyWithLocation (kase_arm_ty, pattern->get_locus ()),
! 	expr.get_locus ());
!       if (checked_kase->get_kind () == TyTy::TypeKind::ERROR)
! 	{
! 	  saw_error = true;
! 	  continue;
  	}
  
        // check the kase type
diff -Nrcpad gcc-16-20260111/gcc/rust/typecheck/rust-tyty.cc gcc-16-20260118/gcc/rust/typecheck/rust-tyty.cc
*** gcc-16-20260111/gcc/rust/typecheck/rust-tyty.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/typecheck/rust-tyty.cc	Sun Jan 18 22:32:08 2026
*************** VariantDef::get_field_at_index (size_t i
*** 1604,1610 ****
  std::vector<StructFieldType *> &
  VariantDef::get_fields ()
  {
-   rust_assert (type != NUM);
    return fields;
  }
  
--- 1604,1609 ----
diff -Nrcpad gcc-16-20260111/gcc/rust/util/rust-attributes.cc gcc-16-20260118/gcc/rust/util/rust-attributes.cc
*** gcc-16-20260111/gcc/rust/util/rust-attributes.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/rust/util/rust-attributes.cc	Sun Jan 18 22:32:08 2026
*************** AttributeChecker::check_attribute (const
*** 464,470 ****
    else if (result.name == Attrs::DEPRECATED)
      check_deprecated_attribute (attribute);
  }
- 
  void
  AttributeChecker::check_attributes (const AST::AttrVec &attributes)
  {
--- 464,469 ----
*************** AttributeChecker::visit (AST::Function &
*** 864,871 ****
  	{
  	  check_crate_type (name, attribute);
  	}
        else if (result.name == "no_mangle")
! 	check_no_mangle_function (attribute, fun);
      }
    if (fun.has_body ())
      fun.get_definition ().value ()->accept_vis (*this);
--- 863,901 ----
  	{
  	  check_crate_type (name, attribute);
  	}
+       else if (result.name == Attrs::TARGET_FEATURE)
+ 	{
+ 	  if (!attribute.has_attr_input ())
+ 	    {
+ 	      rust_error_at (attribute.get_locus (),
+ 			     "malformed %<target_feature%> attribute input");
+ 	      rust_inform (attribute.get_locus (),
+ 			   "must be of the form: %<#[target_feature(enable = "
+ 			   "\"name\")]%>");
+ 	    }
+ 	}
        else if (result.name == "no_mangle")
! 	{
! 	  if (attribute.has_attr_input ())
! 	    {
! 	      rust_error_at (attribute.get_locus (),
! 			     "malformed %<no_mangle%> attribute input");
! 	      rust_inform (attribute.get_locus (),
! 			   "must be of the form: %<#[no_mangle]%>");
! 	    }
! 	  else
! 	    check_no_mangle_function (attribute, fun);
! 	}
!       else if (result.name == Attrs::LINK_NAME)
! 	{
! 	  if (!attribute.has_attr_input ())
! 	    {
! 	      rust_error_at (attribute.get_locus (),
! 			     "malformed %<link_name%> attribute input");
! 	      rust_inform (attribute.get_locus (),
! 			   "must be of the form: %<#[link_name = \"name\"]%>");
! 	    }
! 	}
      }
    if (fun.has_body ())
      fun.get_definition ().value ()->accept_vis (*this);
diff -Nrcpad gcc-16-20260111/gcc/simplify-rtx.cc gcc-16-20260118/gcc/simplify-rtx.cc
*** gcc-16-20260111/gcc/simplify-rtx.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/simplify-rtx.cc	Sun Jan 18 22:32:08 2026
*************** simplify_context::simplify_binary_operat
*** 4193,4199 ****
  		 Keeps shift and AND in the same mode, improving recognition.
  		 Only applied when subreg is a lowpart, shift is valid,
  		 and no precision is lost.  */
! 	      if (SUBREG_P (op0) && subreg_lowpart_p (op0)
  		  && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
  		  /* simplify_subreg asserts the object being accessed is not
  		     VOIDmode or BLKmode.  We may have a REG_EQUAL note which
--- 4193,4201 ----
  		 Keeps shift and AND in the same mode, improving recognition.
  		 Only applied when subreg is a lowpart, shift is valid,
  		 and no precision is lost.  */
! 	      if (SUBREG_P (op0)
! 		  && subreg_lowpart_p (op0)
! 		  && !paradoxical_subreg_p (op0)
  		  && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
  		  /* simplify_subreg asserts the object being accessed is not
  		     VOIDmode or BLKmode.  We may have a REG_EQUAL note which
*************** simplify_const_binary_operation (enum rt
*** 5857,5867 ****
  	    /* The shift count might be in SImode while int_mode might
  	       be narrower.  On IA-64 it is even DImode.  If the shift
  	       count is too large and doesn't fit into int_mode, we'd
! 	       ICE.  So, if int_mode is narrower than word, use
! 	       word_mode for the shift count.  */
  	    if (GET_MODE (op1) == VOIDmode
! 		&& GET_MODE_PRECISION (int_mode) < BITS_PER_WORD)
! 	      pop1 = rtx_mode_t (op1, word_mode);
  
  	    wide_int wop1 = pop1;
  	    if (SHIFT_COUNT_TRUNCATED)
--- 5859,5869 ----
  	    /* The shift count might be in SImode while int_mode might
  	       be narrower.  On IA-64 it is even DImode.  If the shift
  	       count is too large and doesn't fit into int_mode, we'd
! 	       ICE.  So, if int_mode is narrower than
! 	       HOST_BITS_PER_WIDE_INT, use DImode for the shift count.  */
  	    if (GET_MODE (op1) == VOIDmode
! 		&& GET_MODE_PRECISION (int_mode) < HOST_BITS_PER_WIDE_INT)
! 	      pop1 = rtx_mode_t (op1, DImode);
  
  	    wide_int wop1 = pop1;
  	    if (SHIFT_COUNT_TRUNCATED)
*************** simplify_const_binary_operation (enum rt
*** 5912,5922 ****
  	    /* The rotate count might be in SImode while int_mode might
  	       be narrower.  On IA-64 it is even DImode.  If the shift
  	       count is too large and doesn't fit into int_mode, we'd
! 	       ICE.  So, if int_mode is narrower than word, use
! 	       word_mode for the shift count.  */
  	    if (GET_MODE (op1) == VOIDmode
! 		&& GET_MODE_PRECISION (int_mode) < BITS_PER_WORD)
! 	      pop1 = rtx_mode_t (op1, word_mode);
  
  	    if (wi::neg_p (pop1))
  	      return NULL_RTX;
--- 5914,5924 ----
  	    /* The rotate count might be in SImode while int_mode might
  	       be narrower.  On IA-64 it is even DImode.  If the shift
  	       count is too large and doesn't fit into int_mode, we'd
! 	       ICE.  So, if int_mode is narrower than
! 	       HOST_BITS_PER_WIDE_INT, use DImode for the shift count.  */
  	    if (GET_MODE (op1) == VOIDmode
! 		&& GET_MODE_PRECISION (int_mode) < HOST_BITS_PER_WIDE_INT)
! 	      pop1 = rtx_mode_t (op1, DImode);
  
  	    if (wi::neg_p (pop1))
  	      return NULL_RTX;
*************** simplify_const_binary_operation (enum rt
*** 6017,6024 ****
  	      wide_int shift
  		= rtx_mode_t (op1,
  			      GET_MODE (op1) == VOIDmode
! 			      && GET_MODE_PRECISION (int_mode) < BITS_PER_WORD
! 			      ? word_mode : mode);
  	      if (SHIFT_COUNT_TRUNCATED)
  		shift = wi::umod_trunc (shift, GET_MODE_PRECISION (int_mode));
  	      else if (wi::geu_p (shift, GET_MODE_PRECISION (int_mode)))
--- 6019,6027 ----
  	      wide_int shift
  		= rtx_mode_t (op1,
  			      GET_MODE (op1) == VOIDmode
! 			      && (GET_MODE_PRECISION (int_mode)
! 				  < HOST_BITS_PER_WIDE_INT)
! 			      ? DImode : mode);
  	      if (SHIFT_COUNT_TRUNCATED)
  		shift = wi::umod_trunc (shift, GET_MODE_PRECISION (int_mode));
  	      else if (wi::geu_p (shift, GET_MODE_PRECISION (int_mode)))
diff -Nrcpad gcc-16-20260111/gcc/stmt.cc gcc-16-20260118/gcc/stmt.cc
*** gcc-16-20260111/gcc/stmt.cc	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/stmt.cc	Sun Jan 18 22:32:08 2026
*************** parse_output_constraint (const char **co
*** 322,327 ****
--- 322,332 ----
  
    unsigned int alt = 0;
    bool early_clobbered = false;
+   /* Currently, multiple hard register constraints in one alternative are not
+      supported.  A combination of hard register constraints and regular
+      register constraints is also not supported.  */
+   bool alt_has_hard_reg_cstr = false;
+   bool alt_has_reg_cstr = false;
  
    /* Loop through the constraint string.  */
    for (p = constraint + 1; *p; )
*************** parse_output_constraint (const char **co
*** 357,362 ****
--- 362,369 ----
  	case ',':
  	  ++alt;
  	  early_clobbered = false;
+ 	  alt_has_hard_reg_cstr = false;
+ 	  alt_has_reg_cstr = false;
  	  break;
  
  	case '0':  case '1':  case '2':  case '3':  case '4':
*************** parse_output_constraint (const char **co
*** 390,395 ****
--- 397,417 ----
  	      }
  	    if (reg_info)
  	      {
+ 		if (alt_has_reg_cstr)
+ 		  {
+ 		    error (
+ 			"hard register constraints and regular register "
+ 			"constraints in one alternative are not supported");
+ 		    return false;
+ 		  }
+ 		if (alt_has_hard_reg_cstr)
+ 		  {
+ 		    error (
+ 			"multiple hard register constraints in one "
+ 			"alternative are not supported");
+ 		    return false;
+ 		  }
+ 		alt_has_hard_reg_cstr = true;
  		int regno = decode_hard_reg_constraint (p);
  		if (regno < 0)
  		  {
*************** parse_output_constraint (const char **co
*** 441,447 ****
  	  enum constraint_num cn = lookup_constraint (p);
  	  if (reg_class_for_constraint (cn) != NO_REGS
  	      || insn_extra_address_constraint (cn))
! 	    *allows_reg = true;
  	  else if (insn_extra_memory_constraint (cn))
  	    *allows_mem = true;
  	  else
--- 463,479 ----
  	  enum constraint_num cn = lookup_constraint (p);
  	  if (reg_class_for_constraint (cn) != NO_REGS
  	      || insn_extra_address_constraint (cn))
! 	    {
! 	      if (alt_has_hard_reg_cstr)
! 		{
! 		  error (
! 		      "hard register constraints and regular register "
! 		      "constraints in one alternative are not supported");
! 		  return false;
! 		}
! 	      alt_has_reg_cstr = true;
! 	      *allows_reg = true;
! 	    }
  	  else if (insn_extra_memory_constraint (cn))
  	    *allows_mem = true;
  	  else
*************** parse_input_constraint (const char **con
*** 503,508 ****
--- 535,543 ----
    *allows_mem = false;
    *allows_reg = false;
  
+   bool alt_has_hard_reg_cstr = false;
+   bool alt_has_reg_cstr = false;
+ 
    /* Make sure constraint has neither `=', `+', nor '&'.  */
  
    unsigned int alt = 0;
*************** repeat:
*** 555,560 ****
--- 590,597 ----
  
        case ',':
  	++alt;
+ 	alt_has_hard_reg_cstr = false;
+ 	alt_has_reg_cstr = false;
  	break;
  
  	/* Whether or not a numeric constraint allows a register is
*************** repeat:
*** 607,612 ****
--- 644,664 ----
  	    }
  	  if (reg_info)
  	    {
+ 	      if (alt_has_reg_cstr)
+ 		{
+ 		  error (
+ 		      "hard register constraints and regular register "
+ 		      "constraints in one alternative are not supported");
+ 		  return false;
+ 		}
+ 	      if (alt_has_hard_reg_cstr)
+ 		{
+ 		  error (
+ 		      "multiple hard register constraints in one "
+ 		      "alternative are not supported");
+ 		  return false;
+ 		}
+ 	      alt_has_hard_reg_cstr = true;
  	      int regno = decode_hard_reg_constraint (constraint + j);
  	      if (regno < 0)
  		{
*************** repeat:
*** 666,672 ****
  	enum constraint_num cn = lookup_constraint (constraint + j);
  	if (reg_class_for_constraint (cn) != NO_REGS
  	    || insn_extra_address_constraint (cn))
! 	  *allows_reg = true;
  	else if (insn_extra_memory_constraint (cn)
  		 || insn_extra_special_memory_constraint (cn)
  		 || insn_extra_relaxed_memory_constraint (cn))
--- 718,734 ----
  	enum constraint_num cn = lookup_constraint (constraint + j);
  	if (reg_class_for_constraint (cn) != NO_REGS
  	    || insn_extra_address_constraint (cn))
! 	  {
! 	    if (alt_has_hard_reg_cstr)
! 	      {
! 		error (
! 		    "hard register constraints and regular register "
! 		    "constraints in one alternative are not supported");
! 		return false;
! 	      }
! 	    alt_has_reg_cstr = true;
! 	    *allows_reg = true;
! 	  }
  	else if (insn_extra_memory_constraint (cn)
  		 || insn_extra_special_memory_constraint (cn)
  		 || insn_extra_relaxed_memory_constraint (cn))
diff -Nrcpad gcc-16-20260111/gcc/testsuite/ChangeLog gcc-16-20260118/gcc/testsuite/ChangeLog
*** gcc-16-20260111/gcc/testsuite/ChangeLog	Sun Jan 11 22:32:07 2026
--- gcc-16-20260118/gcc/testsuite/ChangeLog	Sun Jan 18 22:32:08 2026
***************
*** 1,3 ****
--- 1,1010 ----
+ 2026-01-17  Jose E. Marchesi  <jemarch@gnu.org>
+ 
+ 	* algol68/execute/pow-real-1.a68: Adapt test to use ** rather than
+ 	^ for pow operator.
+ 
+ 2026-01-17  Eric Botcazou  <ebotcazou@adacore.com>
+ 	    Lisa Felidae  <lisa@felidae.bam.moe>
+ 
+ 	* gnat.dg/component_value2.adb: New test.
+ 
+ 2026-01-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR fortran/94377
+ 	* gfortran.dg/pr94377.f90: New test, failed on gcc-15
+ 
+ 2026-01-17  Steven G. Kargl  <kargl@gcc.gnu.org>
+ 
+ 	PR fortran/109512
+ 	* gfortran.dg/pr109512.f90: New test.
+ 
+ 2026-01-17  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR tree-optimization/123513
+ 	* g++.dg/warn/Wmismatched-new-delete-10.C: New test.
+ 
+ 2026-01-17  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/123627
+ 	* g++.dg/modules/block-decl-4_a.C: New test.
+ 	* g++.dg/modules/block-decl-4_b.C: New test.
+ 	* g++.dg/modules/block-decl-4_c.C: New test.
+ 
+ 2026-01-17  Robert Dubner  <rdubner@symas.com>
+ 	    James K. Lowden  <jklowden@cobolworx.com>
+ 
+ 	* cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.cob:
+ 	Change diagnostics message.
+ 	* cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.cob:
+ 	Change diagnostics message.
+ 	* cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out:
+ 	Change diagnostics message.
+ 	* cobol.dg/group2/floating-point_literals.out:
+ 	Change diagnostics message.
+ 
+ 2026-01-16  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* gcc.dg/hierarchical-discriminator-loop-version.c: Simplify.
+ 	* gcc.dg/hierarchical-discriminator-unroll.c: Likewise
+ 	* gcc.dg/hierarchical-discriminator-vect-version.c: Likewise.
+ 
+ 2026-01-16  Yap Zhi Heng  <yapzhhg@gmail.com>
+ 
+ 	* rust/compile/issue-4163-2.rs: New file.
+ 	* rust/compile/issue-4163.rs: New file.
+ 
+ 2026-01-16  lenny.chiadmi-delage  <lenny.chiadmi-delage@epita.fr>
+ 
+ 	* rust/compile/issue-3874.rs: Fixes test.
+ 	* rust/compile/issue-3904.rs: New test.
+ 
+ 2026-01-16  Lucas Ly Ba  <lucas.ly-ba@outlook.com>
+ 
+ 	* rust/compile/unused-label_0.rs: New test.
+ 
+ 2026-01-16  Jayant Chauhan  <0001jayant@gmail.com>
+ 
+ 	* rust/compile/no_mangle-malformed.rs: New test.
+ 
+ 2026-01-16  Jayant Chauhan  <0001jayant@gmail.com>
+ 
+ 	* rust/compile/target_feature-malformed-4233.rs: New test.
+ 
+ 2026-01-16  Lucas Ly Ba  <lucas.ly-ba@outlook.com>
+ 
+ 	* rust/compile/redundant-semicolons_0.rs: New test.
+ 
+ 2026-01-16  Jayant Chauhan  <0001jayant@gmail.com>
+ 
+ 	* rust/compile/link_name-malformed.rs: New test.
+ 
+ 2026-01-16  Harishankar  <harishankarpp7@gmail.com>
+ 
+ 	* rust/compile/issue-4213.rs: New test.
+ 
+ 2026-01-16  Vladimir N. Makarov  <vmakarov@redhat.com>
+ 
+ 	PR target/123092
+ 	* gcc.target/riscv/pr123092.c: New.
+ 
+ 2026-01-16  Marek Polacek  <polacek@redhat.com>
+ 
+ 	* g++.dg/reflect/member15.C: Enable commented-out test.
+ 	* g++.dg/reflect/splice5.C: Likewise.  Add XFAIL.
+ 
+ 2026-01-16  Jakub Jelinek  <jakub@redhat.com>
+ 	    Peter Damianov  <peter0x44@disroot.org>
+ 
+ 	PR c/123437
+ 	* c-c++-common/pr123437.c: New test.
+ 
+ 2026-01-16  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/123607
+ 	* g++.target/i386/avx512fp16-pr123607.C: New test.
+ 
+ 2026-01-16  Lulu Cheng  <chenglulu@loongson.cn>
+ 
+ 	PR target/123521
+ 	* gcc.target/loongarch/vector/lasx/pr123521.c: New test.
+ 
+ 2026-01-15  Pengxuan Zheng  <pengxuan.zheng@oss.qualcomm.com>
+ 
+ 	* gcc.dg/pr123109.c: Require target x86_64 and aarch64.
+ 
+ 2026-01-15  Jeff Law  <jeffrey.law@oss.qualcomm.com>
+ 
+ 	* gcc.target/riscv/rvv/autovec/pr122445.c: Adjust expected output.
+ 
+ 2026-01-15  Marek Polacek  <polacek@redhat.com>
+ 	    Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120775
+ 	PR c++/123081
+ 	PR c++/122634
+ 	* g++.dg/DRs/dr2581-1.C: Add -freflection.
+ 	* g++.dg/DRs/dr2581-2.C: Likewise.
+ 	* g++.dg/reflect/access_context1.C: New test.
+ 	* g++.dg/reflect/access_context2.C: New test.
+ 	* g++.dg/reflect/access_context3.C: New test.
+ 	* g++.dg/reflect/adl1.C: New test.
+ 	* g++.dg/reflect/alignment_of1.C: New test.
+ 	* g++.dg/reflect/alignment_of2.C: New test.
+ 	* g++.dg/reflect/annotations1.C: New test.
+ 	* g++.dg/reflect/annotations2.C: New test.
+ 	* g++.dg/reflect/annotations3.C: New test.
+ 	* g++.dg/reflect/annotations4.C: New test.
+ 	* g++.dg/reflect/annotations5.C: New test.
+ 	* g++.dg/reflect/annotations6.C: New test.
+ 	* g++.dg/reflect/annotations7.C: New test.
+ 	* g++.dg/reflect/annotations8.C: New test.
+ 	* g++.dg/reflect/anon1.C: New test.
+ 	* g++.dg/reflect/anon2.C: New test.
+ 	* g++.dg/reflect/anon3.C: New test.
+ 	* g++.dg/reflect/bases_of1.C: New test.
+ 	* g++.dg/reflect/bases_of2.C: New test.
+ 	* g++.dg/reflect/bases_of3.C: New test.
+ 	* g++.dg/reflect/bit_size_of1.C: New test.
+ 	* g++.dg/reflect/bitfield1.C: New test.
+ 	* g++.dg/reflect/can_substitute1.C: New test.
+ 	* g++.dg/reflect/class1.C: New test.
+ 	* g++.dg/reflect/class2.C: New test.
+ 	* g++.dg/reflect/common_reference1.C: New test.
+ 	* g++.dg/reflect/common_type1.C: New test.
+ 	* g++.dg/reflect/compare1.C: New test.
+ 	* g++.dg/reflect/compare10.C: New test.
+ 	* g++.dg/reflect/compare2.C: New test.
+ 	* g++.dg/reflect/compare3.C: New test.
+ 	* g++.dg/reflect/compare4.C: New test.
+ 	* g++.dg/reflect/compare5.C: New test.
+ 	* g++.dg/reflect/compare6.C: New test.
+ 	* g++.dg/reflect/compare7.C: New test.
+ 	* g++.dg/reflect/compare8.C: New test.
+ 	* g++.dg/reflect/compare9.C: New test.
+ 	* g++.dg/reflect/compat1.C: New test.
+ 	* g++.dg/reflect/complete1.C: New test.
+ 	* g++.dg/reflect/constant_of1.C: New test.
+ 	* g++.dg/reflect/constant_of2.C: New test.
+ 	* g++.dg/reflect/constant_of3.C: New test.
+ 	* g++.dg/reflect/constant_of4.C: New test.
+ 	* g++.dg/reflect/constant_of5.C: New test.
+ 	* g++.dg/reflect/constant_of6.C: New test.
+ 	* g++.dg/reflect/constant_of7.C: New test.
+ 	* g++.dg/reflect/constant_of8.C: New test.
+ 	* g++.dg/reflect/constant_of9.C: New test.
+ 	* g++.dg/reflect/crash1.C: New test.
+ 	* g++.dg/reflect/crash10.C: New test.
+ 	* g++.dg/reflect/crash11.C: New test.
+ 	* g++.dg/reflect/crash12.C: New test.
+ 	* g++.dg/reflect/crash13.C: New test.
+ 	* g++.dg/reflect/crash14.C: New test.
+ 	* g++.dg/reflect/crash15.C: New test.
+ 	* g++.dg/reflect/crash16.C: New test.
+ 	* g++.dg/reflect/crash17.C: New test.
+ 	* g++.dg/reflect/crash18.C: New test.
+ 	* g++.dg/reflect/crash2.C: New test.
+ 	* g++.dg/reflect/crash3.C: New test.
+ 	* g++.dg/reflect/crash4.C: New test.
+ 	* g++.dg/reflect/crash5.C: New test.
+ 	* g++.dg/reflect/crash6.C: New test.
+ 	* g++.dg/reflect/crash7.C: New test.
+ 	* g++.dg/reflect/crash8.C: New test.
+ 	* g++.dg/reflect/crash9.C: New test.
+ 	* g++.dg/reflect/data_member_spec1.C: New test.
+ 	* g++.dg/reflect/data_member_spec2.C: New test.
+ 	* g++.dg/reflect/data_member_spec3.C: New test.
+ 	* g++.dg/reflect/data_member_spec4.C: New test.
+ 	* g++.dg/reflect/dealias1.C: New test.
+ 	* g++.dg/reflect/dealias2.C: New test.
+ 	* g++.dg/reflect/dealias3.C: New test.
+ 	* g++.dg/reflect/define_aggregate1.C: New test.
+ 	* g++.dg/reflect/define_aggregate2.C: New test.
+ 	* g++.dg/reflect/define_aggregate3.C: New test.
+ 	* g++.dg/reflect/define_aggregate4.C: New test.
+ 	* g++.dg/reflect/define_aggregate5.C: New test.
+ 	* g++.dg/reflect/define_static_array1.C: New test.
+ 	* g++.dg/reflect/define_static_array2.C: New test.
+ 	* g++.dg/reflect/define_static_array3.C: New test.
+ 	* g++.dg/reflect/define_static_array4.C: New test.
+ 	* g++.dg/reflect/define_static_object1.C: New test.
+ 	* g++.dg/reflect/define_static_object2.C: New test.
+ 	* g++.dg/reflect/define_static_string1.C: New test.
+ 	* g++.dg/reflect/dep1.C: New test.
+ 	* g++.dg/reflect/dep10.C: New test.
+ 	* g++.dg/reflect/dep11.C: New test.
+ 	* g++.dg/reflect/dep2.C: New test.
+ 	* g++.dg/reflect/dep3.C: New test.
+ 	* g++.dg/reflect/dep4.C: New test.
+ 	* g++.dg/reflect/dep5.C: New test.
+ 	* g++.dg/reflect/dep6.C: New test.
+ 	* g++.dg/reflect/dep7.C: New test.
+ 	* g++.dg/reflect/dep8.C: New test.
+ 	* g++.dg/reflect/dep9.C: New test.
+ 	* g++.dg/reflect/diag1.C: New test.
+ 	* g++.dg/reflect/diag2.C: New test.
+ 	* g++.dg/reflect/diag3.C: New test.
+ 	* g++.dg/reflect/diag4.C: New test.
+ 	* g++.dg/reflect/display_string_of1.C: New test.
+ 	* g++.dg/reflect/eh1.C: New test.
+ 	* g++.dg/reflect/eh2.C: New test.
+ 	* g++.dg/reflect/eh3.C: New test.
+ 	* g++.dg/reflect/eh4.C: New test.
+ 	* g++.dg/reflect/eh5.C: New test.
+ 	* g++.dg/reflect/eh6.C: New test.
+ 	* g++.dg/reflect/eh7.C: New test.
+ 	* g++.dg/reflect/eh8.C: New test.
+ 	* g++.dg/reflect/eh9.C: New test.
+ 	* g++.dg/reflect/enumerators_of1.C: New test.
+ 	* g++.dg/reflect/error1.C: New test.
+ 	* g++.dg/reflect/error10.C: New test.
+ 	* g++.dg/reflect/error2.C: New test.
+ 	* g++.dg/reflect/error3.C: New test.
+ 	* g++.dg/reflect/error4.C: New test.
+ 	* g++.dg/reflect/error5.C: New test.
+ 	* g++.dg/reflect/error6.C: New test.
+ 	* g++.dg/reflect/error8.C: New test.
+ 	* g++.dg/reflect/error9.C: New test.
+ 	* g++.dg/reflect/expr1.C: New test.
+ 	* g++.dg/reflect/expr10.C: New test.
+ 	* g++.dg/reflect/expr11.C: New test.
+ 	* g++.dg/reflect/expr12.C: New test.
+ 	* g++.dg/reflect/expr13.C: New test.
+ 	* g++.dg/reflect/expr14.C: New test.
+ 	* g++.dg/reflect/expr2.C: New test.
+ 	* g++.dg/reflect/expr3.C: New test.
+ 	* g++.dg/reflect/expr4.C: New test.
+ 	* g++.dg/reflect/expr5.C: New test.
+ 	* g++.dg/reflect/expr6.C: New test.
+ 	* g++.dg/reflect/expr7.C: New test.
+ 	* g++.dg/reflect/expr8.C: New test.
+ 	* g++.dg/reflect/expr9.C: New test.
+ 	* g++.dg/reflect/extract1.C: New test.
+ 	* g++.dg/reflect/extract2.C: New test.
+ 	* g++.dg/reflect/extract3.C: New test.
+ 	* g++.dg/reflect/extract4.C: New test.
+ 	* g++.dg/reflect/extract5.C: New test.
+ 	* g++.dg/reflect/extract6.C: New test.
+ 	* g++.dg/reflect/extract7.C: New test.
+ 	* g++.dg/reflect/extract8.C: New test.
+ 	* g++.dg/reflect/extract9.C: New test.
+ 	* g++.dg/reflect/feat1.C: New test.
+ 	* g++.dg/reflect/feat2.C: New test.
+ 	* g++.dg/reflect/has_c_language_linkage1.C: New test.
+ 	* g++.dg/reflect/has_default_argument1.C: New test.
+ 	* g++.dg/reflect/has_default_argument2.C: New test.
+ 	* g++.dg/reflect/has_default_member_initializer1.C: New test.
+ 	* g++.dg/reflect/has_ellipsis_parameter1.C: New test.
+ 	* g++.dg/reflect/has_external_linkage1.C: New test.
+ 	* g++.dg/reflect/has_external_linkage2.C: New test.
+ 	* g++.dg/reflect/has_identifier1.C: New test.
+ 	* g++.dg/reflect/has_identifier2.C: New test.
+ 	* g++.dg/reflect/has_internal_linkage1.C: New test.
+ 	* g++.dg/reflect/has_internal_linkage2.C: New test.
+ 	* g++.dg/reflect/has_linkage1.C: New test.
+ 	* g++.dg/reflect/has_module_linkage1.C: New test.
+ 	* g++.dg/reflect/has_module_linkage2.C: New test.
+ 	* g++.dg/reflect/has_parent1.C: New test.
+ 	* g++.dg/reflect/has_template_arguments1.C: New test.
+ 	* g++.dg/reflect/has_template_arguments2.C: New test.
+ 	* g++.dg/reflect/has_template_arguments3.C: New test.
+ 	* g++.dg/reflect/has_template_arguments4.C: New test.
+ 	* g++.dg/reflect/identifier_of1.C: New test.
+ 	* g++.dg/reflect/identifier_of2.C: New test.
+ 	* g++.dg/reflect/init1.C: New test.
+ 	* g++.dg/reflect/init10.C: New test.
+ 	* g++.dg/reflect/init11.C: New test.
+ 	* g++.dg/reflect/init12.C: New test.
+ 	* g++.dg/reflect/init13.C: New test.
+ 	* g++.dg/reflect/init14.C: New test.
+ 	* g++.dg/reflect/init15.C: New test.
+ 	* g++.dg/reflect/init16.C: New test.
+ 	* g++.dg/reflect/init17.C: New test.
+ 	* g++.dg/reflect/init2.C: New test.
+ 	* g++.dg/reflect/init3.C: New test.
+ 	* g++.dg/reflect/init4.C: New test.
+ 	* g++.dg/reflect/init5.C: New test.
+ 	* g++.dg/reflect/init6.C: New test.
+ 	* g++.dg/reflect/init7.C: New test.
+ 	* g++.dg/reflect/init8.C: New test.
+ 	* g++.dg/reflect/init9.C: New test.
+ 	* g++.dg/reflect/is_accessible1.C: New test.
+ 	* g++.dg/reflect/is_accessible2.C: New test.
+ 	* g++.dg/reflect/is_alias_template1.C: New test.
+ 	* g++.dg/reflect/is_assignment1.C: New test.
+ 	* g++.dg/reflect/is_bit_field1.C: New test.
+ 	* g++.dg/reflect/is_class_member1.C: New test.
+ 	* g++.dg/reflect/is_class_template1.C: New test.
+ 	* g++.dg/reflect/is_complete_type1.C: New test.
+ 	* g++.dg/reflect/is_complete_type2.C: New test.
+ 	* g++.dg/reflect/is_concept1.C: New test.
+ 	* g++.dg/reflect/is_const1.C: New test.
+ 	* g++.dg/reflect/is_consteval_only1.C: New test.
+ 	* g++.dg/reflect/is_constructible_type1.C: New test.
+ 	* g++.dg/reflect/is_constructible_type2.C: New test.
+ 	* g++.dg/reflect/is_constructor_template1.C: New test.
+ 	* g++.dg/reflect/is_constuctor1.C: New test.
+ 	* g++.dg/reflect/is_conversion_function1.C: New test.
+ 	* g++.dg/reflect/is_conversion_function_template1.C: New test.
+ 	* g++.dg/reflect/is_copy_assignment1.C: New test.
+ 	* g++.dg/reflect/is_copy_constructor1.C: New test.
+ 	* g++.dg/reflect/is_data_member_spec1.C: New test.
+ 	* g++.dg/reflect/is_default_constructor1.C: New test.
+ 	* g++.dg/reflect/is_defaulted1.C: New test.
+ 	* g++.dg/reflect/is_defaulted2.C: New test.
+ 	* g++.dg/reflect/is_deleted1.C: New test.
+ 	* g++.dg/reflect/is_deleted2.C: New test.
+ 	* g++.dg/reflect/is_destructor1.C: New test.
+ 	* g++.dg/reflect/is_enumerable_type1.C: New test.
+ 	* g++.dg/reflect/is_enumerator1.C: New test.
+ 	* g++.dg/reflect/is_explicit1.C: New test.
+ 	* g++.dg/reflect/is_explicit2.C: New test.
+ 	* g++.dg/reflect/is_explicit_object_parameter1.C: New test.
+ 	* g++.dg/reflect/is_final1.C: New test.
+ 	* g++.dg/reflect/is_function1.C: New test.
+ 	* g++.dg/reflect/is_function2.C: New test.
+ 	* g++.dg/reflect/is_function3.C: New test.
+ 	* g++.dg/reflect/is_function_parameter1.C: New test.
+ 	* g++.dg/reflect/is_function_parameter2.C: New test.
+ 	* g++.dg/reflect/is_function_template1.C: New test.
+ 	* g++.dg/reflect/is_function_template2.C: New test.
+ 	* g++.dg/reflect/is_function_type1.C: New test.
+ 	* g++.dg/reflect/is_literal_operator1.C: New test.
+ 	* g++.dg/reflect/is_literal_operator_template1.C: New test.
+ 	* g++.dg/reflect/is_lrvalue_reference_qualified1.C: New test.
+ 	* g++.dg/reflect/is_move_assignment1.C: New test.
+ 	* g++.dg/reflect/is_move_constructor1.C: New test.
+ 	* g++.dg/reflect/is_mutable_member1.C: New test.
+ 	* g++.dg/reflect/is_namespace1.C: New test.
+ 	* g++.dg/reflect/is_namespace_alias1.C: New test.
+ 	* g++.dg/reflect/is_namespace_member1.C: New test.
+ 	* g++.dg/reflect/is_noexcept1.C: New test.
+ 	* g++.dg/reflect/is_noexcept2.C: New test.
+ 	* g++.dg/reflect/is_noexcept3.C: New test.
+ 	* g++.dg/reflect/is_noexcept4.C: New test.
+ 	* g++.dg/reflect/is_nonstatic_data_member1.C: New test.
+ 	* g++.dg/reflect/is_object1.C: New test.
+ 	* g++.dg/reflect/is_object2.C: New test.
+ 	* g++.dg/reflect/is_operator_function1.C: New test.
+ 	* g++.dg/reflect/is_operator_function_template1.C: New test.
+ 	* g++.dg/reflect/is_override1.C: New test.
+ 	* g++.dg/reflect/is_pure_virtual1.C: New test.
+ 	* g++.dg/reflect/is_special_member_function1.C: New test.
+ 	* g++.dg/reflect/is_static_member1.C: New test.
+ 	* g++.dg/reflect/is_string_literal1.C: New test.
+ 	* g++.dg/reflect/is_structured_binding1.C: New test.
+ 	* g++.dg/reflect/is_structured_binding2.C: New test.
+ 	* g++.dg/reflect/is_template1.C: New test.
+ 	* g++.dg/reflect/is_template2.C: New test.
+ 	* g++.dg/reflect/is_type1.C: New test.
+ 	* g++.dg/reflect/is_type_alias1.C: New test.
+ 	* g++.dg/reflect/is_type_alias2.C: New test.
+ 	* g++.dg/reflect/is_type_alias3.C: New test.
+ 	* g++.dg/reflect/is_user_declared1.C: New test.
+ 	* g++.dg/reflect/is_user_declared2.C: New test.
+ 	* g++.dg/reflect/is_user_provided1.C: New test.
+ 	* g++.dg/reflect/is_user_provided2.C: New test.
+ 	* g++.dg/reflect/is_variable1.C: New test.
+ 	* g++.dg/reflect/is_variable_template1.C: New test.
+ 	* g++.dg/reflect/is_virtual1.C: New test.
+ 	* g++.dg/reflect/is_volatile1.C: New test.
+ 	* g++.dg/reflect/lex1.C: New test.
+ 	* g++.dg/reflect/lex2.C: New test.
+ 	* g++.dg/reflect/mangle1.C: New test.
+ 	* g++.dg/reflect/member-visibility1.C: New test.
+ 	* g++.dg/reflect/member-visibility2.C: New test.
+ 	* g++.dg/reflect/member1.C: New test.
+ 	* g++.dg/reflect/member10.C: New test.
+ 	* g++.dg/reflect/member11.C: New test.
+ 	* g++.dg/reflect/member12.C: New test.
+ 	* g++.dg/reflect/member13.C: New test.
+ 	* g++.dg/reflect/member14.C: New test.
+ 	* g++.dg/reflect/member15.C: New test.
+ 	* g++.dg/reflect/member16.C: New test.
+ 	* g++.dg/reflect/member17.C: New test.
+ 	* g++.dg/reflect/member18.C: New test.
+ 	* g++.dg/reflect/member19.C: New test.
+ 	* g++.dg/reflect/member2.C: New test.
+ 	* g++.dg/reflect/member20.C: New test.
+ 	* g++.dg/reflect/member3.C: New test.
+ 	* g++.dg/reflect/member4.C: New test.
+ 	* g++.dg/reflect/member5.C: New test.
+ 	* g++.dg/reflect/member6.C: New test.
+ 	* g++.dg/reflect/member7.C: New test.
+ 	* g++.dg/reflect/member8.C: New test.
+ 	* g++.dg/reflect/member9.C: New test.
+ 	* g++.dg/reflect/members_of1.C: New test.
+ 	* g++.dg/reflect/members_of2.C: New test.
+ 	* g++.dg/reflect/members_of3.C: New test.
+ 	* g++.dg/reflect/members_of4.C: New test.
+ 	* g++.dg/reflect/members_of5.C: New test.
+ 	* g++.dg/reflect/members_of6.C: New test.
+ 	* g++.dg/reflect/members_of7.C: New test.
+ 	* g++.dg/reflect/metafn-ptr1.C: New test.
+ 	* g++.dg/reflect/ns1.C: New test.
+ 	* g++.dg/reflect/ns2.C: New test.
+ 	* g++.dg/reflect/ns3.C: New test.
+ 	* g++.dg/reflect/ns4.C: New test.
+ 	* g++.dg/reflect/ns5.C: New test.
+ 	* g++.dg/reflect/ns6.C: New test.
+ 	* g++.dg/reflect/null1.C: New test.
+ 	* g++.dg/reflect/null2.C: New test.
+ 	* g++.dg/reflect/null3.C: New test.
+ 	* g++.dg/reflect/null4.C: New test.
+ 	* g++.dg/reflect/null5.C: New test.
+ 	* g++.dg/reflect/object_of1.C: New test.
+ 	* g++.dg/reflect/object_of2.C: New test.
+ 	* g++.dg/reflect/odr1.C: New test.
+ 	* g++.dg/reflect/offset_of1.C: New test.
+ 	* g++.dg/reflect/operator_of1.C: New test.
+ 	* g++.dg/reflect/override1.C: New test.
+ 	* g++.dg/reflect/p2996-1.C: New test.
+ 	* g++.dg/reflect/p2996-10.C: New test.
+ 	* g++.dg/reflect/p2996-11.C: New test.
+ 	* g++.dg/reflect/p2996-12.C: New test.
+ 	* g++.dg/reflect/p2996-13.C: New test.
+ 	* g++.dg/reflect/p2996-14.C: New test.
+ 	* g++.dg/reflect/p2996-15.C: New test.
+ 	* g++.dg/reflect/p2996-16.C: New test.
+ 	* g++.dg/reflect/p2996-17.C: New test.
+ 	* g++.dg/reflect/p2996-18.C: New test.
+ 	* g++.dg/reflect/p2996-19.C: New test.
+ 	* g++.dg/reflect/p2996-2.C: New test.
+ 	* g++.dg/reflect/p2996-20.C: New test.
+ 	* g++.dg/reflect/p2996-21.C: New test.
+ 	* g++.dg/reflect/p2996-3.C: New test.
+ 	* g++.dg/reflect/p2996-4.C: New test.
+ 	* g++.dg/reflect/p2996-5.C: New test.
+ 	* g++.dg/reflect/p2996-6.C: New test.
+ 	* g++.dg/reflect/p2996-7.C: New test.
+ 	* g++.dg/reflect/p2996-8.C: New test.
+ 	* g++.dg/reflect/p2996-9.C: New test.
+ 	* g++.dg/reflect/p3394-1.C: New test.
+ 	* g++.dg/reflect/p3491-1.C: New test.
+ 	* g++.dg/reflect/p3491-2.C: New test.
+ 	* g++.dg/reflect/p3491-3.C: New test.
+ 	* g++.dg/reflect/pack-index1.C: New test.
+ 	* g++.dg/reflect/parameters_of1.C: New test.
+ 	* g++.dg/reflect/parameters_of2.C: New test.
+ 	* g++.dg/reflect/parameters_of3.C: New test.
+ 	* g++.dg/reflect/parameters_of4.C: New test.
+ 	* g++.dg/reflect/parameters_of5.C: New test.
+ 	* g++.dg/reflect/parameters_of6.C: New test.
+ 	* g++.dg/reflect/parent_of1.C: New test.
+ 	* g++.dg/reflect/parm1.C: New test.
+ 	* g++.dg/reflect/parm2.C: New test.
+ 	* g++.dg/reflect/parm3.C: New test.
+ 	* g++.dg/reflect/parm4.C: New test.
+ 	* g++.dg/reflect/pr122634-1.C: New test.
+ 	* g++.dg/reflect/pr122634-2.C: New test.
+ 	* g++.dg/reflect/qrn1.C: New test.
+ 	* g++.dg/reflect/qrn2.C: New test.
+ 	* g++.dg/reflect/range_args.C: New test.
+ 	* g++.dg/reflect/reflect_constant1.C: New test.
+ 	* g++.dg/reflect/reflect_constant2.C: New test.
+ 	* g++.dg/reflect/reflect_constant3.C: New test.
+ 	* g++.dg/reflect/reflect_constant4.C: New test.
+ 	* g++.dg/reflect/reflect_constant5.C: New test.
+ 	* g++.dg/reflect/reflect_constant6.C: New test.
+ 	* g++.dg/reflect/reflect_constant7.C: New test.
+ 	* g++.dg/reflect/reflect_constant8.C: New test.
+ 	* g++.dg/reflect/reflect_constant9.C: New test.
+ 	* g++.dg/reflect/reflect_constant_array1.C: New test.
+ 	* g++.dg/reflect/reflect_constant_array2.C: New test.
+ 	* g++.dg/reflect/reflect_constant_array3.C: New test.
+ 	* g++.dg/reflect/reflect_constant_array4.C: New test.
+ 	* g++.dg/reflect/reflect_constant_string1.C: New test.
+ 	* g++.dg/reflect/reflect_constant_string2.C: New test.
+ 	* g++.dg/reflect/reflect_function1.C: New test.
+ 	* g++.dg/reflect/reflect_function2.C: New test.
+ 	* g++.dg/reflect/reflect_object1.C: New test.
+ 	* g++.dg/reflect/reflect_object2.C: New test.
+ 	* g++.dg/reflect/reflect_object3.C: New test.
+ 	* g++.dg/reflect/reflect_object4.C: New test.
+ 	* g++.dg/reflect/return_type_of1.C: New test.
+ 	* g++.dg/reflect/return_type_of2.C: New test.
+ 	* g++.dg/reflect/serialize1.C: New test.
+ 	* g++.dg/reflect/serialize2.C: New test.
+ 	* g++.dg/reflect/size_of1.C: New test.
+ 	* g++.dg/reflect/source_location_of1.C: New test.
+ 	* g++.dg/reflect/source_location_of2.C: New test.
+ 	* g++.dg/reflect/splice1.C: New test.
+ 	* g++.dg/reflect/splice2.C: New test.
+ 	* g++.dg/reflect/splice3.C: New test.
+ 	* g++.dg/reflect/splice4.C: New test.
+ 	* g++.dg/reflect/splice5.C: New test.
+ 	* g++.dg/reflect/splice6.C: New test.
+ 	* g++.dg/reflect/splice7.C: New test.
+ 	* g++.dg/reflect/splicing-base1.C: New test.
+ 	* g++.dg/reflect/splicing-base2.C: New test.
+ 	* g++.dg/reflect/splicing-base3.C: New test.
+ 	* g++.dg/reflect/splicing-base4.C: New test.
+ 	* g++.dg/reflect/storage_duration1.C: New test.
+ 	* g++.dg/reflect/storage_duration2.C: New test.
+ 	* g++.dg/reflect/storage_duration3.C: New test.
+ 	* g++.dg/reflect/subobjects_of1.C: New test.
+ 	* g++.dg/reflect/substitute1.C: New test.
+ 	* g++.dg/reflect/substitute2.C: New test.
+ 	* g++.dg/reflect/symbol_of1.C: New test.
+ 	* g++.dg/reflect/symbol_of2.C: New test.
+ 	* g++.dg/reflect/template_arguments_of1.C: New test.
+ 	* g++.dg/reflect/template_arguments_of2.C: New test.
+ 	* g++.dg/reflect/template_arguments_of3.C: New test.
+ 	* g++.dg/reflect/template_of1.C: New test.
+ 	* g++.dg/reflect/template_of2.C: New test.
+ 	* g++.dg/reflect/template_of3.C: New test.
+ 	* g++.dg/reflect/tuple1.C: New test.
+ 	* g++.dg/reflect/tuple2.C: New test.
+ 	* g++.dg/reflect/type1.C: New test.
+ 	* g++.dg/reflect/type10.C: New test.
+ 	* g++.dg/reflect/type2.C: New test.
+ 	* g++.dg/reflect/type3.C: New test.
+ 	* g++.dg/reflect/type4.C: New test.
+ 	* g++.dg/reflect/type5.C: New test.
+ 	* g++.dg/reflect/type6.C: New test.
+ 	* g++.dg/reflect/type7.C: New test.
+ 	* g++.dg/reflect/type8.C: New test.
+ 	* g++.dg/reflect/type9.C: New test.
+ 	* g++.dg/reflect/type_of1.C: New test.
+ 	* g++.dg/reflect/type_of2.C: New test.
+ 	* g++.dg/reflect/type_rels1.C: New test.
+ 	* g++.dg/reflect/type_trait1.C: New test.
+ 	* g++.dg/reflect/type_trait10.C: New test.
+ 	* g++.dg/reflect/type_trait11.C: New test.
+ 	* g++.dg/reflect/type_trait12.C: New test.
+ 	* g++.dg/reflect/type_trait13.C: New test.
+ 	* g++.dg/reflect/type_trait2.C: New test.
+ 	* g++.dg/reflect/type_trait3.C: New test.
+ 	* g++.dg/reflect/type_trait4.C: New test.
+ 	* g++.dg/reflect/type_trait5.C: New test.
+ 	* g++.dg/reflect/type_trait6.C: New test.
+ 	* g++.dg/reflect/type_trait8.C: New test.
+ 	* g++.dg/reflect/type_trait9.C: New test.
+ 	* g++.dg/reflect/u8display_string_of1.C: New test.
+ 	* g++.dg/reflect/u8identifier_of1.C: New test.
+ 	* g++.dg/reflect/u8symbol_of1.C: New test.
+ 	* g++.dg/reflect/underlying_type1.C: New test.
+ 	* g++.dg/reflect/using1.C: New test.
+ 	* g++.dg/reflect/value_or_object1.C: New test.
+ 	* g++.dg/reflect/variable_of1.C: New test.
+ 	* g++.dg/reflect/variable_of2.C: New test.
+ 	* g++.dg/reflect/variable_of3.C: New test.
+ 	* g++.dg/reflect/variant1.C: New test.
+ 	* g++.dg/reflect/variant2.C: New test.
+ 	* g++.dg/reflect/vector1.C: New test.
+ 	* g++.dg/reflect/visibility1.C: New test.
+ 
+ 2026-01-15  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
+ 
+ 	* gcc.target/powerpc/asm-hard-reg-1.c: New test.
+ 
+ 2026-01-15  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
+ 
+ 	* gcc.dg/asm-hard-reg-error-1.c: Remove tests containing
+ 	multiple hard register constraints in one alternative.
+ 	* gcc.dg/asm-hard-reg-error-6.c: New test.
+ 
+ 2026-01-15  Richard Biener  <rguenther@suse.de>
+ 
+ 	* gcc.dg/vect/fast-math-slp-38.c: Avoid epilogue vectorization.
+ 
+ 2026-01-15  Richard Biener  <rguenther@suse.de>
+ 
+ 	* gcc.dg/vect/complex/fast-math-complex-add-half-float.c:
+ 	Avoid epilogue vectorization.
+ 
+ 2026-01-15  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR tree-optimization/120322
+ 	* gcc.dg/torture/pr120322.c: New test.
+ 
+ 2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* gcc.dg/hierarchical-discriminator-unroll.c: New test.
+ 
+ 2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* gcc.dg/hierarchical-discriminator-loop-version.c: New test.
+ 
+ 2026-01-15  Kugan Vivekanandarajah  <kvivekananda@nvidia.com>
+ 
+ 	* gcc.dg/hierarchical-discriminator-vect-version.c: New test.
+ 
+ 2026-01-15  DengJianbo  <dengjianbo@loongson.cn>
+ 
+ 	* gcc.target/loongarch/la64/attr-model-6.c: New test.
+ 
+ 2026-01-14  Qing Zhao  <qing.zhao@oracle.com>
+ 
+ 	* gcc.dg/counted-by-anonymous-2-char.c: New test.
+ 	* gcc.dg/counted-by-anonymous-2-float.c: New test.
+ 	* gcc.dg/counted-by-anonymous-2-struct.c: New test.
+ 	* gcc.dg/counted-by-anonymous-2-union.c: New test.
+ 	* gcc.dg/counted-by-anonymous-2.c: New test.
+ 	* gcc.dg/counted-by-anonymous-3.c: New test.
+ 	* gcc.dg/counted-by-anonymous.c: New test.
+ 	* gcc.dg/ubsan/counted-by-anonymous-bounds-1.c: New test.
+ 	* gcc.dg/ubsan/counted-by-anonymous-bounds-2.c: New test.
+ 	* gcc.dg/ubsan/counted-by-anonymous-bounds.c: New test.
+ 
+ 2026-01-14  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/123542
+ 	* gcc.dg/ipa/pr123542.c: New test.
+ 
+ 2026-01-14  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* lib/gcc-dg.exp (gdb-exists): Do not use [transform gdb].  Run
+ 	selected GDB with -v on target rather than testing for existence
+ 	on build system.
+ 	* lib/gcc-simulate-thread.exp (simulate-thread): Do not return
+ 	early for non-native and remote.  Download executable and GDB
+ 	command file to target before running GDB there, and delete when
+ 	closing target.
+ 
+ 2026-01-14  Joseph Myers  <josmyers@redhat.com>
+ 
+ 	* lib/gcc-gdb-test.exp (gdb-test): Do not return early for
+ 	non-native and remote.  Download executable and GDB command file
+ 	to target before running GDB there, and delete when closing
+ 	target.
+ 	(report_gdb): Use target when testing GDB availability and
+ 	version.
+ 	* g++.dg/guality/guality.exp: Only use in-tree GDB when host =
+ 	target.  Do not use [transform gdb].
+ 	* gcc.dg/guality/guality.exp: Likewise.
+ 	* gfortran.dg/guality/guality.exp: Likewise.
+ 
+ 2026-01-14  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* g++.dg/diagnostic/bad-fndef-1.C: Add directives to expect
+ 	"void *" vs "const void *" notes about parameter 3 of the close
+ 	candidate.
+ 	* g++.dg/diagnostic/bad-fndef-2.C: New test.
+ 	* g++.dg/diagnostic/bad-fndef-3.C: New test.
+ 	* g++.dg/diagnostic/bad-fndef-4.C: New test.
+ 	* g++.dg/diagnostic/bad-fndef-5.C: New test.
+ 	* g++.dg/diagnostic/bad-fndef-6.C: New test.
+ 	* g++.dg/diagnostic/bad-fndef-7.C: New test.
+ 	* g++.dg/diagnostic/bad-fndef-7b.C: New test.
+ 	* g++.dg/diagnostic/bad-fndef-8.C: New test.
+ 	* g++.dg/diagnostic/bad-fndef-9.C: New test.
+ 
+ 2026-01-14  David Malcolm  <dmalcolm@redhat.com>
+ 
+ 	* g++.dg/cpp0x/inline-ns2.C: Make dg-message directives non-empty.
+ 	* g++.dg/cpp23/explicit-obj-lambda11.C: Prune the extra note.
+ 	* g++.dg/diagnostic/bad-fndef-1.C: New test.
+ 	* g++.dg/lookup/decl1.C: Give the dg-message directives different
+ 	messages.
+ 	* g++.dg/lookup/using17.C: Update expected output.
+ 	* g++.dg/parse/non-dependent2.C: Likewise.
+ 	* g++.old-deja/g++.other/lineno2.C: Give the dg-message directives
+ 	different messages.
+ 	* g++.old-deja/g++.pt/t37.C: Likewise.
+ 
+ 2026-01-14  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123551
+ 	* g++.dg/ext/goto2.C: New test.
+ 
+ 2026-01-14  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/121240
+ 	* gcc.target/aarch64/dbl_mov_immediate_1.c: Adjust test.
+ 	* gcc.target/aarch64/pr63304_1.c: Likewise.
+ 
+ 2026-01-14  Wilco Dijkstra  <wilco.dijkstra@arm.com>
+ 
+ 	PR target/114528
+ 	* gcc.target/aarch64/pr114528.c: New test.
+ 
+ 2026-01-14  Tejas Belagod  <tejas.belagod@arm.com>
+ 
+ 	PR middle-end/123392
+ 	* gcc.target/aarch64/sve/acle/general/pr123392.c: New.
+ 
+ 2026-01-14  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR target/120250
+ 	* gcc.c-torture/compile/pr120250.c: New test.
+ 
+ 2026-01-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123190
+ 	* gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-1.c: Do not
+ 	require -mtune=generic.
+ 	* gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-2.c: Add
+ 	variant with -O2 instead of -O3, inner loop not unrolled.
+ 
+ 2026-01-14  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123190
+ 	* gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-1.c: New testcase.
+ 	* gcc.dg/vect/slp-28.c: Avoid epilogue vectorization for
+ 	simplicity.
+ 
+ 2026-01-14  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR rtl-optimization/123544
+ 	* gcc.dg/pr123544.c: New test.
+ 
+ 2026-01-14  Nathan Sidwell  <nathan@acm.org>
+ 
+ 	* lib/scanasm.exp (check_function_body): Clarify mismatch labelling.
+ 
+ 2026-01-14  Daniel Barboza  <daniel.barboza@oss.qualcomm.com>
+ 
+ 	* gcc.dg/Wstrict-overflow-1.c: Removed because we no longer
+ 	issue a 'fold_overflow_warning' with the
+ 	`(le (minus (@0 INTEGER_CST@1)) INTEGER_CST@2)` pattern.
+ 
+ 2026-01-13  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	* g++.dg/modules/coro-1_a.C: New test.
+ 	* g++.dg/modules/coro-1_b.C: New test.
+ 
+ 2026-01-13  Pengxuan Zheng  <pengxuan.zheng@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123109
+ 	* gcc.dg/tree-ssa/vrp99.c: Update test.
+ 	* gcc.dg/pr123109.c: New test.
+ 
+ 2026-01-13  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/119402
+ 	* gcc.dg/tree-ssa/bitops-14.c: New test.
+ 	* gcc.dg/tree-ssa/bitops-15.c: New test.
+ 
+ 2026-01-13  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR testsuite/122522
+ 	* gcc.target/aarch64/signbitv2sf.c (main): Disable
+ 	unrolling and vectorizer for the checking loop.
+ 
+ 2026-01-13  Martin Uecker  <uecker@tugraz.at>
+ 
+ 	PR c/123309
+ 	* gcc.dg/pr123309.c: New test.
+ 	* gcc.dg/union-composite-type.c: New test.
+ 
+ 2026-01-13  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR libfortran/123012
+ 	* gfortran.dg/namelist_101.f90: New test.
+ 
+ 2026-01-13  Jeff Law  <jeffrey.law@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123530
+ 	* gcc.dg/torture/pr123530.c: New test.
+ 
+ 2026-01-13  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123525
+ 	* gcc.dg/vect/pr123525.c: New test.
+ 	* g++.dg/vect/pr123525-2.cc: New test.
+ 
+ 2026-01-13  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/123301
+ 	* gcc.target/riscv/rvv/autovec/pr123301.c: New test.
+ 
+ 2026-01-13  Robin Dapp  <rdapp@oss.qualcomm.com>
+ 
+ 	PR rtl-optimization/123501
+ 	PR rtl-optimization/123444
+ 	* gcc.target/riscv/rvv/autovec/reduc/pr123501.c: New test.
+ 
+ 2026-01-13  Paul Thomas  <pault@gcc.gnu.org>
+ 
+ 	PR fortran/112460
+ 	* gfortran.dg/pdt_81.f03: New test.
+ 
+ 2026-01-13  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	* gcc.dg/store_merging_19.c: xfail.
+ 
+ 2026-01-13  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	PR target/117581
+ 	* gcc.dg/torture/bitint-64.c: Add sync_char_short effective target
+ 	requirement.
+ 	* gcc.dg/torture/bitint-82.c: Likewise.
+ 	* gcc.dg/torture/bitint-84.c: Likewise.
+ 	* gcc.target/riscv/bitint-32-on-rv64.c: New test.
+ 	* gcc.target/riscv/bitint-alignments.c: New test.
+ 	* gcc.target/riscv/bitint-args.c: New test.
+ 	* gcc.target/riscv/bitint-sizes.c: New test.
+ 
+ 2026-01-13  H.J. Lu  <hjl.tools@gmail.com>
+ 
+ 	PR ipa/122458
+ 	* gcc.dg/ipa/pr122458.c: Replace .quad with .dc.a.
+ 
+ 2026-01-13  liuhongt  <hongtao.liu@intel.com>
+ 
+ 	* gcc.target/i386/pr123484.c: New test.
+ 
+ 2026-01-12  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR tree-optimization/122845
+ 	PR tree-optimization/122843
+ 	* gcc.dg/tree-ssa/bitops-12.c: New test.
+ 	* gcc.dg/tree-ssa/bitops-13.c: New test.
+ 	* gcc.dg/store_merging_18.c: xfail store merging.
+ 
+ 2026-01-12  Steven G. Kargl  <kargl@gcc.gnu.org>
+ 
+ 	PR fortran/91960
+ 	* gfortran.dg/pr69962.f90: Adjust testcase to ignore new error message.
+ 	* gfortran.dg/pr91960_1.f90: New test.
+ 	* gfortran.dg/pr91960_2.f90: New test.
+ 
+ 2026-01-12  Patrick Palka  <ppalka@redhat.com>
+ 
+ 	PR c++/123189
+ 	* g++.dg/cpp0x/noexcept92.C: New test.
+ 
+ 2026-01-12  Jason Merrill  <jason@redhat.com>
+ 
+ 	* g++.dg/modules/internal-17_b.C: Add -fno-implicit-constexpr.
+ 
+ 2026-01-12  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/123528
+ 	* gcc.dg/vect/vect-pr12358.c: New testcase.
+ 
+ 2026-01-12  Claudio Bantaloukas  <claudio.bantaloukas@arm.com>
+ 
+ 	* gcc.target/aarch64/pch/aarch64-pch.exp: Fix copyright year.
+ 
+ 2026-01-12  Claudio Bantaloukas  <claudio.bantaloukas@arm.com>
+ 
+ 	PR target/123457
+ 	* gcc.target/aarch64/pch/aarch64-pch.exp: Add new testsuite.
+ 	* gcc.target/aarch64/pch/pch_arm_acle.c: Add new test file.
+ 	* gcc.target/aarch64/pch/pch_arm_acle.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_acle_include_post.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_acle_include_post.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_multiple.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_multiple.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_multiple_include_post.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_multiple_include_post.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_neon.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_neon.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_neon_include_post.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_neon_include_post.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_sme.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_sme.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_sme_include_post.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_sme_include_post.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_sve.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_sve.hs: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_sve_include_post.c: Likewise.
+ 	* gcc.target/aarch64/pch/pch_arm_sve_include_post.hs: Likewise.
+ 
+ 2026-01-12  Martin Jambor  <mjambor@suse.cz>
+ 
+ 	PR ipa/123543
+ 	* gcc.dg/ipa/pr123543.c: New test.
+ 
+ 2026-01-12  Claudio Bantaloukas  <claudio.bantaloukas@arm.com>
+ 
+ 	* gcc.target/aarch64/sme2/acle-asm/cvt_mf8_bf16_x2.c: Added target checks.
+ 	* gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f16_x2.c: Likewise.
+ 	* gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f32_x4.c: Likewise.
+ 	* gcc.target/aarch64/sme2/acle-asm/cvtn_mf8_f32_x4.c: Likewise.
+ 	* gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c: Likewise.
+ 	* gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c: Likewise.
+ 	* gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c: Likewise.
+ 	* gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c: Likewise.
+ 	* gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c: Likewise.
+ 	* gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c: Likewise.
+ 
+ 2026-01-12  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR tree-optimization/122830
+ 	PR tree-optimization/122824
+ 	* gcc.dg/tree-ssa/ssa-fre-112.c: New testcase.
+ 	* g++.dg/warn/Warray-bounds-pr122824.C: Likewise.
+ 
+ 2026-01-12  Richard Biener  <rguenther@suse.de>
+ 
+ 	PR middle-end/123175
+ 	* gcc.dg/torture/pr123175-1.c: New testcase.
+ 	* gcc.dg/torture/pr123175-2.c: Likewise.
+ 
+ 2026-01-12  Nathaniel Shead  <nathanieloshead@gmail.com>
+ 
+ 	PR c++/115163
+ 	* g++.dg/ext/is_convertible7.C: Add new testcases.
+ 	* g++.dg/diagnostic/explicit2.C: New test.
+ 
+ 2026-01-12  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR rtl-optimization/123523
+ 	* gcc.target/i386/pr123523.c: New test.
+ 
+ 2026-01-12  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/123526
+ 	* g++.dg/ext/gnu-inline-inh-ctor1.C: New test.
+ 	* g++.dg/ext/gnu-inline-inh-ctor2.C: New test.
+ 
+ 2026-01-12  Uros Bizjak  <ubizjak@gmail.com>
+ 
+ 	PR rtl-optimization/123121
+ 	* gcc.target/i386/pr123121.c:
+ 
+ 2026-01-12  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	PR target/123415
+ 	* lib/target-supports.exp (check_effective_target_avx512dq):
+ 	Disable with Solaris/x86 as.
+ 	(check_effective_target_avx512bw): Likewise.
+ 
+ 2026-01-12  Surya Kumari Jangala  <jskumari@linux.ibm.com>
+ 
+ 	PR testsuite/123129
+ 	* gcc.dg/rtl/powerpc/test-frame-related.c: Add -mpowerpc64.
+ 
+ 2026-01-12  Andrew Pinski  <andrew.pinski@oss.qualcomm.com>
+ 
+ 	PR testsuite/121752
+ 	* g++.dg/tree-ssa/vector-compare-1.C: Disable for arm targets.
+ 
+ 2026-01-12  Steven G. Kargl  <kargl@gcc.gnu.org>
+ 
+ 	PR fortran/77415
+ 	* gfortran.dg/pr77415_1.f90: New test.
+ 	* gfortran.dg/pr77415_2.f90: New test.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* gcc.dg/lto/attr-weakref-2_0.c: New test.
+ 	* gcc.dg/lto/attr-weakref-2_1.c: New test.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* gcc.dg/lto/toplevel-simple-asm-1_0.c: New test.
+ 	* gcc.dg/lto/toplevel-simple-asm-1_1.c: New test.
+ 	* gcc.dg/lto/toplevel-simple-asm-2_0.c: New test.
+ 	* gcc.dg/lto/toplevel-simple-asm-2_1.c: New test.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* gcc.dg/lto/toplevel-extended-asm-2_0.c: More partitionings.
+ 	* gcc.dg/lto/toplevel-extended-asm-2_1.c: Likewise.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* gcc.dg/lto/toplevel-extended-asm-2_0.c: New test.
+ 	* gcc.dg/lto/toplevel-extended-asm-2_1.c: New test.
+ 	* gcc.dg/lto/toplevel-extended-asm-3_0.c: New test.
+ 	* gcc.dg/lto/toplevel-extended-asm-3_1.c: New test.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* gcc.dg/lto/toplevel-extended-asm-1_0.c: New test.
+ 	* gcc.dg/lto/toplevel-extended-asm-1_1.c: New test.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	* g++.dg/lto/toplevel_asm-0_0.C: New test.
+ 
+ 2026-01-11  Michal Jires  <mjires@suse.cz>
+ 
+ 	PR ipa/122458
+ 	* gcc.dg/ipa/pr122458.c: New test.
+ 
+ 2026-01-11  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR libfortran/123012
+ 	* gfortran.dg/namelist_100.f90: New test.
+ 
  2026-01-10  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
  
  	* g++.target/s390/float16-1.C: New test.
diff -Nrcpad gcc-16-20260111/gcc/testsuite/algol68/execute/pow-real-1.a68 gcc-16-20260118/gcc/testsuite/algol68/execute/pow-real-1.a68
*** gcc-16-20260111/gcc/testsuite/algol68/execute/pow-real-1.a68	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/algol68/execute/pow-real-1.a68	Sun Jan 18 22:32:08 2026
***************
*** 1,7 ****
  # { dg-options "-fstropping=upper" }  #
  BEGIN REAL r0 = 2.0; LONG REAL rr0 = LONG 2.0; LONG LONG REAL rrr0 = LONG LONG 2.0;
!       REAL r1 = r0 ^ 2; REAL r2 = r0 ^ 3.0;
!       LONG REAL rr1 = rr0 ^ LONG 2; LONG REAL rr2 = rr0 ^ LONG 3.0;
!       LONG LONG REAL rrr1 = rrr0 ^ LONG LONG 2; LONG LONG REAL rrr2 = rrr0 ^ LONG LONG 3.0;
        SKIP
  END
--- 1,7 ----
  # { dg-options "-fstropping=upper" }  #
  BEGIN REAL r0 = 2.0; LONG REAL rr0 = LONG 2.0; LONG LONG REAL rrr0 = LONG LONG 2.0;
!       REAL r1 = r0 ** 2; REAL r2 = r0 ** 3.0;
!       LONG REAL rr1 = rr0 ** LONG 2; LONG REAL rr2 = rr0 ** LONG 3.0;
!       LONG LONG REAL rrr1 = rrr0 ** LONG LONG 2; LONG LONG REAL rrr2 = rrr0 ** LONG LONG 3.0;
        SKIP
  END
diff -Nrcpad gcc-16-20260111/gcc/testsuite/c-c++-common/pr123437.c gcc-16-20260118/gcc/testsuite/c-c++-common/pr123437.c
*** gcc-16-20260111/gcc/testsuite/c-c++-common/pr123437.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/c-c++-common/pr123437.c	Sun Jan 18 22:32:08 2026
***************
*** 0 ****
--- 1,12 ----
+ /* PR c/123437 */
+ /* { dg-do compile } */
+ 
+ enum E { F };
+ typedef enum E V __attribute__ ((vector_size (16)));
+ V x, y, z;
+ 
+ void
+ foo ()
+ {
+   z = x / y;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.cob gcc-16-20260118/gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.cob
*** gcc-16-20260111/gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.cob	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/cobol.dg/group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.cob	Sun Jan 18 22:32:08 2026
***************
*** 1,5 ****
         *> { dg-do run }
!        *> { dg-options "-finternal-ebcdic" }
         *> { dg-output-file "group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.out" }
          IDENTIFICATION      DIVISION.
          PROGRAM-ID.         prog.
--- 1,5 ----
         *> { dg-do run }
!        *> { dg-options "-fexec-charset=cp1140" }
         *> { dg-output-file "group2/CHAR_and_ORD_with_COLLATING_sequence_-_EBCDIC.out" }
          IDENTIFICATION      DIVISION.
          PROGRAM-ID.         prog.
diff -Nrcpad gcc-16-20260111/gcc/testsuite/cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.cob gcc-16-20260118/gcc/testsuite/cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.cob
*** gcc-16-20260111/gcc/testsuite/cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.cob	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/cobol.dg/group2/Multi-target_MOVE_with_subscript_re-evaluation.cob	Sun Jan 18 22:32:08 2026
***************
*** 6,15 ****
          DATA DIVISION.
          WORKING-STORAGE SECTION.
          01 FILLER.
!           02 ADATA VALUE "654321".
            02 A REDEFINES ADATA PIC 9 OCCURS 6 TIMES.
            02 B PIC 9.
!           02 CDATA VALUE "999999".
            02 C REDEFINES CDATA PIC 9 OCCURS 6 TIMES.
          01 TEMP PIC 9.
          PROCEDURE DIVISION.
--- 6,15 ----
          DATA DIVISION.
          WORKING-STORAGE SECTION.
          01 FILLER.
!           02 ADATA PIC X(6) VALUE "654321".
            02 A REDEFINES ADATA PIC 9 OCCURS 6 TIMES.
            02 B PIC 9.
!           02 CDATA PIC X(6) VALUE "999999".
            02 C REDEFINES CDATA PIC 9 OCCURS 6 TIMES.
          01 TEMP PIC 9.
          PROCEDURE DIVISION.
diff -Nrcpad gcc-16-20260111/gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out gcc-16-20260118/gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out
*** gcc-16-20260111/gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/cobol.dg/group2/floating-point_SUBTRACT_FORMAT_2.out	Sun Jan 18 22:32:08 2026
***************
*** 1,8 ****
! 555.10 555.10 555.10 555.10 555.0999756 555.100000000000023 555.1000000000000000000000000000000197
! 555.10 555.10 555.10 555.10 555.0999756 555.100000000000023 555.1000000000000000000000000000000197
! 555.10 555.10 555.10 555.10 555.0999756 555.100000000000023 555.1000000000000000000000000000000197
! 555.10 555.10 555.10 555.10 555.0999756 555.100000000000023 555.1000000000000000000000000000000197
! 555.10 555.10 555.10 555.10 555.0999756 555.100000000000023 555.1000000000000000000000000000000197
! 555.10 555.10 555.10 555.10 555.0999756 555.100000000000023 555.1000000000000000000000000000000197
! 555.10 555.10 555.10 555.10 555.0999756 555.100000000000023 555.1000000000000000000000000000000197
! 
--- 1,7 ----
! 555.10 555.10 555.10 555.10 555.0999756 555.099999999999909 555.0999999999999999999999999999999211
! 555.10 555.10 555.10 555.10 555.0999756 555.099999999999909 555.0999999999999999999999999999999211
! 555.10 555.10 555.10 555.09 555.0999756 555.099999999999909 555.0999999999999999999999999999999211
! 555.10 555.10 555.09 555.09 555.0999756 555.099999999999909 555.0999999999999999999999999999999211
! 555.10 555.09 555.09 555.10 555.0999756 555.099999999999909 555.0999999999999999999999999999999211
! 555.09 555.09 555.10 555.10 555.0999756 555.099999999999909 555.1000030517578124999999999999999606
! 555.09 555.10 555.10 555.10 555.0999756 555.100003051757767 555.0999999999999971578290569595992171
\ No newline at end of file
diff -Nrcpad gcc-16-20260111/gcc/testsuite/cobol.dg/group2/floating-point_literals.out gcc-16-20260118/gcc/testsuite/cobol.dg/group2/floating-point_literals.out
*** gcc-16-20260111/gcc/testsuite/cobol.dg/group2/floating-point_literals.out	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/cobol.dg/group2/floating-point_literals.out	Sun Jan 18 22:32:08 2026
***************
*** 1,9 ****
  -555
  -555.55
! -5.5555E+208
  555
  555.55
! 5.5555E+208
  333.3300 333.3300 333.3300 333.3300 3.333300083E+22 3.33329999999999994E+102 3.333300000000000000000000000000000168E+202
! 555.5500 555.5500 555.5500 555.5500 5.555499988E+22 5.55549999999999973E+102 5.555500000000000000000000000000000029E+202
! 
--- 1,8 ----
  -555
  -555.55
! -555.55e206
  555
  555.55
! 555.55e206
  333.3300 333.3300 333.3300 333.3300 3.333300083E+22 3.33329999999999994E+102 3.333300000000000000000000000000000168E+202
! 555.5500 555.5500 555.5500 555.5500 5.555499988E+22 5.55549999999999973E+102 5.555500000000000000000000000000000029E+202
\ No newline at end of file
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/DRs/dr2581-1.C gcc-16-20260118/gcc/testsuite/g++.dg/DRs/dr2581-1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/DRs/dr2581-1.C	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/DRs/dr2581-1.C	Sun Jan 18 22:32:08 2026
***************
*** 1,6 ****
  // DR 2581 - Undefined behavior for predefined macros
  // { dg-do preprocess }
! // { dg-additional-options "-fcontracts" { target c++26 } }
  // { dg-additional-options "-fmodules -fcoroutines" { target c++20 } }
  
  #undef defined				// { dg-error "'defined' cannot be used as a macro name" }
--- 1,6 ----
  // DR 2581 - Undefined behavior for predefined macros
  // { dg-do preprocess }
! // { dg-additional-options "-fcontracts -freflection" { target c++26 } }
  // { dg-additional-options "-fmodules -fcoroutines" { target c++20 } }
  
  #undef defined				// { dg-error "'defined' cannot be used as a macro name" }
***************
*** 63,69 ****
  #undef __cpp_impl_coroutine		// { dg-warning "undefining '__cpp_impl_coroutine'" "" { target c++20 } }
  #undef __cpp_impl_destroying_delete	// { dg-warning "undefining '__cpp_impl_destroying_delete'" "" { target c++20 } }
  #undef __cpp_impl_three_way_comparison	// { dg-warning "undefining '__cpp_impl_three_way_comparison'" "" { target c++20 } }
! #undef __cpp_impl_reflection
  #undef __cpp_implicit_move		// { dg-warning "undefining '__cpp_implicit_move'" "" { target c++23 } }
  #undef __cpp_inheriting_constructors	// { dg-warning "undefining '__cpp_inheriting_constructors'" "" { target c++20 } }
  #undef __cpp_init_captures		// { dg-warning "undefining '__cpp_init_captures'" "" { target c++20 } }
--- 63,69 ----
  #undef __cpp_impl_coroutine		// { dg-warning "undefining '__cpp_impl_coroutine'" "" { target c++20 } }
  #undef __cpp_impl_destroying_delete	// { dg-warning "undefining '__cpp_impl_destroying_delete'" "" { target c++20 } }
  #undef __cpp_impl_three_way_comparison	// { dg-warning "undefining '__cpp_impl_three_way_comparison'" "" { target c++20 } }
! #undef __cpp_impl_reflection		// { dg-warning "undefining '__cpp_impl_reflection'" "" { target c++26 } }
  #undef __cpp_implicit_move		// { dg-warning "undefining '__cpp_implicit_move'" "" { target c++23 } }
  #undef __cpp_inheriting_constructors	// { dg-warning "undefining '__cpp_inheriting_constructors'" "" { target c++20 } }
  #undef __cpp_init_captures		// { dg-warning "undefining '__cpp_init_captures'" "" { target c++20 } }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/DRs/dr2581-2.C gcc-16-20260118/gcc/testsuite/g++.dg/DRs/dr2581-2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/DRs/dr2581-2.C	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/DRs/dr2581-2.C	Sun Jan 18 22:32:08 2026
***************
*** 1,6 ****
  // DR 2581 - Undefined behavior for predefined macros
  // { dg-do preprocess }
! // { dg-additional-options "-fcontracts" { target c++26 } }
  // { dg-additional-options "-fmodules -fcoroutines" { target c++20 } }
  
  #define defined defined				// { dg-error "'defined' cannot be used as a macro name" }
--- 1,6 ----
  // DR 2581 - Undefined behavior for predefined macros
  // { dg-do preprocess }
! // { dg-additional-options "-fcontracts -freflection" { target c++26 } }
  // { dg-additional-options "-fmodules -fcoroutines" { target c++20 } }
  
  #define defined defined				// { dg-error "'defined' cannot be used as a macro name" }
***************
*** 64,70 ****
  #define __cpp_impl_coroutine 201902L		// { dg-error "'__cpp_impl_coroutine' redefined" "" { target c++20 } }
  #define __cpp_impl_destroying_delete 201806L	// { dg-error "'__cpp_impl_destroying_delete' redefined" "" { target c++20 } }
  #define __cpp_impl_three_way_comparison 201907L	// { dg-error "'__cpp_impl_three_way_comparison' redefined" "" { target c++20 } }
! #define __cpp_impl_reflection 202506L
  #define __cpp_implicit_move 202207L		// { dg-error "'__cpp_implicit_move' redefined" "" { target c++23 } }
  #define __cpp_inheriting_constructors 201511L	// { dg-error "'__cpp_inheriting_constructors' redefined" "" { target c++20 } }
  #define __cpp_init_captures 201803L		// { dg-error "'__cpp_init_captures' redefined" "" { target c++14 } }
--- 64,70 ----
  #define __cpp_impl_coroutine 201902L		// { dg-error "'__cpp_impl_coroutine' redefined" "" { target c++20 } }
  #define __cpp_impl_destroying_delete 201806L	// { dg-error "'__cpp_impl_destroying_delete' redefined" "" { target c++20 } }
  #define __cpp_impl_three_way_comparison 201907L	// { dg-error "'__cpp_impl_three_way_comparison' redefined" "" { target c++20 } }
! #define __cpp_impl_reflection 202506L		// { dg-error "'__cpp_impl_reflection' redefined" "" { target c++26 } }
  #define __cpp_implicit_move 202207L		// { dg-error "'__cpp_implicit_move' redefined" "" { target c++23 } }
  #define __cpp_inheriting_constructors 201511L	// { dg-error "'__cpp_inheriting_constructors' redefined" "" { target c++20 } }
  #define __cpp_init_captures 201803L		// { dg-error "'__cpp_init_captures' redefined" "" { target c++14 } }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C gcc-16-20260118/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/cpp0x/inline-ns2.C	Sun Jan 18 22:32:09 2026
***************
*** 2,18 ****
  
  namespace Q {
    inline namespace V1 {
!     extern int i;		// { dg-message "" }
!     extern int j;		// { dg-message "" }
!     void f();			// { dg-message "" }
!     void g();			// { dg-message "" }
    }
    inline namespace V2 {
!     extern int j;		// { dg-message "" }
!     void g();			// { dg-message "" }
    }
!   extern int i;			// { dg-message "" }
!   void f();			// { dg-message "" }
    void h();
  }
  namespace R {
--- 2,18 ----
  
  namespace Q {
    inline namespace V1 {
!     extern int i;		// { dg-message "candidate" }
!     extern int j;		// { dg-message "candidate" }
!     void f();			// { dg-message "candidate" }
!     void g();			// { dg-message "candidate" }
    }
    inline namespace V2 {
!     extern int j;		// { dg-message "candidate" }
!     void g();			// { dg-message "candidate" }
    }
!   extern int i;			// { dg-message "candidate" }
!   void f();			// { dg-message "candidate" }
    void h();
  }
  namespace R {
*************** int Q::i = 1;			// { dg-error "ambiguous
*** 22,25 ****
  int Q::j = 1;			// { dg-error "ambiguous" }
  void Q::f() { }			// { dg-error "ambiguous" }
  void Q::g() { }			// { dg-error "ambiguous" }
! void R::h() { }			// { dg-error "" }
--- 22,25 ----
  int Q::j = 1;			// { dg-error "ambiguous" }
  void Q::f() { }			// { dg-error "ambiguous" }
  void Q::g() { }			// { dg-error "ambiguous" }
! void R::h() { }			// { dg-error "should have been declared inside 'R'" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/cpp0x/noexcept92.C gcc-16-20260118/gcc/testsuite/g++.dg/cpp0x/noexcept92.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/cpp0x/noexcept92.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/cpp0x/noexcept92.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ // PR c++/123189
+ // { dg-do compile { target c++11 } }
+ 
+ template<class T> void f() noexcept(noexcept(T()));
+ 
+ template<class T>
+ struct A {
+   friend void f<T>() noexcept(noexcept(T()));
+ };
+ 
+ template struct A<int>;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda11.C gcc-16-20260118/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda11.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda11.C	Sun Jan 11 22:32:08 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/cpp23/explicit-obj-lambda11.C	Sun Jan 18 22:32:09 2026
*************** void test2()
*** 40,47 ****
  
    int (*fp0)(decltype(f)&) = &decltype(f)::operator();
    int (*fp1)(int&) = &decltype(f)::operator(); // { dg-error {no matches converting function} }
  }
  
  // { dg-error "a lambda with captures may not have an explicit object parameter of an unrelated type" {depends on PR112874} { xfail *-*-* } t2_f }
  // { dg-note "candidate is" "" { target *-*-* } t2_f }
- 
--- 40,47 ----
  
    int (*fp0)(decltype(f)&) = &decltype(f)::operator();
    int (*fp1)(int&) = &decltype(f)::operator(); // { dg-error {no matches converting function} }
+   // { dg-note "there is 1 candidate" "" { target *-*-* } .-1 }
  }
  
  // { dg-error "a lambda with captures may not have an explicit object parameter of an unrelated type" {depends on PR112874} { xfail *-*-* } t2_f }
  // { dg-note "candidate is" "" { target *-*-* } t2_f }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-1.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, int j, void *ptr, int k); // { dg-line close_decl }
+   void test (int i, int j, int k);            // { dg-line other_decl }
+ };
+ 
+ // Wrong "const"-ness of a param, for one of the overloads (param 3).
+ void foo::test (int i, int j, const void *ptr, int k) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "8: candidate 1: " "candidate 1" { target *-*-* } other_decl }
+ // { dg-message "8: candidate 2: " "candidate 2" { target *-*-* } close_decl }
+ // { dg-message "34: parameter 3 of candidate has type 'void\\*'" "param of decl" { target *-*-* } close_decl }
+ // { dg-message "43: \\.\\.\\.which does not match type 'const void\\*'" "param of defn" { target *-*-* } defn }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-2.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, int j, int k); // { dg-line decl }
+ };
+ 
+ // Wrong "const"-ness of this:
+ void foo::test (int i, int j, int k) const // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "8: candidate is: " "candidate is" { target *-*-* } decl }
+ // { dg-message "8: parameter 'this' of candidate has type 'foo\\*'" "this of decl" { target *-*-* } decl }
+ // { dg-message "6: \\.\\.\\.which does not match type 'const foo\\*'" "this of defn" { target *-*-* } defn }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-3.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, int j, int k) const; // { dg-line decl }
+ };
+ 
+ // Wrong "const"-ness of "this":
+ 
+ void foo::test (int i, int j, int k) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "8: candidate is: " "candidate is" { target *-*-* } decl }
+ // { dg-message "8: parameter 'this' of candidate has type 'const foo\\*'" "this of decl" { target *-*-* } decl }
+ // { dg-message "6: \\.\\.\\.which does not match type 'foo\\*'" "this of defn" { target *-*-* } defn }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-4.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,38 ----
+ // { dg-additional-options "-fdiagnostics-show-caret" }
+ 
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, int j, void *ptr, int k); // { dg-line decl }
+ };
+ 
+ // Wrong "const"-ness of a param (param 3).
+ void foo::test (int i, int j, const void *ptr, int k) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ /* { dg-begin-multiline-output "" }
+  void foo::test (int i, int j, const void *ptr, int k)
+       ^~~
+    { dg-end-multiline-output "" } */
+ // { dg-message "8: candidate is: " "candidate is" { target *-*-* } decl }
+ /* { dg-begin-multiline-output "" }
+    void test (int i, int j, void *ptr, int k);
+         ^~~~
+    { dg-end-multiline-output "" } */
+ // { dg-message "34: parameter 3 of candidate has type 'void\\*'" "param of decl" { target *-*-* } decl }
+ /* { dg-begin-multiline-output "" }
+    void test (int i, int j, void *ptr, int k);
+                             ~~~~~~^~~
+    { dg-end-multiline-output "" } */
+ // { dg-message "43: \\.\\.\\.which does not match type 'const void\\*'" "param of defn" { target *-*-* } defn }
+ /* { dg-begin-multiline-output "" }
+  void foo::test (int i, int j, const void *ptr, int k)
+                                ~~~~~~~~~~~~^~~
+    { dg-end-multiline-output "" } */
+ 
+ /* { dg-begin-multiline-output "" }
+  class foo
+        ^~~
+    { dg-end-multiline-output "" } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-5.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   static void test (int i, int j, void *ptr, int k); // { dg-line decl }
+ };
+ 
+ // Wrong "const"-ness of a param, for static member fn (param 3).
+ void foo::test (int i, int j, const void *ptr, int k) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "15: candidate is: " "candidate is" { target *-*-* } decl }
+ // { dg-message "41: parameter 3 of candidate has type 'void\\*'" "param of decl" { target *-*-* } decl }
+ // { dg-message "43: \\.\\.\\.which does not match type 'const void\\*'" "param of defn" { target *-*-* } defn }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-6.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ class bar;
+ 
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, foo *j, int k); // { dg-line decl }
+ };
+ 
+ // Missing '*' on a param (param 2).
+ void foo::test (int i, foo j, int k) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "8: candidate is: " "candidate is" { target *-*-* } decl }
+ // { dg-message "26: parameter 2 of candidate has type 'foo\\*'" "param of decl" { target *-*-* } decl }
+ // { dg-message "28: \\.\\.\\.which does not match type 'foo'" "param of defn" { target *-*-* } defn }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-7.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, int j, int k, ...);            // { dg-line decl }
+ };
+ 
+ // Variadic vs non-variadic
+ 
+ void foo::test (int i, int j, int k) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "8: candidate is: " "candidate is" { target *-*-* } decl }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-7b.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-7b.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-7b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-7b.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, int j, const char *k, ...);            // { dg-line decl }
+ };
+ 
+ // Variadic vs non-variadic *and* a mismatching param
+ 
+ void foo::test (int i, int j, int k) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "8: candidate is: " "candidate is" { target *-*-* } decl }
+ 
+ // The candidate is too different from the decl for a "close match" hint:
+ // { dg-bogus "parameter 3 of candidate has type" "param mismatch" { target *-*-* } decl }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-8.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, int j, int k);            // { dg-line decl }
+ };
+ 
+ // Variadic vs non-variadic
+ 
+ void foo::test (int i, int j, int k, ...) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "8: candidate is: " "candidate is" { target *-*-* } decl }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-9.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/bad-fndef-9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/bad-fndef-9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ class foo // { dg-message "'class foo' defined here" }
+ {
+ public:
+   void test (int i, int j, int k);            // { dg-line decl }
+ };
+ 
+ // Variadic vs non-variadic
+ 
+ void foo::test (int i, int j, ...) // { dg-line defn }
+ {
+ }
+ 
+ // { dg-error "6: no declaration matches" "error" { target *-*-* } defn }
+ // { dg-message "8: candidate is: " "candidate is" { target *-*-* } decl }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/explicit2.C gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/explicit2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/diagnostic/explicit2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/diagnostic/explicit2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // PR c++/115163
+ // { dg-do compile { target c++11 } }
+ 
+ struct A {
+   explicit A(int);  // { dg-message "explicit conversion function was not considered" }
+ };
+ struct B {
+   explicit operator int() const;  // { dg-message "explicit conversion function was not considered" }
+ };
+ 
+ int main() {
+   A a = 42;  // { dg-error "conversion from .int. to non-scalar type .A." }
+   int x = B{};  // { dg-error "cannot convert .B. to .int. in initialization" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor1.C gcc-16-20260118/gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,22 ----
+ // PR c++/123526
+ // { dg-do link { target c++26 } }
+ // { dg-options "-O0" }
+ // { dg-additional-sources "gnu-inline-inh-ctor2.C" }
+ 
+ struct A {
+   [[__gnu__::__gnu_inline__]]
+   constexpr explicit A (int) {}
+   [[__gnu__::__gnu_inline__]]
+   constexpr virtual ~A () {}
+ };
+ struct B : A {
+   using A::A;
+ };
+ constexpr B b (42);
+ int c = 42;
+ B d (c);
+ 
+ int
+ main ()
+ {
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor2.C gcc-16-20260118/gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/ext/gnu-inline-inh-ctor2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // PR c++/123526
+ // { dg-do compile }
+ 
+ struct A {
+   explicit A (int);
+   virtual ~A ();
+ };
+ 
+ A::A (int)
+ {
+ }
+ 
+ A::~A ()
+ {
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/ext/goto2.C gcc-16-20260118/gcc/testsuite/g++.dg/ext/goto2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/ext/goto2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/ext/goto2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // PR c++/123551
+ // { dg-do compile { target c++11 } }
+ // { dg-options "" }
+ 
+ void
+ foo ()
+ {
+   [] () {
+     void *a = &&b;
+     goto *a;
+    b:;
+   };
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/ext/is_convertible7.C gcc-16-20260118/gcc/testsuite/g++.dg/ext/is_convertible7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/ext/is_convertible7.C	Sun Jan 11 22:32:09 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/ext/is_convertible7.C	Sun Jan 18 22:32:09 2026
*************** struct B {
*** 27,29 ****
--- 27,41 ----
  };
  static_assert(is_nothrow_convertible<int, B>::value, "");  // { dg-error "assert" }
  // { dg-message "'int' is not nothrow convertible from 'B', because" "" { target *-*-* } .-1 }
+ 
+ struct C {
+   explicit C(int);  // { dg-message "not considered" }
+ };
+ static_assert(is_convertible<int, C>::value, "");  // { dg-error "assert" }
+ // { dg-message "could not convert 'int' to 'C'" "" { target *-*-* } .-1 }
+ 
+ struct D {
+   explicit operator int() const;  // { dg-message "not considered" }
+ };
+ static_assert(is_convertible<D, int>::value, "");  // { dg-error "assert" }
+ // { dg-message "could not convert 'D' to 'int'" "" { target *-*-* } .-1 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/guality/guality.exp gcc-16-20260118/gcc/testsuite/g++.dg/guality/guality.exp
*** gcc-16-20260111/gcc/testsuite/g++.dg/guality/guality.exp	Sun Jan 11 22:32:09 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/guality/guality.exp	Sun Jan 18 22:32:09 2026
*************** dg-init
*** 40,53 ****
  torture-init
  
  global GDB
  if ![info exists ::env(GUALITY_GDB_NAME)] {
      if [info exists GDB] {
  	set guality_gdb_name "$GDB"
!     } elseif { [info exists rootme] && [file exists $rootme/../gdb/gdb] } {
  	# If we're doing a combined build, and gdb is available, use it.
  	set guality_gdb_name "$rootme/../gdb/gdb"
      } else {
! 	set guality_gdb_name "[transform gdb]"
      }
      setenv GUALITY_GDB_NAME "$guality_gdb_name"
  }
--- 40,56 ----
  torture-init
  
  global GDB
+ global host_triplet target_triplet
  if ![info exists ::env(GUALITY_GDB_NAME)] {
      if [info exists GDB] {
  	set guality_gdb_name "$GDB"
!     } elseif { [string equal $host_triplet $target_triplet]
! 	       && [info exists rootme]
! 	       && [file exists $rootme/../gdb/gdb] } {
  	# If we're doing a combined build, and gdb is available, use it.
  	set guality_gdb_name "$rootme/../gdb/gdb"
      } else {
! 	set guality_gdb_name "gdb"
      }
      setenv GUALITY_GDB_NAME "$guality_gdb_name"
  }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/lookup/decl1.C gcc-16-20260118/gcc/testsuite/g++.dg/lookup/decl1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/lookup/decl1.C	Sun Jan 11 22:32:09 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/lookup/decl1.C	Sun Jan 18 22:32:09 2026
*************** C2<X>::operator C1<Y>()
*** 20,29 ****
  }
  
  struct A { // { dg-message "defined here" }
!   operator int ();			// { dg-message "operator" }
!   operator float ();			// { dg-message "operator" }
!   operator float () const;		// { dg-message "operator" }
!   template <typename T> operator T * (); // { dg-message "operator" }
  };
  
  A::operator short () { // { dg-error "no declaration matches" }
--- 20,29 ----
  }
  
  struct A { // { dg-message "defined here" }
!   operator int ();			// { dg-message "operator int" }
!   operator float ();			// { dg-message "operator float" }
!   operator float () const;		// { dg-message "operator float" }
!   template <typename T> operator T * (); // { dg-message "operator T" }
  };
  
  A::operator short () { // { dg-error "no declaration matches" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/lookup/using17.C gcc-16-20260118/gcc/testsuite/g++.dg/lookup/using17.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/lookup/using17.C	Sun Jan 11 22:32:09 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/lookup/using17.C	Sun Jan 18 22:32:09 2026
***************
*** 3,13 ****
  // { dg-do compile }
  
  namespace M {
!   struct S {}; // { dg-message "candidates are: .struct M::S." "candidate 1" }
  }
  
  int S;
! struct S {}; // { dg-message ".struct S." "candidate 2" }
  
  using namespace M;
  
--- 3,13 ----
  // { dg-do compile }
  
  namespace M {
!   struct S {}; // { dg-message "candidate 1: 'struct M::S'" }
  }
  
  int S;
! struct S {}; // { dg-message "candidate 2: 'struct S'" }
  
  using namespace M;
  
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/modules/block-decl-4_a.C gcc-16-20260118/gcc/testsuite/g++.dg/modules/block-decl-4_a.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/modules/block-decl-4_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/modules/block-decl-4_a.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,70 ----
+ // PR c++/123627
+ // { dg-additional-options "-fmodules -fdump-lang-module-alias" }
+ // { dg-module-cmi m:part }
+ 
+ export module m:part;
+ 
+ auto foo() {
+   struct S {} s;
+   return s;
+ }
+ 
+ inline auto inline_foo() {
+   struct S {} s;
+   return s;
+ }
+ 
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s attached merge key type_decl:'::foo::S'} module } }
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s local type merge key type_decl:'::inline_foo::S'} module } }
+ 
+ auto bar() {
+   auto lambda = []{};
+   return lambda;
+ }
+ 
+ inline auto inline_bar() {
+   auto lambda = []{};
+   return lambda;
+ }
+ 
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s attached merge key type_decl:'::bar::._anon_[0-9]*'} module } }
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s local type merge key type_decl:'::inline_bar::._anon_[0-9]*'} module } }
+ 
+ auto qux() {
+   struct XN {
+     auto inner() {
+       struct YNN {} y;
+       return y;
+     }
+     inline auto inline_inner() {
+       struct YNI {} y;
+       return y;
+     }
+   } x;
+   return x;
+ }
+ 
+ inline auto inline_qux() {
+   struct XI {
+     auto inner() {
+       struct YIN {} y;
+       return y;
+     }
+     inline auto inline_inner() {
+       struct YII {} y;
+       return y;
+     }
+   } x;
+   return x;
+ }
+ 
+ // If the innermost function has no definition ('N'), merge via atached key decls;
+ // even if an outer function does have an inline body, we can't see this definition.
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s attached merge key type_decl:'::qux::XN'} module } }
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s attached merge key type_decl:'::qux::XN::inner::YNN'} module } }
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s attached merge key type_decl:'::inline_qux::XI::inner::YIN'} module } }
+ 
+ // But if the innermost function has an emitted definition then we can use it.
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s local type merge key type_decl:'::qux::XN::inline_inner::YNI'} module } }
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s local type merge key type_decl:'::inline_qux::XI'} module } }
+ // { dg-final { scan-lang-dump {Wrote:-[0-9]*'s local type merge key type_decl:'::inline_qux::XI::inline_inner::YII'} module } }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/modules/block-decl-4_b.C gcc-16-20260118/gcc/testsuite/g++.dg/modules/block-decl-4_b.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/modules/block-decl-4_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/modules/block-decl-4_b.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ // PR c++/123627
+ // { dg-additional-options "-fmodules" }
+ // { dg-module-cmi m }
+ 
+ export module m;
+ export import :part;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/modules/block-decl-4_c.C gcc-16-20260118/gcc/testsuite/g++.dg/modules/block-decl-4_c.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/modules/block-decl-4_c.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/modules/block-decl-4_c.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // PR c++/123627
+ // { dg-additional-options "-fmodules -fno-module-lazy -fdump-lang-module-alias" }
+ 
+ module m;
+ import :part;
+ 
+ // { dg-final { scan-lang-dump-times {Read:-[0-9]*'s attached merge key \(matched\) type_decl} 5 module } }
+ // { dg-final { scan-lang-dump-times {Read:-[0-9]*'s local type merge key \(matched\) type_decl} 5 module } }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/modules/coro-1_a.C gcc-16-20260118/gcc/testsuite/g++.dg/modules/coro-1_a.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/modules/coro-1_a.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/modules/coro-1_a.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,34 ----
+ // { dg-do compile { target c++20 } }
+ // { dg-additional-options "-fmodules -fdump-lang-module" }
+ // { dg-module-cmi M }
+ 
+ module;
+ #include <coroutine>
+ export module M;
+ 
+ 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() {}
+ };
+ export simple_coroutine coroutine() {
+   co_return;
+ }
+ export inline simple_coroutine inline_coroutine() {
+   co_return;
+ }
+ export template <typename T> simple_coroutine template_coroutine() {
+   co_return;
+ }
+ 
+ // The actor and destroy functions should have definitions streamed only for inline coroutines
+ // { dg-final { scan-lang-dump-not {Writing definition function_decl:'::coroutine.actor'} module } }
+ // { dg-final { scan-lang-dump-not {Writing definition function_decl:'::coroutine.destroy'} module } }
+ // { dg-final { scan-lang-dump {Writing definition function_decl:'::inline_coroutine.actor'} module } }
+ // { dg-final { scan-lang-dump {Writing definition function_decl:'::inline_coroutine.destroy'} module } }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/modules/coro-1_b.C gcc-16-20260118/gcc/testsuite/g++.dg/modules/coro-1_b.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/modules/coro-1_b.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/modules/coro-1_b.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-module-do run { target c++20 } }
+ // { dg-additional-options "-fmodules" }
+ 
+ #include <coroutine>
+ import M;
+ 
+ int main() {
+   auto a = coroutine();
+   a.resume();
+   a.destroy();
+ 
+   auto b = inline_coroutine();
+   b.resume();
+   b.destroy();
+ 
+   auto c = template_coroutine<int>();
+   c.resume();
+   c.destroy();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/modules/internal-17_b.C gcc-16-20260118/gcc/testsuite/g++.dg/modules/internal-17_b.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/modules/internal-17_b.C	Sun Jan 11 22:32:09 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/modules/internal-17_b.C	Sun Jan 18 22:32:09 2026
***************
*** 1,5 ****
  // PR c++/121576
! // { dg-additional-options "-fmodules -Wno-error=expose-global-module-tu-local -Wtemplate-names-tu-local -Wno-global-module" }
  // { dg-module-cmi !X }
  
  module;
--- 1,5 ----
  // PR c++/121576
! // { dg-additional-options "-fmodules -Wno-error=expose-global-module-tu-local -Wtemplate-names-tu-local -Wno-global-module -fno-implicit-constexpr" }
  // { dg-module-cmi !X }
  
  module;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/parse/bitfield10.C gcc-16-20260118/gcc/testsuite/g++.dg/parse/bitfield10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/parse/bitfield10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/parse/bitfield10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,9 ----
+ /* PR c++/122391 */
+ /* { dg-do "compile" } */
+ 
+ extern "C" {
+   template <int> class b; /* { dg-error "with C linkage" } */
+   struct {
+     typedef b: /* { dg-error "at end of input" } */
+ 
+ /* { dg-excess-errors "" } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/parse/non-dependent2.C gcc-16-20260118/gcc/testsuite/g++.dg/parse/non-dependent2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/parse/non-dependent2.C	Sun Jan 11 22:32:09 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/parse/non-dependent2.C	Sun Jan 18 22:32:09 2026
*************** struct Foo {
*** 15,21 ****
  struct Baz 
  {
    int j;
!   int k; // { dg-message "candidates" }
    
  };
  
--- 15,21 ----
  struct Baz 
  {
    int j;
!   int k; // { dg-message "candidate" }
    
  };
  
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/access_context1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/access_context1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/access_context1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/access_context1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,175 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::access_context.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct S {};
+ 
+ constexpr access_context a = access_context::unprivileged ();
+ static_assert (a.scope () == ^^:: && a.designating_class () == null_reflection);
+ constexpr access_context b = access_context::unchecked ();
+ static_assert (b.scope () == null_reflection && b.designating_class () == null_reflection);
+ constexpr access_context c = access_context::current ();
+ static_assert (c.scope () == ^^:: && c.designating_class () == null_reflection);
+ constexpr access_context d = access_context::unprivileged ().via (^^S);
+ static_assert (d.scope () == ^^:: && d.designating_class () == ^^S);
+ constexpr access_context e = access_context::unchecked ().via (^^const S);
+ static_assert (e.scope () == null_reflection && e.designating_class () == ^^const S);
+ constexpr access_context f = access_context::current ().via (^^volatile S);
+ static_assert (f.scope () == ^^:: && f.designating_class () == ^^volatile S);
+ 
+ consteval info
+ foo (info x = access_context::current ().scope ())
+ {
+   static_assert (access_context::current ().scope () == ^^foo);
+   return x;
+ }
+ 
+ static_assert (foo (^^std) == ^^std);
+ static_assert (foo () == ^^::);
+ 
+ namespace N
+ {
+   struct S {};
+   constexpr access_context a = access_context::current ().via (^^::S).via (^^S);
+   static_assert (a.scope () == ^^N && a.designating_class () == ^^S);
+   static_assert (access_context::unprivileged ().scope () == ^^::);
+   static_assert (access_context::unchecked ().scope () == null_reflection);
+   namespace M
+   {
+     constexpr access_context a = access_context::current ().via (^^S).via (^^::S);
+     static_assert (a.scope () == ^^M && a.designating_class () == ^^::S);
+     static_assert (foo () == ^^M);
+     consteval {
+       static_assert (access_context::current ().scope () == ^^M);
+       consteval {
+         static_assert (access_context::current ().scope () == ^^M);
+       }
+     }
+   }
+ }
+ 
+ struct T
+ {
+   static_assert (access_context::unprivileged ().scope () == ^^::);
+   static_assert (access_context::unchecked ().scope () == null_reflection);
+   static_assert (access_context::current ().scope () == ^^T);
+   static_assert (access_context::unprivileged ().designating_class () == null_reflection);
+   static_assert (access_context::unchecked ().designating_class () == null_reflection);
+   static_assert (access_context::current ().designating_class () == null_reflection);
+   static_assert (foo () == ^^T);
+   info t = access_context::current ().scope ();
+ };
+ 
+ struct U
+ {
+   consteval U () {}
+   info u = access_context::current ().scope ();
+ };
+ 
+ struct V : U
+ {
+   using U::U;
+   info v = access_context::current ().scope ();
+   consteval {
+     static_assert (access_context::current ().scope () == ^^V);
+     consteval {
+       static_assert (access_context::current ().scope () == ^^V);
+     }
+   }
+ };
+ 
+ void
+ bar ()
+ {
+   static constexpr access_context a = access_context::current ();
+   static_assert (a.scope () == ^^bar && a.designating_class () == null_reflection);
+   static_assert (foo (^^foo) == ^^foo);
+   static_assert (foo () == ^^bar);
+   static_assert (T {}.t == ^^bar);
+   consteval {
+     static_assert (access_context::current ().scope () == ^^bar);
+     consteval {
+       static_assert (access_context::current ().scope () == ^^bar);
+     }
+   }
+   auto l = [] () {
+     int v = 0;
+     static_assert (access_context::current ().scope () == parent_of (^^v));
+     static_assert (parent_of (parent_of (access_context::current ().scope ())) == ^^bar);
+   };
+   auto l2 = [] () -> int (&) [access_context::current ().scope () == ^^bar ? 2 : 3] {
+     static int a[2];
+     return a;
+   };
+ }
+ 
+ consteval {
+   static_assert (access_context::current ().scope () == ^^::);
+   consteval {
+     static_assert (access_context::current ().scope () == ^^::);
+   }
+   static_assert (access_context::current ().via (^^S).via (null_reflection).designating_class () == null_reflection);
+ }
+ 
+ consteval bool
+ baz ()
+ {
+   constexpr U u;
+   static_assert (is_constructor (u.u) && parent_of (u.u) == ^^U);
+   constexpr V v;
+   static_assert (is_constructor (v.u) && parent_of (v.u) == ^^U);
+   static_assert (is_constructor (v.v) && parent_of (v.v) == ^^V);
+   return true;
+ }
+ 
+ static_assert (baz ());
+ 
+ consteval info
+ qux ()
+ {
+   return ^^qux;
+ }
+ 
+ constexpr info q = qux ();
+ static_assert (q == ^^qux);
+ 
+ namespace O
+ {
+   int a[2];
+   auto
+   foo () -> int (&) [access_context::current ().scope () == ^^O ? 2 : 3]
+   {
+     return a;
+   }
+ }
+ 
+ consteval bool
+ can_do_via (info r)
+ {
+   try { access_context::current ().via (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ struct W;
+ 
+ static_assert (can_do_via (^^S));
+ static_assert (can_do_via (^^T));
+ static_assert (can_do_via (^^U));
+ static_assert (can_do_via (^^V));
+ static_assert (can_do_via (^^N::S));
+ static_assert (can_do_via (null_reflection));
+ static_assert (!can_do_via (^^W));
+ static_assert (!can_do_via (^^::));
+ static_assert (!can_do_via (^^O));
+ static_assert (!can_do_via (^^bar));
+ static_assert (!can_do_via (^^int));
+ enum E { E0, E1 };
+ static_assert (!can_do_via (^^E));
+ static_assert (!can_do_via (^^E0));
+ static_assert (!can_do_via (reflect_constant (42)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/access_context2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/access_context2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/access_context2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/access_context2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::access_context.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template <typename T>
+ struct S
+ {
+   static constexpr auto ctx = access_context::current ();
+ };
+ 
+ static_assert (S <int>::ctx.designating_class () == info {} && S <int>::ctx.scope () == ^^S <int>);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/access_context3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/access_context3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/access_context3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/access_context3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,50 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::access_context.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct Ctor
+ {
+   consteval Ctor()
+   { }
+ 
+   access_context ctx = access_context::current ();
+ };
+ 
+ constexpr Ctor ctor;
+ static_assert (is_constructor (ctor.ctx.scope ()) && parent_of(ctor.ctx.scope()) == ^^Ctor);
+ 
+ struct Dfltd
+ {
+   Dfltd() = default;
+ 
+   access_context ctx = access_context::current ();
+ };
+ 
+ constexpr Dfltd dfltd;
+ static_assert (is_constructor (dfltd.ctx.scope ()) && parent_of(dfltd.ctx.scope()) == ^^Dfltd);
+ 
+ struct Aggr {
+   access_context ctx = access_context::current ();
+ };
+ 
+ constexpr Aggr aggrCtor;
+ static_assert (is_constructor (aggrCtor.ctx.scope ()) && parent_of(aggrCtor.ctx.scope()) == ^^Aggr);
+ 
+ constexpr Aggr aggrInit{};
+ static_assert (aggrInit.ctx.scope () == ^^::);
+ 
+ consteval Aggr
+ func(Aggr aggr = {})
+ { return aggr; }
+ 
+ static_assert (func().ctx.scope () == ^^::);
+ 
+ constexpr void
+ bar()
+ {
+   static_assert (func().ctx.scope () == ^^bar);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/adl1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/adl1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/adl1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/adl1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // ADL.  The namespace std::meta is an associated namespace of
+ // std::meta::info, which allows standard library meta functions
+ // to be invoked without explicit qualification.
+ 
+ #include <meta>
+ 
+ struct S {};
+ 
+ bool b1 = std::meta::has_identifier (^^S);
+ bool b2 = has_identifier (^^S);
+ 
+ 
+ std::string_view name2 = std::meta::identifier_of(^^S);  // Okay.
+ std::string_view name1 = identifier_of(^^S);             // Also okay.
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/alignment_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/alignment_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/alignment_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/alignment_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,165 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::alignment_of.
+ 
+ #include <meta>
+ #include <cstddef>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ extern int arr2[];
+ extern int arr3[2];
+ alignas (32) int arr4[] = {1, 2, 3};
+ alignas (64) extern int arr5[2];
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ } s;
+ struct S2 {
+   char p;
+   int mem;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+   static int ta;
+   alignas (128) static constexpr int tb = 42;
+ };
+ int T::ta;
+ struct U {
+   int u;
+ };
+ static short v1;
+ alignas (64) static long long v2;
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ int &ref = arr[0];
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ consteval bool
+ has_alignment_of (info r)
+ {
+   try { alignment_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!has_alignment_of (std::meta::reflect_constant (42)));
+ static_assert (has_alignment_of (std::meta::reflect_object (arr)));
+ static_assert (has_alignment_of (std::meta::reflect_object (arr[1])));
+ static_assert (has_alignment_of (std::meta::reflect_object (s.mem)));
+ static_assert (has_alignment_of (^^arr));
+ static_assert (!has_alignment_of (^^a3));
+ static_assert (!has_alignment_of (^^fn));
+ static_assert (!has_alignment_of (^^fn2));
+ static_assert (!has_alignment_of (^^Enum::A));
+ static_assert (has_alignment_of (^^Alias));
+ static_assert (has_alignment_of (^^S));
+ static_assert (has_alignment_of (^^S::mem));
+ static_assert (!has_alignment_of (members_of (^^S, access_context::current ())[1]));
+ static_assert (!has_alignment_of (^^TCls));
+ static_assert (!has_alignment_of (^^TFn));
+ static_assert (!has_alignment_of (^^TVar));
+ static_assert (!has_alignment_of (^^Concept));
+ static_assert (!has_alignment_of (^^NSAlias));
+ static_assert (!has_alignment_of (^^NS));
+ static_assert (has_alignment_of (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (has_alignment_of (std::meta::data_member_spec (^^int, { .name = "member" })));
+ static_assert (!has_alignment_of (std::meta::data_member_spec (^^int, { .name = "member", .bit_width = 6 })));
+ static_assert (!has_alignment_of (std::meta::data_member_spec (^^int, { .bit_width = 15 })));
+ static_assert (has_alignment_of (^^arr2));
+ static_assert (has_alignment_of (^^arr3));
+ static_assert (!has_alignment_of (^^ref));
+ static_assert (alignment_of (std::meta::reflect_object (arr)) == alignment_of (^^arr));
+ static_assert (alignment_of (std::meta::reflect_object (arr[1])) == alignof (int));
+ static_assert (alignment_of (std::meta::reflect_object (s.mem)) == alignment_of (^^S::mem));
+ static_assert (alignment_of (^^arr) >= alignof (int));
+ static_assert (alignment_of (^^arr4) == 32);
+ static_assert (alignment_of (^^Alias) == alignof (int));
+ static_assert (alignment_of (^^S) == alignof (S));
+ static_assert (alignment_of (^^S::mem) == offsetof (S2, mem));
+ static_assert (alignment_of (std::meta::bases_of (^^S, ctx)[0]) == alignof (B));
+ static_assert (alignment_of (std::meta::data_member_spec (^^int, { .name = "member" })) == alignof (int));
+ static_assert (alignment_of (^^arr3) >= alignof (int));
+ static_assert (alignment_of (^^arr5) == 64);
+ static_assert (alignment_of (^^T::ta) >= alignof (int));
+ static_assert (alignment_of (^^T::tb) == 128);
+ static_assert (alignment_of (^^v1) >= alignof (short));
+ static_assert (alignment_of (^^v2) == 64);
+ using fnt = int (int, int);
+ static_assert (!has_alignment_of (^^fnt));
+ void bar (long, const T f, int g[2], T &);
+ 
+ int
+ foo (int a, const long b, T c, int d[4], T &e, int f)
+ {
+   static_assert (has_alignment_of (^^a));
+   static_assert (has_alignment_of (^^b));
+   static_assert (has_alignment_of (^^c));
+   static_assert (has_alignment_of (^^d));
+   static_assert (!has_alignment_of (^^e));
+   static_assert (!has_alignment_of (parameters_of (^^foo)[0]));
+   static_assert (!has_alignment_of (parameters_of (^^foo)[5]));
+   static_assert (!has_alignment_of (parameters_of (^^bar)[0]));
+   static_assert (alignment_of (^^a) >= alignof (int));
+   static_assert (alignment_of (^^b) >= alignof (long));
+   static_assert (alignment_of (^^c) >= alignof (T));
+   static_assert (alignment_of (^^d) >= alignof (int *));
+   return 0;
+ }
+ 
+ struct V
+ {
+   char a;
+   long long f;
+   int : 2;
+   int g : 3;
+   int &h;
+   alignas (32) int i;
+   alignas (64) long long j;
+ };
+ struct V2
+ {
+   char p;
+   char a;
+ };
+ struct V3
+ {
+   char p;
+   long long f;
+ };
+ struct V4
+ {
+   char p;
+   int *h;
+ };
+ using CV = const V;
+ 
+ static_assert (alignment_of (^^int) == alignof (int));
+ static_assert (alignment_of (^^char) == alignof (char));
+ static_assert (alignment_of (^^V) == alignof (V));
+ static_assert (alignment_of (^^CV) == alignof (V));
+ static_assert (alignment_of (^^char *) == alignof (char *));
+ static_assert (alignment_of (^^char &) == alignof (char *));
+ static_assert (alignment_of (^^char &&) == alignof (char *));
+ static_assert (alignof (char) == alignof (char *) || alignment_of (^^char &) != alignof (char &));
+ static_assert (alignof (char) == alignof (char *) || alignment_of (^^char &&) != alignof (char &&));
+ static_assert (alignment_of (^^V::a) == offsetof (V2, a));
+ static_assert (alignment_of (^^V::f) == offsetof (V3, f));
+ static_assert (!has_alignment_of (^^V::g));
+ static_assert (alignment_of (^^V::h) == offsetof (V4, h));
+ static_assert (alignment_of (^^V::i) == 32);
+ static_assert (alignment_of (^^V::j) == 64);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/alignment_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/alignment_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/alignment_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/alignment_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,27 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-options "-freflection" }
+ // Test std::meta::alignment_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S
+ {
+   char a;
+   int b;
+ };
+ struct [[gnu::packed]] V
+ {
+   char a;
+   long long f;
+   int *h;
+   S i;
+ } v;
+ 
+ static_assert (alignment_of (^^v) == 1);
+ static_assert (alignment_of (^^V) == alignof (V));
+ static_assert (alignment_of (^^V::a) == 1);
+ static_assert (alignment_of (^^V::f) == 1);
+ static_assert (alignment_of (^^V::h) == 1);
+ static_assert (alignment_of (^^V::i) == 1);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,139 ----
+ // C++ 26 P3394R4 - Annotations for Reflection
+ // { dg-do compile { target c++26 } }
+ 
+ int arr[2];
+ struct S { int a, b; };
+ S arr2[2];
+ 
+ void
+ foo (int n)
+ {
+   [[=1]] int x1;
+   auto a = [] [[=1]] () {};
+   auto b = [] constexpr [[=1]] {};	// { dg-error "annotation on a type other than class or enumeration definition" }
+   auto c = [] noexcept [[=1]] {};	// { dg-error "annotation on a type other than class or enumeration definition" }
+   auto d = [] () [[=1]] {};		// { dg-error "annotation on a type other than class or enumeration definition" }
+   auto e = new int [n] [[=1]];		// { dg-warning "attributes ignored on outermost array type in new expression" }
+   auto e2 = new int [n] [[=1]] [42];	// { dg-warning "attributes ignored on outermost array type in new expression" }
+   auto f = new int [n][42] [[=1]];	// { dg-error "annotation on a type other than class or enumeration definition" }
+   [[=1]];				// { dg-warning "attributes at the beginning of statement are ignored" }
+   [[=1]] {}				// { dg-warning "attributes at the beginning of statement are ignored" }
+   [[=1]] if (true) {}			// { dg-warning "attributes at the beginning of statement are ignored" }
+   [[=1]] while (false) {}		// { dg-warning "attributes at the beginning of statement are ignored" }
+   [[=1]] goto lab;			// { dg-warning "attributes at the beginning of statement are ignored" }
+   [[=1]] lab:;				// { dg-error "annotation applied to a label" }
+   [[=1]] try {} catch (int) {}		// { dg-warning "attributes at the beginning of statement are ignored" }
+   if ([[=1]] int x = 0) {}
+   switch (n)
+     {
+     [[=1]] case 1:			// { dg-error "annotation applied to a label" }
+     [[=1]] break;			// { dg-warning "attributes at the beginning of statement are ignored" }
+     [[=1]] default:			// { dg-error "annotation applied to a label" }
+ 	   break;
+     }
+   for ([[=1]] auto a : arr) {}
+   for ([[=1]] auto [a, b] : arr2) {}
+   [[=1]] asm ("");			// { dg-warning "attributes ignored on 'asm' declaration" }
+   try {} catch ([[=1]] int x) {}
+   try {} catch ([[=1]] int) {}
+   try {} catch (int [[=1]] x) {}	// { dg-warning "attribute ignored" }
+   try {} catch (int [[=1]]) {}		// { dg-warning "attribute ignored" }
+   try {} catch (int x [[=1]]) {}
+ }
+ 
+ [[=1]] int bar ();
+ using foobar [[=1]] = int;
+ [[=1]] int a;
+ [[=1]] auto [b, c] = arr;
+ auto [b3 [[=1]], c3 [[=1]]] = arr;	// { dg-error "annotation on structured binding" }
+ [[=1]];					// { dg-warning "attribute ignored" }
+ inline [[=1]] void baz () {}		// { dg-warning "attribute ignored" }
+ 						// { dg-error "standard attributes in middle of decl-specifiers" "" { target *-*-* } .-1 }
+ constexpr [[=1]] int qux () { return 0; }	// { dg-warning "attribute ignored" }
+ 						// { dg-error "standard attributes in middle of decl-specifiers" "" { target *-*-* } .-1 }
+ int [[=1]] d;				// { dg-warning "attribute ignored" }
+ int const [[=1]] e = 1;			// { dg-warning "attribute ignored" }
+ struct A {} [[=1]];			// { dg-warning "attribute ignored in declaration of 'struct A'" }
+ struct A [[=1]];			// { dg-warning "attribute ignored" }
+ struct A [[=1]] a1;			// { dg-warning "attribute ignored" }
+ A [[=1]] a2;				// { dg-warning "attribute ignored" }
+ enum B { B0 } [[=1]];			// { dg-warning "attribute ignored in declaration of 'enum B'" }
+ enum B [[=1]];				// { dg-warning "attribute ignored" }
+ enum B [[=1]] b1;			// { dg-warning "attribute ignored" }
+ B [[=1]] b2;				// { dg-warning "attribute ignored" }
+ struct [[=1]] C {};
+ int f [[=1]];
+ int g[2] [[=1]];			// { dg-error "annotation on a type other than class or enumeration definition" }
+ int g2 [[=1]] [2];
+ int corge () [[=1]];			// { dg-error "annotation on a type other than class or enumeration definition" }
+ int *[[=1]] h;				// { dg-error "annotation on a type other than class or enumeration definition" }
+ int & [[=1]] i = f;			// { dg-error "annotation on a type other than class or enumeration definition" }
+ int && [[=1]] j = 0;			// { dg-error "annotation on a type other than class or enumeration definition" }
+ int S::* [[=1]] k;			// { dg-error "annotation on a type other than class or enumeration definition" }
+ auto l = sizeof (int [2] [[=1]]);	// { dg-error "annotation on a type other than class or enumeration definition" }
+ int freddy ([[=1]] int a,
+ 	    [[=1]] int,
+ 	    [[=1]] int c = 0,
+ 	    [[=1]] int = 0);
+ void
+ corge ([[=1]] int a,
+        [[=1]] int,
+        [[=1]] int c = 0,
+        [[=1]] int = 0)
+ {
+ }
+ [[=1]] void
+ garply ()
+ {
+ }
+ int grault (int [[=1]] a,		// { dg-warning "attribute ignored" }
+ 	    int [[=1]],			// { dg-warning "attribute ignored" }
+ 	    int [[=1]] c = 0,		// { dg-warning "attribute ignored" }
+ 	    int [[=1]] = 0);		// { dg-warning "attribute ignored" }
+ void
+ waldo (int [[=1]] a,			// { dg-warning "attribute ignored" }
+        int [[=1]],			// { dg-warning "attribute ignored" }
+        int [[=1]] c = 0,		// { dg-warning "attribute ignored" }
+        int [[=1]] = 0)			// { dg-warning "attribute ignored" }
+ {
+ }
+ int plugh (int a [[=1]],
+ 	    int b [[=1]] = 0);
+ void
+ thud (int a [[=1]],
+       int b [[=1]] = 0)
+ {
+ }
+ enum [[=1]] D { D0 };
+ enum class [[=1]] E { E0 };
+ enum F {};
+ enum [[=1]] F;				// { dg-warning "type attributes ignored after type is already defined" }
+ enum G {
+   G0 [[=1]],
+   G1 [[=1]] = 2
+ };
+ namespace [[=1]] H { using H0 = int; }
+ namespace [[=1]] {}
+ [[=1]] using namespace H;		// { dg-error "annotation on using directive" }
+ struct [[=1]] I
+ {
+   [[=1]];				// { dg-error "declaration does not declare anything" }
+   [[=1]] int i;
+   [[=1]] int foo ();
+   [[=1]] int bar () { return 1; }
+   [[=1]] int : 0;			// { dg-error "annotation on unnamed bit-field" }
+   [[=1]] int i2 : 5;
+   [[=1]] static int i3;
+   static int i4;
+ };
+ [[=1]] int I::i4 = 0;
+ struct J : [[=1]] C {};
+ template <typename T>
+ concept K [[=1]] = requires { true; };
+ typedef int L [[=1]];
+ template <typename T>
+ struct M {};
+ template <>
+ struct [[=1]] M<int> { int m; };
+ typedef int N[2] [[=1]];		// { dg-error "annotation on a type other than class or enumeration definition" }
+ typedef int O [[=1]] [2];
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,44 ----
+ // C++ 26 P3394R4 - Annotations for Reflection
+ // { dg-do compile { target c++26 } }
+ 
+ struct [[=0]] A;
+ struct [[=1, =2]] A {
+   [[=1]] [[=1]] [[=2]] int a;
+   [[=3, =4, =5]] static int b; 
+ };
+ namespace [[=6, =6]] [[=6]] N
+ {
+ };
+ namespace [[=7]] [[= 7 + 1]] [[= 7 + 2]] N
+ {
+ };
+ [[=9.5L]] int c;
+ struct B { constexpr B () : b (42) {} int b; };
+ [[=B ()]] int d;
+ struct C { constexpr C () : c (42) {} int c; ~C () {} };
+ [[=C ()]] int e;						// { dg-error "temporary of non-literal type 'C' in a constant expression" }
+ 								// { dg-error "annotation does not have structural type" "" { target *-*-* } .-1 }
+ struct D { constexpr D () : d (42) {} volatile int d; };
+ [[=D ()]] int f;						// { dg-error "temporary of non-literal type 'D' in a constant expression" }
+ 								// { dg-error "annotation does not have structural type" "" { target *-*-* } .-1 }
+ struct E { constexpr E () : e (42) {} private: int e; };
+ [[=E ()]] int g;						// { dg-error "annotation does not have structural type" }
+ struct F { constexpr F () : f (42) {} protected: int f; };
+ [[=F ()]] int h;						// { dg-error "annotation does not have structural type" }
+ struct G { constexpr G () : g (42) {} mutable int g; };
+ [[=G ()]] int i;						// { dg-error "annotation does not have structural type" }
+ struct H { constexpr H () : h (42) {} int h; G g; };
+ [[=H ()]] int j;						// { dg-error "annotation does not have structural type" }
+ [[=c]] int k;							// { dg-error "the value of 'c' is not usable in a constant expression" }
+ [[=(throw 1, 0)]] int l;					// { dg-error "uncaught exception '1'" }
+ struct I { int a, b; long c; };
+ constexpr B m = B ();
+ constexpr I n = { 1, 2, 3 };
+ template <auto ...A>
+ [[=1, =A...]] int o;
+ int p = o<1, m, n> + o<2, 42>;
+ [[maybe_unused]] [[=3]] [[gnu::unused]] int q;
+ [[=3, gnu::unused, gnu::aligned(16), =4]] int r;		// { dg-error "mixing annotations and attributes in the same list" }
+ [[gnu::unused, =5, gnu::aligned(16), =6]] int s;		// { dg-error "mixing annotations and attributes in the same list" }
+ [[using gnu:unused, =7, aligned(16), =8]] int t;		// { dg-error "mixing annotations and attributes in the same list" }
+ [[using gnu:=9]] int u;						// { dg-error "mixing annotations and attributes in the same list" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,174 ----
+ // C++ 26 P3394R4 - Annotations for Reflection
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::annotations_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template<class, class> inline constexpr bool same_type_v = false;
+ template<class T> inline constexpr bool same_type_v<T, T> = true;
+ 
+ [[=42, =42]] int x;
+ static_assert (annotations_of (^^x).size () == 2);
+ static_assert (same_type_v<decltype (annotations_of (^^x)), std::vector<info>>);
+ static_assert (type_of (annotations_of (^^x)[0]) == ^^int);
+ static_assert (type_of (annotations_of (^^x)[1]) == ^^int);
+ 
+ [[=42]] int foo ();
+ [[=24L]] int foo ();
+ static_assert (annotations_of (^^foo).size () == 2);
+ static_assert (type_of (annotations_of (^^foo)[0]) == ^^int);
+ static_assert (type_of (annotations_of (^^foo)[1]) == ^^long);
+ 
+ [[=1]] void bar ();
+ [[=2U, =3UL]] void baz ();
+ void baz [[=4ULL]] ();
+ 
+ static_assert (annotations_of (^^bar).size () == 1);
+ static_assert (type_of (annotations_of (^^bar)[0]) == ^^int);
+ static_assert (annotations_of (^^baz).size () == 3);
+ static_assert (type_of (annotations_of (^^baz)[0]) == ^^unsigned);
+ static_assert (type_of (annotations_of (^^baz)[1]) == ^^unsigned long);
+ static_assert (type_of (annotations_of (^^baz)[2]) == ^^unsigned long long);
+ 
+ struct [[=42]] C {};
+ constexpr std::meta::info a0 = annotations_of (^^C)[0];
+ static_assert (is_annotation (a0));
+ static_assert (type_of (a0) == ^^int);
+ 
+ template <class T>
+ struct [[=42]] D {};
+ 
+ //constexpr std::meta::info a1 = annotations_of (^^D<int>)[0];
+ //constexpr std::meta::info a2 = annotations_of (^^D<char>)[0];
+ //static_assert (is_annotation (a1) && is_annotation (a2));
+ 
+ [[=1, =2L, =3.0, =4U, =5U, =6L, =7U]] int y;
+ static_assert (annotations_of (^^y).size () == 7);
+ static_assert (type_of (annotations_of (^^y)[0]) == ^^int);
+ static_assert (type_of (annotations_of (^^y)[1]) == ^^long);
+ static_assert (type_of (annotations_of (^^y)[2]) == ^^double);
+ static_assert (type_of (annotations_of (^^y)[3]) == ^^unsigned);
+ static_assert (type_of (annotations_of (^^y)[4]) == ^^unsigned);
+ static_assert (type_of (annotations_of (^^y)[5]) == ^^long);
+ static_assert (type_of (annotations_of (^^y)[6]) == ^^unsigned);
+ static_assert (annotations_of_with_type (^^y, ^^int).size () == 1);
+ static_assert (type_of (annotations_of_with_type (^^y, ^^int)[0]) == ^^int);
+ static_assert (annotations_of_with_type (^^y, ^^long).size () == 2);
+ static_assert (type_of (annotations_of_with_type (^^y, ^^long)[0]) == ^^long);
+ static_assert (type_of (annotations_of_with_type (^^y, ^^long)[1]) == ^^long);
+ static_assert (annotations_of_with_type (^^y, ^^unsigned).size () == 3);
+ static_assert (type_of (annotations_of_with_type (^^y, ^^unsigned)[0]) == ^^unsigned);
+ static_assert (type_of (annotations_of_with_type (^^y, ^^unsigned)[1]) == ^^unsigned);
+ static_assert (type_of (annotations_of_with_type (^^y, ^^unsigned)[2]) == ^^unsigned);
+ static_assert (annotations_of_with_type (^^y, ^^const double).size () == 1);
+ static_assert (type_of (annotations_of_with_type (^^y, ^^double)[0]) == ^^double);
+ static_assert (annotations_of_with_type (^^y, ^^volatile double).size () == 0);
+ static_assert (annotations_of_with_type (^^y, ^^float).size () == 0);
+ 
+ int z;
+ static_assert (annotations_of (^^z).size () == 0);
+ 
+ struct V { int a, b, c; };
+ [[=1, =V { 2, 3, 4 }, =1.0]] int an;
+ static_assert (type_of (annotations_of (^^an)[0]) == ^^int);
+ static_assert (type_of (annotations_of (^^an)[1]) == ^^const V);
+ static_assert (type_of (annotations_of (^^an)[2]) == ^^double);
+ 
+ struct W { [[=1, =2L, =3U, =4UL]] int a; [[=V { 2, 3, 4 }, =1.0f]] int b; };
+ static_assert (type_of (annotations_of (^^W::a)[0]) == ^^int);
+ static_assert (type_of (annotations_of (^^W::a)[1]) == ^^long);
+ static_assert (type_of (annotations_of (^^W::a)[2]) == ^^unsigned);
+ static_assert (type_of (annotations_of (^^W::a)[3]) == ^^long unsigned);
+ static_assert (type_of (annotations_of (^^W::b)[0]) == ^^const V);
+ static_assert (type_of (annotations_of (^^W::b)[1]) == ^^float);
+ 
+ [[=1, =1.0f]] [[=2U]] extern int an2;
+ [[=3L, =4.0]] [[=5UL, =5UL]] extern int an2;
+ [[=6LL, =V { 7, 8, 9 }]] [[=6ULL, =6ULL]] int an2;
+ static_assert (annotations_of (^^an2).size () == 11);
+ static_assert (type_of (annotations_of (^^an2)[0]) == ^^int);
+ static_assert (type_of (annotations_of (^^an2)[1]) == ^^float);
+ static_assert (type_of (annotations_of (^^an2)[2]) == ^^unsigned);
+ static_assert (type_of (annotations_of (^^an2)[3]) == ^^long);
+ static_assert (type_of (annotations_of (^^an2)[4]) == ^^double);
+ static_assert (type_of (annotations_of (^^an2)[5]) == ^^unsigned long);
+ static_assert (type_of (annotations_of (^^an2)[6]) == ^^unsigned long);
+ static_assert (type_of (annotations_of (^^an2)[7]) == ^^long long);
+ static_assert (type_of (annotations_of (^^an2)[8]) == ^^const V);
+ static_assert (type_of (annotations_of (^^an2)[9]) == ^^unsigned long long);
+ static_assert (type_of (annotations_of (^^an2)[10]) == ^^unsigned long long);
+ 
+ namespace [[=1, =2U]] [[=3L, =4.0]] N
+ {
+   static_assert (annotations_of (^^N).size () == 4);
+   static_assert (type_of (annotations_of (^^N)[0]) == ^^int);
+   static_assert (type_of (annotations_of (^^N)[1]) == ^^unsigned);
+   static_assert (type_of (annotations_of (^^N)[2]) == ^^long);
+   static_assert (type_of (annotations_of (^^N)[3]) == ^^double);
+ }
+ 
+ namespace [[=5.0f]] [[=6LL]] N
+ {
+   static_assert (annotations_of (^^N).size () == 6);
+   static_assert (type_of (annotations_of (^^N)[0]) == ^^int);
+   static_assert (type_of (annotations_of (^^N)[1]) == ^^unsigned);
+   static_assert (type_of (annotations_of (^^N)[2]) == ^^long);
+   static_assert (type_of (annotations_of (^^N)[3]) == ^^double);
+   static_assert (type_of (annotations_of (^^N)[4]) == ^^float);
+   static_assert (type_of (annotations_of (^^N)[5]) == ^^long long);
+ }
+ 
+ struct F { int f; };
+ struct G { int g; };
+ struct H { int h; };
+ struct I : [[=1U, =2L]] [[=3]] F, [[=4ULL]] G, H { int i; };
+ 
+ constexpr auto ctx = access_context::unchecked ();
+ static_assert (annotations_of (bases_of (^^I, ctx)[0]).size () == 3);
+ static_assert (type_of (annotations_of (bases_of (^^I, ctx)[0])[0]) == ^^unsigned);
+ static_assert (type_of (annotations_of (bases_of (^^I, ctx)[0])[1]) == ^^long);
+ static_assert (type_of (annotations_of (bases_of (^^I, ctx)[0])[2]) == ^^int);
+ static_assert (annotations_of (bases_of (^^I, ctx)[1]).size () == 1);
+ static_assert (type_of (annotations_of (bases_of (^^I, ctx)[1])[0]) == ^^unsigned long long);
+ static_assert (annotations_of (bases_of (^^I, ctx)[2]).size () == 0);
+ 
+ struct J { int j; };
+ struct K { int k; };
+ struct L { int l; };
+ template <typename ...T>
+ struct M : [[=1]] F, G, [[=2U, =V { 1, 2, 3 }]] [[=3LL]] T... { int m; };
+ static_assert (bases_of (^^M <>, ctx).size () == 2);
+ static_assert (annotations_of (bases_of (^^M <>, ctx)[0]).size () == 1);
+ static_assert (type_of (annotations_of (bases_of (^^M <>, ctx)[0])[0]) == ^^int);
+ static_assert (annotations_of (bases_of (^^M <>, ctx)[1]).size () == 0);
+ static_assert (bases_of (^^M <J, K, L>, ctx).size () == 5);
+ static_assert (annotations_of (bases_of (^^M <J, K, L>, ctx)[0]).size () == 1);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[0])[0]) == ^^int);
+ static_assert (annotations_of (bases_of (^^M <J, K, L>, ctx)[1]).size () == 0);
+ static_assert (annotations_of (bases_of (^^M <J, K, L>, ctx)[2]).size () == 3);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[2])[0]) == ^^unsigned);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[2])[1]) == ^^const V);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[2])[2]) == ^^long long);
+ static_assert (annotations_of (bases_of (^^M <J, K, L>, ctx)[3]).size () == 3);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[3])[0]) == ^^unsigned);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[3])[1]) == ^^const V);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[3])[2]) == ^^long long);
+ static_assert (annotations_of (bases_of (^^M <J, K, L>, ctx)[4]).size () == 3);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[4])[0]) == ^^unsigned);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[4])[1]) == ^^const V);
+ static_assert (type_of (annotations_of (bases_of (^^M <J, K, L>, ctx)[4])[2]) == ^^long long);
+ 
+ template <auto ...V>
+ consteval auto
+ qux ()
+ {
+   [[=1, =V..., =2]] int an;
+   return ^^an;
+ }
+ 
+ static_assert (annotations_of (qux <> ()).size () == 2);
+ static_assert (annotations_of (qux <3, 4, 5> ()).size () == 5);
+ static_assert (annotations_of (qux <V { 1, 2, 3 }, V { 2, 3, 4 }> ()).size () == 4);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,79 ----
+ // C++ 26 P3394R4 - Annotations for Reflection
+ // { dg-do compile { target c++26 } }
+ 
+ struct E { constexpr E () : e (42) {} private: int e; };
+ int arr[2];
+ struct S { int a, b; };
+ S arr2[2];
+ 
+ void
+ foo (int n)
+ {
+   [[=E ()]] int x1;				// { dg-error "annotation does not have structural type" }
+   auto a = [] [[=E ()]] () {};			// { dg-error "annotation does not have structural type" }
+   if ([[=E ()]] int x = 0) {}			// { dg-error "annotation does not have structural type" }
+   for ([[=E ()]] auto a : arr) {}		// { dg-error "annotation does not have structural type" }
+   for ([[=E ()]] auto [a, b] : arr2) {}		// { dg-error "annotation does not have structural type" }
+   try {} catch ([[=E ()]] int x) {}		// { dg-error "annotation does not have structural type" }
+   try {} catch ([[=E ()]] int) {}		// { dg-error "annotation does not have structural type" }
+   try {} catch (int x [[=E ()]]) {}		// { dg-error "annotation does not have structural type" }
+ }
+ 
+ [[=E ()]] int bar ();				// { dg-error "annotation does not have structural type" }
+ using foobar [[=E ()]] = int;			// { dg-error "annotation does not have structural type" }
+ [[=E ()]] int a;				// { dg-error "annotation does not have structural type" }
+ [[=E ()]] auto [b, c] = arr;			// { dg-error "annotation does not have structural type" }
+ struct [[=E ()]] C {};				// { dg-error "annotation does not have structural type" }
+ int f [[=E ()]];				// { dg-error "annotation does not have structural type" }
+ int g2 [[=E ()]] [2];				// { dg-error "annotation does not have structural type" }
+ int freddy ([[=E ()]] int a,			// { dg-error "annotation does not have structural type" }
+ 	    [[=E ()]] int,			// { dg-error "annotation does not have structural type" }
+ 	    [[=E ()]] int c = 0,		// { dg-error "annotation does not have structural type" }
+ 	    [[=E ()]] int = 0);			// { dg-error "annotation does not have structural type" }
+ void
+ corge ([[=E ()]] int a,				// { dg-error "annotation does not have structural type" }
+        [[=E ()]] int,				// { dg-error "annotation does not have structural type" }
+        [[=E ()]] int c = 0,			// { dg-error "annotation does not have structural type" }
+        [[=E ()]] int = 0)			// { dg-error "annotation does not have structural type" }
+ {
+ }
+ [[=E ()]] void
+ garply ()					// { dg-error "annotation does not have structural type" }
+ {
+ }
+ int plugh (int a [[=E ()]],			// { dg-error "annotation does not have structural type" }
+ 	   int b [[=E ()]] = 0);		// { dg-error "annotation does not have structural type" }
+ void
+ thud (int a [[=E ()]],				// { dg-error "annotation does not have structural type" }
+       int b [[=E ()]] = 0)			// { dg-error "annotation does not have structural type" }
+ {
+ }
+ enum [[=E ()]] D { D0 };			// { dg-error "annotation does not have structural type" }
+ enum class [[=E ()]] Z { Z0 };			// { dg-error "annotation does not have structural type" }
+ enum F {};
+ enum G {
+   G0 [[=E ()]],					// { dg-error "annotation does not have structural type" }
+   G1 [[=E ()]] = 2				// { dg-error "annotation does not have structural type" }
+ };
+ namespace [[=E ()]] H { using H0 = int; }	// { dg-error "annotation does not have structural type" }
+ namespace [[=E ()]] {}				// { dg-error "annotation does not have structural type" }
+ struct [[=E ()]] I				// { dg-error "annotation does not have structural type" }
+ {
+   [[=E ()]] int i;				// { dg-error "annotation does not have structural type" }
+   [[=E ()]] int foo ();				// { dg-error "annotation does not have structural type" }
+   [[=E ()]] int bar () { return 1; }		// { dg-error "annotation does not have structural type" }
+   [[=E ()]] int i2 : 5;				// { dg-error "annotation does not have structural type" }
+   [[=E ()]] static int i3;			// { dg-error "annotation does not have structural type" }
+   static int i4;
+ };
+ [[=E ()]] int I::i4 = 0;			// { dg-error "annotation does not have structural type" }
+ struct J : [[=E ()]] C {};			// { dg-error "annotation does not have structural type" }
+ template <typename T>
+ concept K [[=E ()]] = requires { true; };	// { dg-error "annotation does not have structural type" "" { xfail *-*-* } }
+ constexpr bool k = K <int>;
+ typedef int L [[=E ()]];			// { dg-error "annotation does not have structural type" }
+ template <typename T>
+ struct M {};
+ template <>
+ struct [[=E ()]] M<int> { int m; };		// { dg-error "annotation does not have structural type" }
+ typedef int O [[=E ()]] [2];			// { dg-error "annotation does not have structural type" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // C++ 26 P3394R4 - Annotations for Reflection
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::annotations_of.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <vector>
+ 
+ [[=1, =1, =2, =1.0f]] void foo ();
+ static_assert ((std::meta::annotations_of (^^foo)
+ 		| std::views::transform (std::meta::constant_of)
+ 		| std::ranges::to<std::vector> ())
+ 	       == std::vector { std::meta::reflect_constant (1),
+ 				std::meta::reflect_constant (1),
+ 				std::meta::reflect_constant (2),
+ 				std::meta::reflect_constant (1.0f) });
+ 
+ [[=1]] [[=2]] void bar ();
+ [[=3]] [[=3]] void bar ();
+ [[=4L, =42]] void bar ();
+ static_assert ((std::meta::annotations_of (^^bar)
+ 		| std::views::transform (std::meta::constant_of)
+ 		| std::ranges::to<std::vector> ())
+ 	       == std::vector { std::meta::reflect_constant (1),
+ 				std::meta::reflect_constant (2),
+ 				std::meta::reflect_constant (3),
+ 				std::meta::reflect_constant (3),
+ 				std::meta::reflect_constant (4L),
+ 				std::meta::reflect_constant (42) });
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::annotations_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ extern int v;
+ 
+ consteval std::size_t
+ foo ()
+ {
+   return annotations_of (^^v).size ();
+ }
+ 
+ static_assert (foo () == 0);
+ [[=1]] [[=2]] extern int v;
+ static_assert (foo () == 2);
+ [[=3, =4, =5]] extern int v;
+ static_assert (foo () == 5);
+ [[=6]] extern int v;
+ static_assert (foo () == 6);
+ [[=6]] int v;
+ static_assert (foo () == 7);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct U {
+   constexpr U() = default;
+   U(const U&) = delete;
+ };
+ constexpr U u;
+ struct [[ =u ]] deletedCopy{};		// { dg-error "annotation does not have copy constructible type" }
+ 					// { dg-error "use of deleted function 'U::U\\\(const U\\\&\\\)'" "" { target *-*-* } .-1 }
+ struct [[ =U{} ]] deletedCopy2{};	// { dg-error "annotation does not have copy constructible type" }
+ 					// { dg-error "use of deleted function 'U::U\\\(const U\\\&\\\)'" "" { target *-*-* } .-1 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/annotations8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/annotations8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ struct [[=42]] A {};
+ template <auto I>
+ inline auto b = [] (auto &&x) { x.template operator () <I> (); };
+ 
+ int
+ main ()
+ {
+   auto l = [&] <auto> {};
+   auto w = b <annotations_of (^^A)[0]>;
+   w (l);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/anon1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/anon1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/anon1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/anon1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,50 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // https://github.com/cplusplus/CWG/issues/705
+ 
+ auto foo() {
+   union { int what; };
+   return &[:^^what:];  // { dg-error "not a direct member of a named class" }
+ }
+ 
+ static union { int m; };
+ constexpr auto r = ^^m;
+ auto p = &[:r:]; // { dg-error "not a direct member of a named class" }
+ 
+ namespace N {
+   static union { int mn; };
+   constexpr auto rn = ^^mn;
+   auto pn = &[:rn:];  // { dg-error "not a direct member of a named class" }
+ }
+ 
+ struct S {
+   union {
+     int m;
+   };
+ };
+ 
+ constexpr auto r2 = ^^S::m;
+ constexpr auto p2 = &[: ^^r2 :];
+ 
+ void
+ f ()
+ {
+   static union {
+     int x;
+   };
+   auto rx = &[: ^^x :]; // { dg-error "not a direct member of a named class" }
+ 
+   union {
+     union {
+       int u;
+     };
+   };
+   auto ru = &[: ^^u :]; // { dg-error "not a direct member of a named class" }
+ 
+   struct L {
+     union {
+       int z;
+     };
+   };
+   auto rz = &[: ^^L::z :];
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/anon2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/anon2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/anon2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/anon2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,43 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ static union { int m; };
+ constexpr auto r = ^^m;
+ auto p = [:r:]; // { dg-error "cannot implicitly reference a class member .<unnamed union>::m. through a splice" }
+ 
+ namespace N {
+   static union { int mn; };
+   constexpr auto rn = ^^mn;
+   auto pn = [:rn:];  // { dg-error "cannot implicitly reference a class member .N::<unnamed union>::mn. through a splice" }
+ }
+ 
+ struct S {
+   union {
+     int m;
+   };
+ };
+ 
+ constexpr auto p2 = [: ^^S::m :]; // { dg-error "cannot implicitly reference a class member .S::<unnamed union>::m. through a splice" }
+ 
+ void
+ f ()
+ {
+   static union {
+     int x;
+   };
+   auto rx = [: ^^x :]; // { dg-error "cannot implicitly reference a class member .f\\\(\\\)::<unnamed union>::x. through a splice" }
+ 
+   union {
+     union {
+       int u;
+     };
+   };
+   auto ru = [: ^^u :]; // { dg-error "cannot implicitly reference a class member .f\\\(\\\)::<unnamed union>::<unnamed union>::u. through a splice" }
+ 
+   struct L {
+     union {
+       int z;
+     };
+   };
+   auto rz = [: ^^L::z :]; // { dg-error "cannot implicitly reference a class member .f\\(\\)::L::<unnamed union>::z. through a splice" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/anon3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/anon3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/anon3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/anon3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ auto foo() {
+   union U { int what; };
+   return &[:^^U::what:];
+ }
+ 
+ union U { int m; };
+ constexpr auto r = ^^U::m;
+ auto p = &[:r:];
+ 
+ namespace N {
+   union V { int mn; };
+   constexpr auto rn = ^^V::mn;
+   auto pn = &[:rn:];
+ }
+ 
+ struct S {
+   union W {
+     int m;
+   };
+ };
+ 
+ constexpr auto r2 = ^^S::W::m;
+ constexpr auto p2 = &[: ^^r2 :];
+ 
+ void
+ f ()
+ {
+   union U1 {
+     int x;
+   };
+   auto rx = &[: ^^U1::x :];
+ 
+   union UU {
+     union U2 {
+       int u;
+     };
+   };
+   auto ru = &[: ^^UU::U2::u :];
+ 
+   struct L {
+     union U3 {
+       int z;
+     };
+   };
+   auto rz = &[: ^^L::U3::z :];
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bases_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bases_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bases_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bases_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,188 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::bases_of and has_inaccessible_bases.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A { int a; };
+ struct B { int b; };
+ struct C { int c; };
+ struct D { int d; };
+ struct E { int e; };
+ struct F { int f; };
+ struct G { int g; };
+ struct H { int h; };
+ struct I : public A, protected B, private C { int i; };
+ struct J : protected D, private E, public F { int j; };
+ struct K : public G, protected I, private H, public J { int k; };
+ struct L : virtual A { int l; };
+ struct M : virtual A { int m; };
+ struct N : public L, protected M, public virtual A { int n; };
+ 
+ constexpr access_context gctx = access_context::current ();
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ static_assert (bases_of (^^A, uctx).size () == 0);
+ static_assert (bases_of (^^B, uctx).size () == 0);
+ static_assert (bases_of (^^C, uctx).size () == 0);
+ static_assert (!has_inaccessible_bases (^^C, uctx));
+ static_assert (bases_of (^^D, uctx).size () == 0);
+ static_assert (bases_of (^^E, uctx).size () == 0);
+ static_assert (bases_of (^^F, uctx).size () == 0);
+ static_assert (bases_of (^^G, uctx).size () == 0);
+ static_assert (bases_of (^^H, uctx).size () == 0);
+ static_assert (bases_of (^^I, uctx).size () == 3);
+ static_assert (is_base (bases_of (^^I, uctx)[0]));
+ static_assert (parent_of (bases_of (^^I, uctx)[0]) == ^^I);
+ static_assert (type_of (bases_of (^^I, uctx)[0]) == ^^A);
+ static_assert (identifier_of (bases_of (^^I, uctx)[0]) == "A");
+ static_assert (is_accessible (bases_of (^^I, uctx)[0], gctx));
+ static_assert (size_of (bases_of (^^I, uctx)[0]) == sizeof (A));
+ static_assert (offset_of (bases_of (^^I, uctx)[0]).total_bits () == 0);
+ static_assert (is_base (bases_of (^^I, uctx)[1]));
+ static_assert (parent_of (bases_of (^^I, uctx)[1]) == ^^I);
+ static_assert (type_of (bases_of (^^I, uctx)[1]) == ^^B);
+ static_assert (identifier_of (bases_of (^^I, uctx)[1]) == "B");
+ static_assert (!is_accessible (bases_of (^^I, uctx)[1], gctx));
+ static_assert (size_of (bases_of (^^I, uctx)[1]) == sizeof (B));
+ static_assert (offset_of (bases_of (^^I, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (A));
+ static_assert (is_base (bases_of (^^I, uctx)[2]));
+ static_assert (parent_of (bases_of (^^I, uctx)[2]) == ^^I);
+ static_assert (type_of (bases_of (^^I, uctx)[2]) == ^^C);
+ static_assert (identifier_of (bases_of (^^I, uctx)[2]) == "C");
+ static_assert (!is_accessible (bases_of (^^I, uctx)[2], gctx));
+ static_assert (size_of (bases_of (^^I, uctx)[2]) == sizeof (C));
+ static_assert (offset_of (bases_of (^^I, uctx)[2]).total_bits () == __CHAR_BIT__ * (sizeof (A) + sizeof (B)));
+ static_assert (!has_inaccessible_bases (^^I, uctx));
+ static_assert (bases_of (^^J, uctx).size () == 3);
+ static_assert (is_base (bases_of (^^J, uctx)[0]));
+ static_assert (parent_of (bases_of (^^J, uctx)[0]) == ^^J);
+ static_assert (type_of (bases_of (^^J, uctx)[0]) == ^^D);
+ static_assert (identifier_of (bases_of (^^J, uctx)[0]) == "D");
+ static_assert (!is_accessible (bases_of (^^J, uctx)[0], gctx));
+ static_assert (size_of (bases_of (^^J, uctx)[0]) == sizeof (D));
+ static_assert (offset_of (bases_of (^^J, uctx)[0]).total_bits () == 0);
+ static_assert (is_base (bases_of (^^J, uctx)[1]));
+ static_assert (parent_of (bases_of (^^J, uctx)[1]) == ^^J);
+ static_assert (type_of (bases_of (^^J, uctx)[1]) == ^^E);
+ static_assert (identifier_of (bases_of (^^J, uctx)[1]) == "E");
+ static_assert (!is_accessible (bases_of (^^J, uctx)[1], gctx));
+ static_assert (size_of (bases_of (^^J, uctx)[1]) == sizeof (E));
+ static_assert (offset_of (bases_of (^^J, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (D));
+ static_assert (is_base (bases_of (^^J, uctx)[2]));
+ static_assert (parent_of (bases_of (^^J, uctx)[2]) == ^^J);
+ static_assert (type_of (bases_of (^^J, uctx)[2]) == ^^F);
+ static_assert (identifier_of (bases_of (^^J, uctx)[2]) == "F");
+ static_assert (is_accessible (bases_of (^^J, uctx)[2], gctx));
+ static_assert (size_of (bases_of (^^J, uctx)[2]) == sizeof (F));
+ static_assert (offset_of (bases_of (^^J, uctx)[2]).total_bits () == __CHAR_BIT__ * (sizeof (D) + sizeof (E)));
+ static_assert (!has_inaccessible_bases (^^J, uctx));
+ static_assert (bases_of (^^K, uctx).size () == 4);
+ static_assert (is_base (bases_of (^^K, uctx)[0]));
+ static_assert (parent_of (bases_of (^^K, uctx)[0]) == ^^K);
+ static_assert (type_of (bases_of (^^K, uctx)[0]) == ^^G);
+ static_assert (identifier_of (bases_of (^^K, uctx)[0]) == "G");
+ static_assert (is_accessible (bases_of (^^K, uctx)[0], gctx));
+ static_assert (size_of (bases_of (^^K, uctx)[0]) == sizeof (G));
+ static_assert (offset_of (bases_of (^^K, uctx)[0]).total_bits () == 0);
+ static_assert (is_base (bases_of (^^K, uctx)[1]));
+ static_assert (parent_of (bases_of (^^K, uctx)[1]) == ^^K);
+ static_assert (type_of (bases_of (^^K, uctx)[1]) == ^^I);
+ static_assert (identifier_of (bases_of (^^K, uctx)[1]) == "I");
+ static_assert (!is_accessible (bases_of (^^K, uctx)[1], gctx));
+ static_assert (size_of (bases_of (^^K, uctx)[1]) == sizeof (I));
+ static_assert (offset_of (bases_of (^^K, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (G));
+ static_assert (is_base (bases_of (^^K, uctx)[2]));
+ static_assert (parent_of (bases_of (^^K, uctx)[2]) == ^^K);
+ static_assert (type_of (bases_of (^^K, uctx)[2]) == ^^H);
+ static_assert (identifier_of (bases_of (^^K, uctx)[2]) == "H");
+ static_assert (!is_accessible (bases_of (^^K, uctx)[2], gctx));
+ static_assert (size_of (bases_of (^^K, uctx)[2]) == sizeof (H));
+ static_assert (offset_of (bases_of (^^K, uctx)[2]).total_bits () == __CHAR_BIT__ * (sizeof (G) + sizeof (I)));
+ static_assert (is_base (bases_of (^^K, uctx)[3]));
+ static_assert (parent_of (bases_of (^^K, uctx)[3]) == ^^K);
+ static_assert (type_of (bases_of (^^K, uctx)[3]) == ^^J);
+ static_assert (identifier_of (bases_of (^^K, uctx)[3]) == "J");
+ static_assert (is_accessible (bases_of (^^K, uctx)[3], gctx));
+ static_assert (size_of (bases_of (^^K, uctx)[3]) == sizeof (J));
+ static_assert (offset_of (bases_of (^^K, uctx)[3]).total_bits () == __CHAR_BIT__ * (sizeof (G) + sizeof (I) + sizeof (H)));
+ static_assert (!has_inaccessible_bases (^^K, uctx));
+ static_assert (bases_of (^^L, uctx).size () == 1);
+ static_assert (is_base (bases_of (^^L, uctx)[0]));
+ static_assert (parent_of (bases_of (^^L, uctx)[0]) == ^^L);
+ static_assert (type_of (bases_of (^^L, uctx)[0]) == ^^A);
+ static_assert (identifier_of (bases_of (^^L, uctx)[0]) == "A");
+ static_assert (is_accessible (bases_of (^^L, uctx)[0], gctx));
+ static_assert (size_of (bases_of (^^L, uctx)[0]) == sizeof (A));
+ static_assert (offset_of (bases_of (^^L, uctx)[0]).total_bits () == __CHAR_BIT__ * (sizeof (void *) + sizeof (int)));
+ static_assert (bases_of (^^M, uctx).size () == 1);
+ static_assert (is_base (bases_of (^^M, uctx)[0]));
+ static_assert (parent_of (bases_of (^^M, uctx)[0]) == ^^M);
+ static_assert (type_of (bases_of (^^M, uctx)[0]) == ^^A);
+ static_assert (identifier_of (bases_of (^^M, uctx)[0]) == "A");
+ static_assert (is_accessible (bases_of (^^M, uctx)[0], gctx));
+ static_assert (size_of (bases_of (^^M, uctx)[0]) == sizeof (A));
+ static_assert (offset_of (bases_of (^^M, uctx)[0]).total_bits () == __CHAR_BIT__ * (sizeof (void *) + sizeof (int)));
+ static_assert (bases_of (^^N, uctx).size () == 3);
+ static_assert (is_base (bases_of (^^N, uctx)[0]));
+ static_assert (parent_of (bases_of (^^N, uctx)[0]) == ^^N);
+ static_assert (type_of (bases_of (^^N, uctx)[0]) == ^^L);
+ static_assert (identifier_of (bases_of (^^N, uctx)[0]) == "L");
+ static_assert (is_accessible (bases_of (^^N, uctx)[0], gctx));
+ static_assert (size_of (bases_of (^^N, uctx)[0]) == sizeof (L));
+ static_assert (offset_of (bases_of (^^N, uctx)[0]).total_bits () == 0);
+ static_assert (is_base (bases_of (^^N, uctx)[1]));
+ static_assert (parent_of (bases_of (^^N, uctx)[1]) == ^^N);
+ static_assert (type_of (bases_of (^^N, uctx)[1]) == ^^M);
+ static_assert (identifier_of (bases_of (^^N, uctx)[1]) == "M");
+ static_assert (!is_accessible (bases_of (^^N, uctx)[1], gctx));
+ static_assert (size_of (bases_of (^^N, uctx)[1]) == sizeof (M));
+ #if (__SIZEOF_POINTER__ == 4 || __SIZEOF_POINTER__ == 8) && __SIZEOF_INT__ == 4 && __CHAR_BIT__ == 8
+ // For LP64, L and M bases have vptr and the int field + 32 bits of padding,
+ // for ILP32 they have no padding.
+ static_assert (offset_of (bases_of (^^N, uctx)[1]).total_bits () == __CHAR_BIT__ * 2 * sizeof (void *));
+ #endif
+ static_assert (is_base (bases_of (^^N, uctx)[2]));
+ static_assert (parent_of (bases_of (^^N, uctx)[2]) == ^^N);
+ static_assert (type_of (bases_of (^^N, uctx)[2]) == ^^A);
+ static_assert (identifier_of (bases_of (^^N, uctx)[2]) == "A");
+ static_assert (is_accessible (bases_of (^^N, uctx)[2], gctx));
+ static_assert (size_of (bases_of (^^N, uctx)[2]) == sizeof (A));
+ #if (__SIZEOF_POINTER__ == 4 || __SIZEOF_POINTER__ == 8) && __SIZEOF_INT__ == 4 && __CHAR_BIT__ == 8
+ // For LP64, N::n is in the of M and then comes the A base.
+ // For ILP32 N::n is after the M base.
+ static_assert (offset_of (bases_of (^^N, uctx)[2]).total_bits () == __CHAR_BIT__ * (4 * sizeof (void *) + (sizeof (void *) == 8 ? 0 : sizeof (int))));
+ static_assert (offset_of (^^N::n).total_bits () == __CHAR_BIT__  * (4 * sizeof (void *) - ((sizeof (void *) == 8 ? sizeof (int) : 0))));
+ #endif
+ 
+ static_assert (bases_of (^^A, gctx).size () == 0);
+ static_assert (bases_of (^^B, gctx).size () == 0);
+ static_assert (bases_of (^^C, gctx).size () == 0);
+ static_assert (!has_inaccessible_bases (^^C, gctx));
+ static_assert (bases_of (^^D, gctx).size () == 0);
+ static_assert (bases_of (^^E, gctx).size () == 0);
+ static_assert (bases_of (^^F, gctx).size () == 0);
+ static_assert (bases_of (^^G, gctx).size () == 0);
+ static_assert (bases_of (^^H, gctx).size () == 0);
+ static_assert (bases_of (^^I, gctx).size () == 1);
+ static_assert (bases_of (^^I, gctx)[0] == bases_of (^^I, uctx)[0]);
+ static_assert (has_inaccessible_bases (^^I, gctx));
+ static_assert (bases_of (^^J, gctx).size () == 1);
+ static_assert (bases_of (^^J, gctx)[0] == bases_of (^^J, uctx)[2]);
+ static_assert (has_inaccessible_bases (^^J, gctx));
+ static_assert (bases_of (^^K, gctx).size () == 2);
+ static_assert (bases_of (^^K, gctx)[0] == bases_of (^^K, uctx)[0]);
+ static_assert (bases_of (^^K, gctx)[1] == bases_of (^^K, uctx)[3]);
+ static_assert (has_inaccessible_bases (^^K, gctx));
+ static_assert (bases_of (^^L, gctx).size () == 1);
+ static_assert (bases_of (^^L, gctx)[0] == bases_of (^^L, uctx)[0]);
+ static_assert (!has_inaccessible_bases (^^L, gctx));
+ static_assert (bases_of (^^M, gctx).size () == 1);
+ static_assert (bases_of (^^M, gctx)[0] == bases_of (^^M, uctx)[0]);
+ static_assert (!has_inaccessible_bases (^^L, gctx));
+ static_assert (bases_of (^^N, gctx).size () == 2);
+ static_assert (bases_of (^^N, gctx)[0] == bases_of (^^N, uctx)[0]);
+ static_assert (bases_of (^^N, gctx)[1] == bases_of (^^N, uctx)[2]);
+ static_assert (has_inaccessible_bases (^^N, gctx));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bases_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bases_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bases_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bases_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,73 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::bases_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A {};
+ struct B : virtual A {};
+ struct C : virtual A {};
+ struct D : virtual B, virtual C {};
+ struct E : virtual D {};
+ struct F : virtual D, virtual E {};
+ struct G : virtual E, virtual F {};
+ struct H : virtual A {};
+ struct I : virtual F, virtual H {};
+ struct J : virtual G, virtual I {};
+ 
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ static_assert (bases_of (^^A, uctx).size () == 0);
+ static_assert (bases_of (^^B, uctx).size () == 1);
+ static_assert (parent_of (bases_of (^^B, uctx)[0]) == ^^B);
+ static_assert (type_of (bases_of (^^B, uctx)[0]) == ^^A);
+ static_assert (offset_of (bases_of (^^B, uctx)[0]).total_bits () == 0);
+ static_assert (bases_of (^^C, uctx).size () == 1);
+ static_assert (parent_of (bases_of (^^C, uctx)[0]) == ^^C);
+ static_assert (type_of (bases_of (^^C, uctx)[0]) == ^^A);
+ static_assert (offset_of (bases_of (^^C, uctx)[0]).total_bits () == 0);
+ static_assert (bases_of (^^D, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^D, uctx)[0]) == ^^D);
+ static_assert (type_of (bases_of (^^D, uctx)[0]) == ^^B);
+ static_assert (offset_of (bases_of (^^D, uctx)[0]).total_bits () == 0);
+ static_assert (parent_of (bases_of (^^D, uctx)[1]) == ^^D);
+ static_assert (type_of (bases_of (^^D, uctx)[1]) == ^^C);
+ static_assert (offset_of (bases_of (^^D, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (bases_of (^^E, uctx).size () == 1);
+ static_assert (parent_of (bases_of (^^E, uctx)[0]) == ^^E);
+ static_assert (type_of (bases_of (^^E, uctx)[0]) == ^^D);
+ static_assert (offset_of (bases_of (^^E, uctx)[0]).total_bits () == 0);
+ static_assert (bases_of (^^F, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^F, uctx)[0]) == ^^F);
+ static_assert (type_of (bases_of (^^F, uctx)[0]) == ^^D);
+ static_assert (offset_of (bases_of (^^F, uctx)[0]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (parent_of (bases_of (^^F, uctx)[1]) == ^^F);
+ static_assert (type_of (bases_of (^^F, uctx)[1]) == ^^E);
+ static_assert (offset_of (bases_of (^^F, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (bases_of (^^G, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^G, uctx)[0]) == ^^G);
+ static_assert (type_of (bases_of (^^G, uctx)[0]) == ^^E);
+ static_assert (offset_of (bases_of (^^G, uctx)[0]).total_bits () == 0);
+ static_assert (parent_of (bases_of (^^G, uctx)[1]) == ^^G);
+ static_assert (type_of (bases_of (^^G, uctx)[1]) == ^^F);
+ static_assert (offset_of (bases_of (^^G, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (bases_of (^^H, uctx).size () == 1);
+ static_assert (parent_of (bases_of (^^H, uctx)[0]) == ^^H);
+ static_assert (type_of (bases_of (^^H, uctx)[0]) == ^^A);
+ static_assert (offset_of (bases_of (^^H, uctx)[0]).total_bits () == 0);
+ static_assert (bases_of (^^I, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^I, uctx)[0]) == ^^I);
+ static_assert (type_of (bases_of (^^I, uctx)[0]) == ^^F);
+ static_assert (offset_of (bases_of (^^I, uctx)[0]).total_bits () == 0);
+ static_assert (parent_of (bases_of (^^I, uctx)[1]) == ^^I);
+ static_assert (type_of (bases_of (^^I, uctx)[1]) == ^^H);
+ static_assert (offset_of (bases_of (^^I, uctx)[1]).total_bits () == __CHAR_BIT__ * 2 * sizeof (void *));
+ static_assert (bases_of (^^J, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^J, uctx)[0]) == ^^J);
+ static_assert (type_of (bases_of (^^J, uctx)[0]) == ^^G);
+ static_assert (offset_of (bases_of (^^J, uctx)[0]).total_bits () == 0);
+ static_assert (parent_of (bases_of (^^J, uctx)[1]) == ^^J);
+ static_assert (type_of (bases_of (^^J, uctx)[1]) == ^^I);
+ static_assert (offset_of (bases_of (^^J, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (void *));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bases_of3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bases_of3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bases_of3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bases_of3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,88 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::bases_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A {};
+ struct B : private virtual A {};
+ struct C : protected virtual A {};
+ struct D : public virtual B, protected virtual C {};
+ struct E : private virtual D {};
+ struct F : public virtual D, public virtual E {};
+ struct G : protected virtual E, private virtual F {};
+ struct H : protected virtual A {};
+ struct I : public virtual F, private virtual H {};
+ struct J : virtual G, virtual I {};
+ 
+ constexpr access_context gctx = access_context::current ();
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ static_assert (bases_of (^^A, uctx).size () == 0);
+ static_assert (bases_of (^^B, uctx).size () == 1);
+ static_assert (parent_of (bases_of (^^B, uctx)[0]) == ^^B);
+ static_assert (type_of (bases_of (^^B, uctx)[0]) == ^^A);
+ static_assert (offset_of (bases_of (^^B, uctx)[0]).total_bits () == 0);
+ static_assert (!is_accessible (bases_of (^^B, uctx)[0], gctx));
+ static_assert (bases_of (^^C, uctx).size () == 1);
+ static_assert (parent_of (bases_of (^^C, uctx)[0]) == ^^C);
+ static_assert (type_of (bases_of (^^C, uctx)[0]) == ^^A);
+ static_assert (offset_of (bases_of (^^C, uctx)[0]).total_bits () == 0);
+ static_assert (!is_accessible (bases_of (^^C, uctx)[0], gctx));
+ static_assert (bases_of (^^D, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^D, uctx)[0]) == ^^D);
+ static_assert (type_of (bases_of (^^D, uctx)[0]) == ^^B);
+ static_assert (offset_of (bases_of (^^D, uctx)[0]).total_bits () == 0);
+ static_assert (is_accessible (bases_of (^^D, uctx)[0], gctx));
+ static_assert (parent_of (bases_of (^^D, uctx)[1]) == ^^D);
+ static_assert (type_of (bases_of (^^D, uctx)[1]) == ^^C);
+ static_assert (offset_of (bases_of (^^D, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (!is_accessible (bases_of (^^D, uctx)[1], gctx));
+ static_assert (bases_of (^^E, uctx).size () == 1);
+ static_assert (parent_of (bases_of (^^E, uctx)[0]) == ^^E);
+ static_assert (type_of (bases_of (^^E, uctx)[0]) == ^^D);
+ static_assert (offset_of (bases_of (^^E, uctx)[0]).total_bits () == 0);
+ static_assert (!is_accessible (bases_of (^^E, uctx)[0], gctx));
+ static_assert (bases_of (^^F, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^F, uctx)[0]) == ^^F);
+ static_assert (type_of (bases_of (^^F, uctx)[0]) == ^^D);
+ static_assert (offset_of (bases_of (^^F, uctx)[0]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (is_accessible (bases_of (^^F, uctx)[0], gctx));
+ static_assert (parent_of (bases_of (^^F, uctx)[1]) == ^^F);
+ static_assert (type_of (bases_of (^^F, uctx)[1]) == ^^E);
+ static_assert (offset_of (bases_of (^^F, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (is_accessible (bases_of (^^F, uctx)[1], gctx));
+ static_assert (bases_of (^^G, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^G, uctx)[0]) == ^^G);
+ static_assert (type_of (bases_of (^^G, uctx)[0]) == ^^E);
+ static_assert (offset_of (bases_of (^^G, uctx)[0]).total_bits () == 0);
+ static_assert (!is_accessible (bases_of (^^G, uctx)[0], gctx));
+ static_assert (parent_of (bases_of (^^G, uctx)[1]) == ^^G);
+ static_assert (type_of (bases_of (^^G, uctx)[1]) == ^^F);
+ static_assert (offset_of (bases_of (^^G, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (!is_accessible (bases_of (^^G, uctx)[1], gctx));
+ static_assert (bases_of (^^H, uctx).size () == 1);
+ static_assert (parent_of (bases_of (^^H, uctx)[0]) == ^^H);
+ static_assert (type_of (bases_of (^^H, uctx)[0]) == ^^A);
+ static_assert (offset_of (bases_of (^^H, uctx)[0]).total_bits () == 0);
+ static_assert (!is_accessible (bases_of (^^H, uctx)[0], gctx));
+ static_assert (bases_of (^^I, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^I, uctx)[0]) == ^^I);
+ static_assert (type_of (bases_of (^^I, uctx)[0]) == ^^F);
+ static_assert (offset_of (bases_of (^^I, uctx)[0]).total_bits () == 0);
+ static_assert (is_accessible (bases_of (^^I, uctx)[0], gctx));
+ static_assert (parent_of (bases_of (^^I, uctx)[1]) == ^^I);
+ static_assert (type_of (bases_of (^^I, uctx)[1]) == ^^H);
+ static_assert (offset_of (bases_of (^^I, uctx)[1]).total_bits () == __CHAR_BIT__ * 2 * sizeof (void *));
+ static_assert (!is_accessible (bases_of (^^I, uctx)[1], gctx));
+ static_assert (bases_of (^^J, uctx).size () == 2);
+ static_assert (parent_of (bases_of (^^J, uctx)[0]) == ^^J);
+ static_assert (type_of (bases_of (^^J, uctx)[0]) == ^^G);
+ static_assert (offset_of (bases_of (^^J, uctx)[0]).total_bits () == 0);
+ static_assert (is_accessible (bases_of (^^J, uctx)[0], gctx));
+ static_assert (parent_of (bases_of (^^J, uctx)[1]) == ^^J);
+ static_assert (type_of (bases_of (^^J, uctx)[1]) == ^^I);
+ static_assert (offset_of (bases_of (^^J, uctx)[1]).total_bits () == __CHAR_BIT__ * sizeof (void *));
+ static_assert (is_accessible (bases_of (^^J, uctx)[1], gctx));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bit_size_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bit_size_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bit_size_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bit_size_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,125 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::bit_size_of.
+ 
+ #include <meta>
+ #include <climits>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ extern int arr2[];
+ extern int arr3[2];
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+ };
+ struct U {
+   int u;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ int &ref = arr[0];
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ consteval bool
+ has_bit_size_of (info r)
+ {
+   try { bit_size_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (has_bit_size_of (std::meta::reflect_constant (42)));
+ static_assert (has_bit_size_of (std::meta::reflect_object (arr[1])));
+ static_assert (has_bit_size_of (^^arr));
+ static_assert (!has_bit_size_of (^^a3));
+ static_assert (!has_bit_size_of (^^fn));
+ static_assert (!has_bit_size_of (^^fn2));
+ static_assert (!has_bit_size_of (^^Enum::A));
+ static_assert (has_bit_size_of (^^Alias));
+ static_assert (has_bit_size_of (^^S));
+ static_assert (has_bit_size_of (^^S::mem));
+ static_assert (has_bit_size_of (std::meta::members_of (^^S, ctx)[1]));
+ static_assert (!has_bit_size_of (^^TCls));
+ static_assert (!has_bit_size_of (^^TFn));
+ static_assert (!has_bit_size_of (^^TVar));
+ static_assert (!has_bit_size_of (^^Concept));
+ static_assert (!has_bit_size_of (^^NSAlias));
+ static_assert (!has_bit_size_of (^^NS));
+ static_assert (has_bit_size_of (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (has_bit_size_of (std::meta::data_member_spec (^^int, { .name = "member" })));
+ static_assert (has_bit_size_of (std::meta::data_member_spec (^^int, { .name = "member2", .bit_width = 6 })));
+ static_assert (!has_bit_size_of (^^arr2));
+ static_assert (has_bit_size_of (^^arr3));
+ static_assert (!has_bit_size_of (^^ref));
+ static_assert (bit_size_of (^^arr) == CHAR_BIT * sizeof (arr));
+ static_assert (bit_size_of (std::meta::reflect_constant (42)) == CHAR_BIT * sizeof (int));
+ static_assert (bit_size_of (^^Alias) == CHAR_BIT * sizeof (int));
+ static_assert (bit_size_of (^^S) == CHAR_BIT * sizeof (S));
+ static_assert (bit_size_of (^^S::mem) == CHAR_BIT * sizeof (S::mem));
+ static_assert (bit_size_of (^^arr3) == CHAR_BIT * sizeof (arr3));
+ using fnt = int (int, int);
+ static_assert (!has_bit_size_of (^^fnt));
+ void bar (long, const T f, int g[2], T &);
+ 
+ int
+ foo (int a, const long b, T c, int d[4], T &e, int f)
+ {
+   static_assert (has_bit_size_of (^^a));
+   static_assert (has_bit_size_of (^^b));
+   static_assert (has_bit_size_of (^^c));
+   static_assert (has_bit_size_of (^^d));
+   static_assert (!has_bit_size_of (^^e));
+   static_assert (!has_bit_size_of (parameters_of (^^foo)[0]));
+   static_assert (!has_bit_size_of (parameters_of (^^foo)[5]));
+   static_assert (!has_bit_size_of (parameters_of (^^bar)[0]));
+   static_assert (bit_size_of (^^a) == CHAR_BIT * sizeof (int));
+   static_assert (bit_size_of (^^b) == CHAR_BIT * sizeof (long));
+   static_assert (bit_size_of (^^c) == CHAR_BIT * sizeof (T));
+   static_assert (bit_size_of (^^d) == CHAR_BIT * sizeof (int *));
+   return 0;
+ }
+ 
+ struct V
+ {
+   char a;
+   long long f;
+   int : 2;
+   int g : 3;
+   int &h;
+   long long i : sizeof (long long) * CHAR_BIT - 3;
+ };
+ using CV = const V;
+ 
+ static_assert (bit_size_of (^^int) == CHAR_BIT * sizeof (int));
+ static_assert (bit_size_of (^^char) == CHAR_BIT * sizeof (char));
+ static_assert (bit_size_of (^^V) == CHAR_BIT * sizeof (V));
+ static_assert (bit_size_of (^^CV) == CHAR_BIT * sizeof (V));
+ static_assert (bit_size_of (^^char *) == CHAR_BIT * sizeof (char *));
+ static_assert (bit_size_of (^^char &) == CHAR_BIT * sizeof (char *));
+ static_assert (sizeof (char) == sizeof (char *) || bit_size_of (^^char &) != CHAR_BIT * sizeof (char &));
+ static_assert (bit_size_of (^^V::a) == CHAR_BIT * sizeof (char));
+ static_assert (bit_size_of (^^V::f) == CHAR_BIT * sizeof (long long));
+ static_assert (bit_size_of (^^V::g) == 3);
+ static_assert (bit_size_of (^^V::h) == CHAR_BIT * sizeof (int *));
+ static_assert (bit_size_of (^^V::i) == CHAR_BIT * sizeof (long long) - 3);
+ static_assert (bit_size_of (std::meta::bases_of (^^S, ctx)[0]) == CHAR_BIT * sizeof (B));
+ static_assert (bit_size_of (std::meta::data_member_spec (^^int, { .name = "member" })) == CHAR_BIT * sizeof (int));
+ static_assert (bit_size_of (std::meta::data_member_spec (^^int, { .name = "member2", .bit_width = 6 })) == 6);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bitfield1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bitfield1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/bitfield1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/bitfield1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct A {
+   int x : 4, y : 4;
+ };
+ 
+ constexpr auto f() {
+   return &[:^^A::y:];  // { dg-error "invalid pointer to bit-field .A::y." }
+ }
+ 
+ static_assert(2 == A{1, 2}.*(f()));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/can_substitute1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/can_substitute1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/can_substitute1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/can_substitute1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,200 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::can_substitute.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ template <reflection_range R = std::initializer_list <info>>
+ consteval bool
+ could_substitute (info r, R &&args)
+ {
+   try { can_substitute (r, args); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!could_substitute (null_reflection, {}));
+ static_assert (!could_substitute (^^::, {}));
+ static_assert (!could_substitute (^^ns, {}));
+ static_assert (!could_substitute (^^ns_alias, {}));
+ static_assert (!could_substitute (reflect_constant (3), {}));
+ static_assert (!could_substitute (^^cls, {}));
+ static_assert (!could_substitute (^^cls::dm, {}));
+ static_assert (!could_substitute (^^cls::ref_dm, {}));
+ static_assert (!could_substitute (^^cls::static_dm, {}));
+ static_assert (!could_substitute (^^cls::mem_fun, {}));
+ static_assert (!could_substitute (^^cls::static_mem_fun, {}));
+ static_assert (!could_substitute (^^cls::type, {}));
+ static_assert (!could_substitute (^^cls_var, {}));
+ static_assert (!could_substitute (^^onion, {}));
+ static_assert (!could_substitute (^^anon, {}));
+ static_assert (!could_substitute (^^fun, {}));
+ static_assert (!could_substitute (^^alias, {}));
+ static_assert (!could_substitute (^^var, {}));
+ static_assert (!could_substitute (^^ref, {}));
+ static_assert (!could_substitute (^^rref, {}));
+ static_assert (!could_substitute (^^ptr, {}));
+ static_assert (could_substitute (^^cls_tmpl, {}));
+ static_assert (!could_substitute (^^cls_tmpl<int>, {}));
+ static_assert (!could_substitute (^^incomplete_cls<int>, {}));
+ static_assert (could_substitute (^^fun_tmpl, {}));
+ static_assert (!could_substitute (^^fun_tmpl<int>, {}));
+ static_assert (could_substitute (^^conc, {}));
+ static_assert (!could_substitute (substitute (^^conc, { ^^int }), {}));
+ static_assert (could_substitute (^^var_tmpl, {}));
+ static_assert (!could_substitute (^^var_tmpl<int>, {}));
+ static_assert (could_substitute (^^cls_tmpl_alias, {}));
+ static_assert (!could_substitute (^^cls_tmpl_alias<int>, {}));
+ static_assert (!could_substitute (^^Enum, {}));
+ static_assert (!could_substitute (^^Enum::A, {}));
+ static_assert (!could_substitute (^^Enum_class, {}));
+ static_assert (!could_substitute (^^Enum_class::A, {}));
+ static_assert (!could_substitute (^^decomp, {}));
+ static_assert (!could_substitute (^^decomp_ref, {}));
+ static_assert (!could_substitute (^^arr, {}));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "a" });
+ static_assert (!could_substitute (dms, {}));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!could_substitute (bases_of (^^Derived, access_context::unchecked ())[0], {}));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!could_substitute (^^T, {}));
+   static_assert (!could_substitute (R, {}));
+   static_assert (!could_substitute (R2, {}));
+   static_assert (could_substitute (R3, {}));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls_tmpl_alias>();
+   static_assert (!could_substitute (^^p, {}));
+   static_assert (!could_substitute (^^c, {}));
+ }
+ 
+ template <typename T>
+ struct S {};
+ 
+ template <float F, int N>
+ struct T {};
+ 
+ template <typename ...T>
+ struct U {};
+ 
+ template <typename T>
+ T foo (T x) { return x; }
+ 
+ template <int N>
+ constexpr int v = N;
+ 
+ template <typename T>
+ concept C = requires { T::s; };
+ 
+ struct V { int s; };
+ 
+ struct NS {
+   constexpr NS (int x) : ns (x) {}
+   constexpr NS (const NS &x) : ns (x.ns) {}
+   constexpr ~NS () {}
+ private:
+   int ns;
+ };
+ [[=1]] void bar (int x);
+ 
+ static_assert (could_substitute (^^S, {}));
+ static_assert (!could_substitute (^^S, { null_reflection }));
+ static_assert (!could_substitute (^^S, { parameters_of (^^bar)[0] }));
+ static_assert (!could_substitute (^^S, { annotations_of (^^bar)[0] }));
+ static_assert (!could_substitute (^^S, { ^^:: }));
+ static_assert (!could_substitute (^^S, { ^^ns }));
+ static_assert (!could_substitute (^^S, { ^^ns_alias }));
+ static_assert (!could_substitute (^^S, { ^^NS::~NS }));
+ static_assert (could_substitute (^^S, { reflect_constant (42) }));
+ constexpr int n = 42;
+ static_assert (could_substitute (^^S, { ^^n }));
+ constexpr NS nsv (42);
+ static_assert (could_substitute (^^S, { ^^nsv }));
+ 
+ static_assert (!can_substitute (^^S, {}));
+ static_assert (can_substitute (^^S, { ^^int }));
+ static_assert (can_substitute (^^S, { ^^V }));
+ static_assert (can_substitute (^^S, { ^^NS }));
+ static_assert (!can_substitute (^^S, { ^^int, ^^long }));
+ static_assert (!can_substitute (^^S, { reflect_constant (42) }));
+ static_assert (!can_substitute (^^S, { ^^n }));
+ static_assert (!can_substitute (^^S, { ^^nsv }));
+ static_assert (!can_substitute (^^T, {}));
+ static_assert (!can_substitute (^^T, { ^^float, ^^int }));
+ constexpr float fv = 42.0f;
+ static_assert (can_substitute (^^T, { ^^fv, reflect_constant (42) }));
+ static_assert (can_substitute (^^T, { ^^fv, reflect_constant (0) }));
+ static_assert (can_substitute (^^T, { ^^fv, ^^n }));
+ static_assert (!can_substitute (^^T, { ^^n, ^^fv }));
+ static_assert (!can_substitute (^^T, { ^^fv, ^^n, ^^fv }));
+ 
+ static_assert (can_substitute (^^U, {}));
+ static_assert (can_substitute (^^U, { ^^int }));
+ static_assert (can_substitute (^^U, { ^^int, ^^long, ^^const int &, ^^float, ^^double }));
+ static_assert (!can_substitute (^^U, { ^^int, ^^long, ^^const int &, ^^n, ^^float }));
+ 
+ static_assert (!can_substitute (^^v, {}));
+ static_assert (can_substitute (^^v, { reflect_constant (15) }));
+ static_assert (can_substitute (^^v, { ^^n }));
+ static_assert (!can_substitute (^^v, { ^^n, ^^n }));
+ static_assert (!can_substitute (^^v, { ^^int }));
+ 
+ static_assert (!can_substitute (^^C, {}));
+ static_assert (can_substitute (^^C, { ^^int }));
+ static_assert (can_substitute (^^C, { ^^V }));
+ static_assert (!can_substitute (^^C, { ^^int, ^^int }));
+ static_assert (!can_substitute (^^C, { reflect_constant (42) }));
+ static_assert (!can_substitute (^^C, { ^^n }));
+ 
+ static_assert (!can_substitute (^^foo, {}));
+ static_assert (can_substitute (^^foo, { ^^int }));
+ static_assert (can_substitute (^^foo, { ^^V }));
+ static_assert (can_substitute (^^foo, { ^^NS }));
+ static_assert (!can_substitute (^^foo, { ^^int, ^^long }));
+ static_assert (!can_substitute (^^foo, { reflect_constant (42) }));
+ static_assert (!can_substitute (^^foo, { ^^n }));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/class1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/class1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/class1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/class1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on classes.
+ 
+ struct S {
+   using T = int;
+ };
+ 
+ void
+ f1 ()
+ {
+   constexpr auto s = ^^S;
+   [: s :]::T i = 42;
+   typename [: s :]::T j = 42;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/class2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/class2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/class2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/class2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,27 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test using a splice expression in an explicit destructor call.
+ 
+ struct S { };
+ struct X { };
+ 
+ void
+ ok (S s)
+ {
+   /* [class.dtor]/16:
+      In an explicit destructor call, the destructor is specified by
+      a ~ followed by a type-name or computed-type-specifier that
+      denotes the destructor's class type.  */
+   s.~typename [:^^S:]();
+ }
+ 
+ void
+ bad (S s)
+ {
+   /* [expr.prim.splice]/2.1.2
+      For a splice-expression of the form splice-specifier, let S be
+      the construct designated by splice-specifier. The expression is
+      ill-formed if S is [...] a destructor  */
+   s.~[:^^S:](); // { dg-error "expected" }
+   s.~typename [:^^X:](); // { dg-error "the destructor refers to .X." }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/common_reference1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/common_reference1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/common_reference1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/common_reference1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,61 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::common_reference.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ template <reflection_range R = std::initializer_list <info>>
+ consteval bool
+ has_common_reference (R &&args)
+ {
+   try { common_reference (args); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ struct A { };
+ struct B { };
+ struct C { };
+ struct D { };
+ struct E { };
+ struct F { };
+ 
+ template<template<typename> class AQual, template<typename> class BQual>
+ struct std::basic_common_reference<A, B, AQual, BQual>
+ {
+   using type = BQual<AQual<C>>;
+ };
+ 
+ template<> struct std::common_type<D, E> { using type = F; };
+ 
+ static_assert (common_reference ({ ^^int }) == ^^int);
+ static_assert (common_reference ({ ^^int & }) == ^^int &);
+ static_assert (common_reference ({ ^^void }) == ^^void);
+ static_assert (common_reference ({ ^^const void }) == ^^const void);
+ static_assert (common_reference ({ ^^const void, ^^void }) == ^^void);
+ static_assert (common_reference ({ ^^void (*const) (), ^^void (*) () }) == ^^void (*) ());
+ static_assert (common_reference ({ ^^int, ^^int }) == ^^int);
+ static_assert (common_reference ({ ^^int &, ^^int }) == ^^int);
+ static_assert (common_reference ({ ^^int, ^^int & }) == ^^int);
+ static_assert (common_reference ({ ^^int &&, ^^int }) == ^^int);
+ static_assert (common_reference ({ ^^int &, ^^int & }) == ^^int &);
+ static_assert (common_reference ({ ^^int &, ^^int && }) == ^^const int &);
+ static_assert (common_reference ({ ^^int &&, ^^int & }) == ^^const int &);
+ static_assert (common_reference ({ ^^int &&, ^^int && }) == ^^int &&);
+ static_assert (common_reference ({ ^^int &&, ^^const int && }) == ^^const int &&);
+ static_assert (common_reference ({ ^^int &, ^^int &, ^^int && }) == ^^const int &);
+ static_assert (common_reference ({ ^^int &&, ^^int &, ^^int & }) == ^^const int &);
+ static_assert (common_reference ({ ^^char &, ^^int & }) == ^^int);
+ static_assert (common_reference ({ ^^long &, ^^int & }) == ^^long);
+ static_assert (common_reference ({ ^^A, ^^B }) == ^^C);
+ static_assert (common_reference ({ ^^A &, ^^B }) == ^^C &);
+ static_assert (common_reference ({ ^^A &, ^^const B }) == ^^C &);
+ static_assert (common_reference ({ ^^const A, ^^B & }) == ^^const C &);
+ static_assert (common_reference ({ ^^const A &, ^^B && }) == ^^const C &);
+ static_assert (common_reference ({ ^^const A, ^^B && }) == ^^const C &&);
+ static_assert (common_reference ({ ^^D, ^^E }) == ^^F);
+ static_assert (common_reference ({ ^^D &, ^^E }) == ^^F);
+ static_assert (common_reference ({ ^^D &, ^^E && }) == ^^F);
+ static_assert (!has_common_reference ({ ^^::, ^^int }));
+ static_assert (!has_common_reference ({ ^^int, ^^int, ^^std }));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/common_type1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/common_type1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/common_type1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/common_type1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,151 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::common_type.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ template <reflection_range R = std::initializer_list <info>>
+ consteval bool
+ has_common_type (R &&args)
+ {
+   try { common_type (args); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ struct S {};
+ struct B {};
+ struct D : B {};
+ struct F1 { operator void * (); };
+ struct F2 { operator void * (); };
+ struct G1 { operator const void * (); };
+ struct G2 { operator volatile void * (); };
+ template <typename T>
+ struct ImplicitTo { operator T (); };
+ template <typename T>
+ struct ExplicitTo { explicit operator T (); };
+ template <typename T>
+ struct PrivateImplicitTo { private: operator T (); };
+ auto lmd1 = [] (int, double) {};
+ auto lmd2 = [] (int, double) {};
+ struct Abstract { virtual ~Abstract () = 0; };
+ enum class ScEn;
+ enum UnscEn : int;
+ struct Ukn;
+ union U { int i; };
+ union U2 { long i; };
+ union UConv1 { operator Abstract * (); };
+ union UConv2 { operator Abstract * (); };
+ struct X1 {};
+ struct X2 {};
+ struct RX12 {};
+ struct RX21 {};
+ struct Y1 {};
+ struct Y2 {};
+ struct Y3 {};
+ struct Y4 {};
+ 
+ namespace std {
+   template <>
+   struct common_type <X1, X2> { typedef RX12 type; };
+   template <>
+   struct common_type <X2, X1> { typedef RX21 type; };
+   template <>
+   struct common_type <RX12, X1> { typedef Y1 type; };
+   template <>
+   struct common_type <X1, RX12> { typedef Y2 type; };
+   template <>
+   struct common_type <RX21, X1> { typedef Y3 type; };
+   template <>
+   struct common_type <X1, RX21> { typedef Y4 type; };
+ }
+ 
+ using A = int;
+ static_assert (common_type ({ ^^int }) == ^^int);
+ static_assert (common_type ({ ^^A }) == ^^int);
+ static_assert (common_type ({ ^^const int }) == ^^int);
+ static_assert (common_type ({ ^^int, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^A, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^A, ^^A }) == ^^int);
+ static_assert (common_type ({ ^^const int, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^ScEn, ^^ScEn }) == ^^ScEn);
+ static_assert (common_type ({ ^^UnscEn, ^^UnscEn }) == ^^UnscEn);
+ static_assert (common_type ({ ^^UnscEn, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^int, ^^int, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^int, ^^int, ^^int, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^int, ^^int, ^^int, ^^int, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^S, ^^S }) == ^^S);
+ static_assert (common_type ({ ^^const S, ^^const S }) == ^^S);
+ static_assert (common_type ({ ^^std::initializer_list<int>, ^^std::initializer_list<int> }) == ^^std::initializer_list<int>);
+ static_assert (common_type ({ ^^B, ^^D }) == ^^B);
+ static_assert (common_type ({ ^^D, ^^B }) == ^^B);
+ static_assert (common_type ({ ^^F1, ^^F2 }) == ^^void *);
+ static_assert (common_type ({ ^^F2, ^^F1 }) == ^^void *);
+ static_assert (common_type ({ ^^G1, ^^G2 }) == ^^const volatile void *);
+ static_assert (common_type ({ ^^G2, ^^G1 }) == ^^const volatile void *);
+ static_assert (common_type ({ ^^int *, ^^const volatile int * }) == ^^const volatile int *);
+ static_assert (common_type ({ ^^void *, ^^const volatile int * }) == ^^const volatile void *);
+ static_assert (common_type ({ ^^void }) == ^^void);
+ static_assert (common_type ({ ^^const void }) == ^^void);
+ static_assert (common_type ({ ^^void, ^^void }) == ^^void);
+ static_assert (common_type ({ ^^const void, ^^const void }) == ^^void);
+ static_assert (common_type ({ ^^int &, ^^int && }) == ^^int);
+ static_assert (common_type ({ ^^int &, ^^int & }) == ^^int);
+ static_assert (common_type ({ ^^int &&, ^^int && }) == ^^int);
+ static_assert (common_type ({ ^^int &&, ^^const int && }) == ^^int);
+ static_assert (common_type ({ ^^U &, ^^const U && }) == ^^U);
+ static_assert (common_type ({ ^^U &, ^^U & }) == ^^U);
+ static_assert (common_type ({ ^^U &&, ^^U && }) == ^^U);
+ static_assert (common_type ({ ^^int B::*, ^^int D::* }) == ^^int D::*);
+ static_assert (common_type ({ ^^int D::*, ^^int B::* }) == ^^int D::*);
+ static_assert (common_type ({ ^^const int B::*, ^^volatile int D::* }) == ^^const volatile int D::*);
+ static_assert (common_type ({ ^^int (B::*) (), ^^int (D::*) () }) == ^^int (D::*) ());
+ static_assert (common_type ({ ^^int (B::*) () const, ^^int (D::*) () const }) == ^^int (D::*) () const);
+ static_assert (common_type ({ ^^int [3], ^^int [3] }) == ^^int *);
+ static_assert (common_type ({ ^^int [1], ^^const int [3] }) == ^^const int *);
+ static_assert (common_type ({ ^^void (), ^^void () }) == ^^void (*) ());
+ static_assert (common_type ({ ^^void (&) (), ^^void (&) () }) == ^^void (*) ());
+ static_assert (common_type ({ ^^void (&) (), ^^void (&&) () }) == ^^void (*) ());
+ static_assert (common_type ({ ^^void (&&) (), ^^void (&) () }) == ^^void (*) ());
+ static_assert (common_type ({ ^^void (&&) (), ^^void (&&) () }) == ^^void (*) ());
+ static_assert (common_type ({ ^^ImplicitTo<int>, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^const ImplicitTo<int>, ^^int }) == ^^int);
+ static_assert (common_type ({ ^^ImplicitTo<int>, ^^ImplicitTo<int> }) == ^^ImplicitTo<int>);
+ static_assert (common_type ({ ^^ImplicitTo<int>, ^^int, ^^ImplicitTo<int> }) == ^^int);
+ static_assert (common_type ({ ^^ExplicitTo<int>, ^^ExplicitTo<int> }) == ^^ExplicitTo<int>);
+ static_assert (common_type ({ ^^decltype (lmd1), ^^decltype (lmd1) }) == ^^decltype (lmd1));
+ static_assert (common_type ({ ^^decltype (lmd1) &, ^^decltype (lmd1) & }) == ^^decltype (lmd1));
+ static_assert (common_type ({ ^^decltype (lmd1) &, ^^decltype (lmd2) & }) == ^^void (*) (int, double));
+ static_assert (common_type ({ ^^decltype (nullptr), ^^void * }) == ^^void *);
+ static_assert (common_type ({ ^^decltype (nullptr), ^^int * }) == ^^int *);
+ static_assert (common_type ({ ^^const decltype (nullptr) &, ^^int * }) == ^^int *);
+ static_assert (common_type ({ ^^decltype (nullptr), ^^const volatile int * }) == ^^const volatile int *);
+ static_assert (common_type ({ ^^decltype (nullptr), ^^int (B::*) () }) == ^^int (B::*) ());
+ static_assert (common_type ({ ^^decltype (nullptr), ^^int (B::*) () const }) == ^^int (B::*) () const);
+ static_assert (common_type ({ ^^decltype (nullptr), ^^const int B::* }) == ^^const int B::*);
+ static_assert (common_type ({ ^^Abstract &, ^^Abstract & }) == ^^Abstract);
+ static_assert (common_type ({ ^^Ukn &, ^^Ukn & }) == ^^Ukn);
+ static_assert (common_type ({ ^^ImplicitTo<B &>, ^^B & }) == ^^B);
+ static_assert (common_type ({ ^^ImplicitTo<B &> &, ^^B && }) == ^^B);
+ static_assert (common_type ({ ^^UConv1, ^^const Abstract * & }) == ^^const Abstract *);
+ static_assert (common_type ({ ^^UConv1, ^^UConv2 }) == ^^Abstract *);
+ static_assert (common_type ({ ^^UConv1 &, ^^UConv2 & }) == ^^Abstract *);
+ static_assert (common_type ({ ^^Abstract &&, ^^Abstract && }) == ^^Abstract);
+ static_assert (common_type ({ ^^const Abstract &&, ^^const Abstract && }) == ^^Abstract);
+ static_assert (common_type ({ ^^volatile Abstract &&, ^^volatile Abstract && }) == ^^Abstract);
+ static_assert (common_type ({ ^^Ukn &&, ^^Ukn && }) == ^^Ukn);
+ static_assert (common_type ({ ^^const Ukn &&, ^^const Ukn && }) == ^^Ukn);
+ static_assert (common_type ({ ^^volatile Ukn &&, ^^volatile Ukn && }) == ^^Ukn);
+ static_assert (common_type ({ ^^X1, ^^X2 }) == ^^RX12);
+ static_assert (common_type ({ ^^const X1, ^^X2 }) == ^^RX12);
+ static_assert (common_type ({ ^^X1 &, ^^const X2 }) == ^^RX12);
+ static_assert (common_type ({ ^^const X1 &, ^^const X2 & }) == ^^RX12);
+ static_assert (common_type ({ ^^X2, ^^X1 }) == ^^RX21);
+ static_assert (common_type ({ ^^X1, ^^X2, ^^X1 }) == ^^Y1);
+ static_assert (common_type ({ ^^X2, ^^X1, ^^X1 }) == ^^Y3);
+ static_assert (common_type ({ ^^X1, ^^X1, ^^X2 }) == ^^RX12);
+ static_assert (common_type ({ ^^X1 &, ^^const X1, ^^const X2 && }) == ^^RX12);
+ static_assert (common_type ({ ^^X1, ^^X1, ^^X2, ^^X1 }) == ^^Y1);
+ static_assert (!has_common_type ({ ^^::, ^^int }));
+ static_assert (!has_common_type ({ ^^int, ^^int, ^^std }));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,38 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test comparison of reflections.  Valid uses.
+ 
+ #include <meta>
+ 
+ namespace N {
+   namespace M {
+   }
+ }
+ 
+ namespace NN = N;
+ namespace NM = N::M;
+ 
+ static_assert(^^int == ^^int);
+ static_assert(^^int != ^^const int);
+ static_assert(^^int != ^^int &);
+ static_assert(^^int const == ^^const int);
+ 
+ static_assert(^^char == ^^char);
+ static_assert(^^char != ^^unsigned char);
+ static_assert(^^char != ^^signed char);
+ 
+ static_assert(^^:: == ^^::);
+ static_assert(^^:: != ^^N);
+ static_assert(^^N == ^^N);
+ static_assert(^^N != ^^N::M);
+ static_assert(^^N != ^^NN);
+ static_assert(^^N::M == ^^N::M);
+ static_assert(^^N::M != ^^NM);
+ 
+ using Alias = int;
+ static_assert(^^int != ^^Alias);
+ static_assert(^^int == std::meta::dealias (^^Alias));
+ 
+ namespace AliasNS = ::std;
+ static_assert(^^::std != ^^AliasNS);
+ static_assert(^^:: == parent_of(^^::std));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test comparing COMPONENT_REFs.
+ 
+ #include <meta>
+ 
+ struct S { int x, y; };
+ 
+ consteval auto f(S &s) {
+   return std::meta::reflect_object(s.x);
+ }
+ 
+ S s;
+ int& x = s.x;
+ static_assert(object_of(^^x) == f(s));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test comparison of reflections.  Invalid uses.
+ 
+ consteval void
+ f ()
+ {
+   bool b = ^^int > ^^int;   // { dg-error "invalid operands of types .std::meta::info. and .std::meta::info. to binary" }
+   b = ^^int >= ^^int;	    // { dg-error "invalid operands of types .std::meta::info. and .std::meta::info. to binary" }
+   b = ^^int <= ^^int;	    // { dg-error "invalid operands of types .std::meta::info. and .std::meta::info. to binary" }
+   +^^int;		    // { dg-error "wrong type argument to unary plus" }
+   !^^int;		    // { dg-error "could not convert .\\^\\^int. from .std::meta::info. to .bool." }
+ 			    // { dg-error "in argument to unary" "" { target *-*-* } .-1 }
+   ~^^int;		    // { dg-error "wrong type argument to bit-complement" }
+   *^^int;		    // { dg-error "invalid type argument of unary" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,24 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test comparison of reflections.
+ 
+ namespace N {
+ namespace foo {
+ struct foo {
+   static_assert(^^foo == ^^::N::foo::foo);
+ };
+ static_assert(^^foo == ^^::N::foo::foo);
+ }
+ 
+ namespace tfoo {
+ template <typename T> struct tfoo {
+   static_assert(^^tfoo == ^^tfoo<T>);
+ };
+ static_assert(^^tfoo == ^^::N::tfoo::tfoo);
+ 
+ tfoo<int> instantiation;
+ }
+ 
+ static_assert(^^foo == ^^::N::foo);
+ static_assert(^^tfoo == ^^::N::tfoo);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,27 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test comparison of reflections.
+ 
+ using info = decltype(^^void);
+ 
+ int x;
+ void fn();
+ struct S {
+   int x;
+   static constexpr int s_x = 11;
+   void fn();
+   static void s_fn();
+ };
+ enum Enum { A, B, C };
+ enum class EnumCls { A, B, C };
+ 
+ static_assert(&[:^^x:] == &x);
+ static_assert([:^^fn:] == fn);
+ 
+ static_assert(&[:^^S::x:] == &S::x);
+ static_assert(&[:^^S::s_x:] == &S::s_x);
+ static_assert(&[:^^S::fn:] == &S::fn);
+ static_assert([:^^S::s_fn:] == S::s_fn);
+ 
+ static_assert([:^^Enum::B:] == Enum::B);
+ static_assert([:^^EnumCls::B:] == EnumCls::B);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test splicing of explicit object member functions.
+ 
+ struct Y {
+     int g(this Y const&, int, int);
+ };
+ static_assert(&Y::g == &[:^^Y::g:]);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ enum Enum { A, B, C };
+ enum class EnumCls { A, B, C };
+ 
+ constexpr info rB = ^^B, rClsB = ^^EnumCls::B;
+ static_assert(rB != rClsB);
+ static_assert(int([:rB:]) == int([:rClsB:]));
+ static_assert(static_cast<Enum>([:rClsB:]) == B);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Reflection of a reflection.
+ 
+ using info = decltype(^^void);
+ constexpr info r1 = ^^int;
+ constexpr info r2 = ^^int;
+ constexpr info rr1 = ^^r1;
+ constexpr info rr2 = ^^r2;
+ static_assert (r1 == ^^int);
+ static_assert (r1 == r2);
+ static_assert (r1 != rr1);
+ static_assert (r1 != rr2);
+ static_assert (^^r1 != ^^r2);
+ static_assert (^^int != rr1);
+ static_assert (^^r1 == rr1);
+ static_assert (rr2 != rr1);
+ static_assert (rr2 != ^^r1);
+ static_assert (rr2 == ^^r2);
+ static_assert (rr1 != ^^r2);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,67 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Reflection of a reflection.
+ 
+ template <int N>
+ void
+ foo ()
+ {
+ }
+ 
+ template <typename ... T>
+ void
+ bar ()
+ {
+ }
+ 
+ template <int N>
+ struct R {};
+ 
+ template <typename ... T>
+ struct S {};
+ 
+ using info = decltype (^^int);
+ constexpr info r1 = ^^foo;
+ constexpr info r2 = ^^foo <42>;
+ constexpr info r3 = ^^foo <43>;
+ constexpr info r4 = ^^R;
+ constexpr info r5 = ^^R <42>;
+ constexpr info r6 = ^^R <43>;
+ constexpr info r7 = ^^bar;
+ constexpr info r8 = ^^bar <>;
+ constexpr info r9 = ^^bar <int>;
+ constexpr info r10 = ^^bar <int, int>;
+ constexpr info r11 = ^^bar <int, int, long>;
+ constexpr info r12 = ^^S;
+ constexpr info r13 = ^^S <>;
+ constexpr info r14 = ^^S <int>;
+ constexpr info r15 = ^^S <int, int>;
+ constexpr info r16 = ^^S <int, int, long>;
+ static_assert (r1 == ^^foo);
+ static_assert (r2 == ^^foo <42>);
+ static_assert (r3 == ^^foo <43>);
+ static_assert (r4 == ^^R);
+ static_assert (r5 == ^^R <42>);
+ static_assert (r6 == ^^R <43>);
+ static_assert (r7 == ^^bar);
+ static_assert (r8 == ^^bar <>);
+ static_assert (r9 == ^^bar <int>);
+ static_assert (r10 == ^^bar <int, int>);
+ static_assert (r11 == ^^bar <int, int, long>);
+ static_assert (r12 == ^^S);
+ static_assert (r13 == ^^S <>);
+ static_assert (r14 == ^^S <int>);
+ static_assert (r15 == ^^S <int, int>);
+ static_assert (r16 == ^^S <int, int, long>);
+ static_assert (r1 != r2);
+ static_assert (r2 != r3);
+ static_assert (r4 != r5);
+ static_assert (r5 != r6);
+ static_assert (r7 != r8);
+ static_assert (r8 != r9);
+ static_assert (r9 != r10);
+ static_assert (r10 != r11);
+ static_assert (r12 != r13);
+ static_assert (r13 != r14);
+ static_assert (r14 != r15);
+ static_assert (r15 != r16);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compare9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compare9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test comparison of reflections.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ static union { int a; };
+ struct S { void foo () {} };
+ template <typename T>
+ consteval auto bar () { int v = 42; return parent_of (^^v); }
+ template <typename T>
+ consteval std::meta::info baz () { int v = 42; return parent_of (^^v); }
+ 
+ constexpr auto ctx = std::meta::access_context::unchecked ();
+ // TODO: These should work
+ //static_assert (^^a == members_of (parent_of (^^a), ctx)[0]);
+ //static_assert (^^S::~S == (members_of (^^S, ctx) | std::views::filter (std::meta::is_destructor) | std::ranges::to <std::vector> ())[0]);
+ static_assert (^^S::foo == members_of (^^S, ctx)[0]);
+ static_assert (^^bar <int> == bar <int> ());
+ constexpr auto b = ^^bar <long>;
+ static_assert (b == bar <long> ());
+ static_assert (^^baz <int> == baz <int> ());
+ constexpr auto c = ^^baz <long>;
+ static_assert (c == baz <long> ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compat1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compat1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/compat1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/compat1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // C++26 P2996R13 - Reflection for C++26
+ // [diff.cpp23.dcl.dcl] tests
+ // { dg-do compile { target c++11 } }
+ // { dg-options "" }
+ 
+ struct C { int operator ^ (int); };
+ int operator ^ (int (C::*p) (int), C);
+ int i = &C::operator ^^ C {};	// { dg-error "expected type-specifier before '\\\^\\\^' token" "" { target c++26 } }
+ 
+ struct [[using CC:]] C;		// { dg-warning "attribute using prefix only available with" "" { target c++14_down } }
+ 				// { dg-error "expected '\\\]' before 'CC'" "" { target c++26 } .-1 }
+ 				// { dg-error "expected identifier before ';' token" "" { target c++26 } .-2 }
+ struct [[using DD: ]] D;	// { dg-warning "attribute using prefix only available with" "" { target c++14_down } }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/complete1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/complete1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/complete1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/complete1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,54 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test which constructs or metafunctions implicitly instantiate.
+ 
+ #include <meta>
+ 
+ template <int N>
+ struct S {
+   static_assert (N < 42);	// { dg-line static_assert }
+ };
+ // { dg-error "static assertion failed" "" { target *-*-* } static_assert }
+ // { dg-bogus "the comparison reduces to '\\\(42 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(43 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(44 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-bogus "the comparison reduces to '\\\(45 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-bogus "the comparison reduces to '\\\(46 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(47 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(48 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(49 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(50 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(51 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(52 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(53 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(54 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(55 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(56 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(57 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-bogus "the comparison reduces to '\\\(58 < 42\\\)'" "" { target *-*-* } static_assert }
+ // { dg-message "the comparison reduces to '\\\(59 < 42\\\)'" "" { target *-*-* } static_assert }
+ 
+ S<0> s1;
+ constexpr auto a = ^^S<42>;
+ bool b = is_complete_type (^^S<43>);
+ bool c = is_enumerable_type (^^S<44>);
+ constexpr auto d = data_member_spec (^^S<45>, { .name = "_" });
+ consteval {
+   define_aggregate (^^S<46>, { data_member_spec (^^int, { .name = "_" }) });
+ }
+ auto e = size_of (^^S<47>);
+ auto f = bit_size_of (^^S<48>);
+ int g;
+ constexpr auto h = annotations_of_with_type (^^g, ^^S<49>);
+ constexpr auto ctx = std::meta::access_context::current ();
+ auto i = members_of (^^S<50>, ctx).size ();
+ auto j = bases_of (^^S<51>, ctx).size ();
+ auto k = static_data_members_of (^^S<52>, ctx).size ();
+ auto l = nonstatic_data_members_of (^^S<53>, ctx).size ();
+ auto m = subobjects_of (^^S<54>, ctx).size ();
+ bool n = has_inaccessible_nonstatic_data_members (^^S<55>, ctx);
+ bool o = has_inaccessible_bases (^^S<56>, ctx);
+ bool p = has_inaccessible_subobjects (^^S<57>, ctx);
+ consteval {
+   define_aggregate (^^S<58>, { data_member_spec (^^S<59>, { .name = "_" }) });
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,40 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr int x = 0;
+ constexpr int y = 0;
+ 
+ // OK, x and y are different variables, so their reflections compare different
+ static_assert (^^x != ^^y);
+ 
+ // OK, both constant_of(^^x) and constant_of(^^y) represent the value 0
+ static_assert (constant_of (^^x) == constant_of (^^y));
+ 
+ // OK, likewise
+ static_assert (constant_of (^^x) == reflect_constant (0));
+ 
+ struct S { int m; };
+ constexpr S s {42};
+ static_assert (is_object (constant_of (^^s)) && is_object (reflect_object (s)));
+ // OK, template parameter object that is template-argument-equivalent to s is
+ // a different object than s
+ static_assert (constant_of (^^s) != reflect_object (s));
+ static_assert (constant_of (^^s) == constant_of (reflect_object (s)));
+ constexpr auto r1 = reflect_constant (s);
+ constexpr auto r2 = reflect_object (s);
+ static_assert (is_object (r1) && is_object (r2));
+ static_assert (r1 != r2);
+ static_assert (r1 == constant_of (r2));
+ 
+ consteval info fn() {
+   constexpr int x = 42;
+   return ^^x;
+ }
+ 
+ // error: x is outside its lifetime
+ constexpr info r = constant_of (fn ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,87 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr int i = 1;
+ static_assert (constant_of (^^i) == constant_of (object_of (^^i)));
+ const int &r = i;
+ static_assert (constant_of (^^i) == reflect_constant (1));
+ static_assert (object_of (^^r) == object_of (^^i));
+ 
+ const int constGlobal = 11;
+ constexpr auto rref = reflect_object (constGlobal);
+ 
+ static_assert (constant_of (^^constGlobal) != ^^constGlobal);
+ static_assert ([:constant_of (^^constGlobal):] == 11);
+ static_assert ([:constant_of (rref):] == 11);
+ static_assert (constant_of (^^constGlobal) == constant_of (rref));
+ static_assert (constant_of (^^constGlobal) == reflect_constant (11));
+ 
+ enum Enum { A };
+ static constexpr Enum e = A;
+ 
+ enum EnumCls { CA };
+ static constexpr EnumCls ce = CA;
+ 
+ static_assert (constant_of (^^A) != constant_of (^^CA));
+ static_assert (constant_of (^^A) != reflect_constant (0));
+ static_assert (constant_of (^^A) == reflect_constant (Enum (0)));
+ 
+ static_assert (constant_of (^^A) != reflect_constant (EnumCls (0)));
+ static_assert (constant_of (^^e) != reflect_constant (0));
+ static_assert (constant_of (^^e) == reflect_constant (Enum (0)));
+ static_assert (constant_of (^^e) != reflect_constant (EnumCls (0)));
+ static_assert (constant_of (^^ce) != reflect_constant (0));
+ static_assert (constant_of (^^ce) != reflect_constant (Enum (0)));
+ static_assert (constant_of (^^ce) == reflect_constant (EnumCls (0)));
+ 
+ using Alias1 = int;
+ constexpr Alias1 a1 = 3;
+ // ??? In clang++, type_of here produces "^^const int".  But
+ // <https://eel.is/c++draft/meta.reflection#queries-2> doesn't say anything
+ // about dealias.  On the other side it in all cases talks about
+ // reflection of types and type aliases aren't types, just entities
+ // with underlying entity thereof.
+ static_assert (type_of (^^a1) == ^^const int);
+ static_assert (type_of (constant_of (^^a1)) == ^^int);
+ 
+ struct S{};
+ using Alias2 = S;
+ constexpr Alias2 a2 {};
+ // And here maybe it should be ^^S instead of ^^Alias2.
+ static_assert (type_of (^^a2) == ^^const Alias2);
+ // constant_of produces _ZTAXtl1SEE whose type is "const S".
+ static_assert (type_of (constant_of (^^a2)) == ^^const S);
+ 
+ constexpr const int &ref = a1;
+ static_assert (type_of (constant_of (^^ref)) == ^^int);
+ 
+ constexpr std::pair<std::pair<int, bool>, int> p = {{1, true}, 2};
+ static_assert (type_of (constant_of (reflect_object (p.first))) == ^^const std::pair<int, bool>);
+ constexpr info rfirst = reflect_object (p.first);
+ static_assert (is_object (rfirst) && !is_value (rfirst));
+ static_assert (type_of (rfirst) == ^^const std::pair<int, bool>);
+ static_assert (rfirst != reflect_constant (std::make_pair (1, true)));
+ 
+ constexpr info rvfirst = constant_of (rfirst);
+ static_assert (is_object (rvfirst) && !is_value (rvfirst));
+ static_assert (type_of (rvfirst) == ^^const std::pair<int, bool>);
+ static_assert (rvfirst == reflect_constant (std::make_pair (1, true)));
+ static_assert ([:rvfirst:].first == 1);
+ 
+ constexpr int g = 3;
+ consteval info
+ fn ()
+ {
+   const int &rg = g;
+   static_assert ([:constant_of(^^rg):] == 3);
+   return constant_of (^^rg);
+ }
+ static_assert ([:fn ():] == 3);
+ 
+ constexpr int foo () { return 42; }
+ static_assert (constant_of (^^foo) == reflect_function (foo));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,60 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ const int K = 0;
+ consteval const int &fn() { return K; }
+ 
+ constexpr auto v = constant_of (reflect_constant (fn ()));
+ static_assert (is_value (v) && !is_object (v));
+ static_assert (type_of (v) == ^^int);
+ static_assert (!is_variable (v));
+ static_assert (v == reflect_constant (0));
+ 
+ template<int N>
+ constexpr int V = N;
+ 
+ struct W {
+   static constexpr int I = 42;
+ };
+ 
+ // clang++ doesn't accept this.  That seems wrong.
+ constexpr auto v2 = constant_of (^^V<3>);
+ static_assert (is_value (v2) && !is_object (v2));
+ static_assert (type_of (v2) == ^^int);
+ static_assert (!is_variable (v2));
+ static_assert (v2 == reflect_constant (3));
+ 
+ constexpr auto v3 = constant_of (^^W::I);
+ static_assert (is_value (v3) && !is_object (v3));
+ static_assert (type_of (v3) == ^^int);
+ static_assert (!is_variable (v3));
+ static_assert (v3 == reflect_constant (42));
+ 
+ constexpr auto v4 = constant_of (reflect_constant (42));
+ static_assert (is_value (v4) && !is_object (v4));
+ static_assert (type_of (v4) == ^^int);
+ static_assert (!is_variable (v4));
+ static_assert (v4 == reflect_constant (42));
+ 
+ template<info R>
+ void
+ f ()
+ {
+   constexpr auto v = constant_of (R);
+   static_assert (is_value (v) && !is_object (v));
+   static_assert (type_of (v) == ^^int);
+   static_assert (!is_variable (v));
+   static_assert (v == reflect_constant (42));
+ }
+ 
+ void
+ g ()
+ {
+   constexpr int b = 42;
+   f<^^b>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,50 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   int k;
+   int bf:32;
+ };
+ 
+ constexpr info null_reflection;
+ static union { int m; };
+ namespace NS { }
+ using T = int;
+ 
+ consteval bool
+ constant_of_ok (info r)
+ {
+   try { constant_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!constant_of_ok (^^S::k));
+ static_assert (!constant_of_ok (^^m));
+ static_assert (!constant_of_ok (^^int));
+ static_assert (!constant_of_ok (^^NS));
+ static_assert (!constant_of_ok (^^S::bf));
+ static_assert (!constant_of_ok (null_reflection));
+ static_assert (!constant_of_ok (^^T));
+ 
+ template<typename>
+ struct X { };
+ static_assert (!constant_of_ok (^^X));
+ static_assert (!constant_of_ok (^^X<int>));
+ 
+ template<int N>
+ constexpr int bar () { return N; }
+ static_assert (!constant_of_ok (^^bar));
+ 
+ template<int N>
+ constexpr int V = N;
+ 
+ static_assert (!constant_of_ok (^^V));
+ 
+ int x = 10;
+ constexpr auto rx = constant_of (^^x); // { dg-error "not usable in a constant expression" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,86 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ [[=1, =1, =2, =1.0f]] int i;
+ static_assert (type_of (constant_of (annotations_of (^^i)[0])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^i)[1])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^i)[2])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^i)[3])) == ^^float);
+ 
+ [[=1, =1, =2, =1.0f]] void fn();
+ static_assert (type_of (constant_of (annotations_of (^^fn)[0])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^fn)[1])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^fn)[2])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^fn)[3])) == ^^float);
+ 
+ struct [[=3, =3, =4, =2.0f]] S;
+ static_assert (type_of (constant_of (annotations_of (^^S)[0])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^S)[1])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^S)[2])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^S)[3])) == ^^float);
+ #if 0
+ template <typename> struct [[=5, =5, =6, =3.0f]] TCls {};
+ // TODO Should work but we don't propagate the annotations correctly to the
+ // instantiation.  See also the TODO in annotations3.C.
+ static_assert (type_of (constant_of (annotations_of (^^TCls<int>)[0])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^TCls<int>)[1])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^TCls<int>)[2])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^TCls<int>)[3])) == ^^float);
+ #endif
+ template <typename> [[=5, =5, =6, =3.0f]] void TFn();
+ static_assert (type_of (constant_of (annotations_of (^^TFn<int>)[0])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^TFn<int>)[1])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^TFn<int>)[2])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^TFn<int>)[3])) == ^^float);
+ namespace [[=7, =7, =8, =4.0f]] NS {}
+ static_assert (type_of (constant_of (annotations_of (^^NS)[0])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^NS)[1])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^NS)[2])) == ^^int);
+ static_assert (type_of (constant_of (annotations_of (^^NS)[3])) == ^^float);
+ 
+ constexpr struct X {} x;
+ [[=x]] void foo ();
+ 
+ // TODO clang++ says ^^X, we say ^^const X.
+ static_assert (type_of (annotations_of (^^foo)[0]) == ^^const X);
+ static_assert (type_of (constant_of (annotations_of (^^foo)[0])) == ^^const X);
+ 
+ template<info R>
+ [[=[:constant_of (annotations_of (R)[0]):]]] void bar();
+ 
+ template<info R>
+ struct [[=[:constant_of (annotations_of (R)[0]):]]] Y {};
+ 
+ static_assert (extract<int>(annotations_of (^^bar<^^::fn>)[0]) == 1);
+ //static_assert (extract<int>(annotations_of (^^Y<^^::S>)[0]) == 3);
+ 
+ struct [[=42, =42.0f]] S1;
+ struct [[=42, =40]] S2;
+ 
+ static_assert (annotations_of (^^S1)[0] == annotations_of (^^S1)[0]);
+ static_assert (annotations_of (^^S1)[0] != annotations_of (^^S2)[0]);
+ static_assert (annotations_of (^^S1)[0] != annotations_of (^^S1)[1]);
+ 
+ static_assert (constant_of (annotations_of (^^S1)[0]) == reflect_constant (42));
+ static_assert (constant_of (annotations_of (^^S1)[0]) == constant_of (annotations_of (^^S2)[0]));
+ 
+ // A test from clang.
+ struct test_struct {};
+ constexpr test_struct test;
+ 
+ [[=test]] void func() {}
+ [[=1]] void func2() {}
+ 
+ constexpr auto func_first = constant_of (annotations_of (^^func)[0]);
+ constexpr auto func2_first = constant_of (annotations_of (^^func2)[0]);
+ 
+ static_assert (constant_of (^^test) == reflect_constant (test));
+ // TODO We evaluate the decltype to test_struct.
+ //static_assert (std::same_as<decltype([:func_first:]), const test_struct &>);
+ static_assert (func2_first == reflect_constant (1));
+ static_assert (func_first == reflect_constant (test));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ [[=1, =1, =2, =1.0f]] void fn();
+ struct [[=3, =3, =4, =2.0f]] S;
+ 
+ template<info R>
+ [[=[:constant_of (annotations_of (R)[0]):]]] void bar();
+ 
+ template<info R>
+ struct [[=[:constant_of (annotations_of (R)[0]):]]] Y {};
+ 
+ constexpr auto y = constant_of (annotations_of (^^bar<^^::fn>)[0]);
+ constexpr auto z = constant_of (annotations_of (^^Y<^^::S>)[0]);
+ // { dg-error "call to non-.constexpr." "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,54 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr int arr[] = { 1, 2, 3, 4 };
+ constexpr auto r = constant_of (^^arr);
+ static_assert (!is_value (r) && !is_object (r));
+ static_assert (*[:r:] == 1);
+ static_assert ([:r:][0] == 1);
+ static_assert ([:r:][1] == 2);
+ static_assert ([:r:][2] == 3);
+ static_assert ([:r:][3] == 4);
+ static_assert (type_of (r) == ^^const int [4]);
+ constexpr auto q = reflect_constant ([: ^^arr :]);
+ static_assert (type_of (q) == ^^const int *);
+ static_assert ([:q:][0] == 1);
+ static_assert ([:q:][1] == 2);
+ static_assert ([:q:][2] == 3);
+ static_assert ([:q:][3] == 4);
+ 
+ using U = int;
+ constexpr U arr2[] = { 5, 6, 7, 8 };
+ constexpr auto r2 = constant_of (^^arr2);
+ static_assert (!is_value (r2) && !is_object (r2));
+ static_assert ([:r2:][0] == 5);
+ static_assert ([:r2:][1] == 6);
+ static_assert ([:r2:][2] == 7);
+ static_assert ([:r2:][3] == 8);
+ // ??? Probably should be const int *.
+ static_assert (type_of (r2) == ^^const U [4]);
+ constexpr auto q2 = reflect_constant ([: ^^arr2 :]);
+ static_assert (type_of (q2) == ^^const U *);
+ static_assert ([:q2:][0] == 5);
+ static_assert ([:q2:][1] == 6);
+ static_assert ([:q2:][2] == 7);
+ static_assert ([:q2:][3] == 8);
+ 
+ struct S { int m; };
+ constexpr S arr3[] = { S{1}, S{2}, S{3} };
+ constexpr auto r3 = constant_of (^^arr3);
+ static_assert (!is_value (r3) && !is_object (r3));
+ static_assert ([:r3:][0].m == 1);
+ static_assert ([:r3:][1].m == 2);
+ static_assert ([:r3:][2].m == 3);
+ static_assert (type_of (r3) == ^^const S [3]);
+ constexpr auto q3 = reflect_constant ([: ^^arr3 :]);
+ static_assert (type_of (q3) == ^^const S *);
+ static_assert ([:q3:][0].m == 1);
+ static_assert ([:q3:][1].m == 2);
+ static_assert ([:q3:][2].m == 3);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of, CWG 3111.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ constexpr int is[] = {1, 2, 3};
+ constexpr info r = reflect_constant_array (is);
+ static_assert (constant_of (^^is) == r);
+ 
+ constexpr int mis[2][2] = {{1, 2}, {3, 4}};
+ // LWG4483 Multidimensional arrays
+ // constexpr info mr = reflect_constant_array (mis);
+ // static_assert (constant_of (^^mis) == mr);
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/constant_of9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/constant_of9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,9 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::constant_of, CWG 3111.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ void f() {}
+ static_assert (constant_of (^^f) == reflect_function (f));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct free_entry {
+   free_entry *next;
+ } first_free_entry;
+ 
+ struct A;
+ struct B {
+   A *a;
+ } BT;
+ 
+ struct A {
+   B b;
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S { };
+ using X = S;
+ 
+ template <auto V> constexpr int e = [:V:];  // { dg-error "expected a reflection of an expression instead of type .X." }
+ template <auto V> constexpr int e2 = [:V:]; // { dg-error "expected a reflection of an expression instead of type .X." }
+ constexpr auto h = ^^X;
+ constexpr auto i = e<([:^^h:])>;
+ constexpr auto j = e2<^^X>;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash11.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash11.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash11.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<typename T>
+ struct Z {};
+ 
+ struct S {
+   static constexpr auto r = ^^Z;
+ };
+ 
+ template<typename T, auto R>
+ void
+ g ()
+ {
+   template [: R :]<int> c0; // { dg-error "not a function template|expected" }
+   template [: T::r :]<int> c1;  // { dg-error "not a function template|expected" }
+ }
+ 
+ void
+ f ()
+ {
+   g<S, ^^Z>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash12.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash12.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash12.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash12.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ struct X { constexpr operator std::meta::info(); }; // { dg-error "function of consteval-only type" }
+ // { dg-warning "used but never defined" "" { target *-*-* } .-1 }
+ constexpr auto r = std::meta::type_of (X{}); // { dg-error "used before its definition" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash13.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash13.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash13.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash13.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^int);
+ 
+ struct S {
+   int j;
+ };
+ 
+ template <info R>
+ consteval int fn() {
+   auto x = [:R:]; // { dg-error "cannot implicitly reference a class member" }
+   return true;
+ }
+ static_assert (fn<^^S::j>());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash14.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash14.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash14.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash14.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ constexpr int i = 0;
+ const int p = ++std::meta::extract<const int &>(^^i); // { dg-error "" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash15.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash15.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash15.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash15.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection -g" }
+ 
+ void
+ foo ()
+ {
+   constexpr auto r = ^^int;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash16.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash16.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash16.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash16.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,43 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype (^^int);
+ 
+ struct A { int x, y; };
+ struct B { info x, y; };
+ struct C { int x; info y; };
+ 
+ void
+ foo ()
+ {
+   constexpr A a { 3, 4 };
+   constexpr auto [ax, ay] = a;
+   static_assert (ax == 3);
+   static_assert (ay == 4);
+ 
+   constexpr B b { ^^::, ^^int };
+   constexpr auto [bx, by] = b;
+   static_assert (b.x == ^^::);
+   static_assert (b.y == ^^int);
+   static_assert (bx == ^^::);
+   static_assert (by == ^^int);
+ 
+   constexpr C c { 4, ^^:: };
+   constexpr auto [cx, cy] = c;
+   static_assert (c.x == 4);
+   static_assert (c.y == ^^::);
+   static_assert (cx == 4);
+   static_assert (cy == ^^::);
+ 
+   constexpr int d[] { 6, 7 };
+   constexpr auto [dx, dy] = d;
+   static_assert (dx == 6);
+   static_assert (dy == 7);
+ 
+   constexpr info e[] { ^^::, ^^int };
+   constexpr auto [ex, ey] = e;
+   static_assert (e[0] == ^^::);
+   static_assert (e[1] == ^^int);
+   static_assert (ex == ^^::);
+   static_assert (ey == ^^int);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash17.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash17.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash17.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash17.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template <typename>
+ void
+ foo ()
+ {
+   constexpr int i = [: reflect_constant (5) :];
+   constexpr info f = reflect_constant_array (std::vector { 1, 2, 3 });
+   constexpr auto &arr = [: f :];
+   constexpr auto &arr2 = [: reflect_constant_array (std::vector { 1, 2, 3 }) :];
+ }
+ 
+ void
+ bar ()
+ {
+   constexpr auto &arr = [: reflect_constant_array (std::vector { 1, 2, 3 }) :];   
+ }
+ 
+ int
+ main ()
+ {
+   foo <int> ();
+   bar ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash18.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash18.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash18.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash18.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ // We also test this elsewhere but we only crashed when there were no other
+ // errors.
+ void fn (decltype(^^::)) {} // { dg-error "function of consteval-only type must be declared .consteval." }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   template<typename T>
+   static void tfn () { }
+   template<typename T>
+   static constexpr int var = 1;
+ };
+ 
+ template<typename T>
+ void
+ f ()
+ {
+   // Parsed as "S::tfn < S".
+   [: ^^T :]::tfn<[: ^^T :]>();	// { dg-error "expected primary-expression|expected a reflection of an expression instead of type .S." }
+ // { dg-warning "expected .template. keyword" "" { target *-*-* } .-1 }
+   int i = [: ^^T :]::var<int>;	// { dg-error "missing|expected" }
+ }
+ 
+ void
+ g ()
+ {
+   f<S>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template <auto V> constexpr int e = [:V:];  // { dg-error "expected a reflection of an expression instead of type .int." }
+ template <auto V> constexpr int e2 = [:V:]; // { dg-error "expected a reflection of an expression instead of type .int." }
+ constexpr auto h = ^^int;
+ constexpr auto i = e<([:^^h:])>;
+ constexpr auto j = e2<^^int>;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   int j;
+   static int i;
+ } s;
+ 
+ int X;
+ 
+ // Typo: should have been ^^s.
+ decltype([: ^^S :].j) x;  // { dg-error "expected a reflection of an expression" }
+ decltype([: ^^S :].i) z;  // { dg-error "expected a reflection of an expression" }
+ decltype([: ^^X :].x) y;  // { dg-error "request for member|expected" }
+ decltype([: ^^:: :].x w;  // { dg-error "expected a reflection of an expression" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   int j;
+   int k;
+ };
+ 
+ // Forgot to define info and we crashed :-(
+ template <info R>   // { dg-error ".info. has not been declared" }
+ consteval int fn() {
+   S s = {11, 13};
+   return s.[:R:];   // { dg-error ".R. was not declared" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ template<typename T>
+ constexpr T magic = 1234;
+ 
+ template<info R>
+ void
+ f ()
+ {
+   [:R:] r; // { dg-error "expected" }
+   [:R:]<int> r; // { dg-error "reflection .\\\[: R :\\\]<int>. not usable in a splice expression" }
+ }
+ 
+ void
+ g ()
+ {
+   f<^^magic>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ struct S {
+   template<typename T>
+   static T t{};
+ } s;
+ 
+ template<info R>
+ void
+ f ()
+ {
+   int j = s.template [:R:]<int>; // { dg-error "expected a reflection of an expression instead of type .S." }
+ }
+ 
+ void
+ g ()
+ {
+   f<^^S>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ // { dg-do compile { target c++26 } }
+ // Test using a splice expression in an explicit destructor call
+ // but without reflection enabled, which ICEd.
+ 
+ struct S { };
+ 
+ void
+ oy (S s)
+ {
+   s.~typename [:^^S:](); // { dg-error "reflection" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/crash9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/crash9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,10 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ namespace N { }
+ 
+ template <auto V> constexpr int e = [:V:];  // { dg-error "expected a reflection of an expression instead of .N." }
+ template <auto V> constexpr int e2 = [:V:]; // { dg-error "expected a reflection of an expression instead of .N." }
+ constexpr auto h = ^^N;
+ constexpr auto i = e<([:^^h:])>;
+ constexpr auto j = e2<^^N>;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/data_member_spec1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/data_member_spec1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/data_member_spec1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/data_member_spec1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,119 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::data_member_spec.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ enum E { E0, E1 };
+ struct S {};
+ 
+ consteval bool
+ valid_data_member_spec (info r, data_member_options opts)
+ {
+   try { data_member_spec (r, opts); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ consteval bool
+ foo ()
+ {
+   std::string n1 = "bar";
+   data_member_options a = { .name = n1 };
+   auto dmsa = data_member_spec (^^S, a);
+   if (!is_data_member_spec (dmsa))
+     throw 1;
+   std::u8string_view n2 = u8"baz";
+   data_member_options b = { .name = n2, .alignment = 2 * alignof (long), .no_unique_address = true };
+   auto dmsb = data_member_spec (^^long, b);
+   if (!is_data_member_spec (dmsb))
+     throw 2;
+   data_member_options c = { .bit_width = 7 };
+   auto dmsc = data_member_spec (^^int, c);
+   if (!is_data_member_spec (dmsc))
+     throw 3;
+   data_member_options d = { .name = "extremely_long_identifier1", .bit_width = 6 };
+   auto dmsd = data_member_spec (^^E, d);
+   if (!is_data_member_spec (dmsd))
+     throw 4;
+   data_member_options e = { .bit_width = 0 };
+   auto dmse = data_member_spec (^^int, e);
+   if (!is_data_member_spec (dmse))
+     throw 5;
+   data_member_options f = { .name = u8"extremely_long_identifier2", .alignment = 2 * alignof (E) };
+   auto dmsf = data_member_spec (^^E &, f);
+   if (!is_data_member_spec (dmsf))
+     throw 6;
+   if (dmsa != data_member_spec (^^S, { .name = "bar" }))
+     throw 7;
+   if (dmsb != data_member_spec (^^long, { .name = u8"baz", .alignment = 2 * alignof (long), .no_unique_address = true }))
+     throw 8;
+   if (dmsc != data_member_spec (^^int, { .bit_width = 7ULL }))
+     throw 9;
+   if (dmsd != data_member_spec (^^E, { .name = "extremely_long_identifier1", .bit_width = 6 }))
+     throw 10;
+   if (dmse != data_member_spec (^^int, { .bit_width = 0U }))
+     throw 11;
+   if (dmsf != data_member_spec (^^E &, { .name = u8"extremely_long_identifier2", .alignment = 2 * alignof (E) }))
+     throw 12;
+   if (dmsa == data_member_spec (^^const S, { .name = "bar" }))
+     throw 13;
+   if (dmsa == data_member_spec (^^S, { .name = "foo" }))
+     throw 14;
+   if (dmsb == data_member_spec (^^long, { .name = u8"baz", .alignment = 4 * alignof (long), .no_unique_address = true }))
+     throw 15;
+   if (dmsb == data_member_spec (^^long, { .name = u8"baz", .alignment = 2 * alignof (long), .no_unique_address = false }))
+     throw 16;
+   if (dmsc == data_member_spec (^^int, { .bit_width = 8 }))
+     throw 17;
+   if (dmsd == data_member_spec (^^E, { .name = "extremely_long_identifier3", .bit_width = 6 }))
+     throw 18;
+   if (dmsd == data_member_spec (^^E, { .name = "extremely_long_identifier", .bit_width = 5 }))
+     throw 19;
+   if (dmse == data_member_spec (^^int, { .name = "a" }))
+     throw 20;
+   if (data_member_spec (^^int, { .name = "a" }) == data_member_spec (^^int, { .name = "a", .no_unique_address = true }))
+     throw 21;
+   return true;
+ }
+ 
+ static_assert (foo ());
+ 
+ static_assert (!valid_data_member_spec (^^void, { .name = "a" }));
+ static_assert (!valid_data_member_spec (^^int (int), { .name = "a" }));
+ static_assert (!valid_data_member_spec (^^int, {}));
+ static_assert (!valid_data_member_spec (^^int, { .alignment = alignof (int) }));
+ static_assert (!valid_data_member_spec (^^int, { .no_unique_address = true }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "for" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "if" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "char8_t" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "virtual" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "static_assert" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "__is_convertible" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "__builtin_is_implicit_lifetime" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "007" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "operator++" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "operator ++" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "foo\\u00AA" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "+ -" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"\u00AA" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"\u00AB" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"\u00B6" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"\u00BA" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"\u00C0" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"\u00D6" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"\u0384" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"\u0669" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"A\u0669" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"\u0E59" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"A\u0E59" }));
+ static_assert (!valid_data_member_spec (^^S, { .name = "a", .bit_width = 4 }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "a", .alignment = alignof (int), .bit_width = 4 }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "a", .bit_width = 4, .no_unique_address = true }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "a", .bit_width = 0 }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "a", .bit_width = -42 }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "a", .alignment = 41 }));
+ static_assert (!valid_data_member_spec (^^int, { .name = "a", .alignment = -__INT_MAX__ - 1 }));
+ static_assert (!valid_data_member_spec (^^long long, { .name = "a", .alignment = alignof (long long) / 2 }));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/data_member_spec2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/data_member_spec2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/data_member_spec2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/data_member_spec2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,113 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::data_member_spec.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval bool
+ valid_data_member_spec (info r, data_member_options opts)
+ {
+   try { data_member_spec (r, opts); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!valid_data_member_spec (null_reflection, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^::, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^ns, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^ns_alias, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (reflect_constant (3), { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^cls, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^cls::dm, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^cls::ref_dm, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^cls::static_dm, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^cls::mem_fun, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^cls::static_mem_fun, { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^cls::type, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^cls_var, { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^onion, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^anon, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^fun, { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^alias, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^var, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^ref, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^rref, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^ptr, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^cls_tmpl, { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^cls_tmpl<int>, { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^incomplete_cls<int>, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^fun_tmpl, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^fun_tmpl<int>, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^conc, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (substitute (^^conc, { ^^int }), { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^var_tmpl, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^var_tmpl<int>, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^cls_tmpl_alias, { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^cls_tmpl_alias<int>, { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^Enum, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^Enum::A, { .name = "dms" }));
+ static_assert (valid_data_member_spec (^^Enum_class, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^Enum_class::A, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^decomp, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^decomp_ref, { .name = "dms" }));
+ static_assert (!valid_data_member_spec (^^arr, { .name = "dms" }));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!valid_data_member_spec (dms, { .name = "dms" }));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!valid_data_member_spec (bases_of (^^Derived, access_context::unchecked ())[0], { .name = "dms" }));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (valid_data_member_spec (^^T, { .name = "dms" }));
+   static_assert (!valid_data_member_spec (R, { .name = "dms" }));
+   static_assert (!valid_data_member_spec (R2, { .name = "dms" }));
+   static_assert (valid_data_member_spec (R3, { .name = "dms" }));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!valid_data_member_spec (^^p, { .name = "dms" }));
+   static_assert (!valid_data_member_spec (^^c, { .name = "dms" }));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/data_member_spec3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/data_member_spec3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/data_member_spec3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/data_member_spec3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::data_member_spec.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval bool
+ valid_data_member_spec (info r, data_member_options opts)
+ {
+   try { data_member_spec (r, opts); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"👷" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"👷.♀" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"⏰" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"🕐" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"☠" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"💀" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"✋" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"👊" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"✈" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"🚀" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"☹" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"😀" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"💩" }));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/data_member_spec4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/data_member_spec4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/data_member_spec4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/data_member_spec4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-options "-freflection" }
+ // Test std::meta::data_member_spec.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval bool
+ valid_data_member_spec (info r, data_member_options opts)
+ {
+   try { data_member_spec (r, opts); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (valid_data_member_spec (^^int, { .name = u8"👷" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"👷.♀" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"⏰" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"🕐" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"☠" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"💀" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"✋" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"👊" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"✈" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"🚀" }));
+ static_assert (!valid_data_member_spec (^^int, { .name = u8"☹" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"😀" }));
+ static_assert (valid_data_member_spec (^^int, { .name = u8"💩" }));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dealias1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dealias1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dealias1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dealias1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,36 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::dealias.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ namespace N { }
+ 
+ using int_alias = int;
+ using int_alias_alias = int_alias;
+ template <typename T> using alias_templ = T;
+ 
+ typedef int T1;
+ typedef T1 T2;
+ 
+ namespace N_alias = N;
+ namespace N_alias_alias = N_alias;
+ 
+ typename [: dealias (^^int) :] i1 = 42;
+ typename [: dealias (^^int_alias_alias) :] i2 = 42;
+ 
+ static_assert (dealias (^^int) == ^^int);
+ static_assert (dealias (^^int_alias) == ^^int);
+ static_assert (dealias (^^int_alias_alias) == ^^int);
+ static_assert (dealias (^^alias_templ<int_alias_alias>) == ^^int);
+ static_assert (dealias (^^T1) == ^^int);
+ static_assert (dealias (^^T2) == ^^int);
+ 
+ static_assert (dealias (^^::) == ^^::);
+ static_assert (dealias (^^N) == ^^N);
+ static_assert (dealias (^^N_alias) == ^^N);
+ static_assert (dealias (^^N_alias_alias) == ^^N);
+ 
+ static_assert (dealias (std::meta::info{}) == std::meta::info{});
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dealias2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dealias2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dealias2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dealias2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::dealias.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ constexpr int i = 42;
+ static_assert (dealias (reflect_object (i)) == reflect_object (i));
+ static_assert (dealias (constant_of (^^i)) == constant_of (^^i));
+ static_assert (dealias (reflect_constant (42)) == reflect_constant (42));
+ [[=1, =1, =2, =1.0f]] void fn ();
+ static_assert (dealias (annotations_of (^^fn)[0]) == annotations_of (^^fn)[0]);
+ static_assert (dealias (^^i) == ^^i);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dealias3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dealias3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dealias3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dealias3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,32 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::dealias.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template<typename T>
+ struct S {};
+ static_assert (dealias (^^S) == ^^S);
+ 
+ template <typename T> using A1 = T;
+ static_assert (dealias (^^A1) == ^^A1);
+ 
+ template <typename T> using A2 = S<T>;
+ static_assert (dealias (^^A2) == ^^A2);
+ 
+ template <typename T> using A3 = S<T*>;
+ static_assert (dealias (^^A3) == ^^A3);
+ 
+ template <typename T>
+ int v = sizeof(T);
+ static_assert (dealias (^^v) == ^^v);
+ 
+ template <typename T>
+ void fn();
+ static_assert (dealias (^^fn) == ^^fn);
+ 
+ template<typename T>
+ concept C = true;
+ static_assert (dealias (^^C) == ^^C);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,108 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::define_aggregate.
+ 
+ #include <cstddef>
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ enum E { E0, E1 };
+ struct S0 {};
+ struct S1;
+ struct S2;
+ struct S3;
+ struct S4;
+ struct S5;
+ union U1;
+ template <int N>
+ struct S6;
+ template <int N>
+ struct S7 { long e; short f; };
+ struct S8;
+ struct S9;
+ using A9 = S9;
+ 
+ consteval {
+   if (define_aggregate (^^S1, {}) != ^^S1)
+     throw 1;
+   if (define_aggregate (^^S2, { data_member_spec (^^S1, { .name = "bar" }),
+ 				data_member_spec (^^long, { .name = u8"baz",
+ 							    .alignment = 2 * alignof (long),
+ 							    .no_unique_address = true }),
+ 				data_member_spec (^^unsigned int, { .bit_width = 7 }),
+ 				data_member_spec (^^E, { .name = "extremely_long_identifier1",
+ 							 .bit_width = 6 }),
+ 				data_member_spec (^^int, { .bit_width = 0 }),
+ 				data_member_spec (^^const E *, { .name = u8"extremely_long_identifier2",
+ 								 .alignment = 2 * alignof (E *) }) }) != ^^S2)
+     throw 2;
+   if (define_aggregate (^^S3, { data_member_spec (^^S0, { .name = "a",
+ 							  .no_unique_address = true }),
+ 				data_member_spec (^^S1, { .name = "b",
+ 							  .no_unique_address = true }) }) != ^^S3)
+     throw 3;
+   if (define_aggregate (^^S4, { data_member_spec (^^S0, { .name = "c" }),
+ 				data_member_spec (^^S1, { .name = "d" }) }) != ^^S4)
+     throw 4;
+   if (define_aggregate (^^S5, { data_member_spec (^^const E &, { .name = u8"qu\N{LATIN SMALL LETTER AE}" }),
+ 				data_member_spec (^^const E &, { .name = u8"foo" }) }) != ^^S5)
+     throw 5;
+   if (define_aggregate (^^U1, { data_member_spec (^^int, { .name = u8"_" }),
+ 				data_member_spec (^^long long, { .name = "abc" }) }) != ^^U1)
+     throw 6;
+   if (define_aggregate (^^S6 <42>, { data_member_spec (^^int, { .name = "a" }),
+ 				     data_member_spec (^^long, { .name = "b" }) }) != ^^S6 <42>)
+     throw 7;
+   if (define_aggregate (substitute (^^S6, { reflect_constant (43) }),
+ 			{ data_member_spec (^^long, { .name = "c" }),
+ 			  data_member_spec (^^unsigned int, { .name = "d", .bit_width = 3 }) }) != ^^S6 <43>)
+     throw 8;
+   if (define_aggregate (^^S7 <42>, { data_member_spec (^^short, { .name = "g" }),
+ 				     data_member_spec (^^float, { .name = "h" }) }) != ^^S7 <42>)
+     throw 9;
+   if (define_aggregate (^^S8, { data_member_spec (^^U1, { .name = "u" }) }) != ^^S8)
+     throw 10;
+   if (define_aggregate (dealias (^^A9), { data_member_spec (^^U1, { .name = "u" }) }) != ^^S9)
+     throw 10;
+ }
+ 
+ constexpr E e0 = E0, e1 = E1;
+ S2 s2 = { .bar = {}, .baz = 42LL, .extremely_long_identifier1 = E1, .extremely_long_identifier2 = &e0 };
+ S3 s3 = { .a = {}, .b = {} };
+ S4 s4 = { .c = {}, .d = {} };
+ constexpr S5 s5 = { e0, e1 };
+ U1 u1 = { ._ = 5 }, u1a = { .abc = 42LL };
+ S6 <42> s642 = { .a = 1, .b = 2 };
+ S6 <43> s643 = { .c = 6, .d = 7 };
+ S7 <42> s742 = { .g = 5, .h = 6.0f };
+ S7 <43> s743 = { .e = 8, .f = 9 };
+ S8 s8 = { .u = { .abc = 2LL } };
+ S9 s9 = { .u = { ._ = 3 } };
+ consteval {
+   S6 <43> x;
+   x.c = -1;
+   x.d = 7;
+   ++x.d;
+   if (x.d != 0)
+     throw 11;
+   --x.d;
+   if (x.d != 7)
+     throw 12;
+ }
+ static_assert (type_of (^^S2::bar) == ^^S1);
+ static_assert (type_of (^^S2::baz) == ^^long);
+ static_assert (type_of (^^S2::extremely_long_identifier1) == ^^E);
+ static_assert (type_of (^^S2::extremely_long_identifier2) == ^^const E *);
+ static_assert (offsetof (S2, bar) == 0);
+ static_assert (offsetof (S2, baz) >= 2 * alignof (long) && offsetof (S2, baz) % (2 * alignof (long)) == 0);
+ static_assert (offsetof (S2, extremely_long_identifier2) > offsetof (S2, baz));
+ static_assert (offsetof (S2, extremely_long_identifier2) % (2 * alignof (E)) == 0);
+ static_assert (type_of (^^S3::a) == ^^S0);
+ static_assert (type_of (^^S3::b) == ^^S1);
+ static_assert (sizeof (S3) == sizeof (S0) && sizeof (S4) == 2 * sizeof (S0));
+ static_assert (type_of (^^S4::c) == ^^S0);
+ static_assert (type_of (^^S4::d) == ^^S1);
+ static_assert (s5.qu\u00E6 == E0 && s5.foo == E1);
+ static_assert (type_of (^^S5::qu\u00E6) == ^^const E &);
+ static_assert (type_of (^^S5::foo) == ^^const E &);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,44 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::define_aggregate.
+ 
+ #include <cstddef>
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ enum E { E0, E1 };
+ struct S0 {};
+ struct S1;
+ struct S2;
+ struct S3;
+ struct S4;
+ struct S5;
+ template <int N>
+ struct S7 { long e; short f; };
+ S7 <15> s715;
+ struct S8;
+ using A8 = S8;
+ struct S9;
+ struct S10;
+ struct S11;
+ struct S12;
+ consteval { define_aggregate (^^::, {}); }		// { dg-error "first 'define_aggregate' argument is not a class type reflection" }
+ consteval { define_aggregate (^^int, {}); }		// { dg-error "first 'define_aggregate' argument is not a class type reflection" }
+ consteval { define_aggregate (^^E, {}); }		// { dg-error "first 'define_aggregate' argument is not a class type reflection" }
+ consteval { define_aggregate (^^S0, {}); }		// { dg-error "first 'define_aggregate' argument is a complete class type reflection" }
+ consteval { define_aggregate (^^S7 <15>, {}); }		// { dg-error "first 'define_aggregate' argument is a complete class type reflection" }
+ consteval { define_aggregate (^^A8, {}); }		// { dg-error "first 'define_aggregate' argument is a reflection of a type alias" }
+ consteval { define_aggregate (^^const S9, {}); }	// { dg-error "first 'define_aggregate' argument is a cv-qualified class type reflection" }
+ consteval { define_aggregate (^^volatile S10, {}); }	// { dg-error "first 'define_aggregate' argument is a cv-qualified class type reflection" }
+ consteval { define_aggregate (^^S11 const volatile, {}); } // { dg-error "first 'define_aggregate' argument is a cv-qualified class type reflection" }
+ consteval { define_aggregate (^^S1, { ^^int }); }	// { dg-error "'define_aggregate' argument not a data member description" }
+ consteval { define_aggregate (^^S2, { data_member_spec (^^S5, { .name = "a" }) }); }	// { dg-error "'define_aggregate' argument data member description without complete type" }
+ consteval { define_aggregate (^^S3, { data_member_spec (^^int, { .name = "a" }),	// { dg-error "name 'a' used in multiple data member descriptions" }
+ 				      data_member_spec (^^long, { .name = "a" }) }); }
+ consteval { define_aggregate (^^S4, { data_member_spec (^^int, { .name = u8"_" }),
+ 				      data_member_spec (^^long, { .name = u8"_" }) }); }
+ consteval { define_aggregate (^^S12, { data_member_spec (^^int, { .name = "foobar" }),	// { dg-error "name 'foobar' used in multiple data member descriptions" }
+ 				       data_member_spec (^^long, { .name = u8"foobar" }) }); }
+ constexpr S4 s4 = { 1, 2 };
+ consteval { auto a = s4._; }				// { dg-error "request for member '_' is ambiguous" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,217 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::define_aggregate.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S1;
+ struct S2;
+ static_assert (define_aggregate (^^S1, {}) == ^^S1);	// { dg-error "non-constant condition for static assertion" }
+ // { dg-error "'define_aggregate' not evaluated from 'consteval' block" "" { target *-*-* } .-1 }
+ consteval bool foo () { return define_aggregate (^^S2, {}) == ^^S2; }
+ // { dg-error "'define_aggregate' not evaluated from 'consteval' block" "" { target *-*-* } .-1 }
+ 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" }
+   }
+ };
+ 
+ template <typename T>
+ struct S4 {
+   consteval {
+     define_aggregate (^^S4 <T>, {});
+   }
+ };
+ 
+ consteval {
+   define_aggregate (^^S4 <long>, {});
+ }
+ 
+ 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>);
+   }
+ };
+ 
+ S7 <char> s7;
+ 
+ consteval {						// { dg-message "'consteval' block defined here" }
+   struct S8;
+   define_aggregate (^^S8, {});				// { dg-error "'define_aggregate' evaluated from 'consteval' block which encloses '<lambda\\\(\\\)> static::S8'" }
+ };
+ 
+ struct S9;
+ consteval {
+   constexpr auto a = define_aggregate (^^S9, {});	// { dg-error "'define_aggregate' not evaluated from 'consteval' block" }
+ }
+ 
+ struct S10;
+ consteval {
+   const auto a = define_aggregate (^^S10, {});
+ }
+ static_assert (is_complete_type (^^S10));
+ 
+ consteval {
+   struct S11 {
+     struct S12;
+   };
+   define_aggregate (^^S11::S12, {});			// { dg-error "'define_aggregate' evaluated from 'consteval' block which encloses '<lambda\\\(\\\)> static::S11::S12' being defined" }
+ }
+ 
+ consteval info
+ baz ()
+ {
+   struct S13;
+   return ^^S13;
+ }
+ 
+ consteval {						// { dg-message "'consteval' block defined here" }
+   define_aggregate (baz (), {});			// { dg-error "'consteval std::meta::info baz\\\(\\\)' intervenes between 'baz\\\(\\\)::S13' scope and 'consteval' block 'define_aggregate' is evaluated from" }
+ }
+ 
+ struct S14 {
+   struct S15;
+ };
+ 
+ consteval {						// { dg-message "'consteval' block defined here" }
+   define_aggregate (^^S14::S15, {});			// { dg-error "'S14' intervenes between 'S14::S15' scope and 'consteval' block 'define_aggregate' is evaluated from" }
+ }
+ 
+ struct S16;
+ 
+ void
+ qux ()
+ {
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (^^S16, {});			// { dg-error "'void qux\\\(\\\)' intervenes between 'consteval' block 'define_aggregate' is evaluated from and 'S16' scope" }
+   }
+ }
+ 
+ struct S17;
+ 
+ struct S18 {
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (^^S17, {});			// { dg-error "'S18' intervenes between 'consteval' block 'define_aggregate' is evaluated from and 'S17' scope" }
+   }
+ };
+ 
+ void
+ garply ()
+ {
+   struct S19;
+   consteval {
+     define_aggregate (^^S19, {});
+   }
+ }
+ 
+ void
+ fred ()
+ {
+   struct S20;
+   [] () {
+     consteval {						// { dg-message "'consteval' block defined here" }
+       define_aggregate (^^S20, {});			// { dg-error "'fred\\\(\\\)::<lambda\\\(\\\)>' intervenes between 'consteval' block 'define_aggregate' is evaluated from and 'fred\\\(\\\)::S20' scope" }
+     }
+   } ();
+ }
+ 
+ consteval info
+ corge ()
+ {
+   struct S21;
+   return ^^S21;
+ }
+ 
+ void
+ plugh ()
+ {
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (corge (), {});			// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'void plugh\\\(\\\)' while 'corge\\\(\\\)::S21' type being defined is enclosed by 'consteval std::meta::info corge\\\(\\\)'" }
+   }
+ }
+ 
+ struct S22 {
+   struct S23;
+ };
+ 
+ struct S24 {
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (^^S22::S23, {});			// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'S24' while 'S22::S23' type being defined is enclosed by 'S22'" }
+   }
+ };
+ 
+ consteval info
+ waldo ()
+ {
+   struct S25;
+   return ^^S25;
+ }
+ 
+ struct S26 {
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (waldo (), {});			// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'S26' while 'waldo\\\(\\\)::S25' type being defined is enclosed by 'consteval std::meta::info waldo\\\(\\\)'" }
+   }
+ };
+ 
+ struct S27 {
+   struct S28;
+ };
+ 
+ void
+ grault ()
+ {
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (^^S27::S28, {});			// { dg-error "'define_aggregate' evaluated from 'consteval' block enclosed by 'void grault\\\(\\\)' while 'S27::S28' type being defined is enclosed by 'S27'" }
+   }
+ }
+ 
+ void
+ xyzzy ()
+ {
+   struct S29 {
+     struct S30;
+   };
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (^^S29::S30, {});			// { dg-error "'xyzzy\\\(\\\)::S29' intervenes between 'xyzzy\\\(\\\)::S29::S30' scope and 'consteval' block 'define_aggregate' is evaluated from" }
+   }
+   static constexpr auto a = [] () consteval {
+     struct S31;
+     return ^^S31;
+   } ();
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (a, {});				// { dg-error "'xyzzy\\\(\\\)::<lambda\\\(\\\)>' intervenes between 'xyzzy\\\(\\\)::<lambda\\\(\\\)>::S31' scope and 'consteval' block 'define_aggregate' is evaluated from" }
+   }
+ }
+ 
+ struct S32 {
+   struct S33 {
+     struct S34;
+   };
+   consteval {						// { dg-message "'consteval' block defined here" }
+     define_aggregate (^^S33::S34, {});			// { dg-error "'S32::S33' intervenes between 'S32::S33::S34' scope and 'consteval' block 'define_aggregate' is evaluated from" }
+   }
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,225 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::define_aggregate.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr auto uctx = access_context::unchecked ();
+ constexpr auto ctx = access_context::unprivileged ();
+ 
+ void
+ foo ()
+ {
+   struct S;
+   class C;
+   union U;
+   static_assert (!is_complete_type (^^S));
+   static_assert (!is_complete_type (^^C));
+   static_assert (!is_complete_type (^^U));
+   consteval {
+     if (is_complete_type (^^S))
+       throw 1;
+     if (is_complete_type (^^C))
+       throw 2;
+     if (is_complete_type (^^U))
+       throw 3;
+     define_aggregate (^^S, {});
+     define_aggregate (^^C, {});
+     define_aggregate (^^U, {});
+     if (!is_complete_type (^^S))
+       throw 4;
+     if (!is_complete_type (^^C))
+       throw 5;
+     if (!is_complete_type (^^U))
+       throw 6;
+     if (!nonstatic_data_members_of (^^S, uctx).empty ())
+       throw 7;
+     if (!nonstatic_data_members_of (^^C, uctx).empty ())
+       throw 8;
+     if (!nonstatic_data_members_of (^^U, uctx).empty ())
+       throw 9;
+   }
+   static_assert (is_complete_type (^^S));
+   static_assert (is_complete_type (^^C));
+   static_assert (is_complete_type (^^U));
+   static_assert (nonstatic_data_members_of (^^S, uctx).empty ());
+   static_assert (nonstatic_data_members_of (^^C, uctx).empty ());
+   static_assert (nonstatic_data_members_of (^^U, uctx).empty ());
+ }
+ 
+ void
+ bar ()
+ {
+   struct S;
+   class C;
+   union U;
+   union U2;
+   static_assert (!is_complete_type (^^S));
+   static_assert (!is_complete_type (^^C));
+   static_assert (!is_complete_type (^^U));
+   consteval {
+     if (is_complete_type (^^S))
+       throw 1;
+     if (is_complete_type (^^C))
+       throw 2;
+     if (is_complete_type (^^U))
+       throw 3;
+     define_aggregate (^^S, { data_member_spec (^^int, { .name = "a", .alignment = 32 }),
+ 			     data_member_spec (^^bool, { .name = "b" }),
+ 			     data_member_spec (^^int, { .bit_width = 0 }),
+ 			     data_member_spec (^^int, { .name = "_", .bit_width = 3 }),});
+     define_aggregate (^^C, { data_member_spec (^^int, { .name = "a", .alignment = 32 }),
+ 			     data_member_spec (^^bool, { .name = "b" }),
+ 			     data_member_spec (^^int, { .bit_width = 0 }),
+ 			     data_member_spec (^^int, { .name = "_", .bit_width = 3 }),});
+     define_aggregate (^^U, { data_member_spec (^^int, { .name = "a", .alignment = 32 }),
+ 			     data_member_spec (^^bool, { .name = "b" }),
+ 			     data_member_spec (^^int, { .bit_width = 0 }),
+ 			     data_member_spec (^^int, { .name = "_", .bit_width = 3 }),});
+     define_aggregate (^^U2, { data_member_spec (^^int, { .name = "a" }),
+ 			      data_member_spec (^^bool, { .name = "b" }),
+ 			      data_member_spec (^^int, { .bit_width = 0 }),
+ 			      data_member_spec (^^int, { .name = "_", .bit_width = 3 }),});
+     if (!is_complete_type (^^S))
+       throw 4;
+     if (!is_complete_type (^^C))
+       throw 5;
+     if (!is_complete_type (^^U))
+       throw 6;
+     if (!nonstatic_data_members_of (^^S, uctx).size () == 3)
+       throw 7;
+     if (!nonstatic_data_members_of (^^C, uctx).size () == 3)
+       throw 8;
+     if (!nonstatic_data_members_of (^^U, uctx).size () == 3)
+       throw 9;
+     if (!nonstatic_data_members_of (^^S, ctx).size () == 3)
+       throw 10;
+     if (!nonstatic_data_members_of (^^C, ctx).size () == 3)
+       throw 11;
+     if (!nonstatic_data_members_of (^^U, ctx).size () == 3)
+       throw 12;
+     if (!alignment_of (nonstatic_data_members_of (^^S, uctx)[0]) == 32)
+       throw 13;
+     if (!bit_size_of (members_of (^^S, uctx)[2]) == 0)
+       throw 14;
+     if (!is_bit_field (members_of (^^S, ctx)[2]))
+       throw 15;
+     if (!bit_size_of (members_of (^^S, uctx)[3]) == 3)
+       throw 16;
+     if (!is_bit_field (members_of (^^S, ctx)[3]))
+       throw 17;
+     if (!alignment_of (nonstatic_data_members_of (^^C, uctx)[0]) == 32)
+       throw 18;
+     if (!bit_size_of (members_of (^^C, uctx)[2]) == 0)
+       throw 19;
+     if (!is_bit_field (members_of (^^C, ctx)[2]))
+       throw 20;
+     if (!bit_size_of (members_of (^^C, uctx)[3]) == 3)
+       throw 21;
+     if (!is_bit_field (members_of (^^C, ctx)[3]))
+       throw 22;
+     if (!alignment_of (nonstatic_data_members_of (^^U, uctx)[0]) == 32)
+       throw 23;
+     if (!bit_size_of (members_of (^^U, uctx)[2]) == 0)
+       throw 24;
+     if (!is_bit_field (members_of (^^U, ctx)[2]))
+       throw 25;
+     if (!bit_size_of (members_of (^^U, uctx)[3]) == 3)
+       throw 26;
+     if (!is_bit_field (members_of (^^U, ctx)[3]))
+       throw 27;
+     if (!is_public (members_of (^^S, uctx)[0]))
+       throw 28;
+     if (!is_public (members_of (^^S, uctx)[1]))
+       throw 29;
+     if (!is_public (members_of (^^S, uctx)[2]))
+       throw 30;
+     if (!is_public (members_of (^^S, uctx)[3]))
+       throw 31;
+     if (!is_public (members_of (^^C, uctx)[0]))
+       throw 32;
+     if (!is_public (members_of (^^C, uctx)[1]))
+       throw 33;
+     if (!is_public (members_of (^^C, uctx)[2]))
+       throw 34;
+     if (!is_public (members_of (^^C, uctx)[3]))
+       throw 35;
+     if (!is_public (members_of (^^U, uctx)[0]))
+       throw 36;
+     if (!is_public (members_of (^^U, uctx)[1]))
+       throw 37;
+     if (!is_public (members_of (^^U, uctx)[2]))
+       throw 38;
+     if (!is_public (members_of (^^U, uctx)[3]))
+       throw 39;
+     if (!is_class_type (^^S))
+       throw 40;
+     if (!is_class_type (^^C))
+       throw 41;
+     if (!is_union_type (^^U))
+       throw 42;
+   }
+   static_assert (is_complete_type (^^S));
+   static_assert (is_complete_type (^^C));
+   static_assert (is_complete_type (^^U));
+   static_assert (nonstatic_data_members_of (^^S, uctx).size () == 3);
+   static_assert (nonstatic_data_members_of (^^C, uctx).size () == 3);
+   static_assert (nonstatic_data_members_of (^^U, uctx).size () == 3);
+   static_assert (nonstatic_data_members_of (^^S, ctx).size () == 3);
+   static_assert (nonstatic_data_members_of (^^C, ctx).size () == 3);
+   static_assert (nonstatic_data_members_of (^^U, ctx).size () == 3);
+   static_assert (alignment_of (nonstatic_data_members_of (^^S, uctx)[0]) == 32);
+   static_assert (bit_size_of (members_of (^^S, uctx)[2]) == 0);
+   static_assert (is_bit_field (members_of (^^S, ctx)[2]));
+   static_assert (bit_size_of (members_of (^^S, uctx)[3]) == 3);
+   static_assert (is_bit_field (members_of (^^S, ctx)[3]));
+   static_assert (alignment_of (nonstatic_data_members_of (^^C, uctx)[0]) == 32);
+   static_assert (bit_size_of (members_of (^^C, uctx)[2]) == 0);
+   static_assert (is_bit_field (members_of (^^C, ctx)[2]));
+   static_assert (bit_size_of (members_of (^^C, uctx)[3]) == 3);
+   static_assert (is_bit_field (members_of (^^C, ctx)[3]));
+   static_assert (alignment_of (nonstatic_data_members_of (^^U, uctx)[0]) == 32);
+   static_assert (bit_size_of (members_of (^^U, uctx)[2]) == 0);
+   static_assert (is_bit_field (members_of (^^U, ctx)[2]));
+   static_assert (bit_size_of (members_of (^^U, uctx)[3]) == 3);
+   static_assert (is_bit_field (members_of (^^U, ctx)[3]));
+   static_assert (is_public (members_of (^^S, uctx)[0]));
+   static_assert (is_public (members_of (^^S, uctx)[1]));
+   static_assert (is_public (members_of (^^S, uctx)[2]));
+   static_assert (is_public (members_of (^^S, uctx)[3]));
+   static_assert (is_public (members_of (^^C, uctx)[0]));
+   static_assert (is_public (members_of (^^C, uctx)[1]));
+   static_assert (is_public (members_of (^^C, uctx)[2]));
+   static_assert (is_public (members_of (^^C, uctx)[3]));
+   static_assert (is_public (members_of (^^U, uctx)[0]));
+   static_assert (is_public (members_of (^^U, uctx)[1]));
+   static_assert (is_public (members_of (^^U, uctx)[2]));
+   static_assert (is_public (members_of (^^U, uctx)[3]));
+   static_assert (is_class_type (^^S));
+   static_assert (is_class_type (^^C));
+   static_assert (is_union_type (^^U));
+   static_assert (sizeof (U2) == sizeof (int));
+   constexpr S s = { 1, true, 2 };
+   static_assert (s.a == 1 && s.b == true && s._ == 2);
+   constexpr C c = { 3, false, -4 };
+   static_assert (c.a == 3 && c.b == false && c._ == -4);
+   union U u { .a = 42 };
+   u.b = true;
+   u._ = 3;
+   u.[: nonstatic_data_members_of (^^U, ctx)[2] :] = 1;
+ }
+ 
+ void
+ baz ()
+ {
+   struct E {};
+   struct S;
+   consteval {
+     define_aggregate (^^S, { data_member_spec (^^int, { .name = "_" }),
+ 			     data_member_spec (^^E, { .name = "_", .no_unique_address = true }) });
+   }
+   static_assert (sizeof (S) == sizeof (int));
+ }
\ No newline at end of file
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_aggregate5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_aggregate5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ struct foo;
+ 
+ consteval {
+   using namespace std::meta;
+   using namespace std::views;
+   using std::make_pair;
+   using std::vector;
+   using std::pair;
+   define_aggregate (^^foo, join (vector <vector <pair <bool, info>>> {
+     { make_pair (true, data_member_spec (^^int, { .name = "i" })) },
+     { make_pair (false, data_member_spec (^^std::string, { .name = "s" })),
+       make_pair (true, data_member_spec (^^bool, { .name = "b" })) }})
+ 	| filter ([] (auto x) constexpr { return x.first; })
+ 	| transform ([] (auto x) constexpr { return x.second; }));
+ }
+ 
+ static_assert (type_of (^^foo::i) == ^^int);
+ static_assert (type_of (^^foo::b) == ^^bool);
+ static_assert (nonstatic_data_members_of (^^foo, std::meta::access_context::current ()).size () == 2);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_array1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_array1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_array1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_array1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,91 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::define_static_array.
+ 
+ #include <array>
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ 
+ struct V { int a, b, c; };
+ constexpr auto a = std::define_static_array ("abcd");
+ constexpr auto b = std::define_static_array (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}");
+ constexpr auto c = std::define_static_array (std::vector <char> {});
+ constexpr auto d = std::define_static_array (std::array { 1, 2, 42, 3 });
+ constexpr float ea[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
+ constexpr auto e = std::define_static_array (ea);
+ constexpr int fb[] = { 1, 2, 3, 4, 5, 6 };
+ constexpr std::span <const int> fa (fb);
+ constexpr auto f = std::define_static_array (fa);
+ constexpr auto g = std::define_static_array (fa.subspan (1, 4));
+ constexpr auto h = std::define_static_array (fa.subspan (1, 4) | std::views::reverse);
+ constexpr auto i = std::define_static_array (std::vector <V> { V { 1, 2, 3 }, V { 2, 3, 4 }, V { 3, 4, 5 } });
+ constexpr auto j = std::define_static_array (std::vector <long long> {});
+ constexpr auto k = std::define_static_array (std::meta::nonstatic_data_members_of (^^V, std::meta::access_context::current ()));
+ static_assert (a.data () == std::define_static_string ("abcd") && a.size () == 5);
+ static_assert (b.data () == std::define_static_string (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}")
+ 	       && b.size () == sizeof (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}") / sizeof (char32_t));
+ static_assert (c.data () == nullptr && c.size () == 0);
+ static_assert (d.data () == std::define_static_array (std::vector <int> { 1, 2, 42, 3 }).data ()
+ 	       && d.size () == 4 && d[0] == 1 && d[1] == 2 && d[2] == 42 && d[3] == 3);
+ static_assert (e.data () == std::define_static_array (std::array { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }).data ()
+ 	       && e.size () == 6 && e[0] == 1.0f && e[1] == 2.0f && e[2] == 3.0f && e[3] == 4.0f && e[4] == 5.0f && e[5] == 6.0f);
+ static_assert (f.data () == std::define_static_array (std::vector <int> { 1, 2, 3, 4, 5, 6 }).data ()
+ 	       && f.size () == 6);
+ static_assert (d.data () != f.data ());
+ static_assert (g.data () == std::define_static_array (std::array { 2, 3, 4, 5 }).data ()
+ 	       && g.size () == 4);
+ static_assert (h.data () == std::define_static_array (std::vector <int> { 5, 4, 3, 2 }).data ()
+ 	       && h.size () == 4 && h[0] == 5 && h[1] == 4 && h[2] == 3 && h[3] == 2);
+ static_assert (i.size () == 3);
+ static_assert (j.data () == nullptr && j.size () == 0);
+ static_assert (k.size () == 3 && k[0] == ^^V::a && k[1] == ^^V::b && k[2] == ^^V::c);
+ 
+ int
+ main ()
+ {
+   if (std::string_view (a) != std::string_view ("abcd", 5))
+     __builtin_abort ();
+   if (std::u32string_view (b) != std::u32string_view (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}", 9))
+     __builtin_abort ();
+   for (const char &x : c)
+     __builtin_abort ();
+   int i = 0;
+   for (const int &x : d)
+     if (x != "\x{1}\x{2}\x{2a}\x{3}"[i++])
+       __builtin_abort ();
+   if (i != 4)
+     __builtin_abort ();
+   i = 0;
+   for (const float &x : e)
+     if (x != ++i)
+       __builtin_abort ();
+   if (i != 6)
+     __builtin_abort ();
+   i = 0;
+   for (const int &x : f)
+     if (x != ++i)
+       __builtin_abort ();
+   if (i != 6)
+     __builtin_abort ();
+   i = 1;
+   for (const int &x : g)
+     if (x != ++i)
+       __builtin_abort ();
+   if (i != 5)
+     __builtin_abort ();
+   i = 6;
+   for (const int &x : h)
+     if (x != --i)
+       __builtin_abort ();
+   if (i != 2)
+     __builtin_abort ();
+   i = 0;
+   for (const V &x : ::i)
+     if (x.a != i + 1 || x.b != i + 2 || x.c != i + 3)
+       __builtin_abort ();
+     else
+       ++i;
+   if (i != 3)
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_array2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_array2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_array2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_array2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::define_static_array.
+ 
+ #include <meta>
+ 
+ struct A {
+   int a;
+   consteval A (int x) : a(x) {}
+   consteval A (const A &x) : a(x.a + 1) {}
+ };
+ static_assert (std::vector <A> { 1 }[0].a == 2);
+ constexpr auto a = std::define_static_array (std::vector <A> { 1, 11, 21 });
+ static_assert (a.size () == 3);
+ static_assert (a[0].a >= 2 && a[1].a >= 12 && a[2].a >= 22);
+ // TODO: I believe there should be at least 2 copy ctors per element rather
+ // than just one.  One is already in the vector construction.
+ // Then [meta.define.static]/10 models it as if reflect_constant was called
+ // on each element and reflect_constant takes the class by value rather than
+ // reference, so one needs to copy construct from a const reference to the
+ // range element into a TARGET_EXPR of the reflect_constant argument.
+ // And not sure if there shouldn't be further bumps inside of
+ // reflect_constant, libcxx bumps 3 times.
+ // static_assert (a[0].a == 3 && a[1].a == 13 && a[2].a == 23);
+ 
+ // I believe the copy-constructor of this class breaks the rule for NTTP
+ // from [temp.arg.nontype] p4 (copies are not structurally equivalent),
+ // that we seem to not currently implement. It makes this test moot
+ // as reflect_constant should throw an exception.
+ // So language seems to say, that you should have no way to observe this copies.
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_array3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_array3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_array3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_array3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant_array.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ 
+ constexpr int arr[4]{1, 2, 3, 4};
+ constexpr std::span<const int> spn = std::define_static_array(std::span<const int, 4>(arr));
+ static_assert ([: std::meta::constant_of(^^arr) :] == spn.data());
+ 
+ constexpr int marr[2][2]{1, 2, 3, 4};
+ // LWG4483 multidimensional arrays
+ // constexpr std::span<const int[2]> mspn = std::define_static_array(std::span<const int[2], 2>(marr));
+ // static_assert ([: std::meta::constant_of(^^marr) :] == mspn.data());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_array4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_array4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_array4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_array4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant_array.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ constexpr int x[]{1,2,3,4,5};
+ constexpr int y[]{11,12,13,14,15};
+ constexpr auto as_pair = []<typename T1, typename T2>(const std::tuple<T1, T2>& t) static
+ { return std::pair<T1, T2>(t); };
+ 
+ constexpr std::span spn = std::define_static_array(std::views::zip (x, y) | std::views::transform (as_pair));
+ // FIXME these should pass
+ // static_assert (^^decltype(spn) == ^^std::span<const std::pair<int, int>>);
+ // static_assert (spn[2].first == 3);
+ // static_assert (spn[2].second == 13);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_object1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_object1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_object1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_object1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::define_static_object.
+ 
+ #include <meta>
+ 
+ struct V { int a, b, c; };
+ constexpr auto a = std::define_static_object (42);
+ constexpr auto b = std::define_static_object (U'\N{LATIN CAPITAL LETTER AE}');
+ constexpr auto c = std::define_static_object (V { 1, 2, 42 });
+ static_assert (a == std::define_static_object (42) && *a == 42);
+ static_assert (is_same_type (type_of (^^a), ^^const int *const));
+ static_assert (b == std::define_static_object (U'\N{LATIN CAPITAL LETTER AE}') && *b == U'\N{LATIN CAPITAL LETTER AE}');
+ static_assert (is_same_type (type_of (^^b), ^^const char32_t *const));
+ static_assert (c == std::define_static_object (V { 1, 2, 42 }) && c->a == 1 && c->b == 2 && c->c == 42);
+ static_assert (is_same_type (type_of (^^c), ^^const V *const));
+ static_assert (a == std::define_static_array (std::vector <int> { 42 }).data ());
+ static_assert (b == std::define_static_array (std::vector <char32_t> { U'\N{LATIN CAPITAL LETTER AE}' }).data ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_object2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_object2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_object2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_object2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::define_static_object.
+ 
+ #include <meta>
+ 
+ constexpr int arr[]{1, 2, 3};
+ // LWG4483 use extract(reflect_constant_array())
+ // constexpr const int(*ptr)[3] = std::define_static_object(arr);
+ // static_assert( *ptr == std::define_static_array(arr).data() );
+ // static_assert( ptr = &std::meta::constant_of(arr) );
+ 
+ constexpr int marr[3][3]{1, 2, 3};
+ // LWG4483 array are not structural so this fail
+ // constexpr const int(*mptr)[3][3] = std::define_static_object(marr);
+ // static_assert( *mptr == std::define_static_array(marr).data() );
+ // static_assert( mptr = &std::meta::constant_of(marr) );
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_string1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_string1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/define_static_string1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/define_static_string1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,133 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::define_static_string.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ 
+ constexpr const char *a = std::define_static_string ("abcd");
+ constexpr const char8_t *b = std::define_static_string (u8"abcd\N{LATIN SMALL LETTER AE}");
+ constexpr const wchar_t *c = std::define_static_string (L"abcd");
+ constexpr const char16_t *d = std::define_static_string (u"abcd\0ef");
+ constexpr const char32_t *e = std::define_static_string (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}");
+ constexpr auto f = std::define_static_string (std::string_view ("abcd", 5));
+ constexpr auto g = std::define_static_string (std::string_view ("abcdefg", 4));
+ constexpr auto h = std::define_static_string (std::u8string_view (u8"ab\0\N{LATIN SMALL LETTER AE}", 5));
+ constexpr auto i = std::define_static_string (std::string_view ("abcdefgh", 9).substr (0, 5));
+ constexpr auto j = std::define_static_string (std::string_view ("abcdefgh", 9).substr (4, 3));
+ constexpr auto k = std::define_static_string (std::u32string_view (U"abcdefgh", 9).substr (3, 4));
+ constexpr char8_t la[] = { u8'h', u8'e', u8'l', u8'l', u8'o', u8'\0' };
+ constexpr auto l = std::define_static_string (la);
+ constexpr std::span <const char8_t> ma (la);
+ constexpr auto m = std::define_static_string (ma);
+ constexpr auto n = std::define_static_string (ma.subspan (1, 4));
+ constexpr auto o = std::define_static_string (ma.subspan (1, 4) | std::views::reverse);
+ constexpr auto p = std::define_static_string (std::vector <wchar_t> { L'W', L'o', L'r', L'l', L'd' });
+ constexpr auto q = std::define_static_string (std::vector <char16_t> { u'e', u'x', u't', u'r', u'e', u'm', u'e', u'l', u'y',
+ 								       u' ', u'l', u'o', u'n', u'g',
+ 								       u' ', u's', u't', u'r', u'i', u'n', u'g',
+ 								       u' ', u'w', u'i', u't', u'h',
+ 								       u' ', u'n', u'o', u'n', u'-', u'A', u'S', u'C', u'I', u'I',
+ 								       u' ', u'c', u'h', u'a', u'r', u'a', u'c', u't', u'e', u'r', u's',
+ 								       u' ', u'\N{LATIN SMALL LETTER A WITH ACUTE}' });
+ const char *r = std::define_static_string ("some string");
+ const char8_t *s = std::define_static_string (u8"\N{GRINNING FACE}\N{GRINNING FACE WITH SMILING EYES}");
+ static_assert (a == std::define_static_string ("abcd"));
+ static_assert (b == std::define_static_string (u8"abcd\N{LATIN SMALL LETTER AE}"));
+ static_assert (c == std::define_static_string (L"abcd"));
+ static_assert (d == std::define_static_string (u"abcd\0ef"));
+ static_assert (e == std::define_static_string (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}"));
+ static_assert (f == std::define_static_string ("abcd\0"));
+ static_assert (g == a);
+ static_assert (h == std::define_static_string (u8"ab\0\N{LATIN SMALL LETTER AE}"));
+ static_assert (i == std::define_static_string ("abcde"));
+ static_assert (a != i);
+ static_assert (j == std::define_static_string ("efg"));
+ static_assert (a != j);
+ static_assert (k == std::define_static_string (U"defg"));
+ static_assert (l == std::define_static_string (u8"hello\0"));
+ static_assert (m == l);
+ static_assert (n == std::define_static_string (u8"ello"));
+ static_assert (o == std::define_static_string (u8"olle"));
+ static_assert (p == std::define_static_string (L"World"));
+ static_assert (q == std::define_static_string (u"extremely long string with non-ASCII characters \N{LATIN SMALL LETTER A WITH ACUTE}"));
+ static_assert (std::define_static_string ("bar") != std::define_static_string ("baz"));
+ 
+ template <typename T, const T *P>
+ struct C { const T *p = P; };
+ 
+ static_assert (std::is_same_v <C <char, std::define_static_string ("foobar")>,
+ 			       C <char, std::define_static_string (std::vector <char> { 'f', 'o', 'o', 'b', 'a', 'r' })>>);
+ static_assert (!std::is_same_v <C <char, std::define_static_string ("foobar")>,
+ 				C <char, std::define_static_string (std::vector <char> { 'f', 'o', 'O', 'b', 'a', 'r' })>>);
+ static_assert (std::is_same_v <C <wchar_t, std::define_static_string (L"hello")>,
+ 			       C <wchar_t, std::define_static_string (L"hello")>>);
+ static_assert (std::is_same_v <C <char8_t, std::define_static_string (u8"hello\0")>,
+ 			       C <char8_t, std::define_static_string (ma)>>);
+ static_assert (std::is_same_v <C <char8_t, std::define_static_string (u8"\N{LATIN SMALL LETTER AE}")>,
+ 			       C <char8_t, std::define_static_string (u8"\N{LATIN SMALL LETTER AE}")>>);
+ static_assert (std::is_same_v <C <char16_t, std::define_static_string (u"\N{LATIN CAPITAL LETTER AE}")>,
+ 			       C <char16_t, std::define_static_string (std::vector <char16_t> { u'\N{LATIN CAPITAL LETTER AE}' })>>);
+ static_assert (std::is_same_v <C <char32_t, std::define_static_string (U"\N{GRINNING FACE}\N{GRINNING FACE WITH SMILING EYES}")>,
+ 			       C <char32_t, std::define_static_string (std::vector <char32_t> { U'\N{GRINNING FACE}', U'\N{GRINNING FACE WITH SMILING EYES}' })>>);
+ 
+ template <auto V>
+ consteval auto
+ foo ()
+ {
+   return V[0];
+ }
+ 
+ static_assert (foo <std::define_static_string ("foo")> () == 'f');
+ static_assert (foo <std::define_static_string (L"bar")> () == L'b');
+ static_assert (foo <std::define_static_string (u8"qux")> () == u8'q');
+ static_assert (foo <std::define_static_string (u"\N{LATIN SMALL LETTER AE}\N{LATIN CAPITAL LETTER AE}")> () == u'\N{LATIN SMALL LETTER AE}');
+ static_assert (foo <std::define_static_string (U"\N{GRINNING FACE WITH SMILING EYES}\N{GRINNING FACE}")> () == U'\N{GRINNING FACE WITH SMILING EYES}');
+ 
+ int
+ main ()
+ {
+   if (std::string_view (a) != std::string_view ("abcd"))
+     __builtin_abort ();
+   if (std::u8string_view (b) != std::u8string_view (u8"abcd\N{LATIN SMALL LETTER AE}"))
+     __builtin_abort ();
+   if (std::wstring_view (c) != std::wstring_view (L"abcd"))
+     __builtin_abort ();
+   if (std::u16string_view (d) != std::u16string_view (u"abcd\0ef"))
+     __builtin_abort ();
+   if (std::u32string_view (e) != std::u32string_view (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}"))
+     __builtin_abort ();
+   if (std::string_view (f) != std::string_view ("abcd\0"))
+     __builtin_abort ();
+   if (g != a)
+     __builtin_abort ();
+   if (std::u8string_view (h) != std::u8string_view (u8"ab\0\N{LATIN SMALL LETTER AE}"))
+     __builtin_abort ();
+   if (std::string_view (i) != std::string_view ("abcde"))
+     __builtin_abort ();
+   if (a == i)
+     __builtin_abort ();
+   if (std::string_view (j) != std::string_view ("efg"))
+     __builtin_abort ();
+   if (a == j)
+     __builtin_abort ();
+   if (std::u32string_view (k) != std::u32string_view (U"defg"))
+     __builtin_abort ();
+   if (std::u8string_view (l) != std::u8string_view (u8"hello\0"))
+     __builtin_abort ();
+   if (m != l)
+     __builtin_abort ();
+   if (std::u8string_view (n) != std::u8string_view (u8"ello"))
+     __builtin_abort ();
+   if (std::u8string_view (o) != std::u8string_view (u8"olle"))
+     __builtin_abort ();
+   if (std::wstring_view (p) != std::wstring_view (L"World"))
+     __builtin_abort ();
+   if (std::u16string_view (q) != std::u16string_view (u"extremely long string with non-ASCII characters \N{LATIN SMALL LETTER A WITH ACUTE}"))
+     __builtin_abort ();
+   if (r != std::define_static_string ("some string"))
+     __builtin_abort ();
+   if (s != std::define_static_string (u8"\N{GRINNING FACE}\N{GRINNING FACE WITH SMILING EYES}"))
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test dependent splice specifiers.
+ 
+ template<template<class> class X>
+ struct S {
+   typename [: ^^X :]<int, float> m; // { dg-error "wrong number of template arguments" }
+ };
+ 
+ template<class> struct V1 {};
+ template<class, class = int> struct V2 {};
+ 
+ S<V1> s1; // { dg-message "required from here" }
+ S<V2> s2; // OK
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Partial substitution of a SPLICE_SCOPE.
+ 
+ template<typename>
+ void f()
+ {
+    auto func = []<auto Mem>() static {
+       return [: ^^[:Mem:] ::func :];
+    };
+ }
+ 
+ void g() {
+    f<int>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep11.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep11.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep11.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Stolen from LLVM's splice-exprs.cpp.
+ 
+ using info = decltype(^^::);
+ 
+ template<info FN>
+ struct Cls {
+     template <typename RESULT, typename... Args>
+     struct Impl {
+         Impl(decltype(&[:FN:]));
+     };
+     template <typename RESULT, typename... Args>
+     Impl(RESULT (*)(Args...)) -> Impl<RESULT, Args...>;
+ };
+ 
+ void fn(int);
+ static_assert(^^decltype(Cls<^^fn>::Impl(&fn)) == ^^Cls<^^fn>::Impl<void, int>);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,36 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ template<typename T>
+ constexpr int
+ fn (T t)
+ {
+   return t;
+ }
+ 
+ template<typename T>
+ constexpr T
+ foo ()
+ {
+   constexpr auto r = ^^fn<T>;
+   int n = [: r :](42);
+   return n;
+ }
+ 
+ void
+ g ()
+ {
+   constexpr int r = foo<int>();
+   static_assert (r == 42);
+ }
+ 
+ template<typename T>
+ consteval info
+ h ()
+ {
+   return ^^T;
+ }
+ 
+ constexpr info i = h<int>();
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,33 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   template<typename T>
+   struct NS { };
+ 
+   template<typename T>
+   void foo ();
+ 
+   template<typename T>
+   S &operator|(const T&);
+ 
+   template<typename T>
+   static int V;
+ };
+ 
+ template<typename T>
+ void
+ g ()
+ {
+   // Looks like r1 and r4 should work.
+   //constexpr auto r1 = ^^T::template NS;
+   constexpr auto r2 = ^^T::template foo;
+   constexpr auto r3 = ^^T::template operator|;
+   //constexpr auto r4 = ^^T::template V;
+ }
+ 
+ void
+ f ()
+ {
+   g<S>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,24 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^int);
+ 
+ consteval int fn1 () { return 42; }
+ consteval int fn2 (int a = 5) { return a; }
+ 
+ constexpr info r1 = ^^fn1;
+ constexpr info r2 = ^^fn2;
+ static_assert([: r1 :]() == 42);
+ static_assert([: r2 :]() == 5);
+ static_assert([: r2 :](11) == 11);
+ 
+ // With a dependent reflection.
+ template <info R> consteval int fn() { return [:R:](); }
+ static_assert(fn<r1>() == 42);
+ static_assert(fn<r2>() == 5);
+ 
+ void
+ runtime ()
+ {
+   [:^^runtime:];
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   static constexpr int x = 42;
+   using type = int;
+   static void fn (int) { }
+   template<typename T>
+   static void tfn () { }
+   template<typename T>
+   static T var;
+ };
+ 
+ template<typename T>
+ void
+ f ()
+ {
+   static_assert ([: ^^T :]::x == 42);
+   typename [: ^^T :]::type a = 42;
+   [: ^^T :]::fn (42);
+   [: ^^T :]::template tfn<([: ^^T :])>();  // { dg-error "expected a reflection of an expression instead of type .S." }
+   auto x = [: ^^T :]::template var<([: ^^T :])>;  // { dg-error "expected a reflection of an expression instead of type .S." }
+ }
+ 
+ void
+ g ()
+ {
+   f<S>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test that we give a nice error about a missing typename.
+ 
+ struct S {
+   using type = int;
+ };
+ 
+ template<typename T>
+ void
+ f ()
+ {
+   [: ^^T :]::type i = 42; // { dg-error "need .typename. before .\\\[: \\\^\\\^T :\\\]::type. because .\\\[: \\\^\\\^T :\\\]. is a dependent scope" }
+ }
+ 
+ void
+ g ()
+ {
+   f<S>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<typename T>
+ struct Z {};
+ 
+ struct S {
+   static constexpr auto r = ^^Z;
+ };
+ 
+ template<typename T, auto R>
+ void
+ g ()
+ {
+  typename [: R :]<int> c1;
+  typename [: T::r :]<int> c2;
+ }
+ 
+ void
+ f ()
+ {
+   g<S, ^^Z>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,70 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ struct S {
+   int i;
+   static int si;
+   static int mfn () { return 1; }
+ };
+ 
+ int S::si;
+ 
+ template<typename T>
+ struct C {
+   int i;
+   static T si;
+   static T mfn() { return 1; }
+ };
+ 
+ template<info R>
+ void
+ f ()
+ {
+   typename [:R:] r{1};
+   ++[:R:]::si;
+   [:R:]::si += [:R:]::mfn ();
+   using L = [:R:];
+   L r2{2};
+ }
+ 
+ template<info R>
+ struct A {
+   typename [:R:] r;
+   int i = [:R:]::mfn ();
+   using L = [:R:];
+   L r2;
+   int mem () { return [:R:]::si; }
+ };
+ 
+ template<info R>
+ void
+ f2 ()
+ {
+   typename [:R:]<int> r{1};
+   ++template [:R:]<int>::si;
+   template [:R:]<int>::si += template [:R:]<int>::mfn ();
+   using L = [:R:]<int>;
+   L r2{2};
+ }
+ 
+ template<info R>
+ struct A2 {
+   typename [:R:]<int> r;
+   int i = template [:R:]<int>::mfn ();
+   using L = [:R:]<int>;
+   L r2;
+   int mem () { return template [:R:]<int>::si; }
+ };
+ 
+ void
+ doit ()
+ {
+   f<^^S>();
+   f<^^C<int>>();
+   A<^^S> a;
+   A<^^C<int>> a2;
+   f2<^^C>();
+   A2<^^C> a3;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/dep9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/dep9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,40 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Dependent variable templates.
+ 
+ using info = decltype(^^void);
+ 
+ template<typename T>
+ constexpr T magic = 1234;
+ 
+ void foo (int);
+ 
+ template<info R>
+ void
+ f ()
+ {
+   int i = template [:R:]<int>;
+   constexpr int ci = template [:R:]<int>;
+   foo (template [:R:]<int>);
+ }
+ 
+ template<auto R>
+ void
+ f2 ()
+ {
+   int i = [:R:];
+   constexpr int ic = [:R:];
+   foo ([:R:]);
+ }
+ 
+ constexpr info V = ^^magic;
+ constexpr info VT = ^^magic<int>;
+ 
+ void
+ g ()
+ {
+   f<^^magic>();
+   f<V>();
+   f2<^^magic<int>>();
+   f2<VT>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/diag1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/diag1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/diag1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/diag1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test that we offer some helpful diagnostic.
+ 
+ struct S {
+   template<typename T>
+   void tfn (T) { }
+ };
+ 
+ template<typename T>
+ constexpr T fortytwo = 42;
+ 
+ void
+ f ()
+ {
+   S s;
+   s.[: ^^S::tfn :](42); // { dg-error "reflection .S::tfn. not usable in a splice expression" }
+ // { dg-message "add .template. to denote a template" "" { target *-*-* } .-1 }
+   s.template [: ^^S::tfn :](42);
+ 
+   constexpr auto r = ^^fortytwo;
+   constexpr int i1 = [:r:]<int>; // { dg-error "reflection .fortytwo<int>. not usable in a splice expression with template arguments" }
+ // { dg-message "add .template. to denote a template" "" { target *-*-* } .-1 }
+   constexpr int i2 = template [:r:]<int>;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/diag2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/diag2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/diag2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/diag2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // This used to say ''splice_scope' not supported by
+ // dump_type_prefix<typeprefixerror>r'splice_scope' not supported
+ // by dump_type_suffix'.  Eeech.
+ 
+ using info = decltype(^^void);
+ 
+ struct S {
+   int i;
+ };
+ 
+ template<info R>
+ void
+ f ()
+ {
+   typename [:R:] r{1};  // { dg-message "previous declaration as .\\\[: R :\\\] r." }
+   typename [:R:] r{2};  // { dg-error "conflicting declaration .\\\[: R :\\\] r." }
+ }
+ 
+ int
+ main ()
+ {
+   f<^^S>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/diag3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/diag3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/diag3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/diag3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,28 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test that we suggest adding "constexpr" or "constinit" (where allowed).
+ 
+ auto foo = ^^int;  // { dg-error "consteval-only variable .foo." }
+ // { dg-message "add .constexpr. or .constinit." "" { target *-*-* } .-1 }
+ constinit auto foo_ = ^^int;
+ constexpr auto foo__ = ^^int;
+ thread_local auto tfoo = ^^int;  // { dg-error "consteval-only variable .tfoo." }
+ // { dg-message "add .constexpr. or .constinit." "" { target *-*-* } .-1 }
+ thread_local constinit auto tfoo_ = ^^int;
+ thread_local constexpr auto tfoo__ = ^^int;
+ 
+ void
+ f ()
+ {
+   auto ref = ^^int;  // { dg-error "consteval-only variable .ref." }
+ // { dg-message "add .constexpr." "" { target *-*-* } .-1 }
+   constexpr auto ref_ = ^^int;
+   static auto sref = ^^int;  // { dg-error "consteval-only variable .sref." }
+ // { dg-message "add .constexpr. or .constinit." "" { target *-*-* } .-1 }
+   static auto constinit sref_ = ^^int;
+   static auto constexpr sref__ = ^^int;
+   thread_local auto tref = ^^int; // { dg-error "consteval-only variable .tref." }
+ // { dg-message "add .constexpr. or .constinit." "" { target *-*-* } .-1 }
+   thread_local constinit auto tref_ = ^^int;
+   thread_local constexpr auto tref__ = ^^int;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/diag4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/diag4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/diag4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/diag4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test that we suggest adding "typename" (where allowed).
+ 
+ constexpr auto r = ^^int;
+ 
+ template<typename> struct S {};
+ 
+ void
+ g ()
+ {
+   [:r:] i = 42;  // { dg-error "expected a reflection of an expression" }
+ // { dg-message "add .typename. to denote a type outside a type-only context" "" { target *-*-* } .-1 }
+ 
+   S<([:r:])> s;  // { dg-error "expected a reflection of an expression|template argument 1 is invalid" }
+ // { dg-message "add .typename. to denote a type outside a type-only context" "" { target *-*-* } .-1 }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/display_string_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/display_string_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/display_string_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/display_string_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,230 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::display_string_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T () {}
+   T (const T &) {}
+   ~T () {}
+ };
+ struct U {
+   int u;
+   int v : 5;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ namespace {
+   namespace NS2 {}
+ };
+ namespace NS3 {
+   namespace {
+     namespace {
+       namespace NS4 {}
+     }
+   }
+ };
+ enum { Z };
+ 
+ constexpr auto ctx = access_context::current ();
+ 
+ struct AN { int a; long b; char c; };
+ 
+ [[=1, =AN { 1, 42, ' ' }]] void bar (long, const T f, int g[2], T &);
+ 
+ struct V1 {
+   constexpr V1 (int) {}
+ };
+ struct V2 {
+   V2 &operator = (const V2 &);
+ };
+ struct V3 {
+   V3 &operator = (V3 &&);
+ };
+ struct V4 {
+   V4 &operator += (const V4 &);
+ };
+ struct V5 {
+   operator int ();
+ };
+ int operator ""_a (const char *);
+ 
+ void
+ foo (int a, const long b, T c, int d[4], T &e)
+ {
+   static_assert (display_string_of (^^a) == "a");
+   static_assert (display_string_of (^^b) == "b");
+   static_assert (display_string_of (^^c) == "c");
+   static_assert (display_string_of (^^d) == "d");
+   static_assert (display_string_of (^^e) == "e");
+   static_assert (display_string_of (parameters_of (^^foo)[0]) == "<parameter a of void foo(int, long int, T, int*, T&)>");
+   static_assert (display_string_of (parameters_of (^^foo)[1]) == "<parameter b of void foo(int, long int, T, int*, T&)>");
+   static_assert (display_string_of (parameters_of (^^foo)[2]) == "<parameter c of void foo(int, long int, T, int*, T&)>");
+   static_assert (display_string_of (parameters_of (^^foo)[3]) == "<parameter d of void foo(int, long int, T, int*, T&)>");
+   static_assert (display_string_of (parameters_of (^^foo)[4]) == "<parameter e of void foo(int, long int, T, int*, T&)>");
+   static_assert (display_string_of (parameters_of (^^bar)[0]) == "<unnamed parameter 1 of void bar(long int, T, int*, T&)>");
+   static_assert (display_string_of (parameters_of (^^bar)[1]) == "<parameter f of void bar(long int, T, int*, T&)>");
+   static_assert (display_string_of (parameters_of (^^bar)[2]) == "<parameter g of void bar(long int, T, int*, T&)>");
+   static_assert (display_string_of (parameters_of (^^bar)[3]) == "<unnamed parameter 4 of void bar(long int, T, int*, T&)>");
+   static_assert (display_string_of (null_reflection) == "<null reflection>");
+   static_assert (display_string_of (^^::) == "::");
+   static_assert (display_string_of (^^NS2) == "{anonymous}::NS2");
+   static_assert (display_string_of (parent_of (^^NS2)) == "{anonymous}");
+   static_assert (display_string_of (^^NS3::NS4) == "NS3::{anonymous}::{anonymous}::NS4");
+   static_assert (display_string_of (parent_of (^^NS3::NS4)) == "NS3::{anonymous}::{anonymous}");
+   static_assert (display_string_of (parent_of (parent_of (^^NS3::NS4))) == "NS3::{anonymous}");
+   static_assert (display_string_of (parent_of (parent_of (parent_of   (^^NS3::NS4)))) == "NS3");
+   static_assert (display_string_of (^^Z) == "Z");
+   static_assert (display_string_of (parent_of (^^Z)) == "<unnamed enum>");
+   static_assert (display_string_of (reflect_constant (42)) == "42");
+   static_assert (display_string_of (reflect_object (arr[1])) == "arr[1]");
+   static_assert (display_string_of (^^arr) == "arr");
+   static_assert (display_string_of (^^a3) == "a3");
+   static_assert (display_string_of (^^fn) == "void fn()");
+   static_assert (display_string_of (^^fn2) == "auto& fn2()");
+   static_assert (display_string_of (^^Enum::A) == "A");
+   static_assert (display_string_of (^^Alias) == "Alias {aka int}");
+   static_assert (display_string_of (^^S) == "S");
+   static_assert (display_string_of (^^S::mem) == "S::mem");
+   static_assert (display_string_of (members_of (^^S, ctx)[1]) == "S::<unnamed bit-field>");
+   static_assert (display_string_of (^^TCls) == "template<auto <anonymous> > struct TCls");
+   static_assert (display_string_of (^^TFn) == "template<auto <anonymous> > void TFn()");
+   static_assert (display_string_of (^^TVar) == "template<auto <anonymous> > int TVar<<anonymous> >");
+   static_assert (display_string_of (^^Concept) == "template<auto <anonymous> > concept Concept");
+   static_assert (display_string_of (^^NSAlias) == "NSAlias");
+   static_assert (display_string_of (^^NS) == "NS");
+   static_assert (display_string_of (bases_of (^^S, ctx)[0]) == "S: B");
+   static_assert (display_string_of (data_member_spec (^^int, { .name = "member", .alignment = 128, .no_unique_address = true })) == "(int, member, 128, , true)");
+   static_assert (display_string_of (data_member_spec (^^const int, { .name = "member", .bit_width = 6 })) == "(const int, member, , 6, false)");
+   static_assert (display_string_of (data_member_spec (^^int, { .bit_width = 0 })) == "(int, , , 0, false)");
+   static_assert (display_string_of (data_member_spec (^^long, { .bit_width = 5 })) == "(long int, , , 5, false)");
+   static_assert (display_string_of (annotations_of (^^bar)[0]) == "[[=1]]");
+   static_assert (display_string_of (annotations_of (^^bar)[1]) == "[[=AN{1, 42, ' '}]]");
+   static_assert (display_string_of (^^int) == "int");
+   static_assert (display_string_of (^^unsigned) == "unsigned int");
+   static_assert (display_string_of (^^unsigned long) == "long unsigned int");
+   static_assert (display_string_of (^^const long long &) == "const long long int&");
+   static_assert (display_string_of (^^const double **) == "const double**");
+   static_assert (display_string_of (^^int (int)) == "int(int)");
+   static_assert (display_string_of (^^int (&) (int, long, S &)) == "int (&)(int, long int, S&)");
+   static_assert (display_string_of (^^int (*) (int, long, S &)) == "int (*)(int, long int, S&)");
+   static_assert (display_string_of (members_of (^^V2, ctx)[0]) == "V2& V2::operator=(const V2&)");
+   static_assert (display_string_of (members_of (^^V3, ctx)[0]) == "V3& V3::operator=(V3&&)");
+   static_assert (display_string_of (members_of (^^V4, ctx)[0]) == "V4& V4::operator+=(const V4&)");
+   static_assert (display_string_of (members_of (^^V5, ctx)[0]) == "V5::operator int()");
+   static_assert (display_string_of (^^operator""_a) == "int operator\"\"_a(const char*)");
+ }
+ 
+ namespace NS5 {
+   int arr[] = {1, 2, 3};
+   auto [a1, a2, a3] = arr;
+   void fn();
+   auto &fn2();
+   enum Enum { A };
+   using Alias = int;
+   struct B {};
+   struct S : B {
+     int mem;
+     int : 0;
+   };
+   struct T {
+     T () {}
+     T (const T &) {}
+     ~T () {}
+   };
+   struct U {
+     int u;
+     int v : 5;
+   };
+   template<auto> struct TCls {};
+   template<auto> void TFn();
+   template<auto> int TVar;
+   template<auto> concept Concept = requires { true; };
+   enum { Z };
+ 
+   struct AN { int a; long b; char c; };
+ 
+   [[=1, =AN { 1, 42, ' ' }]] void bar (long, const T f, int g[2], T &);
+ 
+   struct V1 {
+     constexpr V1 (int) {}
+   };
+   struct V2 {
+     V2 &operator = (const V2 &);
+   };
+   struct V3 {
+     V3 &operator = (V3 &&);
+   };
+   struct V4 {
+     V4 &operator += (const V4 &);
+   };
+   struct V5 {
+     operator int ();
+   };
+   int operator ""_a (const char *);
+ 
+   void
+   foo (int a, const long b, T c, int d[4], T &e)
+   {
+     static_assert (display_string_of (^^a) == "a");
+     static_assert (display_string_of (^^b) == "b");
+     static_assert (display_string_of (^^c) == "c");
+     static_assert (display_string_of (^^d) == "d");
+     static_assert (display_string_of (^^e) == "e");
+     static_assert (display_string_of (parameters_of (^^foo)[0]) == "<parameter a of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (display_string_of (parameters_of (^^foo)[1]) == "<parameter b of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (display_string_of (parameters_of (^^foo)[2]) == "<parameter c of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (display_string_of (parameters_of (^^foo)[3]) == "<parameter d of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (display_string_of (parameters_of (^^foo)[4]) == "<parameter e of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (display_string_of (parameters_of (^^bar)[0]) == "<unnamed parameter 1 of void NS5::bar(long int, T, int*, T&)>");
+     static_assert (display_string_of (parameters_of (^^bar)[1]) == "<parameter f of void NS5::bar(long int, T, int*, T&)>");
+     static_assert (display_string_of (parameters_of (^^bar)[2]) == "<parameter g of void NS5::bar(long int, T, int*, T&)>");
+     static_assert (display_string_of (parameters_of (^^bar)[3]) == "<unnamed parameter 4 of void NS5::bar(long int, T, int*, T&)>");
+     static_assert (display_string_of (^^Z) == "NS5::Z");
+     static_assert (display_string_of (parent_of (^^Z)) == "NS5::<unnamed enum>");
+     static_assert (display_string_of (reflect_constant (42)) == "42");
+     static_assert (display_string_of (reflect_object (arr[1])) == "NS5::arr[1]");
+     static_assert (display_string_of (^^arr) == "NS5::arr");
+     static_assert (display_string_of (^^a3) == "NS5::a3");
+     static_assert (display_string_of (^^fn) == "void NS5::fn()");
+     static_assert (display_string_of (^^fn2) == "auto& NS5::fn2()");
+     static_assert (display_string_of (^^Enum::A) == "NS5::A");
+     static_assert (display_string_of (^^Alias) == "NS5::Alias {aka int}");
+     static_assert (display_string_of (^^S) == "NS5::S");
+     static_assert (display_string_of (^^S::mem) == "NS5::S::mem");
+     static_assert (display_string_of (members_of (^^S, ctx)[1]) == "NS5::S::<unnamed bit-field>");
+     static_assert (display_string_of (^^TCls) == "template<auto <anonymous> > struct NS5::TCls");
+     static_assert (display_string_of (^^TFn) == "template<auto <anonymous> > void NS5::TFn()");
+     static_assert (display_string_of (^^TVar) == "template<auto <anonymous> > int NS5::TVar<<anonymous> >");
+     static_assert (display_string_of (^^Concept) == "template<auto <anonymous> > concept NS5::Concept");
+     static_assert (display_string_of (bases_of (^^S, ctx)[0]) == "NS5::S: NS5::B");
+     static_assert (display_string_of (annotations_of (^^bar)[0]) == "[[=1]]");
+     static_assert (display_string_of (annotations_of (^^bar)[1]) == "[[=NS5::AN{1, 42, ' '}]]");
+     static_assert (display_string_of (^^int (&) (int, long, S &)) == "int (&)(int, long int, NS5::S&)");
+     static_assert (display_string_of (^^int (*) (int, long, S &)) == "int (*)(int, long int, NS5::S&)");
+     static_assert (display_string_of (members_of (^^V2, ctx)[0]) == "NS5::V2& NS5::V2::operator=(const NS5::V2&)");
+     static_assert (display_string_of (members_of (^^V3, ctx)[0]) == "NS5::V3& NS5::V3::operator=(NS5::V3&&)");
+     static_assert (display_string_of (members_of (^^V4, ctx)[0]) == "NS5::V4& NS5::V4::operator+=(const NS5::V4&)");
+     static_assert (display_string_of (members_of (^^V5, ctx)[0]) == "NS5::V5::operator int()");
+     static_assert (display_string_of (^^operator""_a) == "int NS5::operator\"\"_a(const char*)");
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,355 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test throwing std::meta::exception.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval void
+ eval (int n)
+ {
+   switch (n)
+     {
+     case 0:
+       is_reference_type (^^n);
+       break;
+     case 1:
+       is_class_type (^^n);
+       break;
+     case 2:
+       is_union_type (^^n);
+       break;
+     case 3:
+       is_enum_type (^^n);
+       break;
+     case 4:
+       is_member_function_pointer_type (^^n);
+       break;
+     case 5:
+       is_member_object_pointer_type (^^n);
+       break;
+     case 6:
+       is_array_type (^^n);
+       break;
+     case 7:
+       is_pointer_type (^^n);
+       break;
+     case 8:
+       is_void_type (^^n);
+       break;
+     case 9:
+       is_null_pointer_type (^^n);
+       break;
+     case 10:
+       is_integral_type (^^n);
+       break;
+     case 11:
+       is_floating_point_type (^^n);
+       break;
+     case 12:
+       is_lvalue_reference_type (^^n);
+       break;
+     case 13:
+       is_rvalue_reference_type (^^n);
+       break;
+     case 14:
+       is_reflection_type (^^n);
+       break;
+     case 15:
+       remove_const (^^n);
+       break;
+     case 16:
+       remove_volatile (^^n);
+       break;
+     case 17:
+       remove_cv (^^n);
+       break;
+     case 18:
+       add_const (^^n);
+       break;
+     case 19:
+       add_volatile (^^n);
+       break;
+     case 20:
+       add_cv (^^n);
+       break;
+     case 21:
+       is_object_type (^^n);
+       break;
+     case 22:
+       is_arithmetic_type (^^n);
+       break;
+     case 23:
+       is_member_pointer_type (^^n);
+       break;
+     case 24:
+       is_scalar_type (^^n);
+       break;
+     case 25:
+       is_fundamental_type (^^n);
+       break;
+     case 26:
+       is_compound_type (^^n);
+       break;
+     case 27:
+       remove_reference (^^n);
+       break;
+     case 28:
+       add_lvalue_reference (^^n);
+       break;
+     case 29:
+       add_rvalue_reference (^^n);
+       break;
+     case 30:
+       make_signed (^^n);
+       break;
+     case 31:
+       make_unsigned (^^n);
+       break;
+     case 32:
+       remove_extent (^^n);
+       break;
+     case 33:
+       remove_all_extents (^^n);
+       break;
+     case 34:
+       remove_pointer (^^n);
+       break;
+     case 35:
+       add_pointer (^^n);
+       break;
+     case 36:
+       is_const_type (^^n);
+       break;
+     case 37:
+       is_volatile_type (^^n);
+       break;
+     case 38:
+       is_trivially_copyable_type (^^n);
+       break;
+     case 41:
+       is_standard_layout_type (^^n);
+       break;
+     case 42:
+       is_empty_type (^^n);
+       break;
+     case 43:
+       is_polymorphic_type (^^n);
+       break;
+     case 44:
+       is_abstract_type (^^n);
+       break;
+     case 45:
+       is_final_type (^^n);
+       break;
+     case 46:
+       is_aggregate_type (^^n);
+       break;
+     case 47:
+       is_consteval_only_type (^^n);
+       break;
+     case 48:
+       is_signed_type (^^n);
+       break;
+     case 49:
+       is_unsigned_type (^^n);
+       break;
+     case 50:
+       is_bounded_array_type (^^n);
+       break;
+     case 51:
+       is_unbounded_array_type (^^n);
+       break;
+     case 52:
+       is_scoped_enum_type (^^n);
+       break;
+     case 53:
+       is_default_constructible_type (^^n);
+       break;
+     case 54:
+       is_copy_constructible_type (^^n);
+       break;
+     case 55:
+       is_move_constructible_type (^^n);
+       break;
+     case 56:
+       is_copy_assignable_type (^^n);
+       break;
+     case 57:
+       is_move_assignable_type (^^n);
+       break;
+     case 58:
+       is_destructible_type (^^n);
+       break;
+     case 59:
+       is_trivially_default_constructible_type (^^n);
+       break;
+     case 60:
+       is_trivially_copy_constructible_type (^^n);
+       break;
+     case 61:
+       is_trivially_move_constructible_type (^^n);
+       break;
+     case 62:
+       is_trivially_copy_assignable_type (^^n);
+       break;
+     case 63:
+       is_trivially_move_assignable_type (^^n);
+       break;
+     case 64:
+       is_trivially_destructible_type (^^n);
+       break;
+     case 65:
+       is_nothrow_default_constructible_type (^^n);
+       break;
+     case 66:
+       is_nothrow_copy_constructible_type (^^n);
+       break;
+     case 67:
+       is_nothrow_move_constructible_type (^^n);
+       break;
+     case 68:
+       is_nothrow_copy_assignable_type (^^n);
+       break;
+     case 69:
+       is_nothrow_move_assignable_type (^^n);
+       break;
+     case 70:
+       is_nothrow_destructible_type (^^n);
+       break;
+     case 72:
+       has_virtual_destructor (^^n);
+       break;
+     case 73:
+       has_unique_object_representations (^^n);
+       break;
+     case 74:
+       rank (^^n);
+       break;
+     case 75:
+       extent (^^n);
+       break;
+     case 76:
+       extent (^^n, 2);
+       break;
+     case 77:
+       remove_cvref (^^n);
+       break;
+     case 78:
+       decay (^^n);
+       break;
+     case 79:
+       underlying_type (^^n);
+       break;
+     case 80:
+       is_implicit_lifetime_type (^^n);
+       break;
+     case 81:
+       is_swappable_type (^^n);
+       break;
+     case 82:
+       is_nothrow_swappable_type (^^n);
+       break;
+     case 83:
+       unwrap_reference (^^n);
+       break;
+     case 84:
+       unwrap_ref_decay (^^n);
+       break;
+    default:
+       break;
+     }
+ }
+ 
+ consteval bool
+ test (int n)
+ {
+   try { eval (n); }
+   catch (std::meta::exception &) { return true; }
+   catch (...) { return false; }
+   return false;
+ }
+ 
+ static_assert (test (0));
+ static_assert (test (1));
+ static_assert (test (2));
+ static_assert (test (3));
+ static_assert (test (4));
+ static_assert (test (5));
+ static_assert (test (6));
+ static_assert (test (7));
+ static_assert (test (8));
+ static_assert (test (9));
+ static_assert (test (10));
+ static_assert (test (11));
+ static_assert (test (12));
+ static_assert (test (13));
+ static_assert (test (14));
+ static_assert (test (15));
+ static_assert (test (16));
+ static_assert (test (17));
+ static_assert (test (18));
+ static_assert (test (19));
+ static_assert (test (20));
+ static_assert (test (21));
+ static_assert (test (22));
+ static_assert (test (23));
+ static_assert (test (24));
+ static_assert (test (25));
+ static_assert (test (26));
+ static_assert (test (27));
+ static_assert (test (28));
+ static_assert (test (29));
+ static_assert (test (30));
+ static_assert (test (31));
+ static_assert (test (32));
+ static_assert (test (33));
+ static_assert (test (34));
+ static_assert (test (35));
+ static_assert (test (36));
+ static_assert (test (37));
+ static_assert (test (38));
+ static_assert (test (41));
+ static_assert (test (42));
+ static_assert (test (43));
+ static_assert (test (44));
+ static_assert (test (45));
+ static_assert (test (46));
+ static_assert (test (47));
+ static_assert (test (48));
+ static_assert (test (49));
+ static_assert (test (50));
+ static_assert (test (51));
+ static_assert (test (52));
+ static_assert (test (53));
+ static_assert (test (54));
+ static_assert (test (55));
+ static_assert (test (56));
+ static_assert (test (57));
+ static_assert (test (58));
+ static_assert (test (59));
+ static_assert (test (60));
+ static_assert (test (61));
+ static_assert (test (62));
+ static_assert (test (63));
+ static_assert (test (64));
+ static_assert (test (65));
+ static_assert (test (66));
+ static_assert (test (67));
+ static_assert (test (68));
+ static_assert (test (69));
+ static_assert (test (70));
+ static_assert (test (72));
+ static_assert (test (73));
+ static_assert (test (74));
+ static_assert (test (75));
+ static_assert (test (76));
+ static_assert (test (77));
+ static_assert (test (78));
+ static_assert (test (79));
+ static_assert (test (80));
+ static_assert (test (81));
+ static_assert (test (82));
+ static_assert (test (83));
+ static_assert (test (84));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,91 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test throwing std::meta::exception.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int i;
+ static_assert (is_reference_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_class_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_union_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_enum_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_member_function_pointer_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_member_object_pointer_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_pointer_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_array_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_void_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_null_pointer_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_integral_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_floating_point_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_lvalue_reference_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_rvalue_reference_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert (is_reflection_type (^^i)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((remove_const (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((remove_volatile (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((remove_cv (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((add_const (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((add_volatile (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((add_cv (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_object_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_arithmetic_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_member_pointer_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_scalar_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_fundamental_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_compound_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((remove_reference (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((add_lvalue_reference (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((add_rvalue_reference (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((make_signed (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((make_unsigned (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((remove_extent (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((remove_all_extents (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((remove_pointer (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((add_pointer (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_const_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_volatile_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_trivially_copyable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_standard_layout_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_empty_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_polymorphic_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_abstract_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_final_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_aggregate_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_consteval_only_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_signed_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_unsigned_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_bounded_array_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_unbounded_array_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_scoped_enum_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_default_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_copy_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_move_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_copy_assignable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_move_assignable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_destructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_trivially_default_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_trivially_copy_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_trivially_move_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_trivially_copy_assignable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_trivially_move_assignable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_trivially_destructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_nothrow_default_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_nothrow_copy_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_nothrow_move_constructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_nothrow_copy_assignable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_nothrow_move_assignable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_nothrow_destructible_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((has_virtual_destructor (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((has_unique_object_representations (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((rank (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((extent (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((extent (^^i, 42), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((remove_cvref (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((decay (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((underlying_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_implicit_lifetime_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_swappable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((is_nothrow_swappable_type (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((unwrap_reference (^^i), true)); // { dg-error "non-constant|uncaught exception" }
+ static_assert ((unwrap_ref_decay (^^i), true)); // { dg-error "non-constant|uncaught exception" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test throwing std::meta::exception.
+ 
+ #include <meta>
+ 
+ consteval void
+ foo ()
+ {
+   throw std::meta::exception{"foo", ^^int};
+ }
+ 
+ consteval bool
+ test ()
+ {
+   try { foo (); }
+   catch (std::meta::exception &) { return true; }
+   catch (...) { return false; }
+   return false;
+ }
+ 
+ static_assert (test ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,221 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test throwing std::meta::exception.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S { };
+ 
+ consteval void
+ eval (int n)
+ {
+   switch (n)
+     {
+     case 0:
+       is_same_type (^^S, ^^n);
+       break;
+     case 1:
+       is_same_type (^^n, ^^S);
+       break;
+     case 2:
+       is_base_of_type (^^S, ^^n);
+       break;
+     case 3:
+       is_base_of_type (^^n, ^^S);
+       break;
+     case 4:
+       is_virtual_base_of_type (^^S, ^^n);
+       break;
+     case 5:
+       is_virtual_base_of_type (^^n, ^^S);
+       break;
+     case 6:
+       is_convertible_type (^^S, ^^n);
+       break;
+     case 7:
+       is_convertible_type (^^n, ^^S);
+       break;
+     case 8:
+       is_nothrow_convertible_type (^^S, ^^n);
+       break;
+     case 9:
+       is_nothrow_convertible_type (^^n, ^^S);
+       break;
+     case 10:
+       is_layout_compatible_type (^^S, ^^n);
+       break;
+     case 11:
+       is_layout_compatible_type (^^n, ^^S);
+       break;
+     case 12:
+       is_pointer_interconvertible_base_of_type (^^S, ^^n);
+       break;
+     case 13:
+       is_pointer_interconvertible_base_of_type (^^n, ^^S);
+       break;
+     case 14:
+       is_assignable_type (^^S, ^^n);
+       break;
+     case 15:
+       is_assignable_type (^^n, ^^S);
+       break;
+     case 16:
+       is_trivially_assignable_type (^^S, ^^n);
+       break;
+     case 17:
+       is_trivially_assignable_type (^^n, ^^S);
+       break;
+     case 18:
+       is_nothrow_assignable_type (^^S, ^^n);
+       break;
+     case 19:
+       is_nothrow_assignable_type (^^n, ^^S);
+       break;
+     case 20:
+       reference_constructs_from_temporary (^^S, ^^n);
+       break;
+     case 21:
+       reference_constructs_from_temporary (^^n, ^^S);
+       break;
+     case 22:
+       reference_converts_from_temporary (^^S, ^^n);
+       break;
+     case 23:
+       reference_converts_from_temporary (^^n, ^^S);
+       break;
+     case 24:
+       type_order (^^S, ^^n);
+       break;
+     case 25:
+       type_order (^^n, ^^S);
+       break;
+     case 26:
+       is_constructible_type (^^n, {});
+       break;
+     case 27:
+       is_constructible_type (^^S, { ^^S, ^^n, ^^S });
+       break;
+     case 28:
+       is_trivially_constructible_type (^^n, {});
+       break;
+     case 29:
+       is_trivially_constructible_type (^^S, { ^^n, ^^S, ^^S, ^^S });
+       break;
+     case 30:
+       is_nothrow_constructible_type (^^n, {});
+       break;
+     case 31:
+       is_nothrow_constructible_type (^^S, { ^^S, ^^S, ^^S, ^^S, ^^n });
+       break;
+     case 32:
+       is_invocable_type (^^n, {});
+       break;
+     case 33:
+       is_invocable_type (^^S, { ^^S, ^^S, ^^n, ^^S });
+       break;
+     case 34:
+       is_nothrow_invocable_type (^^n, {});
+       break;
+     case 35:
+       is_nothrow_invocable_type (^^S, { ^^S, ^^n, ^^S });
+       break;
+     case 36:
+       is_invocable_r_type (^^n, ^^S, {});
+       break;
+     case 37:
+       is_invocable_r_type (^^S, ^^n, {});
+       break;
+     case 38:
+       is_invocable_r_type (^^S, ^^S, { ^^S, ^^n, ^^S });
+       break;
+     case 39:
+       is_nothrow_invocable_r_type (^^n, ^^S, {});
+       break;
+     case 40:
+       is_nothrow_invocable_r_type (^^S, ^^n, {});
+       break;
+     case 41:
+       is_nothrow_invocable_r_type (^^S, ^^S, { ^^S, ^^n, ^^S });
+       break;
+     case 42:
+       invoke_result (^^n, {});
+       break;
+     case 43:
+       invoke_result (^^S, { ^^S, ^^n, ^^S });
+       break;
+     case 44:
+       is_swappable_with_type (^^S, ^^n);
+       break;
+     case 45:
+       is_swappable_with_type (^^n, ^^S);
+       break;
+     case 46:
+       is_nothrow_swappable_with_type (^^S, ^^n);
+       break;
+     case 47:
+       is_nothrow_swappable_with_type (^^n, ^^S);
+       break;
+     default:
+       break;
+     }
+ }
+ 
+ consteval bool
+ test (int n)
+ {
+   try { eval (n); }
+   catch (std::meta::exception &) { return true; }
+   catch (...) { return false; }
+   return false;
+ }
+ 
+ static_assert (test (0));
+ static_assert (test (1));
+ static_assert (test (2));
+ static_assert (test (3));
+ static_assert (test (4));
+ static_assert (test (5));
+ static_assert (test (6));
+ static_assert (test (7));
+ static_assert (test (8));
+ static_assert (test (9));
+ static_assert (test (10));
+ static_assert (test (11));
+ static_assert (test (12));
+ static_assert (test (13));
+ static_assert (test (14));
+ static_assert (test (15));
+ static_assert (test (16));
+ static_assert (test (17));
+ static_assert (test (18));
+ static_assert (test (19));
+ static_assert (test (20));
+ static_assert (test (21));
+ static_assert (test (22));
+ static_assert (test (23));
+ static_assert (test (24));
+ static_assert (test (25));
+ static_assert (test (26));
+ static_assert (test (27));
+ static_assert (test (28));
+ static_assert (test (29));
+ static_assert (test (30));
+ static_assert (test (31));
+ static_assert (test (32));
+ static_assert (test (33));
+ static_assert (test (34));
+ static_assert (test (35));
+ static_assert (test (36));
+ static_assert (test (37));
+ static_assert (test (38));
+ static_assert (test (39));
+ static_assert (test (40));
+ static_assert (test (41));
+ static_assert (test (42));
+ static_assert (test (43));
+ static_assert (test (44));
+ static_assert (test (45));
+ static_assert (test (46));
+ static_assert (test (47));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,103 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test throwing std::meta::exception.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template <int N>
+ struct S {};
+ 
+ consteval bool
+ foo (info x)
+ {
+   try
+     {
+       is_class_type (x);
+     }
+   catch (std::meta::exception &ex)
+     {
+       std::string_view what = ex.what ();
+       info from = ex.from ();
+       std::source_location loc = ex.where ();
+       if (loc.line () != std::source_location::current ().line () - 7
+ 	  || from != ^^std::meta::is_class_type
+ 	  || what != "reflection does not represent a type"
+ 	  || ex.u8what () != u8"reflection does not represent a type")
+ 	return false;
+       return true;
+     }
+   return false;
+ }
+ 
+ consteval bool
+ bar (info x)
+ {
+   try
+     {
+       parameters_of (x);
+     }
+   catch (std::meta::exception &ex)
+     {
+       std::string_view what = ex.what ();
+       info from = ex.from ();
+       std::source_location loc = ex.where ();
+       if (loc.line () != std::source_location::current ().line () - 7
+ 	  || from != ^^std::meta::parameters_of
+ 	  || what != "reflection does not represent a function or function type"
+ 	  || ex.u8what () != u8"reflection does not represent a function or function type")
+ 	return false;
+       return true;
+     }
+   return false;
+ }
+ 
+ consteval bool
+ baz (info x)
+ {
+   try
+     {
+       data_member_spec (x, { .name = "consteval" });
+     }
+   catch (std::meta::exception &ex)
+     {
+       std::string_view what = ex.what ();
+       info from = ex.from ();
+       std::source_location loc = ex.where ();
+       if (loc.line () != std::source_location::current ().line () - 7
+ 	  || from != ^^std::meta::data_member_spec
+ 	  || what != "name is a keyword"
+ 	  || ex.u8what () != u8"name is a keyword")
+ 	return false;
+       return true;
+     }
+   return false;
+ }
+ 
+ consteval bool
+ qux (info x)
+ {
+   try
+     {
+       can_substitute (^^S, { x });
+     }
+   catch (std::meta::exception &ex)
+     {
+       std::string_view what = ex.what ();
+       info from = ex.from ();
+       std::source_location loc = ex.where ();
+       if (loc.line () != std::source_location::current ().line () - 7
+ 	  || from != ^^std::meta::can_substitute
+ 	  || what != "invalid argument to can_substitute"
+ 	  || ex.u8what () != u8"invalid argument to can_substitute")
+ 	return false;
+       return true;
+     }
+   return false;
+ }
+ 
+ static_assert (foo (^^::));
+ static_assert (bar (^^::));
+ static_assert (baz (^^int));
+ static_assert (qux (^^::));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-iconv "IBM1047" }
+ // { dg-additional-options "-freflection -fexec-charset=IBM1047" }
+ // Test throwing std::meta::exception.
+ 
+ #include "eh5.C"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-iconv "IBM1047" }
+ // { dg-additional-options "-freflection -fexec-charset=IBM1047" }
+ // Test std::meta::exception.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval bool
+ foo ()
+ {
+   exception a (u8"This is a string", ^^foo);
+   if (std::string_view (a.what ()) != std::string_view ("This is a string"))
+     return false;
+   exception b ("This is a string", ^^foo);
+   if (b.u8what () != std::u8string_view (u8"This is a string"))
+     return false;
+   return true;
+ }
+ 
+ static_assert (foo ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,31 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-iconv "ISO-8859-2" }
+ // { dg-options "-freflection -fexec-charset=ISO-8859-2" }
+ // Test std::meta::exception.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval bool
+ foo ()
+ {
+   exception a (u8"h\u00e1\U0000010Dky a \u010d\u00E1rky", ^^foo);
+   if (std::string_view (a.what ()) != std::string_view ("h\u00e1\U0000010Dky a \u010d\u00E1rky"))
+     return false;
+   exception b ("h\u00e1\U0000010Dky a \u010d\u00E1rky", ^^foo);
+   if (b.u8what () != std::u8string_view (u8"h\u00e1\U0000010Dky a \u010d\u00E1rky"))
+     return false;
+   return true;
+ }
+ 
+ consteval bool
+ bar ()
+ {
+   exception a (u8"\N{GRINNING FACE}\N{GRINNING FACE WITH SMILING EYES}\N{LEFT SPEECH BUBBLE}", ^^foo);
+   const char *b = a.what ();	// { dg-message "in 'constexpr' expansion of 'a.std::meta::exception::what\\\(\\\)" }
+   return true;			// { dg-error "inline assembly is not a constant expression" "" { target *-*-* } 0 }
+ }
+ 
+ static_assert (foo ());
+ constexpr auto c = bar ();
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/eh9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/eh9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test throwing an exception in a template.
+ 
+ #include <meta>
+ 
+ enum E : int;
+ template <int K>
+ constexpr auto R = enumerators_of(^^E)[0];
+ enum E : int { A, B, C };
+ static_assert(R<0> == ^^A);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/enumerators_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/enumerators_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/enumerators_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/enumerators_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,189 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::enumerators_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ consteval bool
+ has_enumerators_of (info r)
+ {
+   try { enumerators_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!has_enumerators_of (null_reflection));
+ static_assert (!has_enumerators_of (^^int));
+ static_assert (!has_enumerators_of (^^::));
+ static_assert (!has_enumerators_of (^^foo));
+ 
+ class S;
+ enum class E;
+ typedef E TE;
+ static_assert (!has_enumerators_of (^^S));
+ static_assert (!has_enumerators_of (^^E));
+ static_assert (!has_enumerators_of (^^TE));
+ 
+ template<typename> struct cls_tmpl {};
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ static_assert (!has_enumerators_of (^^cls_tmpl));
+ static_assert (!has_enumerators_of (^^cls_tmpl<int>));
+ static_assert (!has_enumerators_of (^^cls_tmpl_alias));
+ static_assert (!has_enumerators_of (^^cls_tmpl_alias<int>));
+ 
+ class S {
+   void foo ()
+   {
+     static_assert (!has_enumerators_of (^^S));
+   }
+   static_assert (!has_enumerators_of (^^S));
+ };
+ static_assert (!has_enumerators_of (^^S));
+ 
+ enum class E {
+ //  A1 = (has_enumerators_of (^^E) || has_enumerators_of (^^TE)) ? 1 : 2,
+   A2 = has_enumerators_of (^^E) ? 10 : 20,
+   A3 = has_enumerators_of (^^TE) ? 20 : 30
+ };
+ static_assert (has_enumerators_of (^^E));
+ //static_assert (static_cast <int> (E::A1) == 2);
+ static_assert (static_cast <int> (E::A2) == 20);
+ static_assert (static_cast <int> (E::A3) == 30);
+ static_assert (has_enumerators_of (^^TE));
+ 
+ enum F : int;
+ using TF = F;
+ static_assert (!has_enumerators_of (^^F));
+ static_assert (!has_enumerators_of (^^TF));
+ enum F : int {
+ //  B1 = (has_enumerators_of (^^F) || has_enumerators_of (^^TF)) ? 3 : 4,
+   B2 = has_enumerators_of (^^F) ? 30 : 40,
+   B3 = has_enumerators_of (^^TF) ? 40 : 42
+ };
+ static_assert (has_enumerators_of (^^F));
+ //static_assert (B1 == 4);
+ static_assert (B2 == 40);
+ static_assert (B3 == 42);
+ static_assert (has_enumerators_of (^^TF));
+ 
+ enum G {
+   C = has_enumerators_of (^^G) ? 5 : 6
+ };
+ static_assert (has_enumerators_of (^^G));
+ static_assert (C == 6);
+ 
+ enum H : int;
+ typedef H TH;
+ static_assert (!has_enumerators_of (^^H));
+ static_assert (!has_enumerators_of (^^TH));
+ 
+ enum H : int {};
+ static_assert (has_enumerators_of (^^H));
+ static_assert (has_enumerators_of (^^TH));
+ 
+ enum I : short;
+ using TI = I;
+ static_assert (!has_enumerators_of (^^I));
+ static_assert (!has_enumerators_of (^^TI));
+ enum I : short {};
+ static_assert (has_enumerators_of (^^I));
+ static_assert (has_enumerators_of (^^TI));
+ 
+ template <typename T>
+ void
+ qux ()
+ {
+   enum J : T;
+   using K = J;
+   // FIXME: No idea if this is supposed to be false or true.
+   // We certainly during instantiation don't differentiate between
+   // forward enum declarations and later definitions.
+   //  static_assert (!has_enumerators_of (^^J));
+   //  static_assert (!has_enumerators_of (dealias(^^K)));
+   enum J : T {
+     D = (has_enumerators_of (^^J) || has_enumerators_of (^^K))
+ 	? sizeof (T) * 2 : sizeof (T)
+   };
+   static_assert (has_enumerators_of (^^J));
+   static_assert (D == sizeof (T));
+   static_assert (has_enumerators_of (^^K));
+ }
+ 
+ void
+ corge ()
+ {
+   qux <int> ();
+   qux <unsigned char> ();
+ }
+ 
+ enum L : int;
+ using TL = L;
+ static_assert (!has_enumerators_of (^^L));
+ static_assert (!has_enumerators_of (^^TL));
+ enum L : int {
+   L0, L1 = 42, L2, L3 = 14, L4 = 16, L6 = 18, L5 = 24
+ };
+ static_assert (enumerators_of (^^L).size () == 7);
+ static_assert (enumerators_of (^^L)[0] == ^^L0);
+ static_assert (enumerators_of (^^L)[1] == ^^L1);
+ static_assert (enumerators_of (^^L)[2] == ^^L2);
+ static_assert (enumerators_of (^^L)[3] == ^^L3);
+ static_assert (enumerators_of (^^L)[4] == ^^L4);
+ static_assert (enumerators_of (^^L)[5] == ^^L6);
+ static_assert (enumerators_of (^^L)[6] == ^^L5);
+ static_assert (enumerators_of (^^TL).size () == 7);
+ static_assert (enumerators_of (^^TL)[0] == ^^L0);
+ static_assert (enumerators_of (^^TL)[1] == ^^L1);
+ static_assert (enumerators_of (^^TL)[2] == ^^L2);
+ static_assert (enumerators_of (^^TL)[3] == ^^L3);
+ static_assert (enumerators_of (^^TL)[4] == ^^L4);
+ static_assert (enumerators_of (^^TL)[5] == ^^L6);
+ static_assert (enumerators_of (^^TL)[6] == ^^L5);
+ 
+ enum M {
+   M5, M13, M2 = 8, M0, M17
+ };
+ static_assert (enumerators_of (^^M).size () == 5);
+ static_assert (enumerators_of (^^M)[0] == ^^M5);
+ static_assert (enumerators_of (^^M)[1] == ^^M13);
+ static_assert (enumerators_of (^^M)[2] == ^^M2);
+ static_assert (enumerators_of (^^M)[3] == ^^M0);
+ static_assert (enumerators_of (^^M)[4] == ^^M17);
+ static_assert (enumerators_of (parent_of (^^M5)).size () == 5);
+ 
+ enum N : int;
+ typedef N TN;
+ static_assert (!has_enumerators_of (^^N));
+ static_assert (!has_enumerators_of (^^TN));
+ 
+ enum N : int { N1 = 5 };
+ static_assert (enumerators_of (^^N).size () == 1);
+ static_assert (enumerators_of (^^N)[0] == ^^N1);
+ static_assert (enumerators_of (^^TN).size () == 1);
+ static_assert (enumerators_of (^^TN)[0] == ^^N1);
+ 
+ enum O : short;
+ using TO = O;
+ static_assert (!has_enumerators_of (^^O));
+ static_assert (!has_enumerators_of (^^TO));
+ enum O : short { O1 = 2, O2 = 3, O3 = 4};
+ static_assert (enumerators_of (^^O).size () == 3);
+ static_assert (enumerators_of (^^O)[0] == ^^O1);
+ static_assert (enumerators_of (^^O)[1] == ^^O2);
+ static_assert (enumerators_of (^^O)[2] == ^^O3);
+ static_assert (enumerators_of (^^TO).size () == 3);
+ static_assert (enumerators_of (^^TO)[0] == ^^O1);
+ static_assert (enumerators_of (^^TO)[1] == ^^O2);
+ static_assert (enumerators_of (^^TO)[2] == ^^O3);
+ 
+ enum { P1, P2, P3 };
+ static_assert (enumerators_of (parent_of (^^P1)).size() == 3);
+ static_assert (enumerators_of (parent_of (^^P1))[0] == ^^P1);
+ static_assert (enumerators_of (parent_of (^^P1))[1] == ^^P2);
+ static_assert (enumerators_of (parent_of (^^P1))[2] == ^^P3);
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct X { };
+ 
+ void
+ f1 ()
+ {
+   constexpr auto r = ^^int;
+   [: r ] i = 42;  // { dg-error "expected .:].|expected unqualified-id" }
+   [: :] x1;	  // { dg-error "expected primary-expression|forbids|reflection not usable" }
+   [: int :] x2;	  // { dg-error "expected|reflection not usable" }
+   [: X :] x3;	  // { dg-error "expected|reflection not usable" }
+   constexpr X x;
+   [: x :] x4;	  // { dg-error "could not convert .x. from .const X. to .std::meta::info.|reflection not usable" }
+ 
+   constexpr auto e1 = ^^42;  // { dg-error "cannot be applied" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,39 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ int g;
+ 
+ void
+ fn0 (int, typename [: ^^:: :] i) // { dg-error "reflection .::. not usable in a splice type|declared" }
+ {
+ }
+ 
+ void
+ fn1 (int, typename [: ^^g :] i) // { dg-error "reflection .g. not usable in a splice type|declared" }
+ {
+ }
+ 
+ void
+ fn2 (int, typename [: ^^fn1 :] i) // { dg-error "reflection .fn1. not usable in a splice type|declared" }
+ {
+ }
+ 
+ void
+ fn3 (int p, typename [: ^^p :] i) // { dg-error "reflection .p. not usable in a splice type|declared" }
+ {
+ }
+ 
+ enum Harold { Budd };
+ 
+ void
+ fn4 (int, typename [: ^^Budd :] i) // { dg-error "reflection .Budd. not usable in a splice type|declared" }
+ {
+ }
+ 
+ template<int>
+ struct S {};
+ 
+ void
+ fn5 (int, typename [: ^^S :] i) // { dg-error "reflection .S. not usable in a splice type|declared" }
+ {
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct A {
+   A();
+   ~A();
+ };
+ 
+ void
+ g ()
+ {
+   // clang accepts these, but EDG rejects too.
+   constexpr auto r1 = ^^A::A;	  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r2 = ^^A::A();	  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r3 = ^^A::A::A;  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r4 = ^^A::~A;
+   [: r4 :];	  // { dg-error "cannot use constructor or destructor .A::~A\\(\\). in a splice expression" }
+   [: ^^A::~A :];  // { dg-error "cannot use constructor or destructor .A::~A\\(\\). in a splice expression" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ typename[: ^^:: :] x = 0;  // { dg-error "expected" }
+ [: ^^:: :] x2 = 0;  // { dg-error "expected" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ namespace A {}
+ constexpr auto NS_A = ^^A;
+ 
+ namespace B {
+   namespace [:NS_A:] {	// { dg-error "expected" }
+     void fn();  // Is this '::A::fn' or '::B::A::fn' ?
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ namespace N { }
+ 
+ template<info R>
+ void
+ f ()
+ {
+   int i = [:R:]; // { dg-error "expected a reflection of an expression instead of .N." }
+ }
+ 
+ void
+ g ()
+ {
+   f<^^N>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,24 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Detect taking the reflection of a using-declarator as per [expr.reflect]/5.
+ 
+ namespace NS {
+   namespace Inner {
+     consteval int fn() { return 42; }
+     template <auto V> consteval int tfn() { return V; }
+   }  // namespace Inner
+ 
+   using Inner::fn;
+   using Inner::tfn;
+ }  // namespace NS
+ 
+ // splice-expressions
+ static_assert([:^^NS::fn:]() == 42);  // { dg-error "cannot be applied to a using-declaration" }
+ static_assert(template [:^^NS::tfn:]<4>() == 4);  // { dg-error "cannot be applied to a using-declaration|expected" }
+ 
+ // nested proxies
+ struct A { int m; };
+ struct B : A { using A::m; };
+ struct C : B { using B::m; };
+ 
+ static_assert(&[:^^C::m:] == &A::m); // { dg-error "cannot be applied to a using-declaration" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,37 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test static consteval-only vars in a consteval function.
+ 
+ consteval void
+ f1 ()
+ {
+   static auto i = ^^int;  // { dg-error ".i. defined .static. in .constexpr. context" }
+ }
+ 
+ consteval void
+ f2 ()
+ {
+   static const auto i = ^^int;  // { dg-error ".i. defined .static. in .constexpr. context" }
+ }
+ 
+ consteval void
+ f3 ()
+ {
+   static constexpr auto i = ^^int;
+ }
+ 
+ consteval
+ void
+ f4 ()
+ {
+   static constinit auto i = ^^int;  // { dg-error ".i. defined .static. in .constexpr. context" }
+ }
+ 
+ void
+ z ()
+ {
+   f1();  // { dg-error "call to consteval function|in a constant expression" }
+   f2();  // { dg-error "call to consteval function|in a constant expression" }
+   f3();
+   f4();  // { dg-error "call to consteval function|in a constant expression" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/error9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/error9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<typename> concept conc = requires { true; };
+ constexpr auto r = ^^conc;
+ constexpr auto x = ^^conc<int>;  // { dg-error "cannot be applied to a concept check" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,68 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on id-expression.
+ 
+ int arr[2] = { 1, 2 };
+ 
+ template<typename T>
+ void foo (T) { }
+ 
+ struct S {
+   int i;
+   operator int() { return this->i; }
+   ~S();
+ };
+ 
+ static int operator+(S a, S b) { return a.i + b.i; }
+ 
+ void operator ""_km(long double);
+ template <char...> double operator ""_fm();
+ 
+ void
+ f (S a, S b)
+ {
+   // unqualified-id
+   constexpr auto r1 = ^^foo<int>;
+   [: r1 :](1);
+ 
+   constexpr auto r2 = ^^operator+;
+   [: r2 :](a, b);
+ 
+   constexpr auto r3 = ^^operator ""_km;
+   constexpr auto r4 = ^^operator ""_fm;
+   constexpr auto r5 = ^^operator ""_fm<'a'>;
+ 
+   auto & [ c, d ] = arr;
+   constexpr auto r6 = ^^c;
+   constexpr auto r7 = ^^d;
+   [: r6 :] = 1;
+   [: r7 :] = 1;
+ }
+ 
+ void
+ g (S a, S b)
+ {
+   // qualified-id
+   constexpr auto r1 = ^^::foo<int>;
+   [: r1 :](1);
+ 
+   constexpr auto r2 = ^^::operator+;
+   [: r2 :](a, b);
+ 
+   constexpr auto r3 = ^^S::operator int;
+   constexpr auto r4 = ^^::operator ""_km;
+   constexpr auto r5 = ^^S::~S;
+   constexpr auto r6 = ^^::operator ""_fm;
+   constexpr auto r7 = ^^::operator ""_fm<'a'>;
+ }
+ 
+ consteval int
+ h ()
+ {
+   int x = 41;
+   constexpr auto rx = ^^x;
+   ++[: rx :];
+   return x;
+ }
+ 
+ static_assert(h () == 42);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,39 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections in consteval blocks.
+ 
+ using info = decltype(^^void);
+ 
+ consteval info foo (info i) { return i; }
+ 
+ constexpr info u = ^^int;
+ 
+ consteval {
+   auto z = ^^int;
+   u;
+   ^^double;
+   static constexpr auto gl = ^^double;
+   foo (^^int);
+ }
+ 
+ struct S {
+   consteval {
+     auto z = ^^int;
+     ^^double;
+     static constexpr auto gl = ^^double;
+     foo (^^int);
+   }
+ };
+ 
+ void
+ g ()
+ {
+   constexpr info r = ^^int;
+   consteval {
+     r;
+     ^^double;
+     auto l = ^^double;
+     static constexpr auto gl = ^^double;
+     foo (^^int);
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr11.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr11.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr11.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,32 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections in if and while.
+ 
+ using info = decltype(^^void);
+ consteval info foo (info i) { return i; }
+ 
+ void
+ f ()
+ {
+   constexpr auto q = ^^float;
+   if constexpr (foo (^^::) == ^^::)
+     {
+       auto r = ^^int; // { dg-error "consteval-only variable .r." }
+       constexpr auto cr = ^^int;
+     }
+   if constexpr (auto r = ^^int;  // { dg-error "consteval-only variable .r." }
+ 		r == ^^int);	 // { dg-error "the value of .r. is not usable" }
+   if constexpr (constexpr auto r = ^^int; r == ^^int);
+   if constexpr (q != ^^char);
+   if constexpr (^^int != ^^char);
+   if (q != ^^char);  // { dg-error "consteval-only expressions" }
+   if (^^char == ^^char);  // { dg-error "consteval-only expressions" }
+   while (^^char == ^^char);  // { dg-error "consteval-only expressions" }
+   do {} while (^^char == ^^char);  // { dg-error "consteval-only expressions" }
+   consteval {
+     if (q != ^^char);
+     if (^^char == ^^char);
+     while (^^char != ^^char);
+     do {} while (^^char != ^^char);
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr12.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr12.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr12.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr12.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections in consteval if.
+ 
+ void
+ f ()
+ {
+   constexpr auto q = ^^float;
+   if consteval
+     {
+       ^^void;
+       q;
+       auto r = ^^int;
+       if (q != ^^char);
+       if (^^char == ^^char);
+       while (^^char != ^^char);
+       do {} while (^^char != ^^char);
+     }
+ 
+   if not consteval
+     {
+       ^^void;  // { dg-error "consteval-only expressions" }
+       q;  // { dg-error "consteval-only expressions" }
+       auto r = ^^int;  // { dg-error "consteval-only variable" }
+       if (q != ^^char);  // { dg-error "consteval-only expressions" }
+       if (^^char == ^^char);  // { dg-error "consteval-only expressions" }
+       while (^^char != ^^char);  // { dg-error "consteval-only expressions" }
+       do {} while (^^char != ^^char);  // { dg-error "consteval-only expressions" }
+     }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr13.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr13.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr13.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr13.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <type_traits>
+ 
+ template <auto I>
+ struct X {};
+ 
+ struct Y {
+   int name;
+ };
+ 
+ template <typename S>
+ constexpr auto foo (S s) {
+   return X<^^S::name> {};
+ }
+ 
+ constexpr auto a = foo (Y { 42 });
+ // TODO: This doesn't work: 'const struct X<^^Y::name>' is not the same as 'const struct X<^^Y::name>'
+ //static_assert (std::is_same_v <decltype (a), const X <^^Y::name>>);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr14.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr14.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr14.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr14.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // PR c++/123081
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<typename T>
+ constexpr auto refl = ^^T;
+ 
+ struct {
+ 	template<typename T>
+ 	requires(requires { typename[:refl<T>:]; })
+ 	void f(T) {}
+ } a;
+ 
+ int main() {
+ 	a.f([] {});
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,60 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on id-expression.
+ 
+ template<typename T>
+ void foo (T) { }
+ 
+ template<typename T>
+ void foo (T, T) { }
+ 
+ void
+ f (int p)
+ {
+   constexpr auto r1 = ^^foo<int>;   // { dg-error "insufficient contextual information" }
+   constexpr auto r2 = ^^::foo<int>; // { dg-error "insufficient contextual information" }
+ 
+   constexpr auto r3 = ^^__func__;   // { dg-error "cannot be applied" }
+   constexpr auto r4 = ^^__FUNCTION__; // { dg-error "cannot be applied" }
+   constexpr auto r5 = ^^__PRETTY_FUNCTION__;  // { dg-error "cannot be applied" }
+ 
+   requires(int a) { ^^p; };
+   requires(int a) { ^^a; }; // { dg-error "cannot be applied to a local parameter of a requires-expression .a." }
+ }
+ 
+ // NTTPs and pack-index-expressions cannot appear as operands
+ // of the reflection operator.
+ 
+ struct S { int i; };
+ enum E { EE };
+ static constexpr int glob = 0;
+ 
+ template<S s, int n, E e, double d, const int& r>
+ void
+ g ()
+ {
+   constexpr auto r1 = ^^s;  // { dg-error "cannot be applied to a non-type template parameter .s." }
+   constexpr auto r2 = ^^n;  // { dg-error "cannot be applied to a non-type template parameter .n." }
+   constexpr auto r3 = ^^e;  // { dg-error "cannot be applied to a non-type template parameter .e." }
+   constexpr auto r4 = ^^d;  // { dg-error "cannot be applied to a non-type template parameter .d." }
+   constexpr auto r5 = ^^r;  // { dg-error "cannot be applied to a non-type template parameter .r." }
+ }
+ 
+ template<typename T, T t>
+ void
+ g2 ()
+ {
+   constexpr auto r = ^^t; // { dg-error "cannot be applied to a non-type template parameter .t." }
+ }
+ 
+ void
+ h ()
+ {
+   constexpr S s{};
+   constexpr int n = 42;
+   constexpr E e{};
+   constexpr double d = 0.0;
+   g<s, n, e, d, glob>();
+ 
+   g2<int, 42>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,47 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ int x = 42;
+ template<typename T>
+ constexpr T two = 2;
+ 
+ template<typename T>
+ constexpr T foo (T t) { return t; }
+ 
+ void bar () { }
+ 
+ struct S { };
+ 
+ template<typename>
+ struct ST { };
+ 
+ template <int P1, const int &P2> void fn() {}
+ 
+ static constexpr int p[2] = {1, 2};
+ constexpr auto spec = ^^fn<p[0], p[1]>;
+ 
+ void
+ g ()
+ {
+   int i1 = [: ^^x :];
+   int i2 = template [: ^^x :];    // { dg-error "reflection .x. not usable in a template splice" }
+   int i3 = [: ^^two<int> :];
+   int i4 = template [: ^^two<int> :]; // { dg-error "reflection .two<int>. not usable in a template splice" }
+   int i5 = [: ^^foo :](42);	      // { dg-error "reflection .foo. not usable in a splice expression" }
+   int i6 = template [: ^^foo :](42);
+   int i7 = [: ^^foo<int> :](42);
+   int i8 = template [: ^^foo<int> :](42);   // { dg-error "reflection .foo<int>. not usable in a template splice" }
+   int i9 = [: ^^foo :]<int>(42);	    // { dg-error "reflection .foo<int>. not usable in a splice expression with template arguments" }
+   int i10 = template [: ^^foo :]<int>(42);
+   int i11 = template [: ^^bar :]<int>(42);  // { dg-error "no matching function for call" }
+   int i12 = [: ^^two :]<int>;		    // { dg-error "reflection .two<int>. not usable in a splice expression with template arguments" }
+   int i13 = template [: ^^two :]<int>;
+ 
+   [: ^^ST :]<int> c1;  // { dg-error "reflection .ST<int>. not usable in a splice expression with template arguments" }
+   [: ^^S :]<int> c2;   // { dg-error "not a template|reflection not usable in a splice expression with template arguments" }
+   [: ^^bar :]<int>();	// { dg-error "reflection .bar<int>. not usable in a splice expression with template arguments" }
+ 
+   auto x1 = [: ^^ST :]<int>{};	  // { dg-error "reflection .ST<int>. not usable in a splice expression with template arguments" }
+   auto x2 = template [: ^^ST :]<int>{};	// { dg-error "expected a reflection of an expression" }
+   auto x3 = typename [: ^^ST :]<int>{};
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,61 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ void oy (int);
+ template<typename T>
+ void oy (T);
+ 
+ struct S {
+   void foo (int);
+   void foo (int, int);
+   void bar (int);
+ 
+   template<typename T>
+   void baz (T);
+   template<typename T>
+   void baz (T, T);
+ 
+   template<typename T>
+   void qux (T);
+ 
+   void sfoo (int);
+   void sfoo (int, int);
+   void sbar (int);
+ 
+   template<typename T>
+   void sbaz (T);
+   template<typename T>
+   void sbaz (T, T);
+ 
+   template<typename T>
+   void squx (T);
+ 
+   void lox (int);
+   template<typename T>
+   void lox (T);
+ 
+   template<typename T>
+   S &operator+(const T&);
+ 
+   template<typename T>
+   static bool B;
+ };
+ 
+ void
+ g ()
+ {
+   constexpr auto r1 = ^^S::foo;	  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r2 = ^^S::bar;
+   constexpr auto r3 = ^^S::baz;	  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r4 = ^^S::qux;
+   constexpr auto r5 = ^^S::sfoo;  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r6 = ^^S::sbar;
+   constexpr auto r7 = ^^S::sbaz;  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r8 = ^^S::squx;
+   constexpr auto r9 = ^^oy;	  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r10 = ^^S::lox;  // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r11 = ^^S::operator+;
+   constexpr auto r12 = ^^S::template operator+;
+   constexpr auto r13 = ^^S::B;
+   constexpr auto r14 = ^^S::template B;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct A {
+   static void g();
+   static void g(int);
+   void h();
+   void h(int);
+   static void i();
+   void j();
+ };
+ 
+ void
+ f ()
+ {
+   constexpr auto r1 = ^^A::g; // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r2 = ^^A::h; // { dg-error "cannot take the reflection of an overload set" }
+   constexpr auto r3 = ^^A::i;
+   constexpr auto r4 = ^^A::j;
+ 
+   [: r3 :]();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Otherwise, if the id-expression denotes a local entity E for which
+ // there is a lambda scope that intervenes between R and the point at
+ // which E was introduced, R is ill-formed.
+ 
+ static int s1;
+ 
+ void
+ f ()
+ {
+   int l1;
+   static int s2;
+   constexpr auto rl1 = ^^l1;
+   [] -> decltype(^^l1) { return {}; }; // { dg-error "intervening lambda expression" }
+   [] -> decltype(^^s1, s2) {
+     int l2;
+ 
+     constexpr auto rl1_2 = ^^l1;  // { dg-error "intervening lambda expression" }
+     constexpr auto rl2 = ^^l2;
+ 
+     return s1;
+   };
+ }
+ 
+ void
+ g ()
+ {
+   int x;
+   [=]<auto r> {
+     static_assert(^^x == r);  // { dg-error "intervening lambda expression" }
+   }.operator()<^^x>();
+ }
+ 
+ void
+ h ()
+ {
+   int x = 42;
+   int y = 42;
+   [x_=x, y]() {
+     constexpr auto r1 = ^^x;  // { dg-error "intervening lambda expression" }
+     constexpr auto r2 = ^^x_; // { dg-error "cannot be applied to a capture .x_." }
+     constexpr auto r3 = ^^y;  // { dg-error "intervening lambda expression" }
+ 
+     [x_]() {
+       constexpr auto r4 = ^^x_;	// { dg-error "cannot be applied to a capture .x_." }
+     };
+   };
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test using enum.
+ 
+ // TODO cannot take the reflection of a using-declarator
+ enum class Color { R, G, B };
+ struct S { using enum Color; };
+ 
+ static_assert(^^S::R != ^^S::G);
+ static_assert(^^S::R != ^^Color::R);
+ static_assert([:^^S::R:] == Color::R);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ template<info R>
+ void
+ g ()
+ {
+   int i0 = typename [:^^int:](42);
+   int i1 = (typename [:^^int:])(42);
+   int i2 = typename [:R:](42);
+   int i3 = (typename [:R:]) 42;
+ }
+ 
+ template void g<^^int>();
+ 
+ struct X { X(int); operator int(); };
+ 
+ template<info R>
+ void
+ f ()
+ {
+   X x1 = typename [:R:](42);
+   X x2 = (typename [:R:]) 42;
+   int i1 = (typename [:R:]) x1;
+   int i2 = typename [:R:](x1);
+ }
+ 
+ template void f<^^X>();
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/expr9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/expr9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,73 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ void
+ fn1 ()
+ {
+   int x = 1;	    // { dg-message ".x. declared here" }
+   constexpr auto r = ^^x;
+ 
+   [] -> decltype([:r:]) {
+     return {};
+   };
+ 
+   [] -> decltype(x) {
+     return [:r:];   // { dg-error "use of local variable" }
+   };
+ }
+ 
+ void
+ fn2 ()
+ {
+   static int x = 1;
+   constexpr auto r = ^^x;
+ 
+   [] -> decltype([:r:]) {
+     return [:r:];
+   };
+ }
+ 
+ void
+ fn3 ()
+ {
+   int x = 1;	// { dg-message ".x. declared here" }
+ 
+   [] -> int {
+     static constexpr auto r = ^^x;  // { dg-error "cannot be applied a local entity" }
+     return [:r:];
+   };
+ }
+ 
+ void
+ fn4 ()
+ {
+   static int x = 1;
+ 
+   [] -> int {
+     static constexpr auto r = ^^x;
+     return [:r:];
+   };
+ }
+ 
+ void
+ fn5 (int x)   // { dg-message ".x. declared here" }
+ {
+   constexpr auto r = ^^x;
+ 
+   [] -> decltype([:r:]) {
+     return {};
+   };
+ 
+   [] -> decltype(x) {
+     return [:r:];   // { dg-error "use of local variable" }
+   };
+ }
+ 
+ void
+ fn6 (int x)   // { dg-message ".x. declared here" }
+ {
+   [] -> int {
+     static constexpr auto r = ^^x;  // { dg-error "cannot be applied a local entity" }
+     return [:r:];
+   };
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,183 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::extract.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr auto rnptr = reflect_constant (nullptr_t{});
+ static_assert (extract<nullptr_t>(rnptr) == nullptr_t{});
+ static_assert (extract<const nullptr_t>(rnptr) == nullptr_t{});
+ constexpr auto rt = reflect_constant (true);
+ static_assert (extract<bool>(rt));
+ static_assert (extract<const bool>(rt));
+ constexpr auto rf = reflect_constant (false);
+ static_assert (!extract<bool>(rf));
+ static_assert (!extract<const bool>(rf));
+ constexpr auto r1 = reflect_constant (1);
+ static_assert (extract<int>(r1) == 1);
+ static_assert (extract<const int>(r1) == 1);
+ constexpr auto r1u = reflect_constant (1u);
+ static_assert (extract<unsigned>(r1u) == 1u);
+ static_assert (extract<const unsigned>(r1u) == 1u);
+ constexpr auto rA = reflect_constant ('A');
+ static_assert (extract<char>(rA) == 'A');
+ static_assert (extract<const char>(rA) == 'A');
+ constexpr auto rPIf = reflect_constant (3.14f);
+ static_assert (extract<float>(rPIf) == float(3.14f));
+ static_assert (extract<const float>(rPIf) == float(3.14f));
+ constexpr auto rPI = reflect_constant (3.14);
+ static_assert (extract<double>(rPI) == double(3.14));
+ static_assert (extract<const double>(rPI) == double(3.14));
+ constexpr auto r666 = reflect_constant (666L);
+ static_assert (extract<long int>(r666) == 666L);
+ static_assert (extract<const long int>(r666) == 666L);
+ constexpr short int shrt = 42;
+ static_assert (extract<short int>(constant_of (^^shrt)) == 42);
+ static_assert (extract<const short int>(constant_of (^^shrt)) == 42);
+ constexpr signed char sc = -1;
+ static_assert (extract<signed char>(constant_of (^^sc)) == -1);
+ static_assert (extract<const signed char>(constant_of (^^sc)) == -1);
+ constexpr unsigned char uc = 255;
+ static_assert (extract<unsigned char>(constant_of (^^uc)) == 255);
+ static_assert (extract<const unsigned char>(constant_of (^^uc)) == 255);
+ constexpr int *p = nullptr;
+ constexpr info rp = ^^p;
+ static_assert (extract<int *>(rp) == nullptr);
+ static_assert (extract<int * const>(rp) == nullptr);
+ static_assert (extract<const int *>(rp) == nullptr);
+ static_assert (extract<const int *const>(rp) == nullptr);
+ constexpr const int *cp = nullptr;
+ constexpr info rcp = ^^cp;
+ static_assert (extract<const int *>(rcp) == nullptr);
+ static_assert (extract<const int *const>(rcp) == nullptr);
+ constexpr void (*pfn0)() = nullptr;
+ constexpr void (*pfn1)(int) = nullptr;
+ constexpr info rpfn0 = ^^pfn0;
+ constexpr info rpfn1 = ^^pfn1;
+ static_assert (extract<void (*const)()>(rpfn0) == nullptr);
+ static_assert (extract<void (*)()>(rpfn0) == nullptr);
+ static_assert (extract<void (*)(int)>(rpfn1) == nullptr);
+ static_assert (extract<void (*const)(int)>(rpfn1) == nullptr);
+ constexpr int arr[] = { 1, 2, 3, 4, 5 };
+ static_assert (extract<const int *>(^^arr) == [: reflect_constant_array (arr) :]);
+ static_assert (extract<const int *const>(^^arr) == [: reflect_constant_array (arr) :]);
+ static_assert (extract<const int *>(^^arr)[0] == 1);
+ static_assert (extract<const int *>(^^arr)[1] == 2);
+ static_assert (extract<const int *>(^^arr)[2] == 3);
+ static_assert (extract<const int *>(^^arr)[3] == 4);
+ static_assert (extract<const int *>(^^arr)[4] == 5);
+ static_assert (extract<int>(reflect_constant (arr[0])) == 1);
+ static_assert (extract<int>(reflect_constant (arr[1])) == 2);
+ static_assert (extract<int>(reflect_constant (arr[2])) == 3);
+ static_assert (extract<int>(reflect_constant (arr[3])) == 4);
+ static_assert (extract<int>(reflect_constant (arr[4])) == 5);
+ const auto lambda = []{};
+ static_assert (extract<void (*)()>(^^lambda) == lambda);
+ static_assert (extract<void (*const)()>(^^lambda) == lambda);
+ 
+ enum E { A = 42 };
+ enum struct EC { A = 42 };
+ static_assert (extract<E>(reflect_constant (A)) == 42);
+ static_assert (extract<EC>(reflect_constant (EC::A)) == EC::A);
+ 
+ struct S { int m; };
+ static_assert (extract<S>(reflect_constant (S{42})).m == 42);
+ 
+ constexpr int foo () { return 42; }
+ static_assert (extract<int>(reflect_constant (foo ())) == 42);
+ 
+ constexpr int cxi = 42;
+ static_assert (extract<const int *>(reflect_constant (&cxi)) == &cxi);
+ 
+ const int ci = 42;
+ void fn () {}
+ struct C {
+   int k;
+   void fn ();
+ };
+ 
+ template<auto E>
+ consteval bool
+ check_val (info R)
+ {
+   return extract<decltype (E)>(R) == E;
+ }
+ static_assert (check_val<42>(reflect_constant (42)));
+ static_assert (check_val<EC::A>(^^EC::A));
+ static_assert (check_val<E::A>(^^E::A));
+ static_assert (check_val<42>(^^ci));
+ static_assert (check_val<42>(^^cxi));
+ static_assert (check_val<&fn>(^^fn));
+ static_assert (check_val<&C::k>(^^C::k));
+ static_assert (check_val<&C::fn>(^^C::fn));
+ static_assert (check_val<42>([]() {
+   constexpr static int x = 42;
+   return ^^x;
+ }()));
+ 
+ template<int K> struct TC {
+   static constexpr int value = K;
+ };
+ 
+ TC<3> t;
+ static_assert (check_val<3>(static_data_members_of
+ 			    (substitute (^^TC, {reflect_constant (3)}),
+ 			     access_context::unchecked ())[0]));
+ 
+ template<typename T>
+ consteval bool
+ roundtrip (T value)
+ {
+   return extract<T>(reflect_constant (value)) == value;
+ }
+ static_assert (roundtrip (42));
+ static_assert (roundtrip (EC::A));
+ static_assert (roundtrip (E::A));
+ static_assert (roundtrip (ci));
+ static_assert (roundtrip (cxi));
+ static_assert (roundtrip (fn));
+ static_assert (roundtrip (&C::k));
+ static_assert (roundtrip (&C::fn));
+ static_assert (roundtrip ([] {}));
+ 
+ struct B {
+   static constexpr int k = 42;
+   int m;
+   int* p;
+ 
+   int fn ();
+   int fn2 () noexcept;
+   static int fn3 ();
+   static int fn4 () noexcept;
+   int fn5 (this B);
+   int fn6 (int) &;
+   int fn7 (int) &&;
+ };
+ static_assert (extract<const int>(^^B::k) == 42);
+ static_assert (extract<const int &>(^^B::k) == 42);
+ static_assert (extract<int (B::*)()>(^^B::fn) == &B::fn);
+ static_assert (extract<int (B::*)() noexcept>(^^B::fn2) == &B::fn2);
+ static_assert (extract<int (*)()>(^^B::fn3) == &B::fn3);
+ static_assert (extract<int (*)() noexcept>(^^B::fn4) == &B::fn4);
+ static_assert (extract<int (*)(B)>(^^B::fn5) == &B::fn5);
+ static_assert (extract<int (B::*)(int) &>(^^B::fn6) == &B::fn6);
+ static_assert (extract<int (B::*)(int) &&>(^^B::fn7) == &B::fn7);
+ constexpr auto a = extract<int (B::*)()>(^^B::fn);
+ constexpr auto a2 = extract<int (B::*)()noexcept>(^^B::fn2);
+ constexpr auto a3 = extract<int (*)()>(^^B::fn3);
+ constexpr auto a4 = extract<int (*)() noexcept>(^^B::fn4);
+ 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);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,140 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::extract.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template<typename T>
+ consteval bool
+ can_extract (info r)
+ {
+   try { extract<T>(r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ constexpr info null_reflection;
+ static_assert (!can_extract<int>(null_reflection));
+ 
+ constexpr auto rt = reflect_constant (true);
+ static_assert (!can_extract<int>(rt));
+ static_assert (!can_extract<char>(rt));
+ static_assert (!can_extract<short>(rt));
+ static_assert (!can_extract<long>(rt));
+ static_assert (!can_extract<float>(rt));
+ static_assert (!can_extract<bool *>(rt));
+ constexpr auto rA = reflect_constant ('A');
+ static_assert (!can_extract<bool>(rA));
+ static_assert (!can_extract<int>(rA));
+ static_assert (!can_extract<unsigned short>(rA));
+ static_assert (!can_extract<long>(rA));
+ static_assert (!can_extract<double>(rA));
+ static_assert (!can_extract<int *>(rA));
+ constexpr short int shrt = 42;
+ constexpr info rshrt = constant_of (^^shrt);
+ static_assert (!can_extract<int *>(rshrt));
+ static_assert (!can_extract<bool>(rshrt));
+ static_assert (!can_extract<signed char>(rshrt));
+ static_assert (!can_extract<int>(rshrt));
+ static_assert (!can_extract<double>(rshrt));
+ static_assert (!can_extract<long>(rshrt));
+ constexpr signed char sc = -1;
+ constexpr info rsc = constant_of (^^sc);
+ static_assert (!can_extract<int *>(rsc));
+ static_assert (!can_extract<bool>(rsc));
+ static_assert (!can_extract<unsigned char>(rsc));
+ static_assert (!can_extract<int>(rsc));
+ static_assert (!can_extract<double>(rsc));
+ static_assert (!can_extract<long>(rsc));
+ constexpr unsigned char uc = 255;
+ constexpr info ruc = constant_of (^^uc);
+ static_assert (!can_extract<int *>(ruc));
+ static_assert (!can_extract<bool>(ruc));
+ static_assert (!can_extract<signed char>(ruc));
+ static_assert (!can_extract<int>(ruc));
+ static_assert (!can_extract<double>(ruc));
+ static_assert (!can_extract<long>(ruc));
+ 
+ constexpr const int *p = nullptr;
+ constexpr auto rp = ^^p;
+ static_assert (!can_extract<int *>(rp));
+ static_assert (!can_extract<char *>(rp));
+ 
+ constexpr void (*pfn0)() = nullptr;
+ constexpr void (*pfn1)(int) = nullptr;
+ constexpr info rpfn0 = ^^pfn0;
+ constexpr info rpfn1 = ^^pfn1;
+ static_assert (!can_extract<void (*)(int)>(rpfn0));
+ static_assert (!can_extract<void (*)()>(rpfn1));
+ 
+ constexpr int arr[] = { 1, 2, 3, 4, 5 };
+ static_assert (!can_extract<int *>(^^arr));
+ static_assert (!can_extract<const double *>(^^arr));
+ 
+ const auto lambda = []{};
+ static_assert (!can_extract<void (*)(int)>(^^lambda));
+ 
+ enum E { X = 42 };
+ enum struct EC { Y = 42 };
+ static_assert (!can_extract<int *>(reflect_constant (X)));
+ static_assert (!can_extract<int>(reflect_constant (EC::Y)));
+ 
+ struct S { int m; };
+ static_assert (!can_extract<int>(reflect_constant (S{42})));
+ 
+ constexpr int foo () { return 42; }
+ static_assert (!can_extract<int *>(reflect_constant (foo ())));
+ 
+ static constexpr int i = 0;
+ static_assert (!can_extract<const int>(reflect_constant (&i)));
+ static_assert (!can_extract<const int &>(reflect_constant (i)));
+ static_assert (!can_extract<int &>(^^i));
+ 
+ int j;
+ static_assert (extract<int &>(^^j)); // { dg-error "non-constant|not usable" }
+ 
+ consteval info
+ bar ()
+ {
+    constexpr int x = 10;
+    return ^^x;
+ };
+ 
+ constexpr info rbar = bar ();
+ static_assert (!can_extract<int &>(rbar));
+ 
+ struct B {
+   int k;
+   int bf : 16;
+ };
+ 
+ static_assert (!can_extract<int>(^^B::bf));
+ static_assert (!can_extract<int &>(^^B::bf));
+ static_assert (!can_extract<const int &>(^^B::bf));
+ static_assert (!can_extract<int B::*>(^^B::bf));
+ 
+ static union { int um; };
+ static_assert (!can_extract<int>(^^um));
+ static_assert (!can_extract<int&>(^^um));
+ 
+ struct C {
+   int fn ();
+   int fn2 () noexcept;
+   static int fn3 ();
+   static int fn4 () noexcept;
+   int fn5 (this B);
+   int fn6 (int) &;
+   int fn7 (int) &&;
+ };
+ 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-20260111/gcc/testsuite/g++.dg/reflect/extract3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,90 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::extract.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template<class, class> struct same_type;
+ template<class T> struct same_type<T, T> {};
+ 
+ static constexpr int i = 0;
+ constexpr const int &r = i;
+ static_assert (extract<const int &>(^^i) == i);
+ static_assert (extract<const int &>(^^i) == 0);
+ static_assert (&extract<const int &>(^^i) == &i);
+ same_type<decltype(extract<const int &>(^^i)), const int &> st1;
+ same_type<decltype(&extract<const int &>(^^i)), const int *> st2;
+ const int& p = extract<const int &>(^^i);
+ static_assert (extract<const int &>(^^r) == 0);
+ static_assert (extract<const int &>(^^r) == i);
+ 
+ static const int j = 0;
+ const int &rj = j;
+ static_assert (extract<const int &>(^^j) == j);
+ static_assert (extract<const int &>(^^j) == 0);
+ static_assert (&extract<const int &>(^^j) == &j);
+ same_type<decltype(extract<const int &>(^^j)), const int &> st3;
+ same_type<decltype(&extract<const int &>(^^j)), const int *> st4;
+ const int &q = extract<const int &>(^^j);
+ static_assert (extract<const int &>(^^rj) == 0);
+ static_assert (extract<const int &>(^^rj) == j);
+ static_assert (&extract<const int &>(^^rj) == &j);
+ 
+ int k = 1;
+ static_assert (&extract<int &>(^^k) == &k);
+ static_assert (&extract<const int &>(^^k) == &k);
+ 
+ int arr[5] {};
+ static_assert (&extract<int (&)[5]>(^^arr) == &arr);
+ static_assert (&extract<const int (&)[5]>(^^arr) == &arr);
+ 
+ struct S { int m; };
+ constexpr S s{42};
+ constexpr const S &rs = s;
+ static_assert (extract<const S &>(^^s).m == 42);
+ static_assert (&extract<const S &>(^^s) == &s);
+ same_type<decltype(extract<const S &>(^^s)), const S &> st5;
+ same_type<decltype(&extract<const S &>(^^s)), const S *> st6;
+ const S &ps = extract<const S &>(^^s);
+ static_assert (extract<const S &>(^^rs).m == 42);
+ static_assert (extract<const S &>(reflect_constant (S{42})).m == 42);
+ same_type<decltype(extract<const S &>(reflect_constant (S{42}))), const S &> st7;
+ same_type<decltype(&extract<const S &>(reflect_constant (S{42}))), const S *> st8;
+ 
+ S sr{42};
+ static_assert (&extract<S&>(^^sr) == &sr);
+ static_assert (&extract<const S&>(^^sr) == &sr);
+ static_assert (&extract<S&>(^^sr).m == &sr.m);
+ int &srm = sr.m;
+ static_assert (&extract<int&>(^^srm) == &sr.m);
+ 
+ consteval bool foo() {
+    int i = 5;
+    return &extract<int&>(^^i) == &i;
+ }
+ static_assert (foo ());
+ 
+ consteval int
+ bar (int arg)
+ {
+   int val = 3;
+   int &ref = extract<int &>(^^val);
+   ref = 4;
+   return val + extract<int>(^^arg);
+ }
+ static_assert (bar (5) == 9);
+ 
+ consteval const int &
+ baz ()
+ {
+   return j;
+ }
+ 
+ void
+ doit ()
+ {
+   constexpr auto r = reflect_object (baz ());
+   static_assert (extract<const int &>(r) == 0);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::extract.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   int k;
+ };
+ 
+ // This one verifies that we called mark_used.
+ constexpr auto a = extract<int S::*>(^^S::k);
+ static_assert (extract<int S::*>(^^S::k) == &S::k);
+ 
+ consteval int
+ fn1 ()
+ {
+   return extract<int(*)(int)>(reflect_constant ([](int id) { return id; }))(42);
+ }
+ static_assert (fn1 () == 42);
+ 
+ constexpr auto l = [](int id) { return id; };
+ static_assert (extract<int(*)(int)>(^^l)(42) == 42);
+ static_assert (extract<decltype(l)>(^^l)(42) == 42);
+ 
+ constexpr auto gl = [](auto a) { return constant_of (a); };
+ constexpr int i = 42;
+ static_assert (extract<decltype(gl)>(^^gl)(^^i) == reflect_constant (42));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,31 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::extract.
+ 
+ #include <meta>
+ 
+ consteval int
+ foo ()
+ {
+   int arg = 4;
+   return std::meta::extract<int>(^^arg);
+ }
+ 
+ static_assert (foo () == 4);
+ 
+ consteval int
+ bar (int arg)
+ {
+   return std::meta::extract<int>(^^arg);
+ }
+ 
+ static_assert (bar (4) == 4);
+ 
+ consteval int
+ baz ()
+ {
+   constexpr int arg = 4;
+   return std::meta::extract<int>(^^arg);
+ }
+ 
+ static_assert (baz () == 4);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::extract.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ [[=1, =1, =2, =1.0f]] void fn ();
+ struct [[=3, =3, =4, =2.0f]] S;
+ 
+ template<info R>
+ [[=[:constant_of (annotations_of (R)[0]):]]] void TFn();
+ template<info R>
+ struct [[=[:constant_of (annotations_of (R)[0]):]]] TCls {};
+ 
+ static_assert (extract<int>(annotations_of (^^TFn<^^::fn>)[0]) == 1);
+ static_assert (extract<int>(annotations_of (^^TCls<^^::S>)[0]) == 3); // { dg-error "non-constant" }
+ static_assert (extract<int>(annotations_of (^^fn)[0]) == 1);
+ // { dg-error "call to non-.constexpr." "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,27 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::extract.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void fn();
+ static_assert(annotations_of(^^fn).size() == 0);
+ [[=1, =2]] void fn();
+ static_assert(annotations_of(^^fn).size() == 2);
+ [[=3]] void fn();
+ static_assert(annotations_of(^^fn).size() == 3);
+ [[=4, =5]] void fn();
+ static_assert(annotations_of(^^fn).size() == 5);
+ [[=6]] void fn();
+ static_assert(annotations_of(^^fn).size() == 6);
+ void fn();
+ static_assert(annotations_of(^^fn).size() == 6);
+ 
+ static_assert(extract<int>(annotations_of(^^fn)[0]) == 1);
+ static_assert(extract<int>(annotations_of(^^fn)[1]) == 2);
+ static_assert(extract<int>(annotations_of(^^fn)[2]) == 3);
+ static_assert(extract<int>(annotations_of(^^fn)[3]) == 4);
+ static_assert(extract<int>(annotations_of(^^fn)[4]) == 5);
+ static_assert(extract<int>(annotations_of(^^fn)[5]) == 6);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::extract.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template<auto E>
+ consteval bool
+ check_val (info R)
+ {
+   return extract<decltype (E)>(R) == E; // { dg-error "accessing .x. outside its lifetime" }
+ }
+ constexpr auto r = (check_val<42>([]() {
+   constexpr int x = 42;
+   return ^^x;
+ }()));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/extract9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/extract9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // US 112-172
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct B { };
+ struct D : B { };
+ 
+ template<typename T>
+ consteval bool
+ can_extract (info r)
+ {
+   try { extract<T>(r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ constexpr B arrb[] = { {}, {}, {} };
+ constexpr D arrd[] = { {}, {}, {} };
+ static_assert (can_extract<const D *>(^^arrd));
+ static_assert (can_extract<const B *>(^^arrb));
+ static_assert (!can_extract<const B *>(^^arrd));
+ static_assert (!can_extract<const D *>(^^arrb));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/feat1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/feat1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/feat1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/feat1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test feature test macros.
+ 
+ #ifndef __cpp_impl_reflection
+ #  error "__cpp_impl_reflection"
+ #elif __cpp_impl_reflection != 202506
+ #  error "__cpp_impl_reflection != 202506"
+ #endif
+ 
+ #include <meta>
+ 
+ #ifndef __cpp_lib_reflection
+ #  error "__cpp_lib_reflection"
+ #elif __cpp_lib_reflection != 202506
+ #  error "__cpp_lib_reflection != 202506"
+ #endif
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/feat2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/feat2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/feat2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/feat2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,11 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test feature test macros.
+ 
+ #include <version>
+ 
+ #ifndef __cpp_lib_reflection
+ #  error "__cpp_lib_reflection"
+ #elif __cpp_lib_reflection != 202506
+ #  error "__cpp_lib_reflection != 202506"
+ #endif
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_c_language_linkage1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_c_language_linkage1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_c_language_linkage1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_c_language_linkage1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,160 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_c_language_linkage.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_c_language_linkage (null_reflection));
+ static_assert (!has_c_language_linkage (^^::));
+ static_assert (!has_c_language_linkage (^^ns));
+ static_assert (!has_c_language_linkage (^^std));
+ static_assert (!has_c_language_linkage (^^std::meta));
+ static_assert (!has_c_language_linkage (^^ns));
+ static_assert (!has_c_language_linkage (^^ns_alias));
+ static_assert (!has_c_language_linkage (reflect_constant (3)));
+ static_assert (!has_c_language_linkage (^^cls));
+ static_assert (!has_c_language_linkage (^^cls::dm));
+ static_assert (!has_c_language_linkage (^^cls::ref_dm));
+ static_assert (!has_c_language_linkage (^^cls::static_dm));
+ static_assert (!has_c_language_linkage (^^cls::mem_fun));
+ static_assert (!has_c_language_linkage (^^cls::static_mem_fun));
+ static_assert (!has_c_language_linkage (^^cls::type));
+ static_assert (!has_c_language_linkage (^^cls_var));
+ static_assert (!has_c_language_linkage (^^onion));
+ static_assert (!has_c_language_linkage (^^anon));
+ static_assert (!has_c_language_linkage (^^fun));
+ static_assert (!has_c_language_linkage (^^alias));
+ static_assert (!has_c_language_linkage (^^var));
+ static_assert (!has_c_language_linkage (^^ref));
+ static_assert (!has_c_language_linkage (^^rref));
+ static_assert (!has_c_language_linkage (^^ptr));
+ static_assert (!has_c_language_linkage (^^cls_tmpl));
+ static_assert (!has_c_language_linkage (^^cls_tmpl<int>));
+ static_assert (!has_c_language_linkage (^^incomplete_cls<int>));
+ static_assert (!has_c_language_linkage (^^fun_tmpl));
+ static_assert (!has_c_language_linkage (^^fun_tmpl<int>));
+ static_assert (!has_c_language_linkage (^^conc));
+ static_assert (!has_c_language_linkage (substitute (^^conc, { ^^int })));
+ static_assert (!has_c_language_linkage (^^var_tmpl));
+ static_assert (!has_c_language_linkage (^^var_tmpl<int>));
+ static_assert (!has_c_language_linkage (^^cls_tmpl_alias));
+ static_assert (!has_c_language_linkage (^^cls_tmpl_alias<int>));
+ static_assert (!has_c_language_linkage (^^Enum));
+ static_assert (!has_c_language_linkage (^^Enum::A));
+ static_assert (!has_c_language_linkage (^^Enum_class));
+ static_assert (!has_c_language_linkage (^^Enum_class::A));
+ static_assert (!has_c_language_linkage (^^decomp));
+ static_assert (!has_c_language_linkage (^^decomp_ref));
+ static_assert (!has_c_language_linkage (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "a" });
+ static_assert (!has_c_language_linkage (dms));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_c_language_linkage (^^T));
+   static_assert (!has_c_language_linkage (R));
+   static_assert (!has_c_language_linkage (R2));
+   static_assert (!has_c_language_linkage (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   int v;
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!has_c_language_linkage (^^p));
+   static_assert (!has_c_language_linkage (^^c));
+   static_assert (!has_c_language_linkage (^^v));
+ }
+ 
+ static int var2;
+ static int baz () { return 0; }
+ 
+ static_assert (!has_c_language_linkage (^^var2));
+ static_assert (!has_c_language_linkage (^^baz));
+ 
+ namespace {
+   void qux () {}
+   int var3;
+   namespace NN {
+     int var4;
+   }
+   struct S2 {};
+ }
+ 
+ namespace NM {
+   int var5;
+   struct S3 {};
+ }
+ 
+ extern "C" {
+   void corge (int);
+   static void freddy () {}
+   typedef void plugh (int);
+ }
+ static void boo () {}
+ 
+ int
+ main ()
+ {
+ }
+ 
+ extern "C" int garply (long, ...);
+ 
+ const int ci = 42;
+ extern const int ci2 = 42;
+ 
+ static_assert (!has_c_language_linkage (^^qux));
+ static_assert (!has_c_language_linkage (^^var3));
+ static_assert (!has_c_language_linkage (^^NN));
+ static_assert (!has_c_language_linkage (^^NN::var4));
+ static_assert (!has_c_language_linkage (^^NM::var5));
+ static_assert (!has_c_language_linkage (^^S2));
+ static_assert (!has_c_language_linkage (^^NM::S3));
+ static_assert (has_c_language_linkage (^^corge));
+ static_assert (has_c_language_linkage (^^main));
+ static_assert (has_c_language_linkage (^^garply));
+ static_assert (!has_c_language_linkage (^^ci));
+ static_assert (!has_c_language_linkage (^^ci2));
+ static_assert (has_c_language_linkage (^^freddy));
+ static_assert (!has_c_language_linkage (^^boo));
+ // TODO: We don't have TYPE_LANGUAGE nor DECL_LANGUAGE on TYPE_DECLs.
+ //static_assert (has_c_language_linkage (^^plugh));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_default_argument1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_default_argument1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_default_argument1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_default_argument1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,132 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_default_argument.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_default_argument (null_reflection));
+ static_assert (!has_default_argument (^^::));
+ static_assert (!has_default_argument (^^ns));
+ static_assert (!has_default_argument (^^ns_alias));
+ static_assert (!has_default_argument (reflect_constant (3)));
+ static_assert (!has_default_argument (^^cls));
+ static_assert (!has_default_argument (^^cls::dm));
+ static_assert (!has_default_argument (^^cls::ref_dm));
+ static_assert (!has_default_argument (^^cls::static_dm));
+ static_assert (!has_default_argument (^^cls::mem_fun));
+ static_assert (!has_default_argument (^^cls::static_mem_fun));
+ static_assert (!has_default_argument (^^cls::type));
+ static_assert (!has_default_argument (^^cls_var));
+ static_assert (!has_default_argument (^^onion));
+ static_assert (!has_default_argument (^^anon));
+ static_assert (!has_default_argument (^^fun));
+ static_assert (!has_default_argument (^^alias));
+ static_assert (!has_default_argument (^^var));
+ static_assert (!has_default_argument (^^ref));
+ static_assert (!has_default_argument (^^rref));
+ static_assert (!has_default_argument (^^ptr));
+ static_assert (!has_default_argument (^^cls_tmpl));
+ static_assert (!has_default_argument (^^cls_tmpl<int>));
+ static_assert (!has_default_argument (^^incomplete_cls<int>));
+ static_assert (!has_default_argument (^^fun_tmpl));
+ static_assert (!has_default_argument (^^fun_tmpl<int>));
+ static_assert (!has_default_argument (^^conc));
+ static_assert (!has_default_argument (substitute (^^conc, { ^^int })));
+ static_assert (!has_default_argument (^^var_tmpl));
+ static_assert (!has_default_argument (^^var_tmpl<int>));
+ static_assert (!has_default_argument (^^cls_tmpl_alias));
+ static_assert (!has_default_argument (^^cls_tmpl_alias<int>));
+ static_assert (!has_default_argument (^^Enum));
+ static_assert (!has_default_argument (^^Enum::A));
+ static_assert (!has_default_argument (^^Enum_class));
+ static_assert (!has_default_argument (^^Enum_class::A));
+ static_assert (!has_default_argument (^^decomp));
+ static_assert (!has_default_argument (^^decomp_ref));
+ static_assert (!has_default_argument (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "n" });
+ static_assert (!has_default_argument (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!has_default_argument (bases_of (^^Derived, access_context::unchecked ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_default_argument (^^T));
+   static_assert (!has_default_argument (R));
+   static_assert (!has_default_argument (R2));
+   static_assert (!has_default_argument (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^p, ^^c>();
+   static_assert (!has_default_argument (^^p));
+   static_assert (!has_default_argument (^^c));
+ }
+ 
+ void h (int a, int b);
+ static_assert (!has_default_argument (parameters_of (^^h)[0]));
+ static_assert (!has_default_argument (parameters_of (^^h)[1]));
+ constexpr auto ha = parameters_of (^^h)[0];
+ constexpr auto hb = parameters_of (^^h)[1];
+ void h (int c, int d = 42);
+ static_assert (!has_default_argument (parameters_of (^^h)[0]));
+ static_assert (has_default_argument (parameters_of (^^h)[1]));
+ static_assert (!has_default_argument (ha));
+ static_assert (has_default_argument (hb));
+ void h (int c = 5, int d);
+ static_assert (has_default_argument (parameters_of (^^h)[0]));
+ static_assert (has_default_argument (parameters_of (^^h)[1]));
+ static_assert (has_default_argument (ha));
+ static_assert (has_default_argument (hb));
+ 
+ void
+ h (int e, int f)
+ {
+   static_assert (has_default_argument (parameters_of (^^h)[0]));
+   static_assert (has_default_argument (parameters_of (^^h)[1]));
+   static_assert (has_default_argument (ha));
+   static_assert (has_default_argument (hb));
+   static_assert (!has_default_argument (^^e));
+   static_assert (!has_default_argument (^^f));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_default_argument2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_default_argument2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_default_argument2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_default_argument2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,32 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_default_argument.
+ 
+ #include <meta>
+ 
+ void foo (int a, const int b = 42);
+ constexpr auto parm1info = std::meta::parameters_of (^^foo)[0];
+ constexpr auto parm2info = std::meta::parameters_of (^^foo)[1];
+ static_assert (!std::meta::has_default_argument (parm1info));
+ static_assert ( std::meta::has_default_argument (parm2info));
+ void foo (int = 14, const int);
+ static_assert ( std::meta::has_default_argument (parm1info));
+ static_assert ( std::meta::has_default_argument (parm2info));
+ static_assert (std::meta::type_of (parm1info) == ^^int);
+ static_assert (std::meta::type_of (parm2info) == ^^int);
+ 
+ void
+ foo (int c, const int d)
+ {
+   constexpr auto p = std::meta::parameters_of (^^foo)[1];
+   static_assert (p == parm2info);
+   static_assert (std::meta::has_default_argument (p));
+   static_assert (std::meta::type_of (p) == ^^int);
+   static_assert (std::meta::type_of (std::meta::variable_of (p)) == ^^const int);
+   static_assert (std::meta::type_of (^^d) == ^^const int);
+ 
+   static_assert ( std::meta::has_default_argument (parm1info));
+   static_assert ( std::meta::has_default_argument (parm2info));
+   static_assert (std::meta::type_of (parm1info) == ^^int);
+   static_assert (std::meta::type_of (parm2info) == ^^int);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_default_member_initializer1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_default_member_initializer1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_default_member_initializer1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_default_member_initializer1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,133 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_default_member_initializer.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   int dm2 = 42;
+   int &ref_dm2;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+   cls () : ref_dm2 (dm2) {}
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_default_member_initializer (null_reflection));
+ static_assert (!has_default_member_initializer (^^::));
+ static_assert (!has_default_member_initializer (^^ns));
+ static_assert (!has_default_member_initializer (^^ns_alias));
+ static_assert (!has_default_member_initializer (reflect_constant (3)));
+ static_assert (!has_default_member_initializer (^^cls));
+ static_assert (!has_default_member_initializer (^^cls::dm));
+ static_assert (has_default_member_initializer (^^cls::ref_dm));
+ static_assert (has_default_member_initializer (^^cls::dm2));
+ static_assert (!has_default_member_initializer (^^cls::ref_dm2));
+ static_assert (!has_default_member_initializer (^^cls::static_dm));
+ static_assert (!has_default_member_initializer (^^cls::mem_fun));
+ static_assert (!has_default_member_initializer (^^cls::static_mem_fun));
+ static_assert (!has_default_member_initializer (^^cls::type));
+ static_assert (!has_default_member_initializer (^^cls::E));
+ static_assert (!has_default_member_initializer (^^cls::B));
+ static_assert (!has_default_member_initializer (^^cls::C));
+ static_assert (!has_default_member_initializer (^^cls::D));
+ static_assert (!has_default_member_initializer (^^cls::F));
+ static_assert (!has_default_member_initializer (^^cls::F::G));
+ static_assert (!has_default_member_initializer (^^cls::F::H));
+ static_assert (!has_default_member_initializer (^^cls::S));
+ static_assert (!has_default_member_initializer (^^cls::U));
+ static_assert (!has_default_member_initializer (^^cls::foo));
+ static_assert (!has_default_member_initializer (^^cls::foo <0>));
+ static_assert (!has_default_member_initializer (^^cls::bar));
+ static_assert (!has_default_member_initializer (^^cls::bar <42>));
+ static_assert (!has_default_member_initializer (^^cls_var));
+ static_assert (!has_default_member_initializer (^^onion));
+ static_assert (!has_default_member_initializer (^^anon));
+ static_assert (!has_default_member_initializer (^^fun));
+ static_assert (!has_default_member_initializer (^^alias));
+ static_assert (!has_default_member_initializer (^^var));
+ static_assert (!has_default_member_initializer (^^ref));
+ static_assert (!has_default_member_initializer (^^rref));
+ static_assert (!has_default_member_initializer (^^ptr));
+ static_assert (!has_default_member_initializer (^^cls_tmpl));
+ static_assert (!has_default_member_initializer (^^cls_tmpl<int>));
+ static_assert (!has_default_member_initializer (^^incomplete_cls<int>));
+ static_assert (!has_default_member_initializer (^^fun_tmpl));
+ static_assert (!has_default_member_initializer (^^fun_tmpl<int>));
+ static_assert (!has_default_member_initializer (^^conc));
+ static_assert (!has_default_member_initializer (substitute (^^conc, { ^^int })));
+ static_assert (!has_default_member_initializer (^^var_tmpl));
+ static_assert (!has_default_member_initializer (^^var_tmpl<int>));
+ static_assert (!has_default_member_initializer (^^cls_tmpl_alias));
+ static_assert (!has_default_member_initializer (^^cls_tmpl_alias<int>));
+ static_assert (!has_default_member_initializer (^^Enum));
+ static_assert (!has_default_member_initializer (^^Enum::A));
+ static_assert (!has_default_member_initializer (^^Enum_class));
+ static_assert (!has_default_member_initializer (^^Enum_class::A));
+ static_assert (!has_default_member_initializer (^^decomp));
+ static_assert (!has_default_member_initializer (^^decomp_ref));
+ static_assert (!has_default_member_initializer (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "a" });
+ static_assert (!has_default_member_initializer (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!has_default_member_initializer (bases_of (^^Derived, access_context::unchecked ())[0]));
+ 
+ void
+ foo (int x, int y = 10)
+ {
+   static_assert (!has_default_member_initializer (^^x));
+   static_assert (!has_default_member_initializer (parameters_of (^^foo)[0]));
+   static_assert (!has_default_member_initializer (parameters_of (^^foo)[1]));
+   int v;
+   static_assert (!has_default_member_initializer (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!has_default_member_initializer (^^S));
+   static_assert (!has_default_member_initializer (^^E));
+   static_assert (!has_default_member_initializer (^^F));
+   static_assert (!has_default_member_initializer (^^G));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_ellipsis_parameter1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,148 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_ellipsis_parameter.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   void mem_fun2 (int, ...);
+   void mem_fun3 (...);
+   void mem_fun4 (int);
+   static void static_mem_fun ();
+   static void static_mem_fun2 (int, long, ...);
+   static void static_mem_fun3 (...);
+   static void static_mem_fun4 (long);
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ void fun2 (int, ...);
+ void fun3 (...);
+ void fun4 (int, int);
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ using funt = int ();
+ using funt2 = int (int, ...);
+ using funt3 = int (...);
+ using funt4 = int (int, long);
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> void fun_tmpl2 (int, ...);
+ template<typename> void fun_tmpl3 (...);
+ template<typename> void fun_tmpl4 (long, int);
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ using inc_arr = int[];
+ using com_arr = int[42];
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_ellipsis_parameter (null_reflection));
+ static_assert (!has_ellipsis_parameter (^^::));
+ static_assert (!has_ellipsis_parameter (^^ns));
+ static_assert (!has_ellipsis_parameter (^^ns_alias));
+ static_assert (!has_ellipsis_parameter (reflect_constant (3)));
+ static_assert (!has_ellipsis_parameter (^^cls));
+ static_assert (!has_ellipsis_parameter (^^cls::dm));
+ static_assert (!has_ellipsis_parameter (^^cls::ref_dm));
+ static_assert (!has_ellipsis_parameter (^^cls::static_dm));
+ static_assert (!has_ellipsis_parameter (^^cls::mem_fun));
+ static_assert (has_ellipsis_parameter (^^cls::mem_fun2));
+ static_assert (has_ellipsis_parameter (^^cls::mem_fun3));
+ static_assert (!has_ellipsis_parameter (^^cls::mem_fun4));
+ static_assert (!has_ellipsis_parameter (^^cls::static_mem_fun));
+ static_assert (has_ellipsis_parameter (^^cls::static_mem_fun2));
+ static_assert (has_ellipsis_parameter (^^cls::static_mem_fun3));
+ static_assert (!has_ellipsis_parameter (^^cls::static_mem_fun4));
+ static_assert (!has_ellipsis_parameter (^^cls::type));
+ static_assert (!has_ellipsis_parameter (^^cls_var));
+ static_assert (!has_ellipsis_parameter (^^onion));
+ static_assert (!has_ellipsis_parameter (^^anon));
+ static_assert (!has_ellipsis_parameter (^^fun));
+ static_assert (has_ellipsis_parameter (^^fun2));
+ static_assert (has_ellipsis_parameter (^^fun3));
+ static_assert (!has_ellipsis_parameter (^^fun4));
+ static_assert (!has_ellipsis_parameter (type_of (^^fun)));
+ static_assert (has_ellipsis_parameter (type_of (^^fun2)));
+ static_assert (has_ellipsis_parameter (type_of (^^fun3)));
+ static_assert (!has_ellipsis_parameter (type_of (^^fun4)));
+ static_assert (!has_ellipsis_parameter (^^alias));
+ static_assert (!has_ellipsis_parameter (^^var));
+ static_assert (!has_ellipsis_parameter (^^ref));
+ static_assert (!has_ellipsis_parameter (^^rref));
+ static_assert (!has_ellipsis_parameter (^^ptr));
+ static_assert (!has_ellipsis_parameter (^^cls_tmpl));
+ static_assert (!has_ellipsis_parameter (^^cls_tmpl<int>));
+ static_assert (!has_ellipsis_parameter (^^incomplete_cls<int>));
+ static_assert (!has_ellipsis_parameter (^^fun_tmpl));
+ static_assert (!has_ellipsis_parameter (^^fun_tmpl<int>));
+ static_assert (!has_ellipsis_parameter (^^fun_tmpl2));
+ static_assert (has_ellipsis_parameter (^^fun_tmpl2<int>));
+ static_assert (!has_ellipsis_parameter (^^fun_tmpl3));
+ static_assert (has_ellipsis_parameter (^^fun_tmpl3<int>));
+ static_assert (!has_ellipsis_parameter (^^fun_tmpl4));
+ static_assert (!has_ellipsis_parameter (^^fun_tmpl4<int>));
+ static_assert (!has_ellipsis_parameter (^^conc));
+ static_assert (!has_ellipsis_parameter (substitute (^^conc, { ^^int })));
+ static_assert (!has_ellipsis_parameter (^^var_tmpl));
+ static_assert (!has_ellipsis_parameter (^^var_tmpl<int>));
+ static_assert (!has_ellipsis_parameter (^^cls_tmpl_alias));
+ static_assert (!has_ellipsis_parameter (^^cls_tmpl_alias<int>));
+ static_assert (!has_ellipsis_parameter (^^Enum));
+ static_assert (!has_ellipsis_parameter (^^Enum::A));
+ static_assert (!has_ellipsis_parameter (^^Enum_class));
+ static_assert (!has_ellipsis_parameter (^^Enum_class::A));
+ static_assert (!has_ellipsis_parameter (^^decomp));
+ static_assert (!has_ellipsis_parameter (^^decomp_ref));
+ static_assert (!has_ellipsis_parameter (^^arr));
+ static_assert (!has_ellipsis_parameter (^^inc_arr));
+ static_assert (!has_ellipsis_parameter (^^com_arr));
+ static_assert (!has_ellipsis_parameter (^^funt));
+ static_assert (has_ellipsis_parameter (^^funt2));
+ static_assert (has_ellipsis_parameter (^^funt3));
+ static_assert (!has_ellipsis_parameter (^^funt4));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = u8"a" });
+ static_assert (!has_ellipsis_parameter (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!has_ellipsis_parameter (bases_of (^^Derived, access_context::unchecked ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_ellipsis_parameter (^^T));
+   static_assert (!has_ellipsis_parameter (R));
+   static_assert (!has_ellipsis_parameter (R2));
+   static_assert (!has_ellipsis_parameter (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!has_ellipsis_parameter (^^p));
+   static_assert (!has_ellipsis_parameter (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_external_linkage1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_external_linkage1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_external_linkage1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_external_linkage1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,149 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_external_linkage.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_external_linkage (null_reflection));
+ static_assert (has_external_linkage (^^::));
+ static_assert (has_external_linkage (^^ns));
+ static_assert (has_external_linkage (^^std));
+ static_assert (has_external_linkage (^^std::meta));
+ static_assert (has_external_linkage (^^ns_alias));
+ static_assert (!has_external_linkage (reflect_constant (3)));
+ static_assert (has_external_linkage (^^cls));
+ static_assert (!has_external_linkage (^^cls::dm));
+ static_assert (!has_external_linkage (^^cls::ref_dm));
+ static_assert (has_external_linkage (^^cls::static_dm));
+ static_assert (has_external_linkage (^^cls::mem_fun));
+ static_assert (has_external_linkage (^^cls::static_mem_fun));
+ static_assert (!has_external_linkage (^^cls::type));
+ static_assert (has_external_linkage (^^cls_var));
+ static_assert (has_external_linkage (^^onion));
+ static_assert (!has_external_linkage (^^anon));
+ static_assert (has_external_linkage (^^fun));
+ static_assert (!has_external_linkage (^^alias));
+ static_assert (has_external_linkage (^^var));
+ static_assert (has_external_linkage (^^ref));
+ static_assert (has_external_linkage (^^rref));
+ static_assert (has_external_linkage (^^ptr));
+ static_assert (has_external_linkage (^^cls_tmpl));
+ static_assert (has_external_linkage (^^cls_tmpl<int>));
+ static_assert (has_external_linkage (^^incomplete_cls<int>));
+ static_assert (has_external_linkage (^^fun_tmpl));
+ static_assert (has_external_linkage (^^fun_tmpl<int>));
+ static_assert (has_external_linkage (^^conc));
+ static_assert (!has_external_linkage (substitute (^^conc, { ^^int })));
+ static_assert (has_external_linkage (^^var_tmpl));
+ static_assert (has_external_linkage (^^var_tmpl<int>));
+ static_assert (!has_external_linkage (^^cls_tmpl_alias));
+ static_assert (!has_external_linkage (^^cls_tmpl_alias<int>));
+ static_assert (has_external_linkage (^^Enum));
+ static_assert (!has_external_linkage (^^Enum::A));
+ static_assert (has_external_linkage (^^Enum_class));
+ static_assert (!has_external_linkage (^^Enum_class::A));
+ static_assert (!has_external_linkage (^^decomp));
+ static_assert (!has_external_linkage (^^decomp_ref));
+ static_assert (has_external_linkage (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!has_external_linkage (dms));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_external_linkage (^^T));
+   static_assert (has_external_linkage (R));
+   static_assert (has_external_linkage (R2));
+   static_assert (has_external_linkage (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   int v;
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!has_external_linkage (^^p));
+   static_assert (!has_external_linkage (^^c));
+   static_assert (!has_external_linkage (^^v));
+ }
+ 
+ static int var2;
+ static int baz () { return 0; }
+ 
+ static_assert (!has_external_linkage (^^var2));
+ static_assert (!has_external_linkage (^^baz));
+ 
+ namespace {
+   void qux () {}
+   int var3;
+   namespace NN {
+     int var4;
+   }
+   struct S2 {};
+ }
+ 
+ namespace NM {
+   int var5;
+   struct S3 {};
+ }
+ 
+ extern "C" {
+   void corge (int);
+ }
+ 
+ int
+ main ()
+ {
+ }
+ 
+ const int ci = 42;
+ extern const int ci2 = 42;
+ 
+ static_assert (!has_external_linkage (^^qux));
+ static_assert (!has_external_linkage (^^var3));
+ static_assert (!has_external_linkage (^^NN));
+ static_assert (!has_external_linkage (^^NN::var4));
+ static_assert (has_external_linkage (^^NM::var5));
+ static_assert (!has_external_linkage (^^S2));
+ static_assert (has_external_linkage (^^NM::S3));
+ static_assert (has_external_linkage (^^corge));
+ static_assert (has_external_linkage (^^main));
+ static_assert (!has_external_linkage (^^ci));
+ static_assert (has_external_linkage (^^ci2));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_external_linkage2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_external_linkage2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_external_linkage2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_external_linkage2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection -fmodules" }
+ // Test std::meta::has_external_linkage.
+ 
+ module;
+ 
+ #include <meta>
+ 
+ module has_external_linkage:counter;
+ 
+ int counter = 0;
+ 
+ static_assert (!std::meta::has_external_linkage (^^counter));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_identifier1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_identifier1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_identifier1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_identifier1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,241 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_identifier.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ 
+ struct S { };
+ using T = int;
+ using U = S;
+ enum E { E1, E2 };
+ enum { E3, E4 };
+ typedef enum { E5, E6 } E7;
+ union P { int a; };
+ 
+ static_assert (!has_identifier (null_reflection));
+ static_assert (!has_identifier (^^int));
+ static_assert (has_identifier (^^T));
+ static_assert (!has_identifier (^^::));
+ static_assert (has_identifier (^^S));
+ static_assert (has_identifier (^^U));
+ static_assert (has_identifier (^^P));
+ static_assert (!has_identifier (^^const S));
+ static_assert (!has_identifier (^^const volatile U));
+ static_assert (!has_identifier (^^P volatile));
+ static_assert (has_identifier (^^std));
+ static_assert (has_identifier (^^std::meta));
+ static_assert (!has_identifier (^^int *));
+ static_assert (!has_identifier (^^int));
+ static_assert (!has_identifier (^^unsigned long long));
+ static_assert (!has_identifier (^^long &&));
+ static_assert (has_identifier (^^E1));
+ static_assert (has_identifier (^^E));
+ static_assert (!has_identifier (^^E const));
+ static_assert (!has_identifier (^^volatile E));
+ static_assert (!has_identifier (^^const E volatile));
+ static_assert (!has_identifier (parent_of (^^E3)));
+ static_assert (has_identifier (parent_of (^^E5)));
+ static_assert (has_identifier (^^E7));
+ static_assert (has_identifier (dealias (^^E7)));
+ [[=1]] int w;
+ static_assert (!has_identifier (annotations_of (^^w)[0]));
+ static_assert (!has_identifier (data_member_spec (^^int, { .bit_width = 0 })));
+ static_assert (!has_identifier (data_member_spec (^^long, { .bit_width = 6 })));
+ static_assert (has_identifier (data_member_spec (^^long, { .name = "dms", .bit_width = 6 })));
+ static_assert (has_identifier (data_member_spec (^^long, { .name = u8"dms", .alignment = 2 * alignof (long) })));
+ 
+ namespace N {}
+ namespace NA = N;
+ static_assert (has_identifier (^^N));
+ static_assert (has_identifier (^^NA));
+ 
+ namespace {
+   int a;
+   namespace M {}
+   static_assert (has_identifier (^^a));
+   static_assert (!has_identifier (parent_of (^^a)));
+   static_assert (has_identifier (^^M));
+   static_assert (!has_identifier (parent_of (^^M)));
+   static_assert (!has_identifier (parent_of (parent_of (^^M))));
+ }
+ 
+ typedef struct {
+   int a;
+   static_assert (has_identifier (^^a));
+   static_assert (!has_identifier (parent_of (^^a)));
+ } SV;
+ static_assert (has_identifier (^^SV));
+ static_assert (has_identifier (parent_of (^^SV::a)));
+ static_assert (has_identifier (dealias (^^SV)));
+ 
+ template <int N>
+ struct ST
+ {
+   static_assert (has_identifier (^^ST));
+   static_assert (!has_identifier (^^ST <N>));
+ };
+ 
+ struct V
+ {
+   V () { int a; static_assert (!has_identifier (parent_of (^^a))); }
+   V (int, long) { int a; static_assert (!has_identifier (parent_of (^^a))); }
+   template <typename T>
+   V (long, T &) { int a; static_assert (!has_identifier (parent_of (^^a))); }
+   ~V () { int a; static_assert (!has_identifier (parent_of (^^a))); }
+   V &operator = (const V &) { int a; static_assert (!has_identifier (parent_of (^^a))); return *this; }
+   V &operator + (const V &) { int a; static_assert (!has_identifier (parent_of (^^a))); return *this; }
+   template <typename T>
+   V &operator * (const T &) { int a; static_assert (!has_identifier (parent_of (^^a))); return *this; }
+   operator int () { int a; static_assert (!has_identifier (parent_of (^^a))); return *this; }
+   void foo () { int a; static_assert (has_identifier (parent_of (^^a))); }
+   template <int N>
+   void bar () { int a; static_assert (has_identifier (parent_of (^^a))); }
+ };
+ 
+ struct W
+ {
+   template <typename T>
+   explicit operator T () { int a; static_assert (!has_identifier (parent_of (^^a))); }
+ };
+ 
+ int
+ operator ""_a (const char *)
+ {
+   int a;
+   static_assert (has_identifier (parent_of (^^a)));
+   return 0;
+ }
+ 
+ int v;
+ static_assert (!has_identifier (^^V::operator =));
+ static_assert (!has_identifier (^^V::operator +));
+ static_assert (!has_identifier (^^V::operator *));
+ static_assert (!has_identifier (^^V::operator *<int>));
+ static_assert (!has_identifier (^^V::operator int));
+ static_assert (has_identifier (^^V::foo));
+ static_assert (has_identifier (^^V::bar));
+ static_assert (!has_identifier (^^V::bar <0>));
+ 
+ void foo (int);
+ static_assert (has_identifier (^^foo));
+ 
+ int arr[3];
+ 
+ void
+ foo (int a)
+ {
+   auto [b, c, d] = arr;
+   static_assert (has_identifier (^^foo));
+   static_assert (has_identifier (^^a));
+   static_assert (has_identifier (^^b));
+   static_assert (has_identifier (^^c));
+   static_assert (has_identifier (^^d));
+ }
+ 
+ template <int N>
+ void
+ bar (int a)
+ {
+   auto [...b, c] = arr;
+   static_assert (has_identifier (^^foo));
+   static_assert (has_identifier (^^a));
+   static_assert (has_identifier (^^c));
+ }
+ 
+ void
+ baz ()
+ {
+   auto a = [] {
+     int a;
+     static_assert (has_identifier (^^a));
+     static_assert (!has_identifier (parent_of (^^a)));
+     static_assert (!has_identifier (parent_of (parent_of (^^a))));
+     static_assert (has_identifier (parent_of (parent_of (parent_of (^^a)))));
+   };
+   using t = decltype (a);
+   static_assert (has_identifier (^^t));
+   static_assert (!has_identifier (dealias (^^t)));
+ }
+ 
+ void qux (int, int b, int c, int d, int);
+ constexpr auto p0 = parameters_of (^^qux)[0];
+ constexpr auto p1 = parameters_of (^^qux)[1];
+ constexpr auto p2 = parameters_of (^^qux)[2];
+ constexpr auto p3 = parameters_of (^^qux)[3];
+ constexpr auto p4 = parameters_of (^^qux)[4];
+ static_assert (!has_identifier (p0));
+ static_assert (has_identifier (p1));
+ static_assert (has_identifier (p2));
+ static_assert (has_identifier (p3));
+ static_assert (!has_identifier (p4));
+ void qux (int a, int, int c, int e, int);
+ static_assert (has_identifier (p0));
+ static_assert (has_identifier (p1));
+ static_assert (has_identifier (p2));
+ static_assert (!has_identifier (p3));
+ static_assert (!has_identifier (p4));
+ 
+ void
+ qux (int a, int, int, int e, int)
+ {
+   static_assert (has_identifier (p0));
+   static_assert (has_identifier (p1));
+   static_assert (has_identifier (p2));
+   static_assert (!has_identifier (p3));
+   static_assert (!has_identifier (p4));
+   static_assert (has_identifier (variable_of (p0)));
+   static_assert (!has_identifier (variable_of (p1)));
+   static_assert (!has_identifier (variable_of (p2)));
+   static_assert (has_identifier (variable_of (p3)));
+   static_assert (!has_identifier (variable_of (p4)));
+ }
+ 
+ void qux (int f, int, int, int, int g);
+ static_assert (!has_identifier (p0));
+ static_assert (has_identifier (p1));
+ static_assert (has_identifier (p2));
+ static_assert (!has_identifier (p3));
+ static_assert (has_identifier (p4));
+ 
+ template <typename... T>
+ void
+ freddy (int a, T... b)
+ {
+ }
+ 
+ static_assert (has_identifier (parameters_of (^^freddy <int, long, char>)[0]));
+ static_assert (!has_identifier (parameters_of (^^freddy <int, long, char>)[1]));
+ 
+ struct {
+   int a;
+ } s;
+ 
+ static_assert (has_identifier (^^s));
+ static_assert (!has_identifier (type_of (^^s)));
+ 
+ void
+ corge ()
+ {
+   __extension__ constexpr bool b = has_identifier (({ struct S2 { }; ^^S2; }));
+ }
+ 
+ typedef struct {
+   int b;
+ } TN;
+ 
+ static_assert (has_identifier (parent_of (^^TN::b)));
+ static_assert (has_identifier (^^TN));
+ static_assert (has_identifier (dealias (^^TN)));
+ 
+ typedef enum {
+   E8,
+   E9 = has_identifier (parent_of (^^E8)) ? 2 : 3,
+ } E10;
+ static_assert (E9 == 3);
+ static_assert (has_identifier (parent_of (^^E8)));
+ static_assert (has_identifier (^^E10));
+ static_assert (has_identifier (dealias (^^E10)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_identifier2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_identifier2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_identifier2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_identifier2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,57 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_identifier.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ namespace N
+ {
+   consteval bool
+   has_identifier (info r) { return std::meta::has_identifier (r); }
+   consteval std::vector<info>
+   parameters_of (info r) { return std::meta::parameters_of (r); }
+   consteval info
+   variable_of (info r) { return std::meta::variable_of (r); }
+ }
+ 
+ void qux (int, int b, int c, int d, int);
+ constexpr auto p0 = N::parameters_of (^^qux)[0];
+ constexpr auto p1 = N::parameters_of (^^qux)[1];
+ constexpr auto p2 = N::parameters_of (^^qux)[2];
+ constexpr auto p3 = N::parameters_of (^^qux)[3];
+ constexpr auto p4 = N::parameters_of (^^qux)[4];
+ static_assert (!N::has_identifier (p0));
+ static_assert (N::has_identifier (p1));
+ static_assert (N::has_identifier (p2));
+ static_assert (N::has_identifier (p3));
+ static_assert (!N::has_identifier (p4));
+ void qux (int a, int, int c, int e, int);
+ static_assert (N::has_identifier (p0));
+ static_assert (N::has_identifier (p1));
+ static_assert (N::has_identifier (p2));
+ static_assert (!N::has_identifier (p3));
+ static_assert (!N::has_identifier (p4));
+ 
+ void
+ qux (int a, int, int, int e, int)
+ {
+   static_assert (N::has_identifier (p0));
+   static_assert (N::has_identifier (p1));
+   static_assert (N::has_identifier (p2));
+   static_assert (!N::has_identifier (p3));
+   static_assert (!N::has_identifier (p4));
+   static_assert (N::has_identifier (N::variable_of (p0)));
+   static_assert (!N::has_identifier (N::variable_of (p1)));
+   static_assert (!N::has_identifier (N::variable_of (p2)));
+   static_assert (N::has_identifier (N::variable_of (p3)));
+   static_assert (!N::has_identifier (N::variable_of (p4)));
+ }
+ 
+ void qux (int f, int, int, int, int g);
+ static_assert (!N::has_identifier (p0));
+ static_assert (N::has_identifier (p1));
+ static_assert (N::has_identifier (p2));
+ static_assert (!N::has_identifier (p3));
+ static_assert (N::has_identifier (p4));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_internal_linkage1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_internal_linkage1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_internal_linkage1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_internal_linkage1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,149 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_internal_linkage.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_internal_linkage (null_reflection));
+ static_assert (!has_internal_linkage (^^::));
+ static_assert (!has_internal_linkage (^^ns));
+ static_assert (!has_internal_linkage (^^std));
+ static_assert (!has_internal_linkage (^^std::meta));
+ static_assert (!has_internal_linkage (^^ns_alias));
+ static_assert (!has_internal_linkage (reflect_constant (3)));
+ static_assert (!has_internal_linkage (^^cls));
+ static_assert (!has_internal_linkage (^^cls::dm));
+ static_assert (!has_internal_linkage (^^cls::ref_dm));
+ static_assert (!has_internal_linkage (^^cls::static_dm));
+ static_assert (!has_internal_linkage (^^cls::mem_fun));
+ static_assert (!has_internal_linkage (^^cls::static_mem_fun));
+ static_assert (!has_internal_linkage (^^cls::type));
+ static_assert (!has_internal_linkage (^^cls_var));
+ static_assert (!has_internal_linkage (^^onion));
+ static_assert (!has_internal_linkage (^^anon));
+ static_assert (!has_internal_linkage (^^fun));
+ static_assert (!has_internal_linkage (^^alias));
+ static_assert (!has_internal_linkage (^^var));
+ static_assert (!has_internal_linkage (^^ref));
+ static_assert (!has_internal_linkage (^^rref));
+ static_assert (!has_internal_linkage (^^ptr));
+ static_assert (!has_internal_linkage (^^cls_tmpl));
+ static_assert (!has_internal_linkage (^^cls_tmpl<int>));
+ static_assert (!has_internal_linkage (^^incomplete_cls<int>));
+ static_assert (!has_internal_linkage (^^fun_tmpl));
+ static_assert (!has_internal_linkage (^^fun_tmpl<int>));
+ static_assert (!has_internal_linkage (^^conc));
+ static_assert (!has_internal_linkage (substitute (^^conc, { ^^int })));
+ static_assert (!has_internal_linkage (^^var_tmpl));
+ static_assert (!has_internal_linkage (^^var_tmpl<int>));
+ static_assert (!has_internal_linkage (^^cls_tmpl_alias));
+ static_assert (!has_internal_linkage (^^cls_tmpl_alias<int>));
+ static_assert (!has_internal_linkage (^^Enum));
+ static_assert (!has_internal_linkage (^^Enum::A));
+ static_assert (!has_internal_linkage (^^Enum_class));
+ static_assert (!has_internal_linkage (^^Enum_class::A));
+ static_assert (!has_internal_linkage (^^decomp));
+ static_assert (!has_internal_linkage (^^decomp_ref));
+ static_assert (!has_internal_linkage (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!has_internal_linkage (dms));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_internal_linkage (^^T));
+   static_assert (!has_internal_linkage (R));
+   static_assert (!has_internal_linkage (R2));
+   static_assert (!has_internal_linkage (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   int v;
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!has_internal_linkage (^^p));
+   static_assert (!has_internal_linkage (^^c));
+   static_assert (!has_internal_linkage (^^v));
+ }
+ 
+ static int var2;
+ static int baz () { return 0; }
+ 
+ static_assert (has_internal_linkage (^^var2));
+ static_assert (has_internal_linkage (^^baz));
+ 
+ namespace {
+   void qux () {}
+   int var3;
+   namespace NN {
+     int var4;
+   }
+   struct S2 {};
+ }
+ 
+ namespace NM {
+   int var5;
+   struct S3 {};
+ }
+ 
+ extern "C" {
+   void corge (int);
+ }
+ 
+ int
+ main ()
+ {
+ }
+ 
+ const int ci = 42;
+ extern const int ci2 = 42;
+ 
+ static_assert (has_internal_linkage (^^qux));
+ static_assert (has_internal_linkage (^^var3));
+ static_assert (has_internal_linkage (^^NN));
+ static_assert (has_internal_linkage (^^NN::var4));
+ static_assert (!has_internal_linkage (^^NM::var5));
+ static_assert (has_internal_linkage (^^S2));
+ static_assert (!has_internal_linkage (^^NM::S3));
+ static_assert (!has_internal_linkage (^^corge));
+ static_assert (!has_internal_linkage (^^main));
+ static_assert (has_internal_linkage (^^ci));
+ static_assert (!has_internal_linkage (^^ci2));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_internal_linkage2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_internal_linkage2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_internal_linkage2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_internal_linkage2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection -fmodules" }
+ // Test std::meta::has_internal_linkage.
+ 
+ module;
+ 
+ #include <meta>
+ 
+ module has_internal_linkage:counter;
+ 
+ int counter = 0;
+ 
+ static_assert (!std::meta::has_internal_linkage (^^counter));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_linkage1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_linkage1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_linkage1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_linkage1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,149 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_linkage.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_linkage (null_reflection));
+ static_assert (has_linkage (^^::));
+ static_assert (has_linkage (^^ns));
+ static_assert (has_linkage (^^std));
+ static_assert (has_linkage (^^std::meta));
+ static_assert (has_linkage (^^ns_alias));
+ static_assert (!has_linkage (reflect_constant (3)));
+ static_assert (has_linkage (^^cls));
+ static_assert (!has_linkage (^^cls::dm));
+ static_assert (!has_linkage (^^cls::ref_dm));
+ static_assert (has_linkage (^^cls::static_dm));
+ static_assert (has_linkage (^^cls::mem_fun));
+ static_assert (has_linkage (^^cls::static_mem_fun));
+ static_assert (!has_linkage (^^cls::type));
+ static_assert (has_linkage (^^cls_var));
+ static_assert (has_linkage (^^onion));
+ static_assert (!has_linkage (^^anon));
+ static_assert (has_linkage (^^fun));
+ static_assert (!has_linkage (^^alias));
+ static_assert (has_linkage (^^var));
+ static_assert (has_linkage (^^ref));
+ static_assert (has_linkage (^^rref));
+ static_assert (has_linkage (^^ptr));
+ static_assert (has_linkage (^^cls_tmpl));
+ static_assert (has_linkage (^^cls_tmpl<int>));
+ static_assert (has_linkage (^^incomplete_cls<int>));
+ static_assert (has_linkage (^^fun_tmpl));
+ static_assert (has_linkage (^^fun_tmpl<int>));
+ static_assert (has_linkage (^^conc));
+ static_assert (!has_linkage (substitute (^^conc, { ^^int })));
+ static_assert (has_linkage (^^var_tmpl));
+ static_assert (has_linkage (^^var_tmpl<int>));
+ static_assert (!has_linkage (^^cls_tmpl_alias));
+ static_assert (!has_linkage (^^cls_tmpl_alias<int>));
+ static_assert (has_linkage (^^Enum));
+ static_assert (!has_linkage (^^Enum::A));
+ static_assert (has_linkage (^^Enum_class));
+ static_assert (!has_linkage (^^Enum_class::A));
+ static_assert (!has_linkage (^^decomp));
+ static_assert (!has_linkage (^^decomp_ref));
+ static_assert (has_linkage (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!has_linkage (dms));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_linkage (^^T));
+   static_assert (has_linkage (R));
+   static_assert (has_linkage (R2));
+   static_assert (has_linkage (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   int v;
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!has_linkage (^^p));
+   static_assert (!has_linkage (^^c));
+   static_assert (!has_linkage (^^v));
+ }
+ 
+ static int var2;
+ static int baz () { return 0; }
+ 
+ static_assert (has_linkage (^^var2));
+ static_assert (has_linkage (^^baz));
+ 
+ namespace {
+   void qux () {}
+   int var3;
+   namespace NN {
+     int var4;
+   }
+   struct S2 {};
+ }
+ 
+ namespace NM {
+   int var5;
+   struct S3 {};
+ }
+ 
+ extern "C" {
+   void corge (int);
+ }
+ 
+ int
+ main ()
+ {
+ }
+ 
+ const int ci = 42;
+ extern const int ci2 = 42;
+ 
+ static_assert (has_linkage (^^qux));
+ static_assert (has_linkage (^^var3));
+ static_assert (has_linkage (^^NN));
+ static_assert (has_linkage (^^NN::var4));
+ static_assert (has_linkage (^^NM::var5));
+ static_assert (has_linkage (^^S2));
+ static_assert (has_linkage (^^NM::S3));
+ static_assert (has_linkage (^^corge));
+ static_assert (has_linkage (^^main));
+ static_assert (has_linkage (^^ci));
+ static_assert (has_linkage (^^ci2));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_module_linkage1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_module_linkage1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_module_linkage1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_module_linkage1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,149 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection -fmodules" }
+ // Test std::meta::has_module_linkage.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_module_linkage (null_reflection));
+ static_assert (!has_module_linkage (^^::));
+ static_assert (!has_module_linkage (^^ns));
+ static_assert (!has_module_linkage (^^std));
+ static_assert (!has_module_linkage (^^std::meta));
+ static_assert (!has_module_linkage (^^ns_alias));
+ static_assert (!has_module_linkage (reflect_constant (3)));
+ static_assert (!has_module_linkage (^^cls));
+ static_assert (!has_module_linkage (^^cls::dm));
+ static_assert (!has_module_linkage (^^cls::ref_dm));
+ static_assert (!has_module_linkage (^^cls::static_dm));
+ static_assert (!has_module_linkage (^^cls::mem_fun));
+ static_assert (!has_module_linkage (^^cls::static_mem_fun));
+ static_assert (!has_module_linkage (^^cls::type));
+ static_assert (!has_module_linkage (^^cls_var));
+ static_assert (!has_module_linkage (^^onion));
+ static_assert (!has_module_linkage (^^anon));
+ static_assert (!has_module_linkage (^^fun));
+ static_assert (!has_module_linkage (^^alias));
+ static_assert (!has_module_linkage (^^var));
+ static_assert (!has_module_linkage (^^ref));
+ static_assert (!has_module_linkage (^^rref));
+ static_assert (!has_module_linkage (^^ptr));
+ static_assert (!has_module_linkage (^^cls_tmpl));
+ static_assert (!has_module_linkage (^^cls_tmpl<int>));
+ static_assert (!has_module_linkage (^^incomplete_cls<int>));
+ static_assert (!has_module_linkage (^^fun_tmpl));
+ static_assert (!has_module_linkage (^^fun_tmpl<int>));
+ static_assert (!has_module_linkage (^^conc));
+ static_assert (!has_module_linkage (substitute (^^conc, { ^^int })));
+ static_assert (!has_module_linkage (^^var_tmpl));
+ static_assert (!has_module_linkage (^^var_tmpl<int>));
+ static_assert (!has_module_linkage (^^cls_tmpl_alias));
+ static_assert (!has_module_linkage (^^cls_tmpl_alias<int>));
+ static_assert (!has_module_linkage (^^Enum));
+ static_assert (!has_module_linkage (^^Enum::A));
+ static_assert (!has_module_linkage (^^Enum_class));
+ static_assert (!has_module_linkage (^^Enum_class::A));
+ static_assert (!has_module_linkage (^^decomp));
+ static_assert (!has_module_linkage (^^decomp_ref));
+ static_assert (!has_module_linkage (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!has_module_linkage (dms));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_module_linkage (^^T));
+   static_assert (!has_module_linkage (R));
+   static_assert (!has_module_linkage (R2));
+   static_assert (!has_module_linkage (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   int v;
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!has_module_linkage (^^p));
+   static_assert (!has_module_linkage (^^c));
+   static_assert (!has_module_linkage (^^v));
+ }
+ 
+ static int var2;
+ static int baz () { return 0; }
+ 
+ static_assert (!has_module_linkage (^^var2));
+ static_assert (!has_module_linkage (^^baz));
+ 
+ namespace {
+   void qux () {}
+   int var3;
+   namespace NN {
+     int var4;
+   }
+   struct S2 {};
+ }
+ 
+ namespace NM {
+   int var5;
+   struct S3 {};
+ }
+ 
+ extern "C" {
+   void corge (int);
+ }
+ 
+ int
+ main ()
+ {
+ }
+ 
+ const int ci = 42;
+ extern const int ci2 = 42;
+ 
+ static_assert (!has_module_linkage (^^qux));
+ static_assert (!has_module_linkage (^^var3));
+ static_assert (!has_module_linkage (^^NN));
+ static_assert (!has_module_linkage (^^NN::var4));
+ static_assert (!has_module_linkage (^^NM::var5));
+ static_assert (!has_module_linkage (^^S2));
+ static_assert (!has_module_linkage (^^NM::S3));
+ static_assert (!has_module_linkage (^^corge));
+ static_assert (!has_module_linkage (^^main));
+ static_assert (!has_module_linkage (^^ci));
+ static_assert (!has_module_linkage (^^ci2));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_module_linkage2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_module_linkage2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_module_linkage2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_module_linkage2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection -fmodules" }
+ // Test std::meta::has_module_linkage.
+ 
+ module;
+ 
+ #include <meta>
+ 
+ module has_module_linkage:counter;
+ 
+ int counter = 0;
+ 
+ static_assert (std::meta::has_module_linkage (^^counter));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_parent1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_parent1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_parent1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_parent1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,138 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_parent.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_parent (null_reflection));
+ static_assert (!has_parent (^^::));
+ static_assert (has_parent (^^ns));
+ static_assert (has_parent (^^ns_alias));
+ static_assert (!has_parent (reflect_constant (3)));
+ static_assert (has_parent (^^cls));
+ static_assert (has_parent (^^cls::dm));
+ static_assert (has_parent (^^cls::ref_dm));
+ static_assert (has_parent (^^cls::static_dm));
+ static_assert (has_parent (^^cls::mem_fun));
+ static_assert (has_parent (^^cls::static_mem_fun));
+ static_assert (has_parent (^^cls::type));
+ static_assert (has_parent (^^cls_var));
+ static_assert (has_parent (^^onion));
+ static_assert (has_parent (^^anon));
+ static_assert (has_parent (^^fun));
+ static_assert (has_parent (^^alias));
+ static_assert (has_parent (^^var));
+ static_assert (has_parent (^^ref));
+ static_assert (has_parent (^^rref));
+ static_assert (has_parent (^^ptr));
+ static_assert (has_parent (^^cls_tmpl));
+ static_assert (has_parent (^^cls_tmpl<int>));
+ static_assert (has_parent (^^incomplete_cls<int>));
+ static_assert (has_parent (^^fun_tmpl));
+ static_assert (has_parent (^^fun_tmpl<int>));
+ static_assert (has_parent (^^conc));
+ static_assert (!has_parent (substitute (^^conc, { ^^int })));
+ static_assert (has_parent (^^var_tmpl));
+ static_assert (has_parent (^^var_tmpl<int>));
+ static_assert (has_parent (^^cls_tmpl_alias));
+ static_assert (has_parent (^^cls_tmpl_alias<int>));
+ static_assert (has_parent (^^Enum));
+ static_assert (has_parent (^^Enum::A));
+ static_assert (has_parent (^^Enum_class));
+ static_assert (has_parent (^^Enum_class::A));
+ static_assert (has_parent (^^decomp));
+ static_assert (has_parent (^^decomp_ref));
+ static_assert (has_parent (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!has_parent (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (has_parent (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_parent (^^T));
+   static_assert (has_parent (R));
+   static_assert (has_parent (R2));
+   static_assert (has_parent (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (has_parent (^^p));
+   static_assert (has_parent (^^c));
+   static_assert (has_parent (parameters_of (^^g)[0]));
+ }
+ 
+ int
+ main ()
+ {
+ }
+ 
+ namespace N
+ {
+   extern "C" void foo (int);
+   void baz (int);
+ }
+ extern "C" void bar ();
+ 
+ static_assert (!has_parent (^^main));
+ static_assert (!has_parent (^^N::foo));
+ static_assert (!has_parent (^^bar));
+ static_assert (has_parent (^^N::baz));
+ 
+ enum F {
+   F1,
+   F2 = has_parent (^^F1),
+   F3 = has_parent (^^F2) + 1,
+ };
+ static_assert (F2 == 1 && F3 == 2);
+ 
+ void
+ qux ()
+ {
+   auto a = [] () { int b; static_assert (has_parent (^^b)); };
+   static_assert (has_parent (^^a));
+   static_assert (has_parent (type_of (^^a)));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_template_arguments1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_template_arguments1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_template_arguments1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_template_arguments1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,111 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_template_arguments.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ using U = cls_tmpl<int>;
+ typedef cls_tmpl<int> TYPE;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_template_arguments (^^int));
+ static_assert (!has_template_arguments (null_reflection));
+ static_assert (!has_template_arguments (^^::));
+ static_assert (!has_template_arguments (^^ns));
+ static_assert (!has_template_arguments (^^ns_alias));
+ static_assert (!has_template_arguments (reflect_constant (3)));
+ static_assert (!has_template_arguments (^^cls));
+ static_assert (!has_template_arguments (^^cls::dm));
+ static_assert (!has_template_arguments (^^cls::ref_dm));
+ static_assert (!has_template_arguments (^^cls::static_dm));
+ static_assert (!has_template_arguments (^^cls::mem_fun));
+ static_assert (!has_template_arguments (^^cls::static_mem_fun));
+ static_assert (!has_template_arguments (^^cls::type));
+ static_assert (!has_template_arguments (^^cls_var));
+ static_assert (!has_template_arguments (^^onion));
+ static_assert (!has_template_arguments (^^anon));
+ static_assert (!has_template_arguments (^^fun));
+ static_assert (!has_template_arguments (^^alias));
+ static_assert (!has_template_arguments (^^var));
+ static_assert (!has_template_arguments (^^ref));
+ static_assert (!has_template_arguments (^^rref));
+ static_assert (!has_template_arguments (^^ptr));
+ static_assert (!has_template_arguments (^^cls_tmpl));
+ static_assert (has_template_arguments (^^cls_tmpl<int>));
+ static_assert (has_template_arguments (^^incomplete_cls<int>));
+ static_assert (!has_template_arguments (^^fun_tmpl));
+ static_assert (has_template_arguments (^^fun_tmpl<int>));
+ static_assert (!has_template_arguments (^^conc));
+ static_assert (!has_template_arguments (substitute (^^conc, { ^^int })));
+ static_assert (!has_template_arguments (^^var_tmpl));
+ static_assert (has_template_arguments (^^var_tmpl<int>));
+ static_assert (!has_template_arguments (^^cls_tmpl_alias));
+ static_assert (has_template_arguments (^^cls_tmpl_alias<int>));
+ static_assert (!has_template_arguments (^^Enum));
+ static_assert (!has_template_arguments (^^Enum::A));
+ static_assert (!has_template_arguments (^^Enum_class));
+ static_assert (!has_template_arguments (^^Enum_class::A));
+ static_assert (!has_template_arguments (^^decomp));
+ static_assert (!has_template_arguments (^^decomp_ref));
+ static_assert (!has_template_arguments (^^arr));
+ static_assert (!has_template_arguments (^^U));
+ static_assert (!has_template_arguments (^^TYPE));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!has_template_arguments (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!has_template_arguments (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_template_arguments (^^T));
+   static_assert (!has_template_arguments (R));
+   static_assert (has_template_arguments (R2));
+   static_assert (has_template_arguments (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^var_tmpl<int>, ^^cls_tmpl<int>>();
+   static_assert (!has_template_arguments (^^p));
+   static_assert (!has_template_arguments (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_template_arguments2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_template_arguments2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_template_arguments2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_template_arguments2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,75 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_template_arguments.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ struct class_tmpl {
+   template <typename> struct inner {};
+ };
+ static_assert (!has_template_arguments (^^class_tmpl));
+ static_assert (has_template_arguments (^^class_tmpl<int, 9, std::vector>));
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ void fn_tmpl ();
+ static_assert (!has_template_arguments (^^fn_tmpl));
+ static_assert (has_template_arguments (^^fn_tmpl<int, 9, std::vector>));
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ int var_tmpl = 0;
+ static_assert (!has_template_arguments (^^var_tmpl));
+ static_assert (has_template_arguments (^^var_tmpl<int, 9, std::vector>));
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ using alias = int;
+ static_assert (!has_template_arguments (^^alias));
+ static_assert (has_template_arguments (^^alias<int, 9, std::vector>));
+ 
+ template <typename T>
+ using dep_alias = class_tmpl<int, 9, std::vector>::template inner<T>;
+ static_assert (!has_template_arguments (^^dep_alias));
+ static_assert (has_template_arguments (^^dep_alias<int>));
+ 
+ struct Der : class_tmpl<int, 9, std::vector> {};
+ static_assert (!has_template_arguments (^^Der));
+ 
+ template <typename T, T> struct A {};
+ static_assert (!has_template_arguments (^^A));
+ static_assert (has_template_arguments (^^A<int, 5>));
+ 
+ template <typename... Ts> struct B {};
+ static_assert (!has_template_arguments (^^B));
+ static_assert (has_template_arguments (^^B<int, bool>));
+ 
+ struct S {
+   int mem;
+   bool operator==(const S&) const = default;
+ };
+ template <auto... Vs> struct auto_pack {};
+ static_assert (!has_template_arguments (^^auto_pack));
+ static_assert (has_template_arguments (^^auto_pack<4, S{3}>));
+ 
+ template <float> struct float_targ {};
+ constexpr float F = 4.5f;
+ static_assert (!has_template_arguments (^^float_targ));
+ static_assert (has_template_arguments (^^float_targ<F>));
+ 
+ template <const float *> struct ptr_targ {};
+ constexpr float Fs[] = {4.5, 5.5, 6.5};
+ static_assert (!has_template_arguments (^^ptr_targ));
+ static_assert (has_template_arguments (^^ptr_targ<Fs>));
+ static_assert (has_template_arguments (^^ptr_targ<nullptr>));
+ 
+ template <const int &> struct ref_targ {};
+ const int I = 5;
+ using T = ref_targ<I>;
+ static_assert (!has_template_arguments (^^ref_targ));
+ static_assert (has_template_arguments (dealias(^^T)));
+ 
+ template <std::meta::info> struct refl_targ {};
+ static_assert (!has_template_arguments (^^refl_targ));
+ static_assert (has_template_arguments (^^refl_targ<^^int>));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_template_arguments3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_template_arguments3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_template_arguments3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_template_arguments3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,48 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_template_arguments.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   template<typename T>
+   struct N { };
+ };
+ 
+ template<typename T>
+ struct TS {
+   template<typename U>
+   struct N { };
+ };
+ 
+ static_assert (!has_template_arguments (^^S::N));
+ static_assert (has_template_arguments (^^S::N<int>));
+ static_assert (!has_template_arguments (^^TS<int>::N));
+ static_assert (has_template_arguments (^^TS<int>::N<int>));
+ 
+ template<typename T>
+ struct A { };
+ 
+ template<typename T>
+ struct A<T*> { };
+ 
+ template<>
+ struct A<int> { };
+ 
+ static_assert (!has_template_arguments (^^A));
+ static_assert (has_template_arguments (^^A<int>));
+ static_assert (has_template_arguments (^^A<int *>));
+ 
+ template<typename = int>
+ struct B { };
+ static_assert (has_template_arguments (^^B<>));
+ 
+ struct C {
+   using Alias = A<int>;
+ };
+ 
+ static_assert (has_template_arguments (dealias (^^C::Alias)));
+ static_assert (!has_template_arguments (^^C::Alias));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_template_arguments4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_template_arguments4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/has_template_arguments4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/has_template_arguments4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_template_arguments.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   template<typename T>
+   void fn (T) { }
+ };
+ 
+ template<typename T>
+ struct TS {
+   template<typename U>
+   void fn (T) { }
+ };
+ 
+ static_assert (!has_template_arguments (^^S::fn));
+ static_assert (has_template_arguments (^^S::fn<int>));
+ static_assert (!has_template_arguments (^^TS<int>::fn));
+ static_assert (has_template_arguments (^^TS<int>::fn<int>));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/identifier_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/identifier_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/identifier_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/identifier_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,181 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::identifier_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct C { };
+ 
+ constexpr std::string_view sv = identifier_of (^^C);
+ static_assert (sv == "C");
+ static_assert (sv.data ()[0] == 'C');
+ static_assert (sv.data ()[1] == '\0');
+ 
+ struct S { };
+ using T = int;
+ using U = S;
+ enum E { E1, E2 };
+ enum { E3, E4 };
+ typedef enum { E5, E6 } E7;
+ 
+ static_assert (identifier_of (^^T) == std::string_view ("T"));
+ static_assert (identifier_of (^^S) == std::string_view ("S"));
+ static_assert (identifier_of (^^U) == std::string_view ("U"));
+ static_assert (identifier_of (^^std) == std::string_view ("std"));
+ static_assert (identifier_of (^^std::meta) == std::string_view ("meta"));
+ static_assert (identifier_of (^^E1) == std::string_view ("E1"));
+ static_assert (identifier_of (^^E) == std::string_view ("E"));
+ static_assert (identifier_of (parent_of (^^E5)) == std::string_view ("E7"));
+ static_assert (identifier_of (^^E7) == std::string_view ("E7"));
+ static_assert (identifier_of (dealias (^^E7)) == std::string_view ("E7"));
+ static_assert (identifier_of (data_member_spec (^^long, { .name = "foo", .bit_width = 6 })) == std::string_view ("foo"));
+ static_assert (identifier_of (data_member_spec (^^long, { .name = "extremely_long_string_used_as_identifier" })) == std::string_view ("extremely_long_string_used_as_identifier"));
+ 
+ namespace N {}
+ namespace NA = N;
+ static_assert (identifier_of (^^N) == std::string_view ("N"));
+ static_assert (identifier_of (^^NA) == std::string_view ("NA"));
+ 
+ namespace {
+   int a;
+   namespace M {}
+   static_assert (identifier_of (^^a) == std::string_view ("a"));
+   static_assert (identifier_of (^^M) == std::string_view ("M"));
+ }
+ 
+ typedef struct {
+   int a;
+   static_assert (identifier_of (^^a) == std::string_view ("a"));
+ } SV;
+ static_assert (identifier_of (^^SV) == std::string_view ("SV"));
+ static_assert (identifier_of (parent_of (^^SV::a)) == std::string_view ("SV"));
+ static_assert (identifier_of (dealias (^^SV)) == std::string_view ("SV"));
+ 
+ template <int N>
+ struct ST
+ {
+   static_assert (identifier_of (^^ST) == std::string_view ("ST"));
+ };
+ static_assert (identifier_of (^^ST) == std::string_view ("ST"));
+ 
+ struct V
+ {
+   void foo () { int a; static_assert (identifier_of (parent_of (^^a)) == std::string_view ("foo")); }
+   template <int N>
+   void bar () { int a; static_assert (identifier_of (parent_of (^^a)) == std::string_view ("bar")); }
+ };
+ static_assert (identifier_of (^^V::foo) == std::string_view ("foo"));
+ static_assert (identifier_of (^^V::bar) == std::string_view ("bar"));
+ 
+ int
+ operator ""_a (const char *)
+ {
+   int a;
+   static_assert (identifier_of (parent_of (^^a)) == std::string_view ("_a"));
+   return 0;
+ }
+ 
+ int v;
+ static_assert (identifier_of (^^v) == std::string_view ("v"));
+ template<typename T>
+ T vtempl;
+ static_assert (identifier_of (^^vtempl) == std::string_view ("vtempl"));
+ 
+ void foo (int);
+ static_assert (identifier_of (^^foo) == std::string_view ("foo"));
+ 
+ int arr[3];
+ 
+ void
+ foo (int a)
+ {
+   auto [b, c, d] = arr;
+   static_assert (identifier_of (^^foo) == std::string_view ("foo"));
+   static_assert (identifier_of (^^a) == std::string_view ("a"));
+   static_assert (identifier_of (^^b) == std::string_view ("b"));
+   static_assert (identifier_of (^^c) == std::string_view ("c"));
+   static_assert (identifier_of (^^d) == std::string_view ("d"));
+ }
+ 
+ template <int N>
+ void
+ bar (int a)
+ {
+   auto [...b, c] = arr;
+   static_assert (identifier_of (^^a) == std::string_view ("a"));
+   static_assert (identifier_of (^^c) == std::string_view ("c"));
+ }
+ static_assert (identifier_of (^^bar) == std::string_view ("bar"));
+ 
+ void
+ baz ()
+ {
+   auto a = [] {
+     int a;
+     static_assert (identifier_of (^^a) == std::string_view ("a"));
+     static_assert (identifier_of (parent_of (parent_of (parent_of (^^a)))) == std::string_view ("baz"));
+   };
+   using t = decltype (a);
+   static_assert (identifier_of (^^t) == std::string_view ("t"));
+ }
+ 
+ void qux (int, int b, int c, int d, int);
+ constexpr auto p0 = parameters_of (^^qux)[0];
+ constexpr auto p1 = parameters_of (^^qux)[1];
+ constexpr auto p2 = parameters_of (^^qux)[2];
+ constexpr auto p3 = parameters_of (^^qux)[3];
+ constexpr auto p4 = parameters_of (^^qux)[4];
+ static_assert (identifier_of (p1) == std::string_view ("b"));
+ static_assert (identifier_of (p2) == std::string_view ("c"));
+ static_assert (identifier_of (p3) == std::string_view ("d"));
+ void qux (int a, int, int c, int e, int);
+ static_assert (identifier_of (p0) == std::string_view ("a"));
+ static_assert (identifier_of (p1) == std::string_view ("b"));
+ static_assert (identifier_of (p2) == std::string_view ("c"));
+ 
+ void
+ qux (int a, int, int, int e, int)
+ {
+   static_assert (identifier_of (p0) == std::string_view ("a"));
+   static_assert (identifier_of (p1) == std::string_view ("b"));
+   static_assert (identifier_of (p2) == std::string_view ("c"));
+   static_assert (identifier_of (variable_of (p0)) == std::string_view ("a"));
+   static_assert (identifier_of (variable_of (p3)) == std::string_view ("e"));
+ }
+ 
+ void qux (int f, int, int, int, int g);
+ static_assert (identifier_of (p1) == std::string_view ("b"));
+ static_assert (identifier_of (p2) == std::string_view ("c"));
+ static_assert (identifier_of (p4) == std::string_view ("g"));
+ 
+ template <typename... T>
+ void
+ freddy (int a, T... b)
+ {
+ }
+ 
+ static_assert (identifier_of (parameters_of (^^freddy <int, long, char>)[0]) == std::string_view ("a"));
+ 
+ struct {
+   int a;
+ } s;
+ 
+ static_assert (identifier_of (^^s) == std::string_view ("s"));
+ 
+ typedef struct {
+   int b;
+ } TN;
+ 
+ static_assert (identifier_of (parent_of (^^TN::b)) == std::string_view ("TN"));
+ static_assert (identifier_of (^^TN) == std::string_view ("TN"));
+ static_assert (identifier_of (dealias (^^TN)) == std::string_view ("TN"));
+ 
+ typedef enum {
+   E8,
+   E9
+ } E10;
+ static_assert (identifier_of (parent_of (^^E8)) == std::string_view ("E10"));
+ static_assert (identifier_of (^^E10) == std::string_view ("E10"));
+ static_assert (identifier_of (dealias (^^E10)) == std::string_view ("E10"));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/identifier_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/identifier_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/identifier_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/identifier_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-iconv "IBM1047" }
+ // { dg-additional-options "-freflection -fexec-charset=IBM1047" }
+ // Test std::meta::identifier_of.
+ 
+ #include "identifier_of1.C"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,59 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test various forms of initialization with reflections.
+ 
+ #include <initializer_list>
+ 
+ using info = decltype(^^int);
+ 
+ struct S { int i; };
+ struct X {
+   consteval operator info() { return ^^int; }
+ };
+ 
+ struct Y {
+   info i = ^^int;
+ };
+ 
+ constexpr Y y;
+ 
+ struct W {
+   consteval W() { }
+   decltype(^^::) i = ^^W::i;
+ };
+ 
+ constinit info r = ^^int;
+ constinit info *p = &r;
+ 
+ consteval void
+ f ()
+ {
+   constexpr auto refl = ^^S;
+   auto a1 = refl;
+   auto a2(refl);
+   auto a3 = { refl };
+   auto a4{refl};
+ 
+   constexpr decltype(refl) arr[] = { refl };
+   constexpr auto ra = arr[0];
+   typename [: ra :] s = { .i = 42 };
+ 
+   constexpr static auto srefl = ^^S;
+   constexpr static auto *p = &srefl;
+   constexpr auto *const *q = &p;
+   typename [: **q :] s2 = { .i = 42 };
+ }
+ 
+ void
+ g ()
+ {
+   f ();
+ }
+ 
+ void
+ h ()
+ {
+   X x;
+   typename [: x :] i = 42;
+   typename [: X{} :] j = i;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,24 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test member list initializers.
+ 
+ using info = decltype(^^int);
+ 
+ struct A {
+   info i;
+   consteval A() : i{^^void} {}
+ };
+ 
+ A a1;  // { dg-error "consteval-only variable .a1." }
+ constinit A a2;
+ constexpr A a3;
+ 
+ struct B {
+  info i;
+  info j;
+  consteval B() : i{}, j{i} {}
+ };
+ 
+ B b1;  // { dg-error "consteval-only variable .b1." }
+ constinit B b2;
+ constexpr B b3;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init11.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init11.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init11.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test invalid reflections in member init lists.
+ 
+ using info = decltype(^^void);
+ 
+ struct A {
+   info i;
+   constexpr A() : i{^^void} {}  // { dg-error "consteval-only" }
+ };
+ 
+ struct B {
+   info i;
+   B() : i{^^void} {}  // { dg-error "consteval-only" }
+ };
+ 
+ struct C {
+   info i;
+   constexpr C() : i{} {}  // { dg-error "function of consteval-only type must be declared .consteval." }
+ };
+ 
+ struct D {
+   info i;
+   D() : i{} {}  // { dg-error "function of consteval-only type must be declared .consteval." }
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init12.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init12.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init12.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init12.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test consteval-only type smuggling.
+ 
+ using info = decltype(^^int);
+ 
+ template<typename T>
+ constexpr const void *
+ foo (const T *__location)
+ {
+   const void *__loc = __location;
+   return __loc;
+ }
+ 
+ template<typename T>
+ constexpr const void *
+ bar (const T *__location)
+ {
+   const void *__loc = __location;
+   return __loc;
+ }
+ 
+ void
+ g ()
+ {
+   constexpr static auto r = ^^int;
+   constexpr auto x = foo<info>(&r); // { dg-error "pointer into an object of consteval-only type" }
+   constexpr auto y = bar<info>(nullptr);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init13.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init13.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init13.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init13.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,55 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^::);
+ 
+ constexpr info A {};
+ constexpr info B = ^^::;
+ inline constexpr info C = ^^::;
+ 
+ template<typename T>
+ struct S {
+   static constexpr info B {^^T};
+ 
+   void wow () {
+     constexpr info D {^^T};
+   }
+ };
+ 
+ consteval void
+ foo ()
+ {
+   info A = ^^::;
+   constexpr info B = ^^::;
+ }
+ 
+ constexpr void
+ bar ()
+ {
+   constexpr info A = ^^::;
+   static constexpr info B = ^^::;
+ }
+ 
+ constexpr void
+ tux ()
+ {
+   if consteval {
+     constexpr info A = ^^::;
+     static constexpr info B = ^^::;
+   }
+ }
+ 
+ void
+ qux ()
+ {
+   constexpr info A {};
+   constexpr info B = ^^::;
+   static constexpr info C = ^^::;
+   foo ();
+   consteval { bar (); }
+   consteval { tux (); }
+   tux ();
+   bar ();
+ }
+ 
+ template struct S<int>;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init14.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init14.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init14.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init14.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<typename T>
+ struct S {
+   static constexpr auto s = ^^T;
+   void foo () { constexpr auto s = ^^T; }
+ };
+ template struct S<int>;
+ 
+ constexpr void
+ bud ()
+ {
+   if consteval { static constexpr auto a = ^^::; }
+ }
+ auto bar () { return &bud; }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init15.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init15.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init15.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init15.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^::);
+ 
+ consteval info identity(info i) { return i; }
+ consteval int something_of(info) { return 10; }
+ consteval void do_something(info) {}
+ 
+ void fox() {
+   if not consteval {
+     constexpr info X {};
+     constexpr info A = ^^::;
+     constexpr info B = identity(A);
+     static constexpr info D = ^^::;
+ 
+     static_assert(X == info{});
+     static_assert(A == ^^::);
+     static_assert(B == ^^::);
+     static_assert(D == ^^::);
+ 
+     consteval {
+       do_something(X);
+       do_something(A);
+       int H = something_of(A);
+       constexpr int I = something_of(A);
+     }
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init16.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init16.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init16.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init16.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,47 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^::);
+ 
+ consteval info identity(info i) {
+     return i;
+ }
+ 
+ consteval int something_of(info) {
+     return 10;
+ }
+ 
+ consteval void do_something(info) {}
+ 
+ template <info>
+ void do_something_runtime() {}
+ 
+ void fox() {
+     if not consteval {
+         constexpr info X {};
+         constexpr info A = ^^::;
+         constexpr info B = identity(A);
+         static constexpr info D = ^^::;
+ 
+         static_assert(X == info{});
+         static_assert(A == ^^::);
+         static_assert(B == ^^::);
+         static_assert(D == ^^::);
+ 
+         consteval {
+             do_something(X);
+             do_something(A);
+             int H = something_of(A);
+             constexpr int I = something_of(A);
+         }
+ 
+         do_something(X);
+         do_something(A);
+         do_something_runtime<X>();
+         do_something_runtime<A>();
+         int C = something_of(A);
+         constexpr int E = something_of(A);
+         identity(A); // { dg-error "consteval-only expressions" }
+         identity(B); // { dg-error "consteval-only expressions" }
+     }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init17.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init17.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init17.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init17.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^int);
+ 
+ consteval int
+ foo (info i)
+ {
+   return 42;
+ }
+ 
+ consteval info
+ bar ()
+ {
+   return __extension__ ({ constexpr auto a = ^^int; a; });
+ }
+ 
+ struct S {
+   info i;
+ };
+ 
+ void
+ g ()
+ {
+   __extension__ constexpr int i = foo (({ constexpr auto a = ^^int; a; }));
+   __extension__ static constexpr info r = ({ constexpr auto a = ^^int; a; });
+   constexpr info o = bar ();
+   __extension__ constexpr auto sz = sizeof (({ constexpr auto a = ^^int; a; }));
+   __extension__ constexpr S s{({ constexpr auto a = ^^int; a; })};
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test various forms of initialization with reflections.  Invalid.
+ 
+ consteval void
+ f ()
+ {
+   constexpr static auto srefl = ^^int;
+   constexpr auto *p = &srefl;
+   constexpr auto **q = &p;  // { dg-error "unable to deduce" }
+   // { dg-message "types .auto\\*. and .std::meta::info\\* const." "" { target *-*-* } .-1 }
+ }
+ 
+ void
+ g ()
+ {
+   f ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template <auto R = ^^::> class S {};
+ S s;
+ 
+ template <auto R = ^^int> class S2 {};
+ S2 s2;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,63 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test that we properly detect compounded consteval-only types.
+ 
+ using info = decltype(^^int);
+ constexpr static info glob = ^^::;
+ constexpr info array[3] = { glob, glob, glob };
+ consteval info foo () { return ^^::; }
+ 
+ struct A {
+   info i = ^^int;
+ };
+ constexpr A a;
+ 
+ struct B {
+   A a;
+ };
+ constexpr B b;
+ 
+ struct C {
+   const info *i = &glob;
+ };
+ constexpr C c;
+ 
+ struct D {
+   int i;
+   C c;
+   consteval D() : c{}, i{42} { }
+ };
+ constexpr D d;
+ 
+ struct E {
+   info arr[2];
+   consteval E() : arr{glob, glob} { }
+ };
+ constexpr E e;
+ 
+ struct F {
+   const info &r;
+   consteval F() : r{glob} { }
+ };
+ constexpr F f;
+ 
+ struct G {
+   B b;
+ };
+ constexpr G g;
+ 
+ struct H {
+   info (*fp)();
+ };
+ constexpr H h{foo}; // { dg-error "address of immediate function" }
+ 
+ union U {
+   int n;
+   info i;
+ };
+ constexpr U u{.i = glob };
+ 
+ struct I {
+   info i;
+ };
+ constexpr info I::*pmi = &I::i;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ struct Base { };
+ struct Derived : Base {
+   info k;
+   consteval Derived() : Base(), k(^^int) {}
+ };
+ consteval const Base &fn1() {
+   static constexpr Derived d;
+   return d;
+ }
+ constexpr auto &ref = fn1(); // { dg-error "reference into an object of consteval-only type" }
+ 
+ consteval void *fn2() {
+   static constexpr auto v = ^^int;
+   return (void *)&v;
+ }
+ constexpr const void *ptr = fn2(); // { dg-error "pointer into an object of consteval-only type" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,37 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^int);
+ 
+ struct S {
+   info i;
+ };
+ 
+ struct N {
+   info i = ^^void;
+ };
+ 
+ S s1;  // { dg-error "consteval-only variable" }
+ constinit S s2{};
+ constexpr S s3{^^int};
+ 
+ N n1;  // { dg-error "consteval-only variable" }
+ constinit N n2;
+ constexpr N n3;
+ 
+ template<typename T>
+ struct X {
+   T t;
+ };
+ 
+ X<info> x1;  // { dg-error "consteval-only variable" }
+ constinit X<info> x2{};
+ constexpr X<info> x3{^^int};
+ 
+ void
+ g ()
+ {
+   static constexpr S s{^^void};
+   static constexpr X<info> x{^^void};
+   static constexpr N n;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,41 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test that we properly detect using consteval-only variables without
+ // constexpr/constinit.
+ 
+ using info = decltype(^^int);
+ 
+ info r1 = ^^int;  // { dg-error "consteval-only variable .r1. not declared .constexpr. used outside a constant-evaluated context" }
+ const info r2 = ^^int;  // { dg-error "consteval-only variable .r2. not declared .constexpr. used outside a constant-evaluated context" }
+ 
+ constexpr info r3 = ^^int;
+ constinit info r4 = ^^int;
+ const info *const p1 = &r3;  // { dg-error "consteval-only variable .p1. not declared .constexpr. used outside a constant-evaluated context" }
+ info *p2;  // { dg-error "consteval-only variable .p2. not declared .constexpr. used outside a constant-evaluated context" }
+ const info &q = r3;  // { dg-error "consteval-only variable .q. not declared .constexpr. used outside a constant-evaluated context" }
+ 
+ void
+ g ()
+ {
+   info l1 = ^^int;  // { dg-error "consteval-only variable .l1. not declared .constexpr. used outside a constant-evaluated context" }
+   const info l2 = ^^int;  // { dg-error "consteval-only variable .l2. not declared .constexpr. used outside a constant-evaluated context" }
+   constexpr info l3 = ^^int;
+   static info l4 = ^^int;  // { dg-error "consteval-only variable .l4. not declared .constexpr. used outside a constant-evaluated context" }
+   static const info l5 = ^^int;  // { dg-error "consteval-only variable .l5. not declared .constexpr. used outside a constant-evaluated context" }
+   static constexpr info l6 = ^^int;
+   static constinit info l7 = ^^int;
+ }
+ 
+ consteval void
+ f ()
+ {
+   info l1 = ^^int;
+   const info l2 = ^^int;
+   constexpr info l3 = ^^int;
+   // Are these really OK?  Only if we don't call this function, I suppose.
+   // See error8.C for that scenario.
+   static info l4 = ^^int;
+   static const info l5 = ^^int;
+   static constexpr info l6 = ^^int;
+   static constinit info l7 = ^^int;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test member list initializers.
+ 
+ using info = decltype(^^int);
+ 
+ struct A {
+   info i;
+   consteval A() : i{^^void} {}
+ };
+ 
+ static_assert (A{}.i == ^^void);
+ constexpr A a;
+ static_assert (a.i == ^^void);
+ constexpr A a2;
+ static_assert (a2.i == ^^void);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/init9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/init9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,53 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test returning consteval-only exprs.
+ 
+ using info = decltype(^^int);
+ 
+ info foo (); // { dg-error "function of consteval-only type must be declared .consteval." }
+ constexpr info bar (); // { dg-error "function of consteval-only type must be declared .consteval." }
+ void baz (info); // { dg-error "function of consteval-only type must be declared .consteval." }
+ 
+ consteval info
+ ok1 ()
+ {
+   return ^^int;
+ }
+ 
+ consteval info
+ ok2 ()
+ {
+   constexpr info r = ^^int;
+   return r;
+ }
+ 
+ consteval auto
+ ok3 (info i)
+ {
+   return i;
+ }
+ 
+ constexpr info
+ bad1 () // { dg-error "function of consteval-only type must be declared .consteval." }
+ {
+   return ^^int;  // { dg-error "consteval-only expressions" }
+ }
+ 
+ info
+ bad2 () // { dg-error "function of consteval-only type must be declared .consteval." }
+ {
+   return ^^int;  // { dg-error "consteval-only expressions" }
+ }
+ 
+ constexpr auto
+ bad3 (info i) // { dg-error "function of consteval-only type must be declared .consteval." }
+ {
+   return i;  // { dg-error "consteval-only expressions" }
+ }
+ 
+ template<info R>
+ info
+ bad4 () // { dg-error "function of consteval-only type must be declared .consteval." }
+ {
+   return R;  // { dg-error "consteval-only expressions" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_accessible1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_accessible1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_accessible1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_accessible1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,131 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_accessible.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ constexpr access_context gctx = access_context::current ();
+ 
+ static_assert (is_accessible (null_reflection, gctx));
+ static_assert (is_accessible (^^::, gctx));
+ static_assert (is_accessible (^^ns, gctx));
+ static_assert (is_accessible (^^ns_alias, gctx));
+ static_assert (is_accessible (reflect_constant (3), gctx));
+ static_assert (is_accessible (^^cls, gctx));
+ static_assert (is_accessible (^^cls::dm, gctx));
+ static_assert (is_accessible (^^cls::ref_dm, gctx));
+ static_assert (is_accessible (^^cls::static_dm, gctx));
+ static_assert (is_accessible (^^cls::mem_fun, gctx));
+ static_assert (is_accessible (^^cls::static_mem_fun, gctx));
+ static_assert (is_accessible (^^cls::type, gctx));
+ static_assert (is_accessible (^^cls::E, gctx));
+ static_assert (is_accessible (^^cls::B, gctx));
+ static_assert (is_accessible (^^cls::C, gctx));
+ static_assert (is_accessible (^^cls::D, gctx));
+ static_assert (is_accessible (^^cls::F, gctx));
+ static_assert (is_accessible (^^cls::F::G, gctx));
+ static_assert (is_accessible (^^cls::F::H, gctx));
+ static_assert (is_accessible (^^cls::S, gctx));
+ static_assert (is_accessible (^^cls::U, gctx));
+ static_assert (is_accessible (^^cls::foo, gctx));
+ static_assert (is_accessible (^^cls::foo <0>, gctx));
+ static_assert (is_accessible (^^cls::bar, gctx));
+ static_assert (is_accessible (^^cls::bar <42>, gctx));
+ static_assert (is_accessible (^^cls_var, gctx));
+ static_assert (is_accessible (^^onion, gctx));
+ static_assert (is_accessible (^^anon, gctx));
+ static_assert (is_accessible (^^fun, gctx));
+ static_assert (is_accessible (^^alias, gctx));
+ static_assert (is_accessible (^^var, gctx));
+ static_assert (is_accessible (^^ref, gctx));
+ static_assert (is_accessible (^^rref, gctx));
+ static_assert (is_accessible (^^ptr, gctx));
+ static_assert (is_accessible (^^cls_tmpl, gctx));
+ static_assert (is_accessible (^^cls_tmpl<int>, gctx));
+ static_assert (is_accessible (^^incomplete_cls<int>, gctx));
+ static_assert (is_accessible (^^fun_tmpl, gctx));
+ static_assert (is_accessible (^^fun_tmpl<int>, gctx));
+ static_assert (is_accessible (^^conc, gctx));
+ static_assert (is_accessible (substitute (^^conc, { ^^int }), gctx));
+ static_assert (is_accessible (^^var_tmpl, gctx));
+ static_assert (is_accessible (^^var_tmpl<int>, gctx));
+ static_assert (is_accessible (^^cls_tmpl_alias, gctx));
+ static_assert (is_accessible (^^cls_tmpl_alias<int>, gctx));
+ static_assert (is_accessible (^^Enum, gctx));
+ static_assert (is_accessible (^^Enum::A, gctx));
+ static_assert (is_accessible (^^Enum_class, gctx));
+ static_assert (is_accessible (^^Enum_class::A, gctx));
+ static_assert (is_accessible (^^decomp, gctx));
+ static_assert (is_accessible (^^decomp_ref, gctx));
+ static_assert (is_accessible (^^arr, gctx));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (is_accessible (dms, gctx));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ struct Derived2 : private Base {};
+ static_assert (is_accessible (bases_of (^^Derived, gctx)[0], gctx));
+ static_assert (!is_accessible (bases_of (^^Derived2, access_context::unchecked ())[0], gctx));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (is_accessible (^^x, gctx));
+   static_assert (is_accessible (parameters_of (^^foo)[0], gctx));
+   int v;
+   static_assert (is_accessible (^^v, gctx));
+   struct S {};
+   enum E { F, G };
+   static_assert (is_accessible (^^S, gctx));
+   static_assert (is_accessible (^^E, gctx));
+   static_assert (is_accessible (^^F, gctx));
+   static_assert (is_accessible (^^G, gctx));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_accessible2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_accessible2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_accessible2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_accessible2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,470 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_accessible.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A { int a; };
+ struct B { int b; };
+ struct C { int c; };
+ 
+ struct D : A, protected B, private C {
+   static consteval access_context foo () { return access_context::current (); }
+   int d;
+ public:
+   struct E {};
+   enum F { F1 };
+   int bar () { return 0; }
+   template <typename T>
+   void baz () { }
+   using g = int;
+   static constexpr int j = 42;
+ protected:
+   int e;
+   struct G {};
+   enum H { H1 };
+   int qux () { return 0; }
+   template <typename T>
+   void freddy () { }
+   using h = int;
+   static constexpr int k = 42;
+ private:
+   int f;
+   struct I {};
+   enum J { J1 };
+   int corge () { return 0; }
+   template <typename T>
+   void garply () {}
+   using i = int;
+   static constexpr int l = 42;
+   friend struct K;
+   friend void plugh ();
+ public:
+   void waldo ()
+   {
+     constexpr auto ctx = access_context::current ();
+     static_assert (is_accessible (^^d, ctx));
+     static_assert (is_accessible (^^E, ctx));
+     static_assert (is_accessible (^^F, ctx));
+     static_assert (is_accessible (^^F1, ctx));
+     static_assert (is_accessible (^^bar, ctx));
+     static_assert (is_accessible (^^baz, ctx));
+     static_assert (is_accessible (^^g, ctx));
+     static_assert (is_accessible (^^j, ctx));
+     static_assert (is_accessible (^^e, ctx));
+     static_assert (is_accessible (^^G, ctx));
+     static_assert (is_accessible (^^H, ctx));
+     static_assert (is_accessible (^^H1, ctx));
+     static_assert (is_accessible (^^qux, ctx));
+     static_assert (is_accessible (^^freddy, ctx));
+     static_assert (is_accessible (^^h, ctx));
+     static_assert (is_accessible (^^k, ctx));
+     static_assert (is_accessible (^^f, ctx));
+     static_assert (is_accessible (^^I, ctx));
+     static_assert (is_accessible (^^J, ctx));
+     static_assert (is_accessible (^^J1, ctx));
+     static_assert (is_accessible (^^corge, ctx));
+     static_assert (is_accessible (^^garply, ctx));
+     static_assert (is_accessible (^^i, ctx));
+     static_assert (is_accessible (^^l, ctx));
+     static_assert (is_accessible (^^waldo, ctx));
+   }
+   static constexpr info rd = ^^d;
+   static constexpr info rE = ^^E;
+   static constexpr info rF = ^^F;
+   static constexpr info rF1 = ^^F1;
+   static constexpr info rbar = ^^bar;
+   static constexpr info rbaz = ^^baz;
+   static constexpr info rg = ^^g;
+   static constexpr info rj = ^^j;
+   static constexpr info re = ^^e;
+   static constexpr info rG = ^^G;
+   static constexpr info rH = ^^H;
+   static constexpr info rH1 = ^^H1;
+   static constexpr info rqux = ^^qux;
+   static constexpr info rfreddy = ^^freddy;
+   static constexpr info rh = ^^h;
+   static constexpr info rk = ^^k;
+   static constexpr info rf = ^^f;
+   static constexpr info rI = ^^I;
+   static constexpr info rJ = ^^J;
+   static constexpr info rJ1 = ^^J1;
+   static constexpr info rcorge = ^^corge;
+   static constexpr info rgarply = ^^garply;
+   static constexpr info ri = ^^i;
+   static constexpr info rl = ^^l;
+   static constexpr info rwaldo = ^^waldo;
+ };
+ 
+ constexpr auto gctx = access_context::current ();
+ static_assert (is_accessible (D::rd, gctx));
+ static_assert (is_accessible (D::rE, gctx));
+ static_assert (is_accessible (D::rF, gctx));
+ static_assert (is_accessible (D::rF1, gctx));
+ static_assert (is_accessible (D::rbar, gctx));
+ static_assert (is_accessible (D::rbaz, gctx));
+ static_assert (is_accessible (D::rg, gctx));
+ static_assert (is_accessible (D::rj, gctx));
+ static_assert (!is_accessible (D::re, gctx));
+ static_assert (!is_accessible (D::rG, gctx));
+ static_assert (!is_accessible (D::rH, gctx));
+ static_assert (!is_accessible (D::rH1, gctx));
+ static_assert (!is_accessible (D::rqux, gctx));
+ static_assert (!is_accessible (D::rfreddy, gctx));
+ static_assert (!is_accessible (D::rh, gctx));
+ static_assert (!is_accessible (D::rk, gctx));
+ static_assert (!is_accessible (D::rf, gctx));
+ static_assert (!is_accessible (D::rI, gctx));
+ static_assert (!is_accessible (D::rJ, gctx));
+ static_assert (!is_accessible (D::rJ1, gctx));
+ static_assert (!is_accessible (D::rcorge, gctx));
+ static_assert (!is_accessible (D::rgarply, gctx));
+ static_assert (!is_accessible (D::ri, gctx));
+ static_assert (!is_accessible (D::rl, gctx));
+ static_assert (is_accessible (D::rwaldo, gctx));
+ static_assert (is_accessible (D::rd, D::foo ()));
+ static_assert (is_accessible (D::rE, D::foo ()));
+ static_assert (is_accessible (D::rF, D::foo ()));
+ static_assert (is_accessible (D::rF1, D::foo ()));
+ static_assert (is_accessible (D::rbar, D::foo ()));
+ static_assert (is_accessible (D::rbaz, D::foo ()));
+ static_assert (is_accessible (D::rg, D::foo ()));
+ static_assert (is_accessible (D::rj, D::foo ()));
+ static_assert (is_accessible (D::re, D::foo ()));
+ static_assert (is_accessible (D::rG, D::foo ()));
+ static_assert (is_accessible (D::rH, D::foo ()));
+ static_assert (is_accessible (D::rH1, D::foo ()));
+ static_assert (is_accessible (D::rqux, D::foo ()));
+ static_assert (is_accessible (D::rfreddy, D::foo ()));
+ static_assert (is_accessible (D::rh, D::foo ()));
+ static_assert (is_accessible (D::rk, D::foo ()));
+ static_assert (is_accessible (D::rf, D::foo ()));
+ static_assert (is_accessible (D::rI, D::foo ()));
+ static_assert (is_accessible (D::rJ, D::foo ()));
+ static_assert (is_accessible (D::rJ1, D::foo ()));
+ static_assert (is_accessible (D::rcorge, D::foo ()));
+ static_assert (is_accessible (D::rgarply, D::foo ()));
+ static_assert (is_accessible (D::ri, D::foo ()));
+ static_assert (is_accessible (D::rl, D::foo ()));
+ static_assert (is_accessible (D::rwaldo, D::foo ()));
+ constexpr auto uctx = access_context::unchecked ();
+ static_assert (is_accessible (D::rd, uctx));
+ static_assert (is_accessible (D::rE, uctx));
+ static_assert (is_accessible (D::rF, uctx));
+ static_assert (is_accessible (D::rF1, uctx));
+ static_assert (is_accessible (D::rbar, uctx));
+ static_assert (is_accessible (D::rbaz, uctx));
+ static_assert (is_accessible (D::rg, uctx));
+ static_assert (is_accessible (D::rj, uctx));
+ static_assert (is_accessible (D::re, uctx));
+ static_assert (is_accessible (D::rG, uctx));
+ static_assert (is_accessible (D::rH, uctx));
+ static_assert (is_accessible (D::rH1, uctx));
+ static_assert (is_accessible (D::rqux, uctx));
+ static_assert (is_accessible (D::rfreddy, uctx));
+ static_assert (is_accessible (D::rh, uctx));
+ static_assert (is_accessible (D::rk, uctx));
+ static_assert (is_accessible (D::rf, uctx));
+ static_assert (is_accessible (D::rI, uctx));
+ static_assert (is_accessible (D::rJ, uctx));
+ static_assert (is_accessible (D::rJ1, uctx));
+ static_assert (is_accessible (D::rcorge, uctx));
+ static_assert (is_accessible (D::rgarply, uctx));
+ static_assert (is_accessible (D::ri, uctx));
+ static_assert (is_accessible (D::rl, uctx));
+ static_assert (is_accessible (D::rwaldo, uctx));
+ 
+ struct K {
+   static constexpr auto ctx = access_context::current ();
+   static_assert (is_accessible (D::rd, ctx));
+   static_assert (is_accessible (D::rE, ctx));
+   static_assert (is_accessible (D::rF, ctx));
+   static_assert (is_accessible (D::rF1, ctx));
+   static_assert (is_accessible (D::rbar, ctx));
+   static_assert (is_accessible (D::rbaz, ctx));
+   static_assert (is_accessible (D::rg, ctx));
+   static_assert (is_accessible (D::rj, ctx));
+   static_assert (is_accessible (D::re, ctx));
+   static_assert (is_accessible (D::rG, ctx));
+   static_assert (is_accessible (D::rH, ctx));
+   static_assert (is_accessible (D::rH1, ctx));
+   static_assert (is_accessible (D::rqux, ctx));
+   static_assert (is_accessible (D::rfreddy, ctx));
+   static_assert (is_accessible (D::rh, ctx));
+   static_assert (is_accessible (D::rk, ctx));
+   static_assert (is_accessible (D::rf, ctx));
+   static_assert (is_accessible (D::rI, ctx));
+   static_assert (is_accessible (D::rJ, ctx));
+   static_assert (is_accessible (D::rJ1, ctx));
+   static_assert (is_accessible (D::rcorge, ctx));
+   static_assert (is_accessible (D::rgarply, ctx));
+   static_assert (is_accessible (D::ri, ctx));
+   static_assert (is_accessible (D::rl, ctx));
+   static_assert (is_accessible (D::rwaldo, ctx));
+   static constexpr auto uctx = access_context::unprivileged ();
+   static_assert (is_accessible (D::rd, uctx));
+   static_assert (is_accessible (D::rE, uctx));
+   static_assert (is_accessible (D::rF, uctx));
+   static_assert (is_accessible (D::rF1, uctx));
+   static_assert (is_accessible (D::rbar, uctx));
+   static_assert (is_accessible (D::rbaz, uctx));
+   static_assert (is_accessible (D::rg, uctx));
+   static_assert (is_accessible (D::rj, uctx));
+   static_assert (!is_accessible (D::re, uctx));
+   static_assert (!is_accessible (D::rG, uctx));
+   static_assert (!is_accessible (D::rH, uctx));
+   static_assert (!is_accessible (D::rH1, uctx));
+   static_assert (!is_accessible (D::rqux, uctx));
+   static_assert (!is_accessible (D::rfreddy, uctx));
+   static_assert (!is_accessible (D::rh, uctx));
+   static_assert (!is_accessible (D::rk, uctx));
+   static_assert (!is_accessible (D::rf, uctx));
+   static_assert (!is_accessible (D::rI, uctx));
+   static_assert (!is_accessible (D::rJ, uctx));
+   static_assert (!is_accessible (D::rJ1, uctx));
+   static_assert (!is_accessible (D::rcorge, uctx));
+   static_assert (!is_accessible (D::rgarply, uctx));
+   static_assert (!is_accessible (D::ri, uctx));
+   static_assert (!is_accessible (D::rl, uctx));
+   static_assert (is_accessible (D::rwaldo, uctx));
+ };
+ 
+ void
+ plugh ()
+ {
+   static constexpr auto ctx = access_context::current ();
+   static_assert (is_accessible (D::rd, ctx));
+   static_assert (is_accessible (D::rE, ctx));
+   static_assert (is_accessible (D::rF, ctx));
+   static_assert (is_accessible (D::rF1, ctx));
+   static_assert (is_accessible (D::rbar, ctx));
+   static_assert (is_accessible (D::rbaz, ctx));
+   static_assert (is_accessible (D::rg, ctx));
+   static_assert (is_accessible (D::rj, ctx));
+   static_assert (is_accessible (D::re, ctx));
+   static_assert (is_accessible (D::rG, ctx));
+   static_assert (is_accessible (D::rH, ctx));
+   static_assert (is_accessible (D::rH1, ctx));
+   static_assert (is_accessible (D::rqux, ctx));
+   static_assert (is_accessible (D::rfreddy, ctx));
+   static_assert (is_accessible (D::rh, ctx));
+   static_assert (is_accessible (D::rk, ctx));
+   static_assert (is_accessible (D::rf, ctx));
+   static_assert (is_accessible (D::rI, ctx));
+   static_assert (is_accessible (D::rJ, ctx));
+   static_assert (is_accessible (D::rJ1, ctx));
+   static_assert (is_accessible (D::rcorge, ctx));
+   static_assert (is_accessible (D::rgarply, ctx));
+   static_assert (is_accessible (D::ri, ctx));
+   static_assert (is_accessible (D::rl, ctx));
+   static_assert (is_accessible (D::rwaldo, ctx));
+ }
+ 
+ void
+ xyzzy ()
+ {
+   static constexpr auto ctx = access_context::current ();
+   static_assert (is_accessible (D::rd, ctx));
+   static_assert (is_accessible (D::rE, ctx));
+   static_assert (is_accessible (D::rF, ctx));
+   static_assert (is_accessible (D::rF1, ctx));
+   static_assert (is_accessible (D::rbar, ctx));
+   static_assert (is_accessible (D::rbaz, ctx));
+   static_assert (is_accessible (D::rg, ctx));
+   static_assert (is_accessible (D::rj, ctx));
+   static_assert (!is_accessible (D::re, ctx));
+   static_assert (!is_accessible (D::rG, ctx));
+   static_assert (!is_accessible (D::rH, ctx));
+   static_assert (!is_accessible (D::rH1, ctx));
+   static_assert (!is_accessible (D::rqux, ctx));
+   static_assert (!is_accessible (D::rfreddy, ctx));
+   static_assert (!is_accessible (D::rh, ctx));
+   static_assert (!is_accessible (D::rk, ctx));
+   static_assert (!is_accessible (D::rf, ctx));
+   static_assert (!is_accessible (D::rI, ctx));
+   static_assert (!is_accessible (D::rJ, ctx));
+   static_assert (!is_accessible (D::rJ1, ctx));
+   static_assert (!is_accessible (D::rcorge, ctx));
+   static_assert (!is_accessible (D::rgarply, ctx));
+   static_assert (!is_accessible (D::ri, ctx));
+   static_assert (!is_accessible (D::rl, ctx));
+   static_assert (is_accessible (D::rwaldo, ctx));
+ }
+ 
+ struct L : public D
+ {
+   static constexpr auto ctx = access_context::current ();
+   static_assert (is_accessible (D::rd, ctx));
+   static_assert (is_accessible (D::rE, ctx));
+   static_assert (is_accessible (D::rF, ctx));
+   static_assert (is_accessible (D::rF1, ctx));
+   static_assert (is_accessible (D::rbar, ctx));
+   static_assert (is_accessible (D::rbaz, ctx));
+   static_assert (is_accessible (D::rg, ctx));
+   static_assert (is_accessible (D::rj, ctx));
+   static_assert (!is_accessible (D::re, ctx));
+   static_assert (is_accessible (D::rG, ctx));
+   static_assert (is_accessible (D::rH, ctx));
+   static_assert (is_accessible (D::rH1, ctx));
+   static_assert (!is_accessible (D::rqux, ctx));
+   static_assert (!is_accessible (D::rfreddy, ctx));
+   static_assert (is_accessible (D::rh, ctx));
+   static_assert (is_accessible (D::rk, ctx));
+   static_assert (!is_accessible (D::rf, ctx));
+   static_assert (!is_accessible (D::rI, ctx));
+   static_assert (!is_accessible (D::rJ, ctx));
+   static_assert (!is_accessible (D::rJ1, ctx));
+   static_assert (!is_accessible (D::rcorge, ctx));
+   static_assert (!is_accessible (D::rgarply, ctx));
+   static_assert (!is_accessible (D::ri, ctx));
+   static_assert (!is_accessible (D::rl, ctx));
+   static_assert (is_accessible (D::rwaldo, ctx));
+   friend void thud ();
+ };
+ 
+ consteval {
+   constexpr auto ctx = L::ctx.via (^^L);
+   static_assert (is_accessible (D::rd, ctx));
+   static_assert (is_accessible (D::rE, ctx));
+   static_assert (is_accessible (D::rF, ctx));
+   static_assert (is_accessible (D::rF1, ctx));
+   static_assert (is_accessible (D::rbar, ctx));
+   static_assert (is_accessible (D::rbaz, ctx));
+   static_assert (is_accessible (D::rg, ctx));
+   static_assert (is_accessible (D::rj, ctx));
+   static_assert (is_accessible (D::re, ctx));
+   static_assert (is_accessible (D::rG, ctx));
+   static_assert (is_accessible (D::rH, ctx));
+   static_assert (is_accessible (D::rH1, ctx));
+   static_assert (is_accessible (D::rqux, ctx));
+   static_assert (is_accessible (D::rfreddy, ctx));
+   static_assert (is_accessible (D::rh, ctx));
+   static_assert (is_accessible (D::rk, ctx));
+   static_assert (!is_accessible (D::rf, ctx));
+   static_assert (!is_accessible (D::rI, ctx));
+   static_assert (!is_accessible (D::rJ, ctx));
+   static_assert (!is_accessible (D::rJ1, ctx));
+   static_assert (!is_accessible (D::rcorge, ctx));
+   static_assert (!is_accessible (D::rgarply, ctx));
+   static_assert (!is_accessible (D::ri, ctx));
+   static_assert (!is_accessible (D::rl, ctx));
+   static_assert (is_accessible (D::rwaldo, ctx));
+ }
+ 
+ void
+ thud ()
+ {
+   static constexpr auto ctx = access_context::current ();
+   static_assert (is_accessible (D::rd, ctx));
+   static_assert (is_accessible (D::rE, ctx));
+   static_assert (is_accessible (D::rF, ctx));
+   static_assert (is_accessible (D::rF1, ctx));
+   static_assert (is_accessible (D::rbar, ctx));
+   static_assert (is_accessible (D::rbaz, ctx));
+   static_assert (is_accessible (D::rg, ctx));
+   static_assert (is_accessible (D::rj, ctx));
+   static_assert (!is_accessible (D::re, ctx));
+   // TODO: clang++ disagrees with GCC on the D::r{G,H,H12,h,k} cases.
+   static_assert (is_accessible (D::rG, ctx));
+   static_assert (is_accessible (D::rH, ctx));
+   static_assert (is_accessible (D::rH1, ctx));
+   static_assert (!is_accessible (D::rqux, ctx));
+   static_assert (!is_accessible (D::rfreddy, ctx));
+   static_assert (is_accessible (D::rh, ctx));
+   static_assert (is_accessible (D::rk, ctx));
+   static_assert (!is_accessible (D::rf, ctx));
+   static_assert (!is_accessible (D::rI, ctx));
+   static_assert (!is_accessible (D::rJ, ctx));
+   static_assert (!is_accessible (D::rJ1, ctx));
+   static_assert (!is_accessible (D::rcorge, ctx));
+   static_assert (!is_accessible (D::rgarply, ctx));
+   static_assert (!is_accessible (D::ri, ctx));
+   static_assert (!is_accessible (D::rl, ctx));
+   static_assert (is_accessible (D::rwaldo, ctx));
+   static constexpr auto ctx2 = access_context::current ().via (^^L);
+   static_assert (is_accessible (D::rd, ctx2));
+   static_assert (is_accessible (D::rE, ctx2));
+   static_assert (is_accessible (D::rF, ctx2));
+   static_assert (is_accessible (D::rF1, ctx2));
+   static_assert (is_accessible (D::rbar, ctx2));
+   static_assert (is_accessible (D::rbaz, ctx2));
+   static_assert (is_accessible (D::rg, ctx2));
+   static_assert (is_accessible (D::rj, ctx2));
+   static_assert (is_accessible (D::re, ctx2));
+   static_assert (is_accessible (D::rG, ctx2));
+   static_assert (is_accessible (D::rH, ctx2));
+   static_assert (is_accessible (D::rH1, ctx2));
+   static_assert (is_accessible (D::rqux, ctx2));
+   static_assert (is_accessible (D::rfreddy, ctx2));
+   static_assert (is_accessible (D::rh, ctx2));
+   static_assert (is_accessible (D::rk, ctx2));
+   static_assert (!is_accessible (D::rf, ctx2));
+   static_assert (!is_accessible (D::rI, ctx2));
+   static_assert (!is_accessible (D::rJ, ctx2));
+   static_assert (!is_accessible (D::rJ1, ctx2));
+   static_assert (!is_accessible (D::rcorge, ctx2));
+   static_assert (!is_accessible (D::rgarply, ctx2));
+   static_assert (!is_accessible (D::ri, ctx2));
+   static_assert (!is_accessible (D::rl, ctx2));
+   static_assert (is_accessible (D::rwaldo, ctx2));
+ }
+ 
+ struct M : D
+ {
+   static constexpr auto ctx = access_context::current ();
+   static_assert (is_accessible (^^D::A::a, ctx));
+   static_assert (is_accessible (^^D::B::b, ctx));
+   static_assert (is_accessible (^^::C::c, ctx));
+ };
+ 
+ consteval {
+   constexpr auto ctx = M::ctx.via (^^M);
+   static_assert (!is_accessible (^^::C::c, ctx));
+ }
+ 
+ static union { int a; };
+ 
+ static_assert (is_accessible (^^a, gctx));
+ static_assert (is_accessible (^^a, D::foo ()));
+ static_assert (is_accessible (^^a, uctx));
+ 
+ struct N
+ {
+   union { int a; };
+ protected:
+   union { int b; };
+ private:
+   union { int c; };
+ public:
+   static constexpr auto ctx = access_context::current ();
+   static constexpr info ra = ^^a;
+   static constexpr info rb = ^^b;
+   static constexpr info rc = ^^c;
+ };
+ 
+ struct O : public N
+ {
+   static constexpr auto ctx = access_context::current ();
+ };
+ 
+ static_assert (is_accessible (N::ra, gctx));
+ // TODO: clang++ disagrees with g++ on the N::r{b,c} cases with gctx and O::ctx.
+ static_assert (!is_accessible (N::rb, gctx));
+ static_assert (!is_accessible (N::rc, gctx));
+ static_assert (is_accessible (N::ra, N::ctx));
+ // TODO: This case ICEs.
+ //static_assert (is_accessible (N::rb, N::ctx));
+ static_assert (is_accessible (N::rc, N::ctx));
+ static_assert (is_accessible (N::ra, N::ctx.via (^^N)));
+ static_assert (is_accessible (N::rb, N::ctx.via (^^N)));
+ static_assert (is_accessible (N::rc, N::ctx.via (^^N)));
+ static_assert (is_accessible (N::ra, O::ctx));
+ static_assert (!is_accessible (N::rb, O::ctx));
+ static_assert (!is_accessible (N::rc, O::ctx));
+ static_assert (is_accessible (N::ra, O::ctx.via (^^O)));
+ static_assert (is_accessible (N::rb, O::ctx.via (^^O)));
+ static_assert (!is_accessible (N::rc, O::ctx.via (^^O)));
+ static_assert (is_accessible (^^A::a, O::ctx));
+ static_assert (!is_accessible (^^A::a, O::ctx.via (^^O)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_alias_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_alias_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_alias_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_alias_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_alias_template.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_alias_template (null_reflection));
+ static_assert (!is_alias_template (^^::));
+ static_assert (!is_alias_template (^^ns));
+ static_assert (!is_alias_template (^^ns_alias));
+ static_assert (!is_alias_template (reflect_constant (3)));
+ static_assert (!is_alias_template (^^cls));
+ static_assert (!is_alias_template (^^cls::dm));
+ static_assert (!is_alias_template (^^cls::ref_dm));
+ static_assert (!is_alias_template (^^cls::static_dm));
+ static_assert (!is_alias_template (^^cls::mem_fun));
+ static_assert (!is_alias_template (^^cls::static_mem_fun));
+ static_assert (!is_alias_template (^^cls::type));
+ static_assert (!is_alias_template (^^cls_var));
+ static_assert (!is_alias_template (^^onion));
+ static_assert (!is_alias_template (^^anon));
+ static_assert (!is_alias_template (^^fun));
+ static_assert (!is_alias_template (^^alias));
+ static_assert (!is_alias_template (^^var));
+ static_assert (!is_alias_template (^^ref));
+ static_assert (!is_alias_template (^^rref));
+ static_assert (!is_alias_template (^^ptr));
+ static_assert (!is_alias_template (^^cls_tmpl));
+ static_assert (!is_alias_template (^^cls_tmpl<int>));
+ static_assert (!is_alias_template (^^incomplete_cls<int>));
+ static_assert (!is_alias_template (^^fun_tmpl));
+ static_assert (!is_alias_template (^^fun_tmpl<int>));
+ static_assert (!is_alias_template (^^conc));
+ static_assert (!is_alias_template (substitute (^^conc, { ^^int })));
+ static_assert (!is_alias_template (^^var_tmpl));
+ static_assert (!is_alias_template (^^var_tmpl<int>));
+ static_assert (is_alias_template (^^cls_tmpl_alias));
+ static_assert (!is_alias_template (^^cls_tmpl_alias<int>));
+ static_assert (!is_alias_template (^^Enum));
+ static_assert (!is_alias_template (^^Enum::A));
+ static_assert (!is_alias_template (^^Enum_class));
+ static_assert (!is_alias_template (^^Enum_class::A));
+ static_assert (!is_alias_template (^^decomp));
+ static_assert (!is_alias_template (^^decomp_ref));
+ static_assert (!is_alias_template (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_alias_template (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_alias_template (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_alias_template (^^T));
+   static_assert (!is_alias_template (R));
+   static_assert (!is_alias_template (R2));
+   static_assert (is_alias_template (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls_tmpl_alias>();
+   static_assert (!is_alias_template (^^p));
+   static_assert (!is_alias_template (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_assignment1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_assignment1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_assignment1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_assignment1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,44 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_assignment.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S &operator = (const S &);
+   S &operator += (const S &);
+   void bar ();
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (is_assignment (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &);
+ };
+ 
+ struct U {
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (is_assignment (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ static_assert (!is_assignment (null_reflection));
+ static_assert (!is_assignment (^^int));
+ static_assert (!is_assignment (^^::));
+ static_assert (!is_assignment (^^foo));
+ static_assert (!is_assignment (^^S::bar));
+ static_assert (is_assignment (^^S::operator =));
+ static_assert (!is_assignment (^^S::operator +=));
+ static_assert (!is_assignment (^^T::operator *=));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_bit_field1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_bit_field1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_bit_field1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_bit_field1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,144 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_bit_field.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_bit_field (null_reflection));
+ static_assert (!is_bit_field (^^::));
+ static_assert (!is_bit_field (^^ns));
+ static_assert (!is_bit_field (^^ns_alias));
+ static_assert (!is_bit_field (reflect_constant (3)));
+ static_assert (!is_bit_field (^^cls));
+ static_assert (!is_bit_field (^^cls::dm));
+ static_assert (!is_bit_field (^^cls::ref_dm));
+ static_assert (!is_bit_field (^^cls::static_dm));
+ static_assert (!is_bit_field (^^cls::mem_fun));
+ static_assert (!is_bit_field (^^cls::static_mem_fun));
+ static_assert (!is_bit_field (^^cls::type));
+ static_assert (!is_bit_field (^^cls::E));
+ static_assert (!is_bit_field (^^cls::B));
+ static_assert (!is_bit_field (^^cls::C));
+ static_assert (!is_bit_field (^^cls::D));
+ static_assert (!is_bit_field (^^cls::F));
+ static_assert (!is_bit_field (^^cls::F::G));
+ static_assert (!is_bit_field (^^cls::F::H));
+ static_assert (!is_bit_field (^^cls::S));
+ static_assert (!is_bit_field (^^cls::U));
+ static_assert (!is_bit_field (^^cls::foo));
+ static_assert (!is_bit_field (^^cls::foo <0>));
+ static_assert (!is_bit_field (^^cls::bar));
+ static_assert (!is_bit_field (^^cls::bar <42>));
+ static_assert (!is_bit_field (^^cls_var));
+ static_assert (!is_bit_field (^^onion));
+ static_assert (!is_bit_field (^^anon));
+ static_assert (!is_bit_field (^^fun));
+ static_assert (!is_bit_field (^^alias));
+ static_assert (!is_bit_field (^^var));
+ static_assert (!is_bit_field (^^ref));
+ static_assert (!is_bit_field (^^rref));
+ static_assert (!is_bit_field (^^ptr));
+ static_assert (!is_bit_field (^^cls_tmpl));
+ static_assert (!is_bit_field (^^cls_tmpl<int>));
+ static_assert (!is_bit_field (^^incomplete_cls<int>));
+ static_assert (!is_bit_field (^^fun_tmpl));
+ static_assert (!is_bit_field (^^fun_tmpl<int>));
+ static_assert (!is_bit_field (^^conc));
+ static_assert (!is_bit_field (substitute (^^conc, { ^^int })));
+ static_assert (!is_bit_field (^^var_tmpl));
+ static_assert (!is_bit_field (^^var_tmpl<int>));
+ static_assert (!is_bit_field (^^cls_tmpl_alias));
+ static_assert (!is_bit_field (^^cls_tmpl_alias<int>));
+ static_assert (!is_bit_field (^^Enum));
+ static_assert (!is_bit_field (^^Enum::A));
+ static_assert (!is_bit_field (^^Enum_class));
+ static_assert (!is_bit_field (^^Enum_class::A));
+ static_assert (!is_bit_field (^^decomp));
+ static_assert (!is_bit_field (^^decomp_ref));
+ static_assert (!is_bit_field (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_bit_field (dms));
+ constexpr auto dms2 = data_member_spec (^^int, { .bit_width = 6 });
+ static_assert (is_bit_field (dms2));
+ constexpr auto dms3 = data_member_spec (^^int, { .name = "dms", .bit_width = 15 });
+ static_assert (is_bit_field (dms3));
+ 
+ constexpr auto ctx = access_context::current ();
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_bit_field (bases_of (^^Derived, ctx)[0]));
+ 
+ struct S {
+   int bf : 4;
+   long long bf2 : 36;
+   int : 4;
+   int : 0;
+ };
+ static_assert (is_bit_field (^^S::bf));
+ static_assert (is_bit_field (^^S::bf2));
+ static_assert (is_bit_field (members_of (^^S, ctx)[2]));
+ static_assert (is_bit_field (members_of (^^S, ctx)[3]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_bit_field (^^x));
+   static_assert (!is_bit_field (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_bit_field (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_bit_field (^^S));
+   static_assert (!is_bit_field (^^E));
+   static_assert (!is_bit_field (^^F));
+   static_assert (!is_bit_field (^^G));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_class_member1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_class_member1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_class_member1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_class_member1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,128 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_class_member.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_class_member (null_reflection));
+ static_assert (!is_class_member (^^::));
+ static_assert (!is_class_member (^^ns));
+ static_assert (!is_class_member (^^ns_alias));
+ static_assert (!is_class_member (reflect_constant (3)));
+ static_assert (!is_class_member (^^cls));
+ static_assert (is_class_member (^^cls::~cls));
+ static_assert (is_class_member (^^cls::dm));
+ static_assert (is_class_member (^^cls::ref_dm));
+ static_assert (is_class_member (^^cls::static_dm));
+ static_assert (is_class_member (^^cls::mem_fun));
+ static_assert (is_class_member (^^cls::static_mem_fun));
+ static_assert (is_class_member (^^cls::type));
+ static_assert (is_class_member (^^cls::E));
+ static_assert (is_class_member (^^cls::B));
+ static_assert (is_class_member (^^cls::C));
+ static_assert (is_class_member (^^cls::D));
+ static_assert (is_class_member (^^cls::F));
+ static_assert (!is_class_member (^^cls::F::G));
+ static_assert (!is_class_member (^^cls::F::H));
+ static_assert (is_class_member (^^cls::S));
+ static_assert (is_class_member (^^cls::U));
+ static_assert (is_class_member (^^cls::foo));
+ static_assert (is_class_member (^^cls::foo <0>));
+ static_assert (is_class_member (^^cls::bar));
+ static_assert (is_class_member (^^cls::bar <42>));
+ static_assert (!is_class_member (^^cls_var));
+ static_assert (!is_class_member (^^onion));
+ static_assert (is_class_member (^^anon));
+ static_assert (!is_class_member (^^fun));
+ static_assert (!is_class_member (^^alias));
+ static_assert (!is_class_member (^^var));
+ static_assert (!is_class_member (^^ref));
+ static_assert (!is_class_member (^^rref));
+ static_assert (!is_class_member (^^ptr));
+ static_assert (!is_class_member (^^cls_tmpl));
+ static_assert (!is_class_member (^^cls_tmpl<int>));
+ static_assert (!is_class_member (^^incomplete_cls<int>));
+ static_assert (!is_class_member (^^fun_tmpl));
+ static_assert (!is_class_member (^^fun_tmpl<int>));
+ static_assert (!is_class_member (^^conc));
+ static_assert (!is_class_member (substitute (^^conc, { ^^int })));
+ static_assert (!is_class_member (^^var_tmpl));
+ static_assert (!is_class_member (^^var_tmpl<int>));
+ static_assert (!is_class_member (^^cls_tmpl_alias));
+ static_assert (!is_class_member (^^cls_tmpl_alias<int>));
+ static_assert (!is_class_member (^^Enum));
+ static_assert (!is_class_member (^^Enum::A));
+ static_assert (!is_class_member (^^Enum_class));
+ static_assert (!is_class_member (^^Enum_class::A));
+ static_assert (!is_class_member (^^decomp));
+ static_assert (!is_class_member (^^decomp_ref));
+ static_assert (!is_class_member (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_class_member (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_class_member (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_class_member (^^x));
+   static_assert (!is_class_member (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_class_member (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_class_member (^^S));
+   static_assert (!is_class_member (^^E));
+   static_assert (!is_class_member (^^F));
+   static_assert (!is_class_member (^^G));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_class_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_class_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_class_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_class_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_class_template.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_class_template (null_reflection));
+ static_assert (!is_class_template (^^::));
+ static_assert (!is_class_template (^^ns));
+ static_assert (!is_class_template (^^ns_alias));
+ static_assert (!is_class_template (reflect_constant (3)));
+ static_assert (!is_class_template (^^cls));
+ static_assert (!is_class_template (^^cls::dm));
+ static_assert (!is_class_template (^^cls::ref_dm));
+ static_assert (!is_class_template (^^cls::static_dm));
+ static_assert (!is_class_template (^^cls::mem_fun));
+ static_assert (!is_class_template (^^cls::static_mem_fun));
+ static_assert (!is_class_template (^^cls::type));
+ static_assert (!is_class_template (^^cls_var));
+ static_assert (!is_class_template (^^onion));
+ static_assert (!is_class_template (^^anon));
+ static_assert (!is_class_template (^^fun));
+ static_assert (!is_class_template (^^alias));
+ static_assert (!is_class_template (^^var));
+ static_assert (!is_class_template (^^ref));
+ static_assert (!is_class_template (^^rref));
+ static_assert (!is_class_template (^^ptr));
+ static_assert (is_class_template (^^cls_tmpl));
+ static_assert (!is_class_template (^^cls_tmpl<int>));
+ static_assert (!is_class_template (^^incomplete_cls<int>));
+ static_assert (!is_class_template (^^fun_tmpl));
+ static_assert (!is_class_template (^^fun_tmpl<int>));
+ static_assert (!is_class_template (^^conc));
+ static_assert (!is_class_template (substitute (^^conc, { ^^int })));
+ static_assert (!is_class_template (^^var_tmpl));
+ static_assert (!is_class_template (^^var_tmpl<int>));
+ static_assert (!is_class_template (^^cls_tmpl_alias));
+ static_assert (!is_class_template (^^cls_tmpl_alias<int>));
+ static_assert (!is_class_template (^^Enum));
+ static_assert (!is_class_template (^^Enum::A));
+ static_assert (!is_class_template (^^Enum_class));
+ static_assert (!is_class_template (^^Enum_class::A));
+ static_assert (!is_class_template (^^decomp));
+ static_assert (!is_class_template (^^decomp_ref));
+ static_assert (!is_class_template (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_class_template (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_class_template (bases_of (^^Derived, access_context::unprivileged ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_class_template (^^T));
+   static_assert (!is_class_template (R));
+   static_assert (!is_class_template (R2));
+   static_assert (is_class_template (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls_tmpl>();
+   static_assert (!is_class_template (^^p));
+   static_assert (!is_class_template (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_complete_type1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_complete_type1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_complete_type1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_complete_type1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,109 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_complete_type.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ using inc_arr = int[];
+ using com_arr = int[42];
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_complete_type (null_reflection));
+ static_assert (!is_complete_type (^^::));
+ static_assert (!is_complete_type (^^ns));
+ static_assert (!is_complete_type (^^ns_alias));
+ static_assert (!is_complete_type (reflect_constant (3)));
+ static_assert (is_complete_type (^^cls));
+ static_assert (!is_complete_type (^^cls::dm));
+ static_assert (!is_complete_type (^^cls::ref_dm));
+ static_assert (!is_complete_type (^^cls::static_dm));
+ static_assert (!is_complete_type (^^cls::mem_fun));
+ static_assert (!is_complete_type (^^cls::static_mem_fun));
+ static_assert (is_complete_type (^^cls::type));
+ static_assert (!is_complete_type (^^cls_var));
+ static_assert (is_complete_type (^^onion));
+ static_assert (!is_complete_type (^^anon));
+ static_assert (!is_complete_type (^^fun));
+ static_assert (is_complete_type (^^alias));
+ static_assert (!is_complete_type (^^var));
+ static_assert (!is_complete_type (^^ref));
+ static_assert (!is_complete_type (^^rref));
+ static_assert (!is_complete_type (^^ptr));
+ static_assert (!is_complete_type (^^cls_tmpl));
+ static_assert (is_complete_type (^^cls_tmpl<int>));
+ static_assert (!is_complete_type (^^incomplete_cls<int>));
+ static_assert (!is_complete_type (^^fun_tmpl));
+ static_assert (!is_complete_type (^^fun_tmpl<int>));
+ static_assert (!is_complete_type (^^conc));
+ static_assert (!is_complete_type (substitute (^^conc, { ^^int })));
+ static_assert (!is_complete_type (^^var_tmpl));
+ static_assert (!is_complete_type (^^var_tmpl<int>));
+ static_assert (!is_complete_type (^^cls_tmpl_alias));
+ static_assert (is_complete_type (^^cls_tmpl_alias<int>));
+ static_assert (is_complete_type (^^Enum));
+ static_assert (!is_complete_type (^^Enum::A));
+ static_assert (is_complete_type (^^Enum_class));
+ static_assert (!is_complete_type (^^Enum_class::A));
+ static_assert (!is_complete_type (^^decomp));
+ static_assert (!is_complete_type (^^decomp_ref));
+ static_assert (!is_complete_type (^^arr));
+ static_assert (!is_complete_type (^^inc_arr));
+ static_assert (is_complete_type (^^com_arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_complete_type (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_complete_type (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (is_complete_type (^^T));
+   static_assert (!is_complete_type (R));
+   static_assert (!is_complete_type (R2));
+   static_assert (is_complete_type (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!is_complete_type (^^p));
+   static_assert (!is_complete_type (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_complete_type2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_complete_type2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_complete_type2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_complete_type2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_complete_type.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S;
+ 
+ namespace N
+ {
+   consteval bool
+   is_complete_type (info r) { return std::meta::is_complete_type (r); }
+ }
+ 
+ static_assert (!is_complete_type (^^S));
+ static_assert (!N::is_complete_type (^^S));
+ 
+ consteval {
+   define_aggregate (^^S, {});
+ }
+ 
+ static_assert (is_complete_type (^^S));
+ static_assert (N::is_complete_type (^^S));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_concept1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_concept1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_concept1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_concept1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_concept.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_concept (null_reflection));
+ static_assert (!is_concept (^^::));
+ static_assert (!is_concept (^^ns));
+ static_assert (!is_concept (^^ns_alias));
+ static_assert (!is_concept (reflect_constant (3)));
+ static_assert (!is_concept (^^cls));
+ static_assert (!is_concept (^^cls::dm));
+ static_assert (!is_concept (^^cls::ref_dm));
+ static_assert (!is_concept (^^cls::static_dm));
+ static_assert (!is_concept (^^cls::mem_fun));
+ static_assert (!is_concept (^^cls::static_mem_fun));
+ static_assert (!is_concept (^^cls::type));
+ static_assert (!is_concept (^^cls_var));
+ static_assert (!is_concept (^^onion));
+ static_assert (!is_concept (^^anon));
+ static_assert (!is_concept (^^fun));
+ static_assert (!is_concept (^^alias));
+ static_assert (!is_concept (^^var));
+ static_assert (!is_concept (^^ref));
+ static_assert (!is_concept (^^rref));
+ static_assert (!is_concept (^^ptr));
+ static_assert (!is_concept (^^cls_tmpl));
+ static_assert (!is_concept (^^cls_tmpl<int>));
+ static_assert (!is_concept (^^incomplete_cls<int>));
+ static_assert (!is_concept (^^fun_tmpl));
+ static_assert (!is_concept (^^fun_tmpl<int>));
+ static_assert (is_concept (^^conc));
+ static_assert (!is_concept (substitute (^^conc, { ^^int })));
+ static_assert (!is_concept (^^var_tmpl));
+ static_assert (!is_concept (^^var_tmpl<int>));
+ static_assert (!is_concept (^^cls_tmpl_alias));
+ static_assert (!is_concept (^^cls_tmpl_alias<int>));
+ static_assert (!is_concept (^^Enum));
+ static_assert (!is_concept (^^Enum::A));
+ static_assert (!is_concept (^^Enum_class));
+ static_assert (!is_concept (^^Enum_class::A));
+ static_assert (!is_concept (^^decomp));
+ static_assert (!is_concept (^^decomp_ref));
+ static_assert (!is_concept (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_concept (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_concept (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_concept (^^T));
+   static_assert (!is_concept (R));
+   static_assert (!is_concept (R2));
+   static_assert (is_concept (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^conc>();
+   static_assert (!is_concept (^^p));
+   static_assert (!is_concept (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_const1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_const1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_const1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_const1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,116 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_const.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+ };
+ struct U {
+   int u;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ static_assert (!is_const (std::meta::reflect_constant (42)));
+ static_assert (!is_const (std::meta::reflect_object (arr[1])));
+ static_assert (!is_const (^^arr));
+ static_assert (!is_const (^^a3));
+ static_assert (!is_const (^^fn));
+ static_assert (!is_const (^^fn2));
+ static_assert (!is_const (^^Enum::A));
+ static_assert (!is_const (^^Alias));
+ static_assert (!is_const (^^S));
+ static_assert (!is_const (^^S::mem));
+ static_assert (!is_const (std::meta::members_of (^^S, ctx)[1]));
+ static_assert (!is_const (^^TCls));
+ static_assert (!is_const (^^TFn));
+ static_assert (!is_const (^^TVar));
+ static_assert (!is_const (^^Concept));
+ static_assert (!is_const (^^NSAlias));
+ static_assert (!is_const (^^NS));
+ static_assert (!is_const (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (!is_const (std::meta::data_member_spec (^^int, { .name = "member" })));
+ 
+ int
+ foo (int a, const long b, T c, int d[4], T &e)
+ {
+   static_assert (!is_const (^^a));
+   static_assert (is_const (^^b));
+   static_assert (!is_const (^^c));
+   static_assert (!is_const (^^d));
+   static_assert (!is_const (^^e));
+   static_assert (!is_const (parameters_of (^^foo)[0]));
+   static_assert (!is_const (parameters_of (^^foo)[1]));
+   static_assert (!is_const (parameters_of (^^foo)[2]));
+   static_assert (!is_const (parameters_of (^^foo)[3]));
+   static_assert (!is_const (parameters_of (^^foo)[4]));
+   return 0;
+ }
+ 
+ static_assert (!is_const (std::meta::reflect_constant (42)));
+ static_assert (!is_const (std::meta::reflect_constant (42.0)));
+ static_assert (is_const (std::meta::reflect_constant (U { 42 })));
+ static_assert (!is_const (std::meta::reflect_object (arr[1])));
+ static_assert (!is_const (^^arr));
+ static_assert (!is_const (^^fn));
+ static_assert (!is_const (^^Enum::A));
+ static_assert (!is_const (^^A));
+ static_assert (!is_const (^^S::mem));
+ 
+ const int ci = 42;
+ static_assert (is_const (^^ci));
+ using uci = const int;
+ static_assert (is_const (^^uci));
+ constexpr long cl = 42L;
+ static_assert (is_const (^^cl));
+ extern const volatile short cv = 2;
+ static_assert (is_const (^^cv));
+ struct V { const int a; static const int b; };
+ static_assert (is_const (^^V::a));
+ static_assert (is_const (^^V::b));
+ 
+ const int arr2[] = {3, 4, 5};
+ const int arr3[2][2][2] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
+ struct W {
+   void foo () volatile {}
+   void bar () const {}
+ };
+ static_assert (is_const (^^arr2));
+ static_assert (is_const (^^arr3));
+ static_assert (!is_const (^^W::foo));
+ static_assert (is_const (^^W::bar));
+ static_assert (!is_const (^^int));
+ static_assert (is_const (^^const int));
+ static_assert (!is_const (^^volatile int));
+ static_assert (is_const (^^const volatile int));
+ static_assert (!is_const (^^int [2]));
+ static_assert (is_const (^^const int [2]));
+ static_assert (!is_const (^^volatile int [2]));
+ static_assert (is_const (^^const volatile int [2]));
+ static_assert (!is_const (^^int (int)));
+ static_assert (is_const (^^int (int) const));
+ static_assert (!is_const (^^int (int) volatile));
+ static_assert (is_const (^^int (int) const volatile));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_consteval_only1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_consteval_only1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_consteval_only1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_consteval_only1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,83 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_consteval_only.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct A {
+   info i;
+ };
+ struct B : A { };
+ struct C : virtual A { };
+ struct D : B { };
+ struct E { };
+ struct F : E {
+   info i;
+ };
+ template<typename T>
+ struct G {
+   T t;
+   using size_type = int;
+ };
+ struct H {
+   G<info>::size_type sz;
+ };
+ struct I {
+   std::initializer_list<std::meta::info>::size_type sz;
+ };
+ template<typename T>
+ struct J : T { };
+ 
+ template<typename T>
+ using U = J<T>;
+ 
+ template<typename T>
+ struct K {
+   J<T> j;
+ };
+ 
+ template<typename T>
+ struct L {
+   U<T> u;
+ };
+ 
+ template<typename T>
+ struct M : J<T> { };
+ 
+ template<typename>
+ struct N { };
+ 
+ static_assert (is_consteval_only_type (^^A));
+ static_assert (is_consteval_only_type (^^B));
+ static_assert (is_consteval_only_type (^^C));
+ static_assert (is_consteval_only_type (^^D));
+ static_assert (!is_consteval_only_type (^^E));
+ static_assert (is_consteval_only_type (^^F));
+ static_assert (!is_consteval_only_type (^^G<int>));
+ static_assert (is_consteval_only_type (^^G<info>));
+ static_assert (!is_consteval_only_type (^^H));
+ static_assert (!is_consteval_only_type (^^I));
+ static_assert (!is_consteval_only_type (^^J<E>));
+ static_assert (is_consteval_only_type (^^J<A>));
+ static_assert (!is_consteval_only_type (^^U<E>));
+ static_assert (is_consteval_only_type (^^U<A>));
+ static_assert (!is_consteval_only_type (^^K<E>));
+ static_assert (is_consteval_only_type (^^K<A>));
+ static_assert (!is_consteval_only_type (^^L<E>));
+ static_assert (is_consteval_only_type (^^L<A>));
+ static_assert (!is_consteval_only_type (^^M<E>));
+ static_assert (is_consteval_only_type (^^M<A>));
+ static_assert (!is_consteval_only_type (^^N<E>));
+ static_assert (!is_consteval_only_type (^^N<A>));
+ 
+ static_assert (is_consteval_only_type (^^std::meta::exception));
+ static_assert (is_consteval_only_type (^^std::meta::access_context));
+ static_assert (!is_consteval_only_type (^^std::meta::member_offset));
+ static_assert (is_consteval_only_type (^^std::meta::data_member_options));
+ static_assert (is_consteval_only_type (type_of (^^std::meta::data_member_options::name)));
+ 
+ struct O;
+ static_assert (!is_consteval_only_type (^^O));
+ struct O { info i; };
+ static_assert (is_consteval_only_type (^^O));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_constructible_type1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_constructible_type1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_constructible_type1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_constructible_type1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,674 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_constructible_type.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ class ClassType { };
+ class DerivedType : public ClassType { };
+ enum EnumType { e0 };
+ struct ThrowDefaultClass { ThrowDefaultClass () noexcept (false); };
+ struct ThrowCopyConsClass { ThrowCopyConsClass (const ThrowCopyConsClass &) noexcept (false); };
+ struct ThrowMoveConsClass { ThrowMoveConsClass (ThrowMoveConsClass &&) noexcept (false); };
+ struct NoexceptDefaultClass { NoexceptDefaultClass () noexcept (true); };
+ struct ExceptDefaultClass { ExceptDefaultClass () noexcept (false); };
+ struct NoexceptCopyConsClass { NoexceptCopyConsClass (const NoexceptCopyConsClass &) noexcept (true); };
+ struct ExceptCopyConsClass { ExceptCopyConsClass (const ExceptCopyConsClass &) noexcept (false); };
+ struct NoexceptMoveConsClass { NoexceptMoveConsClass (NoexceptMoveConsClass &&) noexcept (true); NoexceptMoveConsClass &operator= (NoexceptMoveConsClass &&) = default; };
+ struct ExceptMoveConsClass { ExceptMoveConsClass (ExceptMoveConsClass &&) noexcept (false); };
+ struct NoexceptCopyAssignClass { NoexceptCopyAssignClass &operator= (const NoexceptCopyAssignClass &) noexcept (true); };
+ struct ExceptCopyAssignClass { ExceptCopyAssignClass &operator= (const ExceptCopyAssignClass &) noexcept (false); };
+ struct NoexceptMoveAssignClass { NoexceptMoveAssignClass (NoexceptMoveAssignClass &&) = default; NoexceptMoveAssignClass &operator= (NoexceptMoveAssignClass &&) noexcept (true); };
+ struct ExceptMoveAssignClass { ExceptMoveAssignClass &operator= (ExceptMoveAssignClass &&) noexcept (false); };
+ struct DeletedCopyAssignClass { DeletedCopyAssignClass & operator= (const DeletedCopyAssignClass &) = delete; };
+ struct DeletedMoveAssignClass { DeletedMoveAssignClass &operator= (DeletedMoveAssignClass &&) = delete; };
+ struct NType { int i; int j; virtual ~NType (); };
+ struct TType { int i; private: int j; };
+ struct SLType { int i; int j; ~SLType (); };
+ struct PODType { int i; int j; };
+ struct Empty {};
+ struct B { int i; B () {} };
+ struct D : B {};
+ enum E { ee1 };
+ enum E2 { ee2 };
+ enum class SE { e1 };
+ enum class SE2 { e2 };
+ enum OpE : int;
+ enum class OpSE : bool;
+ union U { int i; Empty b; };
+ struct Abstract { virtual ~Abstract () = 0; };
+ struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };
+ struct Ukn;
+ template <class To>
+ struct ImplicitTo { operator To (); };
+ template <class To>
+ struct DelImplicitTo { operator To () = delete; };
+ template <class To>
+ struct ExplicitTo { explicit operator To (); };
+ struct Ellipsis { Ellipsis (...) {} };
+ struct DelEllipsis { DelEllipsis (...) = delete; };
+ struct Any { template <class T> Any (T &&) {} };
+ struct nAny { template <class... T> nAny (T &&...) {} };
+ struct DelnAny { template <class... T> DelnAny (T &&...) = delete; };
+ template <class... Args>
+ struct FromArgs { FromArgs (Args...); };
+ struct DelDef { DelDef () = delete; };
+ struct DelCopy { DelCopy (const DelCopy &) = delete; };
+ struct DelDtor {
+   DelDtor () = default;
+   DelDtor (const DelDtor &) = default;
+   DelDtor (DelDtor &&) = default;
+   DelDtor (int);
+   DelDtor (int, B, U);
+   ~DelDtor () = delete;
+ };
+ struct Nontrivial {
+   Nontrivial ();
+   Nontrivial (const Nontrivial &);
+   Nontrivial &operator= (const Nontrivial &);
+   ~Nontrivial ();
+ };
+ union NontrivialUnion { int i; Nontrivial n; };
+ struct UnusualCopy { UnusualCopy (UnusualCopy &); };
+ 
+ static_assert (is_constructible_type (^^int, { ^^int }));
+ static_assert (is_constructible_type (^^std::nullptr_t, { ^^std::nullptr_t }));
+ static_assert (is_constructible_type (^^E, { ^^E }));
+ static_assert (is_constructible_type (^^SE, { ^^SE }));
+ static_assert (is_constructible_type (^^OpE, { ^^OpE }));
+ static_assert (is_constructible_type (^^OpSE, { ^^OpSE }));
+ static_assert (is_constructible_type (^^Empty, { ^^Empty }));
+ static_assert (is_constructible_type (^^B, { ^^B }));
+ static_assert (is_constructible_type (^^U, { ^^U }));
+ static_assert (is_constructible_type (^^int B::*, { ^^int B::* }));
+ static_assert (is_constructible_type (^^Ellipsis, { ^^Ellipsis }));
+ static_assert (is_constructible_type (^^int *, { ^^int * }));
+ static_assert (is_constructible_type (^^void *, { ^^void * }));
+ static_assert (is_constructible_type (^^Any, { ^^Any }));
+ static_assert (is_constructible_type (^^nAny, { ^^nAny }));
+ static_assert (is_constructible_type (^^std::initializer_list <int>, { ^^std::initializer_list <int> }));
+ static_assert (is_constructible_type (^^DelDef, { ^^DelDef }));
+ static_assert (!is_constructible_type (^^void, { ^^void }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^Abstract }));
+ static_assert (!is_constructible_type (^^int [], { ^^int [] }));
+ static_assert (!is_constructible_type (^^int [1], { ^^int [1] }));
+ static_assert (!is_constructible_type (^^DelCopy, { ^^const DelCopy & }));
+ static_assert (!is_constructible_type (^^DelCopy, { ^^DelCopy && }));
+ static_assert (!is_constructible_type (^^DelCopy, { ^^DelCopy }));
+ static_assert (!is_constructible_type (^^DelDtor, { ^^void }));
+ static_assert (!is_constructible_type (^^DelDtor, { ^^int }));
+ static_assert (!is_constructible_type (^^DelDtor, { ^^DelDtor }));
+ static_assert (!is_constructible_type (^^DelDtor, { ^^DelDtor && }));
+ static_assert (!is_constructible_type (^^DelDtor, { ^^const DelDtor & }));
+ static_assert (is_constructible_type (^^DelEllipsis, { ^^const DelEllipsis & }));
+ static_assert (is_constructible_type (^^DelEllipsis, { ^^DelEllipsis && }));
+ static_assert (is_constructible_type (^^DelEllipsis, { ^^DelEllipsis }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^void }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^B }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^Empty }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^E }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^SE }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^OpE }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^void () }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^void () const }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^int [1] }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^int [] }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^int * }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^void * }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^int B::* }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^int D::* }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^Abstract }));
+ static_assert (!is_constructible_type (^^int, { ^^DelImplicitTo <int> }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^DelImplicitTo <std::nullptr_t> }));
+ static_assert (!is_constructible_type (^^int &, { ^^DelImplicitTo <const int &> }));
+ static_assert (!is_constructible_type (^^int, { ^^void }));
+ static_assert (!is_constructible_type (^^void, { ^^int }));
+ static_assert (is_constructible_type (^^void *, { ^^int * }));
+ static_assert (!is_constructible_type (^^int *, { ^^void * }));
+ static_assert (is_constructible_type (^^int *, { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^int * }));
+ static_assert (!is_constructible_type (^^Empty, { ^^E }));
+ static_assert (!is_constructible_type (^^Empty, { ^^SE }));
+ static_assert (!is_constructible_type (^^Empty, { ^^OpE }));
+ static_assert (!is_constructible_type (^^Empty, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^Empty, { ^^void }));
+ static_assert (!is_constructible_type (^^Empty, { ^^void * }));
+ static_assert (!is_constructible_type (^^Empty, { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^Empty, { ^^int [] }));
+ static_assert (!is_constructible_type (^^Empty, { ^^int [3] }));
+ static_assert (!is_constructible_type (^^Empty, { ^^int }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^int }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^Abstract }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^int [] }));
+ static_assert (is_constructible_type (^^B, { ^^D }));
+ static_assert (!is_constructible_type (^^int [], { ^^int [1] }));
+ static_assert (!is_constructible_type (^^int [1], { ^^int [] }));
+ static_assert (!is_constructible_type (^^int [], { ^^Empty }));
+ static_assert (!is_constructible_type (^^int [], { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^int [1], { ^^Abstract }));
+ static_assert (is_constructible_type (^^const int *, { ^^int * }));
+ static_assert (is_constructible_type (^^const void *, { ^^void * }));
+ static_assert (is_constructible_type (^^const void *, { ^^int * }));
+ static_assert (!is_constructible_type (^^int *, { ^^const void * }));
+ static_assert (is_constructible_type (^^int, { ^^E }));
+ static_assert (!is_constructible_type (^^E, { ^^int }));
+ static_assert (!is_constructible_type (^^E, { ^^E2 }));
+ static_assert (is_constructible_type (^^E, { ^^E }));
+ static_assert (is_constructible_type (^^bool, { ^^E }));
+ static_assert (!is_constructible_type (^^E, { ^^bool }));
+ static_assert (is_constructible_type (^^double, { ^^E }));
+ static_assert (!is_constructible_type (^^E, { ^^double }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^E }));
+ static_assert (!is_constructible_type (^^E, { ^^std::nullptr_t }));
+ static_assert (is_constructible_type (^^int, { ^^OpE }));
+ static_assert (!is_constructible_type (^^OpE, { ^^int }));
+ static_assert (!is_constructible_type (^^OpE, { ^^E2 }));
+ static_assert (is_constructible_type (^^OpE, { ^^OpE }));
+ static_assert (is_constructible_type (^^bool, { ^^OpE }));
+ static_assert (!is_constructible_type (^^OpE, { ^^bool }));
+ static_assert (is_constructible_type (^^double, { ^^OpE }));
+ static_assert (!is_constructible_type (^^OpE, { ^^double }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^OpE }));
+ static_assert (!is_constructible_type (^^OpE, { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^int, { ^^SE }));
+ static_assert (!is_constructible_type (^^SE, { ^^int }));
+ static_assert (!is_constructible_type (^^E, { ^^SE }));
+ static_assert (!is_constructible_type (^^SE, { ^^SE2 }));
+ static_assert (is_constructible_type (^^SE, { ^^SE }));
+ static_assert (!is_constructible_type (^^bool, { ^^SE }));
+ static_assert (!is_constructible_type (^^SE, { ^^bool }));
+ static_assert (!is_constructible_type (^^double, { ^^SE }));
+ static_assert (!is_constructible_type (^^SE, { ^^double }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^SE }));
+ static_assert (!is_constructible_type (^^SE, { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^int, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^int }));
+ static_assert (!is_constructible_type (^^OpE, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^SE2 }));
+ static_assert (is_constructible_type (^^OpSE, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^bool, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^bool }));
+ static_assert (!is_constructible_type (^^double, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^double }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^D *, { ^^B * }));
+ static_assert (!is_constructible_type (^^const volatile D *, { ^^B * }));
+ static_assert (!is_constructible_type (^^D *, { ^^const volatile B * }));
+ static_assert (!is_constructible_type (^^D *, { ^^B * const }));
+ static_assert (!is_constructible_type (^^const volatile D *, { ^^B * const }));
+ static_assert (!is_constructible_type (^^D *, { ^^const volatile B * const }));
+ static_assert (!is_constructible_type (^^D *, { ^^B * & }));
+ static_assert (!is_constructible_type (^^const volatile D *, { ^^B * & }));
+ static_assert (!is_constructible_type (^^D *, { ^^const volatile B * & }));
+ static_assert (!is_constructible_type (^^int B::*, { ^^int D::* }));
+ static_assert (!is_constructible_type (^^const volatile int B::*, { ^^int D::* }));
+ static_assert (!is_constructible_type (^^int B::*, { ^^const volatile int D::* }));
+ static_assert (!is_constructible_type (^^int B::*, { ^^int D::* const }));
+ static_assert (!is_constructible_type (^^const volatile int B::*, { ^^int D::* const }));
+ static_assert (!is_constructible_type (^^int B::*, { ^^const volatile int D::* const }));
+ static_assert (!is_constructible_type (^^int B::*, { ^^int D::* & }));
+ static_assert (!is_constructible_type (^^const volatile int B::*, { ^^int D::* & }));
+ static_assert (!is_constructible_type (^^int B::*, { ^^const volatile int D::* & }));
+ static_assert (!is_constructible_type (^^int B::*, { ^^int D::* const & }));
+ static_assert (!is_constructible_type (^^const volatile int B::*, { ^^int D::* const & }));
+ static_assert (!is_constructible_type (^^int B::*, { ^^const volatile int D::* const & }));
+ static_assert (!is_constructible_type (^^int &&, { ^^int & }));
+ static_assert (!is_constructible_type (^^const int &&, { ^^int & }));
+ static_assert (is_constructible_type (^^B &, { ^^D & }));
+ static_assert (is_constructible_type (^^B &&, { ^^D && }));
+ static_assert (is_constructible_type (^^const B &, { ^^D & }));
+ static_assert (is_constructible_type (^^const B &&, { ^^D && }));
+ static_assert (!is_constructible_type (^^B &, { ^^const D & }));
+ static_assert (!is_constructible_type (^^B &&, { ^^const D && }));
+ static_assert (!is_constructible_type (^^D &, { ^^B & }));
+ static_assert (is_constructible_type (^^D &&, { ^^B && }));
+ static_assert (!is_constructible_type (^^D &, { ^^const B & }));
+ static_assert (is_constructible_type (^^D &&, { ^^const B && }));
+ static_assert (is_constructible_type (^^const D &, { ^^B & }));
+ static_assert (is_constructible_type (^^const D &&, { ^^B && }));
+ static_assert (!is_constructible_type (^^B &&, { ^^B & }));
+ static_assert (!is_constructible_type (^^B &&, { ^^D & }));
+ static_assert (is_constructible_type (^^B &&, { ^^ImplicitTo <D &&> }));
+ static_assert (is_constructible_type (^^B &&, { ^^ImplicitTo <D &&> & }));
+ static_assert (is_constructible_type (^^int &&, { ^^double & }));
+ static_assert (is_constructible_type (^^const int &, { ^^ImplicitTo <int &> & }));
+ static_assert (is_constructible_type (^^const int &, { ^^ImplicitTo <int &> }));
+ static_assert (is_constructible_type (^^const int &, { ^^ExplicitTo <int &> & }));
+ static_assert (is_constructible_type (^^const int &, { ^^ExplicitTo <int &> }));
+ static_assert (!is_constructible_type (^^B &&, { ^^ExplicitTo <D &&> }));
+ static_assert (!is_constructible_type (^^B &&, { ^^ExplicitTo <D &&> & }));
+ static_assert (!is_constructible_type (^^B &, { ^^B && }));
+ static_assert (!is_constructible_type (^^D &, { ^^B && }));
+ static_assert (!is_constructible_type (^^B &, { ^^D && }));
+ static_assert (is_constructible_type (^^void (&) (), { ^^void (&) () }));
+ static_assert (is_constructible_type (^^void (&&) (), { ^^void (&&) () }));
+ static_assert (is_constructible_type (^^void (&&) (), { ^^void () }));
+ static_assert (!is_constructible_type (^^void, { }));
+ static_assert (!is_constructible_type (^^void, { ^^int }));
+ static_assert (!is_constructible_type (^^void, { ^^int, ^^double }));
+ static_assert (!is_constructible_type (^^int &, {}));
+ static_assert (!is_constructible_type (^^const int &, {}));
+ static_assert (!is_constructible_type (^^int &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const int &, { ^^int, ^^int }));
+ static_assert (is_constructible_type (^^void (&) (), { ^^void () }));
+ static_assert (is_constructible_type (^^void (&) (), { ^^void (&&) () }));
+ static_assert (is_constructible_type (^^int &, { ^^int & }));
+ static_assert (!is_constructible_type (^^int &, { ^^const int & }));
+ static_assert (!is_constructible_type (^^int &, { ^^int }));
+ static_assert (!is_constructible_type (^^int &, { ^^int && }));
+ static_assert (!is_constructible_type (^^int &, { ^^const int && }));
+ static_assert (is_constructible_type (^^const int &, { ^^int & }));
+ static_assert (is_constructible_type (^^const int &, { ^^int }));
+ static_assert (is_constructible_type (^^const int &, { ^^const int }));
+ static_assert (is_constructible_type (^^const int &, { ^^int && }));
+ static_assert (is_constructible_type (^^const int &, { ^^const int && }));
+ static_assert (is_constructible_type (^^volatile int &, { ^^int & }));
+ static_assert (!is_constructible_type (^^volatile int &, { ^^const int & }));
+ static_assert (!is_constructible_type (^^volatile int &, { ^^int }));
+ static_assert (!is_constructible_type (^^volatile int &, { ^^int && }));
+ static_assert (!is_constructible_type (^^volatile int &, { ^^const int && }));
+ static_assert (is_constructible_type (^^const volatile int &, { ^^int & }));
+ static_assert (!is_constructible_type (^^const volatile int &, { ^^int }));
+ static_assert (!is_constructible_type (^^const volatile int &, { ^^const int }));
+ static_assert (!is_constructible_type (^^const volatile int &, { ^^int && }));
+ static_assert (!is_constructible_type (^^const volatile int &, { ^^const int && }));
+ static_assert (is_constructible_type (^^int &&, { ^^int }));
+ static_assert (is_constructible_type (^^int &&, { ^^int && }));
+ static_assert (!is_constructible_type (^^int &&, { ^^const int && }));
+ static_assert (!is_constructible_type (^^int &&, { ^^int & }));
+ static_assert (!is_constructible_type (^^int &&, { ^^const int & }));
+ static_assert (is_constructible_type (^^int &&, { ^^double & }));
+ static_assert (is_constructible_type (^^const int &&, { ^^int }));
+ static_assert (is_constructible_type (^^const int &&, { ^^int && }));
+ static_assert (is_constructible_type (^^const int &&, { ^^const int }));
+ static_assert (is_constructible_type (^^const int &&, { ^^const int && }));
+ static_assert (!is_constructible_type (^^int &&, { ^^const int & }));
+ static_assert (!is_constructible_type (^^const int &&, { ^^int & }));
+ static_assert (!is_constructible_type (^^const int &&, { ^^const int & }));
+ static_assert (is_constructible_type (^^volatile int &&, { ^^int }));
+ static_assert (is_constructible_type (^^volatile int &&, { ^^int && }));
+ static_assert (!is_constructible_type (^^volatile int &&, { ^^const int && }));
+ static_assert (!is_constructible_type (^^volatile int &&, { ^^int & }));
+ static_assert (!is_constructible_type (^^volatile int &&, { ^^const int & }));
+ static_assert (is_constructible_type (^^volatile int &&, { ^^double & }));
+ static_assert (is_constructible_type (^^volatile const int &&, { ^^int }));
+ static_assert (is_constructible_type (^^const volatile int &&, { ^^int && }));
+ static_assert (is_constructible_type (^^const volatile int &&, { ^^const int }));
+ static_assert (is_constructible_type (^^const volatile int &&, { ^^const int && }));
+ static_assert (!is_constructible_type (^^volatile int &&, { ^^const int & }));
+ static_assert (!is_constructible_type (^^const volatile int &&, { ^^int & }));
+ static_assert (!is_constructible_type (^^const volatile int &&, { ^^const int & }));
+ static_assert (is_constructible_type (^^Empty &, { ^^Empty & }));
+ static_assert (!is_constructible_type (^^Empty &, { ^^const Empty & }));
+ static_assert (!is_constructible_type (^^Empty &, { ^^Empty }));
+ static_assert (!is_constructible_type (^^Empty &, { ^^Empty && }));
+ static_assert (!is_constructible_type (^^Empty &, { ^^const Empty && }));
+ static_assert (is_constructible_type (^^const Empty &, { ^^Empty & }));
+ static_assert (is_constructible_type (^^const Empty &, { ^^Empty }));
+ static_assert (is_constructible_type (^^const Empty &, { ^^const Empty }));
+ static_assert (is_constructible_type (^^const Empty &, { ^^Empty && }));
+ static_assert (is_constructible_type (^^const Empty &, { ^^const Empty && }));
+ static_assert (is_constructible_type (^^volatile Empty &, { ^^Empty & }));
+ static_assert (!is_constructible_type (^^volatile Empty &, { ^^const Empty & }));
+ static_assert (!is_constructible_type (^^volatile Empty &, { ^^Empty }));
+ static_assert (!is_constructible_type (^^volatile Empty &, { ^^Empty && }));
+ static_assert (!is_constructible_type (^^volatile Empty &, { ^^const Empty && }));
+ static_assert (is_constructible_type (^^const volatile Empty &, { ^^Empty & }));
+ static_assert (!is_constructible_type (^^const volatile Empty &, { ^^Empty }));
+ static_assert (!is_constructible_type (^^const volatile Empty &, { ^^const Empty }));
+ static_assert (!is_constructible_type (^^const volatile Empty &, { ^^Empty && }));
+ static_assert (!is_constructible_type (^^const volatile Empty &, { ^^const Empty && }));
+ static_assert (is_constructible_type (^^Empty &&, { ^^Empty }));
+ static_assert (is_constructible_type (^^Empty &&, { ^^Empty && }));
+ static_assert (!is_constructible_type (^^Empty &&, { ^^const Empty && }));
+ static_assert (!is_constructible_type (^^Empty &&, { ^^Empty & }));
+ static_assert (!is_constructible_type (^^Empty &&, { ^^const Empty & }));
+ static_assert (!is_constructible_type (^^Empty &&, { ^^double & }));
+ static_assert (!is_constructible_type (^^Empty &&, { ^^const double & }));
+ static_assert (is_constructible_type (^^const Empty &&, { ^^Empty }));
+ static_assert (is_constructible_type (^^const Empty &&, { ^^Empty && }));
+ static_assert (is_constructible_type (^^const Empty &&, { ^^const Empty }));
+ static_assert (is_constructible_type (^^const Empty &&, { ^^const Empty && }));
+ static_assert (!is_constructible_type (^^Empty &&, { ^^const Empty & }));
+ static_assert (!is_constructible_type (^^const Empty &&, { ^^Empty & }));
+ static_assert (!is_constructible_type (^^const Empty &&, { ^^const Empty & }));
+ static_assert (is_constructible_type (^^volatile Empty &&, { ^^Empty }));
+ static_assert (is_constructible_type (^^volatile Empty &&, { ^^Empty && }));
+ static_assert (!is_constructible_type (^^volatile Empty &&, { ^^const Empty && }));
+ static_assert (!is_constructible_type (^^volatile Empty &&, { ^^Empty & }));
+ static_assert (!is_constructible_type (^^volatile Empty &&, { ^^const Empty & }));
+ static_assert (!is_constructible_type (^^volatile Empty &&, { ^^double & }));
+ static_assert (!is_constructible_type (^^volatile Empty &&, { ^^const double & }));
+ static_assert (is_constructible_type (^^const volatile Empty &&, { ^^Empty }));
+ static_assert (is_constructible_type (^^const volatile Empty &&, { ^^Empty && }));
+ static_assert (is_constructible_type (^^const volatile Empty &&, { ^^const Empty }));
+ static_assert (is_constructible_type (^^const volatile Empty &&, { ^^const Empty && }));
+ static_assert (!is_constructible_type (^^volatile Empty &&, { ^^const Empty & }));
+ static_assert (!is_constructible_type (^^const volatile Empty &&, { ^^Empty & }));
+ static_assert (!is_constructible_type (^^const volatile Empty &&, { ^^const Empty & }));
+ static_assert (is_constructible_type (^^Ellipsis, { ^^int }));
+ static_assert (is_constructible_type (^^Ellipsis, { ^^Empty }));
+ static_assert (is_constructible_type (^^Ellipsis, { ^^std::nullptr_t }));
+ static_assert (is_constructible_type (^^Ellipsis, { ^^int [] }));
+ static_assert (is_constructible_type (^^Ellipsis, { ^^int [1] }));
+ static_assert (!is_constructible_type (^^Ellipsis, { ^^void }));
+ static_assert (is_constructible_type (^^int (&) [1], { ^^int (&) [1] }));
+ static_assert (is_constructible_type (^^const int (&) [1], { ^^int (&) [1] }));
+ static_assert (is_constructible_type (^^volatile int (&) [1], { ^^int (&) [1] }));
+ static_assert (is_constructible_type (^^const volatile int (&) [1], { ^^int (&) [1] }));
+ static_assert (!is_constructible_type (^^int (&) [1], { ^^const int (&) [1] }));
+ static_assert (!is_constructible_type (^^const int (&) [1], { ^^volatile int (&) [1] }));
+ static_assert (is_constructible_type (^^int (&) [], { ^^int (&) [] }));
+ static_assert (!is_constructible_type (^^int (&) [1], { ^^int (&) [2] }));
+ static_assert (!is_constructible_type (^^int (&) [1], { ^^int & }));
+ static_assert (!is_constructible_type (^^int &, { ^^int (&) [1] }));
+ static_assert (!is_constructible_type (^^U, { ^^Empty }));
+ static_assert (!is_constructible_type (^^void (), { ^^void () }));
+ static_assert (!is_constructible_type (^^void (), { ^^int }));
+ static_assert (!is_constructible_type (^^void (), { ^^Abstract }));
+ static_assert (!is_constructible_type (^^void (), { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^void (), { ^^Empty }));
+ static_assert (!is_constructible_type (^^void (), { ^^U }));
+ static_assert (!is_constructible_type (^^void (), { ^^E }));
+ static_assert (!is_constructible_type (^^void (), { ^^SE }));
+ static_assert (!is_constructible_type (^^void (), { ^^OpE }));
+ static_assert (!is_constructible_type (^^void (), { ^^OpSE }));
+ static_assert (!is_constructible_type (^^void (), { ^^int [] }));
+ static_assert (!is_constructible_type (^^void (), { ^^int [1] }));
+ static_assert (!is_constructible_type (^^void () const, { ^^void () volatile }));
+ static_assert (!is_constructible_type (^^void () const, { ^^int }));
+ static_assert (!is_constructible_type (^^void () const, { ^^Abstract }));
+ static_assert (!is_constructible_type (^^void () const, { ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^void () const, { ^^Empty }));
+ static_assert (!is_constructible_type (^^void () const, { ^^U }));
+ static_assert (!is_constructible_type (^^void () const, { ^^E }));
+ static_assert (!is_constructible_type (^^void () const, { ^^SE }));
+ static_assert (!is_constructible_type (^^void () const, { ^^OpE }));
+ static_assert (!is_constructible_type (^^void () const, { ^^OpSE }));
+ static_assert (!is_constructible_type (^^void () const, { ^^int [] }));
+ static_assert (!is_constructible_type (^^void () const, { ^^int [1] }));
+ static_assert (!is_constructible_type (^^void (int), { ^^void () }));
+ static_assert (!is_constructible_type (^^int, { ^^void () }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^void () }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^void () }));
+ static_assert (!is_constructible_type (^^Empty, { ^^void () }));
+ static_assert (!is_constructible_type (^^U, { ^^void () }));
+ static_assert (!is_constructible_type (^^E, { ^^void () }));
+ static_assert (!is_constructible_type (^^SE, { ^^void () }));
+ static_assert (!is_constructible_type (^^OpE, { ^^void () }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^void () }));
+ static_assert (!is_constructible_type (^^int [], { ^^void () }));
+ static_assert (!is_constructible_type (^^int [1], { ^^void () }));
+ static_assert (!is_constructible_type (^^void (int) const, { ^^void () const }));
+ static_assert (!is_constructible_type (^^int, { ^^void () const }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^void () const }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^void () const }));
+ static_assert (!is_constructible_type (^^Empty, { ^^void () const }));
+ static_assert (!is_constructible_type (^^U, { ^^void () const }));
+ static_assert (!is_constructible_type (^^E, { ^^void () const }));
+ static_assert (!is_constructible_type (^^SE, { ^^void () const }));
+ static_assert (!is_constructible_type (^^OpE, { ^^void () const }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^void () const }));
+ static_assert (!is_constructible_type (^^int [], { ^^void () const }));
+ static_assert (!is_constructible_type (^^int [1], { ^^void () const }));
+ static_assert (!is_constructible_type (^^void, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^void, { ^^Empty, ^^B }));
+ static_assert (!is_constructible_type (^^void, { ^^Empty, ^^Empty }));
+ static_assert (!is_constructible_type (^^void, { ^^U, ^^Empty }));
+ static_assert (!is_constructible_type (^^void, { ^^U, ^^U }));
+ static_assert (!is_constructible_type (^^void, { ^^std::nullptr_t, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^void, { ^^int [1], ^^int [1] }));
+ static_assert (!is_constructible_type (^^void, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^void, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^void, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^void, { ^^void (), ^^void () }));
+ static_assert (!is_constructible_type (^^void, { ^^void () const, ^^void () volatile }));
+ static_assert (!is_constructible_type (^^int, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const int, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^int, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const int, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^int, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const int, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^bool, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const bool, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const std::nullptr_t, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const std::nullptr_t, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^std::nullptr_t, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const std::nullptr_t, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^E, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const E, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^E, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const E, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^E, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const E, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^SE, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const SE, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^SE, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const SE, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^SE, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const SE, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^OpE, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const OpE, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^OpE, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const OpE, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^OpE, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const OpE, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const OpSE, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const OpSE, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const OpSE, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^Empty, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const Empty, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^Empty, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const Empty, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^Empty, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const Empty, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^U, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const U, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^U, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const U, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^U, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const U, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^B, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const B, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^B, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const B, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^B, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const B, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^Any, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const Any, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^Any, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const Any, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^Any, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const Any, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^nAny, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const nAny, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^nAny, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const nAny, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^FromArgs <>, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const FromArgs <>, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^FromArgs <>, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const FromArgs <>, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^FromArgs <>, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const FromArgs <>, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const Abstract, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const Abstract, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^Abstract, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const Abstract, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^AbstractDelDtor, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const AbstractDelDtor, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^AbstractDelDtor, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const AbstractDelDtor, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^AbstractDelDtor, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const AbstractDelDtor, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^int [1], { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const int [1], { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^int [1], { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const int [1], { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^int [1], { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^const int [1], { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^int &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^int &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^int &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^int &, { ^^int &, ^^int & }));
+ static_assert (!is_constructible_type (^^int &, { ^^void, ^^int & }));
+ static_assert (!is_constructible_type (^^int &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^std::nullptr_t &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^std::nullptr_t &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^std::nullptr_t &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^E &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^E &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^E &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^SE &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^SE &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^SE &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^OpE &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^OpE &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^OpE &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^OpSE &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^OpSE &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^OpSE &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^Empty &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^Empty &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^Empty &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^U &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^U &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^U &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^B &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^B &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^B &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^Any &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^Any &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^Any &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^nAny &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^nAny &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^FromArgs <> &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^FromArgs <> &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^FromArgs <> &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^Abstract &, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^Abstract &, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^Abstract &, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^int (&) [1], { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^int (&) [1], { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^int (&) [1], { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^void (), { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^void (), { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^void (), { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^void (), { ^^void (), ^^int }));
+ static_assert (!is_constructible_type (^^void (), { ^^void (), ^^void () }));
+ static_assert (!is_constructible_type (^^void () const, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^void () const, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^void () const, { ^^void, ^^void }));
+ static_assert (!is_constructible_type (^^void () const, { ^^void () volatile, ^^int }));
+ static_assert (!is_constructible_type (^^void () const, { ^^void () volatile const, ^^void () const }));
+ static_assert (!is_constructible_type (^^FromArgs <int>, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const FromArgs <int>, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^FromArgs <int>, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const FromArgs <int>, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^FromArgs <int, int>, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^const FromArgs <int, int>, { ^^void, ^^int }));
+ static_assert (!is_constructible_type (^^DelDtor, { ^^int, ^^B, ^^U }));
+ static_assert (!is_constructible_type (^^const DelDtor, { ^^int, ^^B, ^^U }));
+ static_assert (!is_constructible_type (^^DelDtor, { ^^int }));
+ static_assert (!is_constructible_type (^^const DelDtor, { ^^int }));
+ static_assert (!is_constructible_type (^^DelDtor, {}));
+ static_assert (!is_constructible_type (^^const DelDtor, {}));
+ static_assert (!is_constructible_type (^^DelDtor, { ^^void *, ^^void (&) () }));
+ static_assert (!is_constructible_type (^^const DelDtor, { ^^void *, ^^void (&) () }));
+ static_assert (!is_constructible_type (^^AbstractDelDtor, {}));
+ static_assert (!is_constructible_type (^^const AbstractDelDtor, {}));
+ static_assert (!is_constructible_type (^^DelEllipsis, {}));
+ static_assert (!is_constructible_type (^^const DelEllipsis, {}));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^double }));
+ static_assert (!is_constructible_type (^^const DelEllipsis, { ^^double }));
+ static_assert (!is_constructible_type (^^DelEllipsis, { ^^double, ^^int & }));
+ static_assert (!is_constructible_type (^^const DelEllipsis, { ^^double, ^^int & }));
+ static_assert (!is_constructible_type (^^DelnAny, {}));
+ static_assert (!is_constructible_type (^^const DelnAny, {}));
+ static_assert (!is_constructible_type (^^DelnAny, { ^^int }));
+ static_assert (!is_constructible_type (^^const DelnAny, { ^^int }));
+ static_assert (!is_constructible_type (^^DelnAny, { ^^int, ^^void * }));
+ static_assert (!is_constructible_type (^^const DelnAny, { ^^int, ^^void * }));
+ static_assert (!is_constructible_type (^^DelnAny, { ^^Empty, ^^B, ^^D }));
+ static_assert (!is_constructible_type (^^const DelnAny, { ^^Empty, ^^B, ^^D }));
+ static_assert (!is_constructible_type (^^NontrivialUnion, {}));
+ static_assert (!is_constructible_type (^^NontrivialUnion, { ^^const NontrivialUnion & }));
+ static_assert (!is_constructible_type (^^UnusualCopy, {}));
+ static_assert (!is_constructible_type (^^UnusualCopy, { ^^UnusualCopy }));
+ static_assert (!is_constructible_type (^^UnusualCopy, { ^^UnusualCopy && }));
+ static_assert (!is_constructible_type (^^UnusualCopy, { ^^const UnusualCopy & }));
+ static_assert (is_constructible_type (^^UnusualCopy, { ^^UnusualCopy & }));
+ static_assert (is_constructible_type (^^FromArgs <int, char>, { ^^int, ^^char }));
+ static_assert (is_constructible_type (^^const FromArgs <int, char>, { ^^int, ^^char }));
+ static_assert (is_constructible_type (^^FromArgs <int, char>, { ^^int, ^^int }));
+ static_assert (is_constructible_type (^^const FromArgs <int, char>, { ^^int, ^^int }));
+ static_assert (is_constructible_type (^^nAny, { ^^int, ^^int }));
+ static_assert (is_constructible_type (^^const nAny, { ^^int, ^^int }));
+ static_assert (is_constructible_type (^^FromArgs <int, char>, { ^^ImplicitTo <int>, ^^ImplicitTo <char> }));
+ static_assert (is_constructible_type (^^const FromArgs <int, char>, { ^^ImplicitTo <int>, ^^ImplicitTo <char> }));
+ static_assert (is_constructible_type (^^Ellipsis, { ^^int, ^^char }));
+ static_assert (is_constructible_type (^^const Ellipsis, { ^^int, ^^char }));
+ static_assert (is_constructible_type (^^Ellipsis, { ^^B, ^^U, ^^int & }));
+ static_assert (is_constructible_type (^^const Ellipsis, { ^^B, ^^U, ^^int & }));
+ static_assert (is_constructible_type (^^nAny, { ^^B, ^^U, ^^int & }));
+ static_assert (is_constructible_type (^^const nAny, { ^^B, ^^U, ^^int & }));
+ static_assert (is_constructible_type (^^FromArgs <std::initializer_list <int>, std::initializer_list <B>>, { ^^std::initializer_list <int>, ^^std::initializer_list <B> }));
+ static_assert (is_constructible_type (^^const FromArgs <std::initializer_list <int>, std::initializer_list <B>>, { ^^std::initializer_list <int>, ^^std::initializer_list <B> }));
+ static_assert (is_constructible_type (^^FromArgs <std::initializer_list <int>, std::initializer_list <B>>, { ^^std::initializer_list <int> &, ^^std::initializer_list <B> & }));
+ static_assert (!is_constructible_type (^^FromArgs <std::initializer_list <int> &, std::initializer_list <B> &>, { ^^std::initializer_list <int>, ^^std::initializer_list <B> }));
+ static_assert (!is_constructible_type (^^FromArgs <std::initializer_list <int>>, { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const FromArgs <std::initializer_list <int>>, { ^^int, ^^int }));
+ static_assert (is_constructible_type (^^B [2], { ^^B, ^^B }));
+ static_assert (is_constructible_type (^^const B [2], { ^^B, ^^B }));
+ static_assert (is_constructible_type (^^U [2], { ^^U, ^^U }));
+ static_assert (is_constructible_type (^^const U [2], { ^^U, ^^U }));
+ static_assert (!is_constructible_type (^^E, { ^^E, ^^E }));
+ static_assert (!is_constructible_type (^^const E, { ^^E, ^^E }));
+ static_assert (!is_constructible_type (^^SE, { ^^SE, ^^SE }));
+ static_assert (!is_constructible_type (^^const SE, { ^^SE, ^^SE }));
+ static_assert (!is_constructible_type (^^E, { ^^B, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^const E, { ^^B, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^SE, { ^^B, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^const SE, { ^^B, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^E, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^const E, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^SE, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^const SE, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^OpE, { ^^OpE, ^^OpE }));
+ static_assert (!is_constructible_type (^^const OpE, { ^^OpE, ^^OpE }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^OpSE, ^^OpSE }));
+ static_assert (!is_constructible_type (^^const OpSE, { ^^OpSE, ^^OpSE }));
+ static_assert (!is_constructible_type (^^OpE, { ^^B, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^const OpE, { ^^B, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^B, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^const OpSE, { ^^B, ^^std::nullptr_t }));
+ static_assert (!is_constructible_type (^^OpE, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^const OpE, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^OpSE, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^const OpSE, { ^^int [], ^^int [] }));
+ static_assert (!is_constructible_type (^^int [], { ^^int, ^^int }));
+ static_assert (!is_constructible_type (^^const int [], { ^^int, ^^int }));
+ static_assert (is_constructible_type (^^int &, { ^^ImplicitTo <int &> }));
+ static_assert (is_constructible_type (^^const int &, { ^^ImplicitTo <int &&> }));
+ static_assert (is_constructible_type (^^int &&, { ^^ImplicitTo <int &&> }));
+ static_assert (is_constructible_type (^^const int &, { ^^ImplicitTo <int> }));
+ static_assert (!is_constructible_type (^^const int &, { ^^ExplicitTo <int> }));
+ static_assert (!is_constructible_type (^^int &&, { ^^ExplicitTo <int> }));
+ static_assert (is_constructible_type (^^int &, { ^^ExplicitTo <int &> }));
+ static_assert (is_constructible_type (^^int &&, { ^^ExplicitTo <int &&> }));
+ static_assert (!is_constructible_type (^^const int &, { ^^ExplicitTo <int &&> }));
+ static_assert (!is_constructible_type (^^const int &, { ^^ExplicitTo <double &&> }));
+ static_assert (!is_constructible_type (^^int &&, { ^^ExplicitTo <double &&> }));
+ static_assert (is_constructible_type (^^void (&&) (), { ^^void (&) () }));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_constructible_type2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_constructible_type2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_constructible_type2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_constructible_type2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,137 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_constructible_type.
+ 
+ #include <array>
+ #include <list>
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template <class... Args>
+ struct FromArgs { FromArgs (Args...); };
+ 
+ static_assert (!is_constructible_type (^^FromArgs <int &, long &, const double &>, {}));
+ static_assert (is_constructible_type (^^FromArgs <int &, long &, const double &>, { ^^int &, ^^long &, ^^const double & }));
+ constexpr info arr1[6] = { ^^double, ^^int &, ^^unsigned long long &, ^^int *, ^^short &, ^^char & };
+ static_assert (is_constructible_type (^^FromArgs <double, int &, unsigned long long &, int *, short &, char &>, arr1));
+ constexpr std::span <const info> sp1 (arr1);
+ static_assert (is_constructible_type (^^FromArgs <double, int &, unsigned long long &, int *, short &, char &>, sp1));
+ static_assert (is_constructible_type (^^FromArgs <int &, unsigned long long &, int *>, sp1.subspan (1, 3)));
+ static_assert (is_constructible_type (^^FromArgs <double, int &, unsigned long long &, int *, short &>, sp1.first (5)));
+ static_assert (is_constructible_type (^^FromArgs <int *, unsigned long long &, int &>, sp1.subspan (1, 3) | std::views::reverse));
+ static_assert (is_constructible_type (^^FromArgs <short &, int *, unsigned long long &, int &, double>, sp1.first (5) | std::views::reverse));
+ static_assert (!is_constructible_type (^^FromArgs <double, int &, unsigned long long &, int *, short &>, sp1.first (5) | std::views::reverse));
+ 
+ consteval bool
+ foo ()
+ {
+   auto a = std::vector <info> { ^^int &, ^^long &, ^^long long & };
+   if (!is_constructible_type (^^FromArgs <int &, long &, long long &>, a))
+     return false;
+   auto b = std::vector <info> { ^^short &, ^^double &, ^^float &, ^^char & };
+   if (!is_constructible_type (^^FromArgs <short &, double &, float &, char &>, b))
+     return false;
+   auto c = std::array { ^^long &, ^^short &, ^^char &, ^^int };
+   if (!is_constructible_type (^^FromArgs <long &, short &, char &, int>, c))
+     return false;
+   if (!is_constructible_type (^^FromArgs <long long &, long &, int &>, a | std::views::reverse))
+     return false;
+   if (!is_constructible_type (^^FromArgs <char &, float &, double &, short &>, b | std::views::reverse))
+     return false;
+   if (!is_constructible_type (^^FromArgs <int, char &, short &, long &>, c | std::views::reverse))
+     return false;
+   return true;
+ }
+ static_assert (foo ());
+ 
+ struct G
+ {
+   consteval const info *begin () const { return &arr1[0]; }
+   consteval const info *end () const { return &arr1[4]; }
+ };
+ static_assert (is_constructible_type (^^FromArgs <double, int &, unsigned long long &, int *>, G {}));
+ 
+ struct H
+ {
+   consteval const info *begin () const { return &arr1[1]; }
+   consteval const info *end () const { return &arr1[4]; }
+ };
+ static_assert (is_constructible_type (^^FromArgs <int &, unsigned long long &, int *>, H {}));
+ 
+ struct I
+ {
+   using difference_type = std::ptrdiff_t;
+   using value_type = info;
+   consteval info operator * () const {
+     if (p == 0) return arr1[2];
+     else if (p == 1) return arr1[0];
+     else if (p == 2) return arr1[1];
+     else return arr1[3];
+   }
+   constexpr I &operator ++ () { ++p; return *this; }
+   constexpr void operator ++ (int) { ++*this; }
+   constexpr bool operator == (const I &x) const { return p == x.p; }
+   int p;
+ };
+ 
+ struct J
+ {
+   constexpr I begin () const { return I { 0 }; }
+   constexpr I end () const { return I { 4 }; }
+ };
+ static_assert (is_constructible_type (^^FromArgs <unsigned long long &, double, int &, int *>, J {}));
+ 
+ struct K
+ {
+   constexpr K () : q (new int) {}
+   constexpr K (const K &) : q (new int) {}
+   constexpr K &operator = (const K &) { return *this; }
+   constexpr ~K () { delete q; }
+   int *q;
+ };
+ 
+ template <typename T, T E>
+ struct L
+ {
+   using difference_type = std::ptrdiff_t;
+   using value_type = T;
+   constexpr T &operator * () const { return *p; }
+   constexpr L (T *x) : p (x), q (new int) {}
+   constexpr L (const L &x) : p (x.p), q (new int) {}
+   constexpr L &operator = (const L &x) { p = x.p; return *this; }
+   constexpr ~L () { delete q; }
+   constexpr L &operator ++ () { ++p; return *this; }
+   constexpr void operator ++ (int) { ++*this; }
+   constexpr bool operator == (const L &x) const { return p == x.p; }
+   constexpr bool operator == (const K &) const { return *p == E; }
+   T *p;
+   int *q;
+ };
+ 
+ template <typename T, T E>
+ struct M
+ {
+   constexpr M (T *x) : p (x), q (new int) {}
+   constexpr M (const M &x) : p (x.p), q (new int) {}
+   constexpr M &operator = (const M &x) { p = x.p; return *this; }
+   constexpr ~M () { delete q; }
+   constexpr L <T, E> begin () const { return L <T, E> (p); }
+   constexpr K end () const { return K (); }
+   T *p;
+   int *q;
+ };
+ 
+ consteval bool
+ bar ()
+ {
+   info a[] = { ^^int &, ^^short &, ^^long &, ^^unsigned &, ^^char &, ^^void, ^^int };
+   auto b = M <info, ^^void> (&a[0]);
+   if (!is_constructible_type (^^FromArgs <int &, short &, long &, unsigned &, char &>, b))
+     return false;
+   return true;
+ }
+ static_assert (bar ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_constructor_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_constructor_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_constructor_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_constructor_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_constructor_template.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S &operator+(const S&);
+ 
+   template <typename T>
+   S &operator-(const S&);
+ 
+   operator int();
+ 
+   void fn();
+ };
+ 
+ struct T {
+   template <typename U>
+   T(int, const U &);
+ };
+ 
+ bool operator&&(const S&, const S&);
+ 
+ template <typename T>
+ bool operator||(const S&, const T&);
+ 
+ int operator""_a(const char *);
+ 
+ template<char...>
+ int operator""_b();
+ 
+ constexpr auto constructor_template
+   = (members_of (^^T, access_context::current ()) | std::views::filter (is_template)).front ();
+ 
+ static_assert (!is_constructor_template (null_reflection));
+ static_assert (!is_constructor_template (^^int));
+ static_assert (!is_constructor_template (^^::));
+ static_assert (!is_constructor_template (^^foo));
+ static_assert (!is_constructor_template (^^S::operator+));
+ static_assert (!is_constructor_template (^^operator&&));
+ static_assert (!is_constructor_template (^^operator||));
+ static_assert (!is_constructor_template (^^operator||<int>));
+ static_assert (!is_constructor_template (^^S::operator-));
+ static_assert (!is_constructor_template (^^S::operator-<int>));
+ static_assert (!is_constructor_template (^^S::operator int));
+ static_assert (is_constructor_template (constructor_template));
+ static_assert (!is_constructor_template (^^S::fn));
+ static_assert (!is_constructor_template (^^operator""_a));
+ static_assert (!is_constructor_template (^^operator""_b));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_constuctor1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_constuctor1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_constuctor1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_constuctor1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,101 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_constructor.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S ()
+   {
+     int a;
+     static_assert (is_constructor (parent_of (^^a)));
+   }
+   S (int)
+   {
+     int a;
+     static_assert (is_constructor (parent_of (^^a)));
+   }
+   S (const S &)
+   {
+     int a;
+     static_assert (is_constructor (parent_of (^^a)));
+   }
+   S (S &&)
+   {
+     int a;
+     static_assert (is_constructor (parent_of (^^a)));
+   }
+   S &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_constructor (parent_of (^^a)));
+     return *this;
+   }
+   S &operator += (const S &)
+   {
+     int a;
+     static_assert (!is_constructor (parent_of (^^a)));
+     return *this;
+   }
+   void bar ()
+   {
+     int a;
+     static_assert (!is_constructor (parent_of (^^a)));
+   }
+   ~S ()
+   {
+     int a;
+     static_assert (!is_constructor (parent_of (^^a)));
+   }
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_constructor (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &)
+   {
+     int a;
+     static_assert (!is_constructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct U {
+   template <typename T>
+   U (T &)
+   {
+     T a;
+     static_assert (is_constructor (parent_of (^^a)));
+   }
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (!is_constructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct V {
+   V (int a = 42, long b = 18)
+   {
+     static_assert (is_constructor (parent_of (^^a)));
+   }
+ };
+ 
+ static_assert (!is_constructor (null_reflection));
+ static_assert (!is_constructor (^^int));
+ static_assert (!is_constructor (^^::));
+ static_assert (!is_constructor (^^foo));
+ static_assert (!is_constructor (^^S::bar));
+ static_assert (!is_constructor (^^S::operator =));
+ static_assert (!is_constructor (^^S::operator +=));
+ static_assert (!is_constructor (^^T::operator *=));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_conversion_function1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_conversion_function1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_conversion_function1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_conversion_function1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_conversion_function.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S &operator+(const S&);
+ 
+   template <typename T>
+   S &operator-(const S&);
+ 
+   operator int();
+ 
+   void fn();
+ };
+ 
+ struct T {
+   template <typename T>
+   operator T();
+ };
+ 
+ bool operator&&(const S&, const S&);
+ 
+ template <typename T>
+ bool operator||(const S&, const T&);
+ 
+ int operator""_a(const char *);
+ 
+ template<char...>
+ int operator""_b();
+ 
+ constexpr auto conversion_template
+   = (members_of (^^T, access_context::current ()) | std::views::filter (is_template)).front ();
+ 
+ static_assert (!is_conversion_function (null_reflection));
+ static_assert (!is_conversion_function (^^int));
+ static_assert (!is_conversion_function (^^::));
+ static_assert (!is_conversion_function (^^foo));
+ static_assert (!is_conversion_function (^^S::operator+));
+ static_assert (!is_conversion_function (^^operator&&));
+ static_assert (!is_conversion_function (^^operator||));
+ static_assert (!is_conversion_function (^^operator||<int>));
+ static_assert (!is_conversion_function (^^S::operator-));
+ static_assert (!is_conversion_function (^^S::operator-<int>));
+ static_assert (is_conversion_function (^^S::operator int));
+ static_assert (!is_conversion_function (conversion_template));
+ static_assert (!is_conversion_function (^^S::fn));
+ static_assert (!is_conversion_function (^^operator""_a));
+ static_assert (!is_conversion_function (^^operator""_b));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_conversion_function_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_conversion_function_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_conversion_function_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_conversion_function_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,54 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_conversion_function_template.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S &operator+(const S&);
+ 
+   template <typename T>
+   S &operator-(const S&);
+ 
+   operator int();
+ 
+   void fn();
+ };
+ 
+ struct T {
+   template <typename T>
+   operator T ();
+ };
+ 
+ bool operator&&(const S&, const S&);
+ 
+ template <typename T>
+ bool operator||(const S&, const T&);
+ 
+ int operator""_a(const char *);
+ 
+ template<char...>
+ int operator""_b();
+ 
+ constexpr auto conversion_template
+   = (members_of (^^T, access_context::current ()) | std::views::filter (is_template)).front ();
+ 
+ static_assert (!is_conversion_function_template (null_reflection));
+ static_assert (!is_conversion_function_template (^^int));
+ static_assert (!is_conversion_function_template (^^::));
+ static_assert (!is_conversion_function_template (^^foo));
+ static_assert (!is_conversion_function_template (^^S::operator+));
+ static_assert (!is_conversion_function_template (^^operator&&));
+ static_assert (!is_conversion_function_template (^^operator||));
+ static_assert (!is_conversion_function_template (^^S::operator-));
+ static_assert (!is_conversion_function_template (^^S::operator int));
+ static_assert (is_conversion_function_template (conversion_template));
+ static_assert (!is_conversion_function_template (^^S::fn));
+ static_assert (!is_conversion_function_template (^^operator""_a));
+ static_assert (!is_conversion_function_template (^^operator""_b));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_copy_assignment1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_copy_assignment1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_copy_assignment1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_copy_assignment1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,101 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_copy_assignment.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S ()
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+   }
+   S (int)
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+   }
+   S (const S &)
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+   }
+   S (S &&)
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+   }
+   S &operator = (const S &)
+   {
+     int a;
+     static_assert (is_copy_assignment (parent_of (^^a)));
+     return *this;
+   }
+   S &operator += (const S &)
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+     return *this;
+   }
+   void bar ()
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+   }
+   ~S ()
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+   }
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &)
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct U {
+   template <typename T>
+   U (T &)
+   {
+     T a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+   }
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct V {
+   V (int a = 42, long b = 18)
+   {
+     static_assert (!is_copy_assignment (parent_of (^^a)));
+   }
+ };
+ 
+ static_assert (!is_copy_assignment (null_reflection));
+ static_assert (!is_copy_assignment (^^int));
+ static_assert (!is_copy_assignment (^^::));
+ static_assert (!is_copy_assignment (^^foo));
+ static_assert (!is_copy_assignment (^^S::bar));
+ static_assert (is_copy_assignment (^^S::operator =));
+ static_assert (!is_copy_assignment (^^S::operator +=));
+ static_assert (!is_copy_assignment (^^T::operator *=));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_copy_constructor1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_copy_constructor1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_copy_constructor1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_copy_constructor1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,101 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_copy_constructor.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S ()
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+   }
+   S (int)
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+   }
+   S (const S &)
+   {
+     int a;
+     static_assert (is_copy_constructor (parent_of (^^a)));
+   }
+   S (S &&)
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+   }
+   S &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+     return *this;
+   }
+   S &operator += (const S &)
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+     return *this;
+   }
+   void bar ()
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+   }
+   ~S ()
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+   }
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &)
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct U {
+   template <typename T>
+   U (T &)
+   {
+     T a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+   }
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct V {
+   V (int a = 42, long b = 18)
+   {
+     static_assert (!is_copy_constructor (parent_of (^^a)));
+   }
+ };
+ 
+ static_assert (!is_copy_constructor (null_reflection));
+ static_assert (!is_copy_constructor (^^int));
+ static_assert (!is_copy_constructor (^^::));
+ static_assert (!is_copy_constructor (^^foo));
+ static_assert (!is_copy_constructor (^^S::bar));
+ static_assert (!is_copy_constructor (^^S::operator =));
+ static_assert (!is_copy_constructor (^^S::operator +=));
+ static_assert (!is_copy_constructor (^^T::operator *=));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_data_member_spec1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_data_member_spec1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_data_member_spec1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_data_member_spec1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_data_member_spec.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_data_member_spec (null_reflection));
+ static_assert (!is_data_member_spec (^^::));
+ static_assert (!is_data_member_spec (^^ns));
+ static_assert (!is_data_member_spec (^^ns_alias));
+ static_assert (!is_data_member_spec (reflect_constant (3)));
+ static_assert (!is_data_member_spec (^^cls));
+ static_assert (!is_data_member_spec (^^cls::dm));
+ static_assert (!is_data_member_spec (^^cls::ref_dm));
+ static_assert (!is_data_member_spec (^^cls::static_dm));
+ static_assert (!is_data_member_spec (^^cls::mem_fun));
+ static_assert (!is_data_member_spec (^^cls::static_mem_fun));
+ static_assert (!is_data_member_spec (^^cls::type));
+ static_assert (!is_data_member_spec (^^cls_var));
+ static_assert (!is_data_member_spec (^^onion));
+ static_assert (!is_data_member_spec (^^anon));
+ static_assert (!is_data_member_spec (^^fun));
+ static_assert (!is_data_member_spec (^^alias));
+ static_assert (!is_data_member_spec (^^var));
+ static_assert (!is_data_member_spec (^^ref));
+ static_assert (!is_data_member_spec (^^rref));
+ static_assert (!is_data_member_spec (^^ptr));
+ static_assert (!is_data_member_spec (^^cls_tmpl));
+ static_assert (!is_data_member_spec (^^cls_tmpl<int>));
+ static_assert (!is_data_member_spec (^^incomplete_cls<int>));
+ static_assert (!is_data_member_spec (^^fun_tmpl));
+ static_assert (!is_data_member_spec (^^fun_tmpl<int>));
+ static_assert (!is_data_member_spec (^^conc));
+ static_assert (!is_data_member_spec (substitute (^^conc, { ^^int })));
+ static_assert (!is_data_member_spec (^^var_tmpl));
+ static_assert (!is_data_member_spec (^^var_tmpl<int>));
+ static_assert (!is_data_member_spec (^^cls_tmpl_alias));
+ static_assert (!is_data_member_spec (^^cls_tmpl_alias<int>));
+ static_assert (!is_data_member_spec (^^Enum));
+ static_assert (!is_data_member_spec (^^Enum::A));
+ static_assert (!is_data_member_spec (^^Enum_class));
+ static_assert (!is_data_member_spec (^^Enum_class::A));
+ static_assert (!is_data_member_spec (^^decomp));
+ static_assert (!is_data_member_spec (^^decomp_ref));
+ static_assert (!is_data_member_spec (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (is_data_member_spec (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_data_member_spec (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_data_member_spec (^^T));
+   static_assert (!is_data_member_spec (R));
+   static_assert (!is_data_member_spec (R2));
+   static_assert (!is_data_member_spec (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!is_data_member_spec (^^p));
+   static_assert (!is_data_member_spec (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_default_constructor1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_default_constructor1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_default_constructor1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_default_constructor1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,101 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_default_constructor.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S ()
+   {
+     int a;
+     static_assert (is_default_constructor (parent_of (^^a)));
+   }
+   S (int)
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+   }
+   S (const S &)
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+   }
+   S (S &&)
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+   }
+   S &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+     return *this;
+   }
+   S &operator += (const S &)
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+     return *this;
+   }
+   void bar ()
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+   }
+   ~S ()
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+   }
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &)
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct U {
+   template <typename T>
+   U (T &)
+   {
+     T a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+   }
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (!is_default_constructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct V {
+   V (int a = 42, long b = 18)
+   {
+     static_assert (is_default_constructor (parent_of (^^a)));
+   }
+ };
+ 
+ static_assert (!is_default_constructor (null_reflection));
+ static_assert (!is_default_constructor (^^int));
+ static_assert (!is_default_constructor (^^::));
+ static_assert (!is_default_constructor (^^foo));
+ static_assert (!is_default_constructor (^^S::bar));
+ static_assert (!is_default_constructor (^^S::operator =));
+ static_assert (!is_default_constructor (^^S::operator +=));
+ static_assert (!is_default_constructor (^^T::operator *=));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_defaulted1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_defaulted1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_defaulted1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_defaulted1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,169 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_defaulted.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_defaulted (null_reflection));
+ static_assert (!is_defaulted (^^::));
+ static_assert (!is_defaulted (^^ns));
+ static_assert (!is_defaulted (^^ns_alias));
+ static_assert (!is_defaulted (reflect_constant (3)));
+ static_assert (!is_defaulted (^^cls));
+ static_assert (!is_defaulted (^^cls::dm));
+ static_assert (!is_defaulted (^^cls::ref_dm));
+ static_assert (!is_defaulted (^^cls::static_dm));
+ static_assert (!is_defaulted (^^cls::mem_fun));
+ static_assert (!is_defaulted (^^cls::static_mem_fun));
+ static_assert (!is_defaulted (^^cls::type));
+ static_assert (!is_defaulted (^^cls::E));
+ static_assert (!is_defaulted (^^cls::B));
+ static_assert (!is_defaulted (^^cls::C));
+ static_assert (!is_defaulted (^^cls::D));
+ static_assert (!is_defaulted (^^cls::F));
+ static_assert (!is_defaulted (^^cls::F::G));
+ static_assert (!is_defaulted (^^cls::F::H));
+ static_assert (!is_defaulted (^^cls::S));
+ static_assert (!is_defaulted (^^cls::U));
+ static_assert (!is_defaulted (^^cls::foo));
+ static_assert (!is_defaulted (^^cls::foo <0>));
+ static_assert (!is_defaulted (^^cls::bar));
+ static_assert (!is_defaulted (^^cls::bar <42>));
+ static_assert (!is_defaulted (^^cls_var));
+ static_assert (!is_defaulted (^^onion));
+ static_assert (!is_defaulted (^^anon));
+ static_assert (!is_defaulted (^^fun));
+ static_assert (!is_defaulted (^^alias));
+ static_assert (!is_defaulted (^^var));
+ static_assert (!is_defaulted (^^ref));
+ static_assert (!is_defaulted (^^rref));
+ static_assert (!is_defaulted (^^ptr));
+ static_assert (!is_defaulted (^^cls_tmpl));
+ static_assert (!is_defaulted (^^cls_tmpl<int>));
+ static_assert (!is_defaulted (^^incomplete_cls<int>));
+ static_assert (!is_defaulted (^^fun_tmpl));
+ static_assert (!is_defaulted (^^fun_tmpl<int>));
+ static_assert (!is_defaulted (^^conc));
+ static_assert (!is_defaulted (substitute (^^conc, { ^^int })));
+ static_assert (!is_defaulted (^^var_tmpl));
+ static_assert (!is_defaulted (^^var_tmpl<int>));
+ static_assert (!is_defaulted (^^cls_tmpl_alias));
+ static_assert (!is_defaulted (^^cls_tmpl_alias<int>));
+ static_assert (!is_defaulted (^^Enum));
+ static_assert (!is_defaulted (^^Enum::A));
+ static_assert (!is_defaulted (^^Enum_class));
+ static_assert (!is_defaulted (^^Enum_class::A));
+ static_assert (!is_defaulted (^^decomp));
+ static_assert (!is_defaulted (^^decomp_ref));
+ static_assert (!is_defaulted (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_defaulted (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_defaulted (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_defaulted (^^x));
+   static_assert (!is_defaulted (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_defaulted (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_defaulted (^^S));
+   static_assert (!is_defaulted (^^E));
+   static_assert (!is_defaulted (^^F));
+   static_assert (!is_defaulted (^^G));
+ }
+ 
+ void bar (int, long) = delete;
+ void baz (int) = delete ("foobar");
+ static_assert (!is_defaulted (^^bar));
+ static_assert (!is_defaulted (^^baz));
+ 
+ struct S
+ {
+   bool operator == (const S &) const = default;
+   auto operator <=> (const S &) const = default;
+   S &operator = (const S &) = default;
+   int s;
+   void foo ();
+   template <int N>
+   void bar ();
+ };
+ 
+ struct V
+ {
+   V (const V &);
+ };
+ 
+ static_assert (is_defaulted (^^S::operator <=>));
+ static_assert (is_defaulted (^^S::operator <=>));
+ static_assert (is_defaulted (^^S::operator =));
+ static_assert (!is_defaulted (^^S::foo));
+ static_assert (!is_defaulted (^^S::bar));
+ static_assert (!is_defaulted (^^S::bar <42>));
+ static_assert (is_defaulted (^^V::operator =));
+ 
+ struct W
+ {
+   ~W () = default;
+   int w;
+ };
+ static_assert (is_defaulted (^^W::~W));
+ 
+ struct X
+ {
+   int x;
+ };
+ static_assert (is_defaulted (^^X::~X));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_defaulted2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_defaulted2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_defaulted2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_defaulted2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,64 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_deleted.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template<typename F>
+ consteval info
+ select_mem(info clazz, F f)
+ {
+   for (info x : members_of(clazz, access_context::unchecked()))
+     if (f(x))
+       return x;
+ }
+ 
+ struct ExplicitDef
+ {
+   ExplicitDef() = default;
+   ExplicitDef(const ExplicitDef&) = default;
+   ExplicitDef(ExplicitDef&&) = default;
+ 
+   ExplicitDef& operator=(const ExplicitDef&) = default;
+   ExplicitDef& operator=(ExplicitDef&&) = default;
+   
+   ~ExplicitDef() = default;
+ };
+ 
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_default_constructor)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_copy_constructor)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_move_constructor)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_copy_assignment)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_move_assignment)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_destructor)));
+ 
+ struct ImplicitDef
+ {
+ };
+ 
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_default_constructor)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_copy_constructor)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_move_constructor)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_copy_assignment)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_move_assignment)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_destructor)));
+ 
+ struct ExplicitRelOps
+ {
+   bool operator==(const ExplicitRelOps&) const = default;
+   auto operator<=>(const ExplicitRelOps&) const = default;
+ };
+ static_assert (is_defaulted (^^ExplicitRelOps::operator==));
+ static_assert (is_defaulted (^^ExplicitRelOps::operator<=>));
+ 
+ struct ImplicitRelOps
+ {
+   // operator== is implicitly declared
+   auto operator<=>(const ImplicitRelOps&) const = default;
+ };
+ static_assert (is_defaulted (^^ImplicitRelOps::operator==));
+ static_assert (is_defaulted (^^ImplicitRelOps::operator<=>));
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_deleted1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_deleted1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_deleted1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_deleted1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,154 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_deleted.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_deleted (null_reflection));
+ static_assert (!is_deleted (^^::));
+ static_assert (!is_deleted (^^ns));
+ static_assert (!is_deleted (^^ns_alias));
+ static_assert (!is_deleted (reflect_constant (3)));
+ static_assert (!is_deleted (^^cls));
+ static_assert (!is_deleted (^^cls::dm));
+ static_assert (!is_deleted (^^cls::ref_dm));
+ static_assert (!is_deleted (^^cls::static_dm));
+ static_assert (!is_deleted (^^cls::mem_fun));
+ static_assert (!is_deleted (^^cls::static_mem_fun));
+ static_assert (!is_deleted (^^cls::type));
+ static_assert (!is_deleted (^^cls::E));
+ static_assert (!is_deleted (^^cls::B));
+ static_assert (!is_deleted (^^cls::C));
+ static_assert (!is_deleted (^^cls::D));
+ static_assert (!is_deleted (^^cls::F));
+ static_assert (!is_deleted (^^cls::F::G));
+ static_assert (!is_deleted (^^cls::F::H));
+ static_assert (!is_deleted (^^cls::S));
+ static_assert (!is_deleted (^^cls::U));
+ static_assert (!is_deleted (^^cls::foo));
+ static_assert (!is_deleted (^^cls::foo <0>));
+ static_assert (!is_deleted (^^cls::bar));
+ static_assert (!is_deleted (^^cls::bar <42>));
+ static_assert (!is_deleted (^^cls_var));
+ static_assert (!is_deleted (^^onion));
+ static_assert (!is_deleted (^^anon));
+ static_assert (!is_deleted (^^fun));
+ static_assert (!is_deleted (^^alias));
+ static_assert (!is_deleted (^^var));
+ static_assert (!is_deleted (^^ref));
+ static_assert (!is_deleted (^^rref));
+ static_assert (!is_deleted (^^ptr));
+ static_assert (!is_deleted (^^cls_tmpl));
+ static_assert (!is_deleted (^^cls_tmpl<int>));
+ static_assert (!is_deleted (^^incomplete_cls<int>));
+ static_assert (!is_deleted (^^fun_tmpl));
+ static_assert (!is_deleted (^^fun_tmpl<int>));
+ static_assert (!is_deleted (^^conc));
+ static_assert (!is_deleted (substitute (^^conc, { ^^int })));
+ static_assert (!is_deleted (^^var_tmpl));
+ static_assert (!is_deleted (^^var_tmpl<int>));
+ static_assert (!is_deleted (^^cls_tmpl_alias));
+ static_assert (!is_deleted (^^cls_tmpl_alias<int>));
+ static_assert (!is_deleted (^^Enum));
+ static_assert (!is_deleted (^^Enum::A));
+ static_assert (!is_deleted (^^Enum_class));
+ static_assert (!is_deleted (^^Enum_class::A));
+ static_assert (!is_deleted (^^decomp));
+ static_assert (!is_deleted (^^decomp_ref));
+ static_assert (!is_deleted (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = u8"dms" });
+ static_assert (!is_deleted (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_deleted (bases_of (^^Derived, access_context::unprivileged ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_deleted (^^x));
+   static_assert (!is_deleted (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_deleted (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_deleted (^^S));
+   static_assert (!is_deleted (^^E));
+   static_assert (!is_deleted (^^F));
+   static_assert (!is_deleted (^^G));
+ }
+ 
+ void bar (int, long) = delete;
+ void baz (int) = delete ("foobar");
+ static_assert (is_deleted (^^bar));
+ static_assert (is_deleted (^^baz));
+ 
+ struct S
+ {
+   S (const int &x) : s (x) {}
+   auto operator <=> (const S &) const = default;
+   const int &s;
+   void foo () = delete;
+   template <int N>
+   void bar () = delete;
+ };
+ S s1 = 42;
+ S s2 = 43;
+ auto s3 = s1 <=> s2; // { dg-error "use of deleted function" }
+ static_assert (is_deleted (^^S::operator <=>));
+ static_assert (is_deleted (^^S::foo));
+ static_assert (!is_deleted (^^S::bar));
+ 
+ struct W
+ {
+   ~W () = delete;
+ };
+ static_assert (is_deleted (^^W::~W));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_deleted2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_deleted2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_deleted2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_deleted2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,89 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_deleted.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ struct Del {
+   Del() = delete;
+   Del(Del&&) = delete;
+   ~Del() = delete;
+ };
+ 
+ template<typename F>
+ consteval info
+ select_mem(info clazz, F f)
+ {
+   for (info x : members_of(clazz, access_context::unchecked()))
+     if (f(x))
+       return x;
+ }
+ 
+ struct ExplicitDef
+ {
+   ExplicitDef() = default;
+   ExplicitDef(const ExplicitDef&) = default;
+   ExplicitDef(ExplicitDef&&) = default;
+ 
+   ExplicitDef& operator=(const ExplicitDef&) = default;
+   ExplicitDef& operator=(ExplicitDef&&) = default;
+   
+   ~ExplicitDef() = default;
+ 
+   Del d;
+ };
+ 
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_default_constructor)));
+ static_assert (is_deleted (select_mem (^^ExplicitDef, is_default_constructor)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_copy_constructor)));
+ static_assert (is_deleted (select_mem (^^ExplicitDef, is_copy_constructor)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_move_constructor)));
+ static_assert (is_deleted (select_mem (^^ExplicitDef, is_move_constructor)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_copy_assignment)));
+ static_assert (is_deleted (select_mem (^^ExplicitDef, is_copy_assignment)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_move_assignment)));
+ static_assert (is_deleted (select_mem (^^ExplicitDef, is_move_assignment)));
+ static_assert (is_defaulted (select_mem (^^ExplicitDef, is_destructor)));
+ static_assert (is_deleted (select_mem (^^ExplicitDef, is_destructor)));
+ 
+ struct ImplicitDef
+ {
+   Del d;
+ };
+ 
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_default_constructor)));
+ static_assert (is_deleted (select_mem (^^ImplicitDef, is_default_constructor)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_copy_constructor)));
+ static_assert (is_deleted (select_mem (^^ImplicitDef, is_copy_constructor)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_move_constructor)));
+ static_assert (is_deleted (select_mem (^^ImplicitDef, is_move_constructor)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_copy_assignment)));
+ static_assert (is_deleted (select_mem (^^ImplicitDef, is_copy_assignment)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_move_assignment)));
+ static_assert (is_deleted (select_mem (^^ImplicitDef, is_move_assignment)));
+ static_assert (is_defaulted (select_mem (^^ImplicitDef, is_destructor)));
+ static_assert (is_deleted (select_mem (^^ImplicitDef, is_destructor)));
+ 
+ template<typename T>
+ concept check_rel_ops = requires(T t) {
+   t <=> t;
+   t == t;
+ };
+ 
+ struct RelOpsDel
+ {
+   int& x;
+ 
+   // deleted because of reference member
+   auto operator<=>(const RelOpsDel&) const = default;
+ };
+ static_assert (is_deleted (^^RelOpsDel::operator<=>));
+ static_assert (!check_rel_ops<RelOpsDel>);
+ 
+ static_assert (is_defaulted (^^RelOpsDel::operator==));
+ static_assert (is_deleted (^^RelOpsDel::operator==));
+ static_assert (is_defaulted (^^RelOpsDel::operator<=>));
+ static_assert (is_deleted (^^RelOpsDel::operator<=>));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_destructor1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_destructor1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_destructor1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_destructor1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,124 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_destructor.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S ()
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+   }
+   S (int)
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+   }
+   S (const S &)
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+   }
+   S (S &&)
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+   }
+   S &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+     return *this;
+   }
+   S &operator += (const S &)
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+     return *this;
+   }
+   void bar ()
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+   }
+   ~S ()
+   {
+     int a;
+     static_assert (is_destructor (parent_of (^^a)));
+   }
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &)
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct U {
+   template <typename T>
+   U (T &)
+   {
+     T a;
+     static_assert (!is_destructor (parent_of (^^a)));
+   }
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (!is_destructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct V {
+   V (int a = 42, long b = 18)
+   {
+     static_assert (!is_destructor (parent_of (^^a)));
+   }
+ };
+ 
+ static_assert (!is_destructor (null_reflection));
+ static_assert (!is_destructor (^^int));
+ static_assert (!is_destructor (^^::));
+ static_assert (!is_destructor (^^foo));
+ static_assert (!is_destructor (^^S::bar));
+ static_assert (!is_destructor (^^S::operator =));
+ static_assert (!is_destructor (^^S::operator +=));
+ static_assert (!is_destructor (^^T::operator *=));
+ 
+ struct W {};
+ static_assert (is_destructor (^^W::~W));
+ 
+ struct X 
+ {
+   ~X () = default;
+ };
+ static_assert (is_destructor (^^X::~X));
+ 
+ struct Y
+ {
+   ~Y () = delete;
+ };
+ static_assert (is_destructor (^^Y::~Y));
+ 
+ struct Z
+ {
+   ~Z () {}
+ };
+ static_assert (is_destructor (^^Z::~Z));
+ 
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_enumerable_type1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_enumerable_type1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_enumerable_type1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_enumerable_type1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,106 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_enumerable_type.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ static_assert (!is_enumerable_type (null_reflection));
+ static_assert (!is_enumerable_type (^^int));
+ static_assert (!is_enumerable_type (^^::));
+ static_assert (!is_enumerable_type (^^foo));
+ 
+ class S;
+ enum class E;
+ typedef E TE;
+ static_assert (!is_enumerable_type (^^S));
+ static_assert (!is_enumerable_type (^^E));
+ static_assert (!is_enumerable_type (^^TE));
+ 
+ template<typename> struct cls_tmpl {};
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ static_assert (!is_enumerable_type (^^cls_tmpl));
+ static_assert (is_enumerable_type (^^cls_tmpl<int>));
+ static_assert (!is_enumerable_type (^^cls_tmpl_alias));
+ static_assert (is_enumerable_type (^^cls_tmpl_alias<int>));
+ 
+ class S {
+   void foo ()
+   {
+     static_assert (is_enumerable_type (^^S));
+   }
+   static_assert (!is_enumerable_type (^^S));
+ };
+ static_assert (is_enumerable_type (^^S));
+ 
+ enum class E {
+   A = (is_enumerable_type (^^E) || is_enumerable_type (^^TE)) ? 1 : 2
+ };
+ static_assert (is_enumerable_type (^^E));
+ static_assert (static_cast <int> (E::A) == 2);
+ static_assert (is_enumerable_type (^^TE));
+ 
+ enum F : int;
+ using TF = F;
+ static_assert (!is_enumerable_type (^^F));
+ static_assert (!is_enumerable_type (^^TF));
+ enum F : int {
+   B = (is_enumerable_type (^^F) || is_enumerable_type (^^TF)) ? 3 : 4
+ };
+ static_assert (is_enumerable_type (^^F));
+ static_assert (B == 4);
+ static_assert (is_enumerable_type (^^TF));
+ 
+ enum G {
+   C = is_enumerable_type (^^G) ? 5 : 6
+ };
+ static_assert (is_enumerable_type (^^G));
+ static_assert (C == 6);
+ 
+ enum H : int;
+ typedef H TH;
+ static_assert (!is_enumerable_type (^^H));
+ static_assert (!is_enumerable_type (^^TH));
+ 
+ enum H : int {};
+ static_assert (is_enumerable_type (^^H));
+ static_assert (is_enumerable_type (^^TH));
+ 
+ enum I : short;
+ using TI = I;
+ static_assert (!is_enumerable_type (^^I));
+ static_assert (!is_enumerable_type (^^TI));
+ enum I : short {};
+ static_assert (is_enumerable_type (^^I));
+ static_assert (is_enumerable_type (^^TI));
+ 
+ template <typename T>
+ void
+ qux ()
+ {
+   enum J : T;
+   using K = J;
+   // FIXME: No idea if this is supposed to be false or true.
+   // We certainly during instantiation don't differentiate between
+   // forward enum declarations and later definitions.
+   //  static_assert (!is_enumerable_type (^^J));
+   //  static_assert (!is_enumerable_type (^^K));
+   enum J : T {
+     D = (is_enumerable_type (^^J) || is_enumerable_type (^^K))
+ 	? sizeof (T) * 2 : sizeof (T)
+   };
+   static_assert (is_enumerable_type (^^J));
+   static_assert (D == sizeof (T));
+   static_assert (is_enumerable_type (^^K));
+ }
+ 
+ void
+ corge ()
+ {
+   qux <int> ();
+   qux <unsigned char> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_enumerator1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_enumerator1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_enumerator1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_enumerator1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,107 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_enumerator.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_enumerator (null_reflection));
+ static_assert (!is_enumerator (^^::));
+ static_assert (!is_enumerator (^^ns));
+ static_assert (!is_enumerator (^^ns_alias));
+ static_assert (!is_enumerator (reflect_constant (3)));
+ static_assert (!is_enumerator (^^cls));
+ static_assert (!is_enumerator (^^cls::dm));
+ static_assert (!is_enumerator (^^cls::ref_dm));
+ static_assert (!is_enumerator (^^cls::static_dm));
+ static_assert (!is_enumerator (^^cls::mem_fun));
+ static_assert (!is_enumerator (^^cls::static_mem_fun));
+ static_assert (!is_enumerator (^^cls::type));
+ static_assert (!is_enumerator (^^cls_var));
+ static_assert (!is_enumerator (^^onion));
+ static_assert (!is_enumerator (^^anon));
+ static_assert (!is_enumerator (^^fun));
+ static_assert (!is_enumerator (^^alias));
+ static_assert (!is_enumerator (^^var));
+ static_assert (!is_enumerator (^^ref));
+ static_assert (!is_enumerator (^^rref));
+ static_assert (!is_enumerator (^^ptr));
+ static_assert (!is_enumerator (^^cls_tmpl));
+ static_assert (!is_enumerator (^^cls_tmpl<int>));
+ static_assert (!is_enumerator (^^incomplete_cls<int>));
+ static_assert (!is_enumerator (^^fun_tmpl));
+ static_assert (!is_enumerator (^^fun_tmpl<int>));
+ static_assert (!is_enumerator (^^conc));
+ static_assert (!is_enumerator (substitute (^^conc, { ^^int })));
+ static_assert (!is_enumerator (^^var_tmpl));
+ static_assert (!is_enumerator (^^var_tmpl<int>));
+ static_assert (!is_enumerator (^^cls_tmpl_alias));
+ static_assert (!is_enumerator (^^cls_tmpl_alias<int>));
+ static_assert (!is_enumerator (^^Enum));
+ static_assert (is_enumerator (^^Enum::A));
+ static_assert (!is_enumerator (^^Enum_class));
+ static_assert (is_enumerator (^^Enum_class::A));
+ static_assert (!is_enumerator (^^decomp));
+ static_assert (!is_enumerator (^^decomp_ref));
+ static_assert (!is_enumerator (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_enumerator (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_enumerator (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_enumerator (^^T));
+   static_assert (!is_enumerator (R));
+   static_assert (is_enumerator (R2));
+   static_assert (is_enumerator (R3));
+ }
+ 
+ void
+ g (int p, cls c, Enum e, Enum_class ec)
+ {
+   f<int, ^^var, ^^Enum::A, ^^Enum_class::A>();
+   static_assert (!is_enumerator (^^p));
+   static_assert (!is_enumerator (^^c));
+   static_assert (!is_enumerator (^^e));
+   static_assert (!is_enumerator (^^ec));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_explicit1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_explicit1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_explicit1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_explicit1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,72 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_explicit.
+ 
+ #include <meta>
+ 
+ class Test {
+ public:
+     explicit Test(int) 
+     {
+         int a;
+         static_assert (std::meta::is_explicit (std::meta::parent_of (^^a)));
+     }
+ 
+     Test(double) 
+     {
+         int a;
+         static_assert (!std::meta::is_explicit (std::meta::parent_of (^^a)));
+     }
+ 
+     explicit operator bool();
+ 
+     operator int();
+ 
+     template<typename T>
+     explicit operator double();
+     
+     void member_function();
+ 
+     virtual void virtual_function();
+ 
+     template <typename T>
+     void template_function(T param);
+ };
+ 
+ void function();
+ 
+ static_assert (std::meta::is_explicit (^^Test::Test)); // { dg-error "cannot take the reflection of an overload set" }
+ static_assert (!std::meta::is_explicit (^^Test::~Test));
+ 
+ static_assert (std::meta::is_explicit (^^Test::operator bool));
+ static_assert (!std::meta::is_explicit (^^Test::operator int));
+ static_assert (!std::meta::is_explicit (^^Test::operator double));
+ 
+ static_assert (!std::meta::is_explicit (^^Test::member_function));
+ static_assert (!std::meta::is_explicit (^^Test::virtual_function));
+ static_assert (!std::meta::is_explicit (^^Test::template_function));
+ static_assert (!std::meta::is_explicit (^^Test::template_function<int>));
+ 
+ static_assert (!std::meta::is_explicit (^^function));
+ static_assert (!std::meta::is_explicit (^^Test));
+ static_assert (!std::meta::is_explicit (^^::));
+ 
+ class Base {
+ public:
+     explicit operator int();
+ };
+ 
+ class Derived : public Base {
+ public:
+     explicit operator double();
+ 
+     operator bool();
+ };
+ 
+ static_assert (std::meta::is_explicit (^^Derived::operator int));
+ static_assert (std::meta::is_explicit (^^Derived::operator double));
+ static_assert (!std::meta::is_explicit (^^Derived::operator bool));
+ 
+ class EmptyClass {};
+ static_assert (!std::meta::is_explicit (^^EmptyClass::EmptyClass)); // { dg-error "cannot take the reflection of an overload set" }
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_explicit2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_explicit2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_explicit2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_explicit2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,47 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_explicit.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ template<typename Fn>
+ consteval info select(info clazz, Fn f)
+ {
+   for (auto x : members_of(clazz, access_context::unchecked()))
+    if (f(x))
+      return x;
+ }
+ 
+ struct Implicit {
+   template<typename T>
+   Implicit(T&& t);
+ 
+   template<typename T>
+   operator T();
+ };
+ 
+ static_assert (!is_explicit (select(^^Implicit, is_constructor_template)));
+ static_assert (!is_explicit (select(^^Implicit, is_conversion_function_template)));
+ 
+ struct Explicit {
+   template<typename T>
+   explicit Explicit(T&& t);
+ 
+   template<typename T>
+   explicit operator T();
+ };
+ 
+ static_assert (!is_explicit (select(^^Explicit, is_constructor_template)));
+ static_assert (!is_explicit (select(^^Explicit, is_conversion_function_template)));
+ 
+ struct CondExplicit {
+   template<typename T>
+   explicit(sizeof(T) > 4) CondExplicit(T&& t);
+ 
+   template<typename T>
+   explicit(sizeof(T) > 4) operator T();
+ };
+ 
+ static_assert (!is_explicit (select(^^CondExplicit, is_constructor_template)));
+ static_assert (!is_explicit (select(^^CondExplicit, is_conversion_function_template)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_explicit_object_parameter1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,165 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_explicit_object_parameter.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_explicit_object_parameter (null_reflection));
+ static_assert (!is_explicit_object_parameter (^^::));
+ static_assert (!is_explicit_object_parameter (^^ns));
+ static_assert (!is_explicit_object_parameter (^^ns_alias));
+ static_assert (!is_explicit_object_parameter (reflect_constant (3)));
+ static_assert (!is_explicit_object_parameter (^^cls));
+ static_assert (!is_explicit_object_parameter (^^cls::dm));
+ static_assert (!is_explicit_object_parameter (^^cls::ref_dm));
+ static_assert (!is_explicit_object_parameter (^^cls::static_dm));
+ static_assert (!is_explicit_object_parameter (^^cls::mem_fun));
+ static_assert (!is_explicit_object_parameter (^^cls::static_mem_fun));
+ static_assert (!is_explicit_object_parameter (^^cls::type));
+ static_assert (!is_explicit_object_parameter (^^cls_var));
+ static_assert (!is_explicit_object_parameter (^^onion));
+ static_assert (!is_explicit_object_parameter (^^anon));
+ static_assert (!is_explicit_object_parameter (^^fun));
+ static_assert (!is_explicit_object_parameter (^^alias));
+ static_assert (!is_explicit_object_parameter (^^var));
+ static_assert (!is_explicit_object_parameter (^^ref));
+ static_assert (!is_explicit_object_parameter (^^rref));
+ static_assert (!is_explicit_object_parameter (^^ptr));
+ static_assert (!is_explicit_object_parameter (^^cls_tmpl));
+ static_assert (!is_explicit_object_parameter (^^cls_tmpl<int>));
+ static_assert (!is_explicit_object_parameter (^^incomplete_cls<int>));
+ static_assert (!is_explicit_object_parameter (^^fun_tmpl));
+ static_assert (!is_explicit_object_parameter (^^fun_tmpl<int>));
+ static_assert (!is_explicit_object_parameter (^^conc));
+ static_assert (!is_explicit_object_parameter (substitute (^^conc, { ^^int })));
+ static_assert (!is_explicit_object_parameter (^^var_tmpl));
+ static_assert (!is_explicit_object_parameter (^^var_tmpl<int>));
+ static_assert (!is_explicit_object_parameter (^^cls_tmpl_alias));
+ static_assert (!is_explicit_object_parameter (^^cls_tmpl_alias<int>));
+ static_assert (!is_explicit_object_parameter (^^Enum));
+ static_assert (!is_explicit_object_parameter (^^Enum::A));
+ static_assert (!is_explicit_object_parameter (^^Enum_class));
+ static_assert (!is_explicit_object_parameter (^^Enum_class::A));
+ static_assert (!is_explicit_object_parameter (^^decomp));
+ static_assert (!is_explicit_object_parameter (^^decomp_ref));
+ static_assert (!is_explicit_object_parameter (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_explicit_object_parameter (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_explicit_object_parameter (bases_of (^^Derived, access_context::unchecked ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_explicit_object_parameter (^^T));
+   static_assert (!is_explicit_object_parameter (R));
+   static_assert (!is_explicit_object_parameter (R2));
+   static_assert (!is_explicit_object_parameter (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^p, ^^c> ();
+   static_assert (!is_explicit_object_parameter (^^p));
+   static_assert (!is_explicit_object_parameter (^^c));
+ }
+ 
+ struct S {
+   template<typename T, info R, info R2, info R3>
+   static void
+   f ()
+   {
+     static_assert (!is_explicit_object_parameter (^^T));
+     static_assert (!is_explicit_object_parameter (R));
+     static_assert (is_explicit_object_parameter (R2));
+     static_assert (!is_explicit_object_parameter (R3));
+   }
+ 
+   void
+   g (this const S &a, int b)
+   {
+     f<int, ^^var, parameters_of (^^S::g)[0], parameters_of (^^S::g)[1]> ();
+     static_assert (is_explicit_object_parameter (parameters_of (^^S::g)[0]));
+     static_assert (!is_explicit_object_parameter (parameters_of (^^S::g)[1]));
+     static_assert (!is_explicit_object_parameter (variable_of (parameters_of (^^S::g)[0])));
+     static_assert (!is_explicit_object_parameter (variable_of (parameters_of (^^S::g)[1])));
+     static_assert (!is_explicit_object_parameter (^^a));
+     static_assert (!is_explicit_object_parameter (^^b));
+   }
+ 
+   template<int N>
+   void
+   h (this S *a, long b)
+   {
+     static_assert (is_explicit_object_parameter (parameters_of (^^S::h <N>)[0]));
+     static_assert (!is_explicit_object_parameter (parameters_of (^^S::h <N>)[0]));
+     static_assert (!is_explicit_object_parameter (variable_of (parameters_of (^^S::h <N>)[0])));
+     static_assert (!is_explicit_object_parameter (variable_of (parameters_of (^^S::h <N>)[0])));
+     static_assert (!is_explicit_object_parameter (^^a));
+     static_assert (!is_explicit_object_parameter (^^b));
+   }
+ 
+   void
+   i (const S &a, int b)
+   {
+     ::f<int, ^^var, parameters_of (^^S::i)[0], parameters_of (^^S::i)[1]> ();
+     static_assert (!is_explicit_object_parameter (parameters_of (^^S::i)[0]));
+     static_assert (!is_explicit_object_parameter (parameters_of (^^S::i)[1]));
+     static_assert (!is_explicit_object_parameter (variable_of (parameters_of (^^S::i)[0])));
+     static_assert (!is_explicit_object_parameter (variable_of (parameters_of (^^S::i)[1])));
+     static_assert (!is_explicit_object_parameter (^^a));
+     static_assert (!is_explicit_object_parameter (^^b));
+   }
+ 
+   template<typename T>
+   void
+   j (const S *, int b)
+   {
+     ::f<int, ^^var, parameters_of (^^S::j <T>)[0], parameters_of (^^S::j <T>)[1]> ();
+     static_assert (!is_explicit_object_parameter (parameters_of (^^S::j <T>)[0]));
+     static_assert (!is_explicit_object_parameter (parameters_of (^^S::j <T>)[1]));
+     static_assert (!is_explicit_object_parameter (variable_of (parameters_of (^^S::j <T>)[0])));
+     static_assert (!is_explicit_object_parameter (variable_of (parameters_of (^^S::j <T>)[1])));
+     static_assert (!is_explicit_object_parameter (^^b));
+   }
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_final1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_final1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_final1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_final1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_final.
+ 
+ #include <meta>
+ 
+ struct A {
+   virtual void foo();
+ 
+   virtual void bar() final;
+ 
+   virtual ~A() = default;
+ };
+ 
+ struct B final : A {
+   void foo() override;
+ 
+   ~B() final = default;
+ };
+ 
+ struct C : A {
+   void foo() final;
+ };
+ 
+ struct D final : A {
+   static_assert (is_final (^^D));
+ };
+ 
+ static_assert (!std::meta::is_final (^^A));
+ static_assert (std::meta::is_final (^^B));
+ static_assert (!std::meta::is_final (^^C));
+ 
+ static_assert (!std::meta::is_final (^^A::foo));
+ static_assert (!std::meta::is_final (^^B::foo));
+ static_assert (std::meta::is_final (^^C::foo));
+ 
+ static_assert (std::meta::is_final (^^A::bar));
+ static_assert (std::meta::is_final (^^B::bar));
+ static_assert (std::meta::is_final (^^C::bar));
+ 
+ static_assert (!std::meta::is_final (^^A::~A));
+ static_assert (std::meta::is_final (^^B::~B));
+ static_assert (!std::meta::is_final (^^C::~C));
+ 
+ A a;
+ B b;
+ C c;
+ 
+ static_assert (!std::meta::is_final (^^::));
+ static_assert (!std::meta::is_final (^^a));
+ static_assert (!std::meta::is_final (^^b));
+ static_assert (!std::meta::is_final (^^c));
+ 
+ static_assert (!std::meta::is_final (std::meta::type_of (^^a)));
+ static_assert (std::meta::is_final (std::meta::type_of (^^b)));
+ static_assert (!std::meta::is_final (std::meta::type_of (^^c)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_function.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_function (null_reflection));
+ static_assert (!is_function (^^::));
+ static_assert (!is_function (^^ns));
+ static_assert (!is_function (^^ns_alias));
+ static_assert (!is_function (reflect_constant (3)));
+ static_assert (!is_function (^^cls));
+ static_assert (!is_function (^^cls::dm));
+ static_assert (!is_function (^^cls::ref_dm));
+ static_assert (!is_function (^^cls::static_dm));
+ static_assert (is_function (^^cls::mem_fun));
+ static_assert (is_function (^^cls::static_mem_fun));
+ static_assert (!is_function (^^cls::type));
+ static_assert (!is_function (^^cls_var));
+ static_assert (!is_function (^^onion));
+ static_assert (!is_function (^^anon));
+ static_assert (is_function (^^fun));
+ static_assert (!is_function (^^alias));
+ static_assert (!is_function (^^var));
+ static_assert (!is_function (^^ref));
+ static_assert (!is_function (^^rref));
+ static_assert (!is_function (^^ptr));
+ static_assert (!is_function (^^cls_tmpl));
+ static_assert (!is_function (^^cls_tmpl<int>));
+ static_assert (!is_function (^^incomplete_cls<int>));
+ static_assert (!is_function (^^fun_tmpl));
+ static_assert (is_function (^^fun_tmpl<int>));
+ static_assert (!is_function (^^conc));
+ static_assert (!is_function (substitute (^^conc, { ^^int })));
+ static_assert (!is_function (^^var_tmpl));
+ static_assert (!is_function (^^var_tmpl<int>));
+ static_assert (!is_function (^^cls_tmpl_alias));
+ static_assert (!is_function (^^cls_tmpl_alias<int>));
+ static_assert (!is_function (^^Enum));
+ static_assert (!is_function (^^Enum::A));
+ static_assert (!is_function (^^Enum_class));
+ static_assert (!is_function (^^Enum_class::A));
+ static_assert (!is_function (^^decomp));
+ static_assert (!is_function (^^decomp_ref));
+ static_assert (!is_function (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_function (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_function (bases_of (^^Derived, access_context::unprivileged ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_function (^^T));
+   static_assert (!is_function (R));
+   static_assert (!is_function (R2));
+   static_assert (is_function (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^fun>();
+   static_assert (!is_function (^^p));
+   static_assert (!is_function (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,44 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_function.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   template<typename T>
+   void ovl (T) { }
+ 
+   template<typename T>
+   void static_ovl (T) { }
+ };
+ 
+ static_assert (!is_function (^^S::ovl));
+ static_assert (is_function (^^S::ovl<int>));
+ static_assert (!is_function (^^S::static_ovl));
+ static_assert (is_function (^^S::static_ovl<int>));
+ 
+ static_assert (!is_function (^^void()));
+ 
+ template<info R1, info R2>
+ void
+ f ()
+ {
+   static_assert (!is_function (R1));
+   static_assert (is_function (R2));
+ }
+ 
+ template<typename T>
+ void
+ g ()
+ {
+   f<^^S::ovl, ^^S::ovl<T>>();
+   f<^^S::static_ovl, ^^S::static_ovl<T>>();
+ }
+ 
+ void
+ h ()
+ {
+   g<int>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_function.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   S();
+   ~S();
+ };
+ 
+ static_assert (is_function (^^S::S)); // { dg-error "cannot take the reflection of an overload set" }
+ static_assert (is_function (^^S::~S));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_parameter1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_parameter1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_parameter1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_parameter1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_function_parameter.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_function_parameter (null_reflection));
+ static_assert (!is_function_parameter (^^::));
+ static_assert (!is_function_parameter (^^ns));
+ static_assert (!is_function_parameter (^^ns_alias));
+ static_assert (!is_function_parameter (reflect_constant (3)));
+ static_assert (!is_function_parameter (^^cls));
+ static_assert (!is_function_parameter (^^cls::dm));
+ static_assert (!is_function_parameter (^^cls::ref_dm));
+ static_assert (!is_function_parameter (^^cls::static_dm));
+ static_assert (!is_function_parameter (^^cls::mem_fun));
+ static_assert (!is_function_parameter (^^cls::static_mem_fun));
+ static_assert (!is_function_parameter (^^cls::type));
+ static_assert (!is_function_parameter (^^cls_var));
+ static_assert (!is_function_parameter (^^onion));
+ static_assert (!is_function_parameter (^^anon));
+ static_assert (!is_function_parameter (^^fun));
+ static_assert (!is_function_parameter (^^alias));
+ static_assert (!is_function_parameter (^^var));
+ static_assert (!is_function_parameter (^^ref));
+ static_assert (!is_function_parameter (^^rref));
+ static_assert (!is_function_parameter (^^ptr));
+ static_assert (!is_function_parameter (^^cls_tmpl));
+ static_assert (!is_function_parameter (^^cls_tmpl<int>));
+ static_assert (!is_function_parameter (^^incomplete_cls<int>));
+ static_assert (!is_function_parameter (^^fun_tmpl));
+ static_assert (!is_function_parameter (^^fun_tmpl<int>));
+ static_assert (!is_function_parameter (^^conc));
+ static_assert (!is_function_parameter (substitute (^^conc, { ^^int })));
+ static_assert (!is_function_parameter (^^var_tmpl));
+ static_assert (!is_function_parameter (^^var_tmpl<int>));
+ static_assert (!is_function_parameter (^^cls_tmpl_alias));
+ static_assert (!is_function_parameter (^^cls_tmpl_alias<int>));
+ static_assert (!is_function_parameter (^^Enum));
+ static_assert (!is_function_parameter (^^Enum::A));
+ static_assert (!is_function_parameter (^^Enum_class));
+ static_assert (!is_function_parameter (^^Enum_class::A));
+ static_assert (!is_function_parameter (^^decomp));
+ static_assert (!is_function_parameter (^^decomp_ref));
+ static_assert (!is_function_parameter (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_function_parameter (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_function_parameter (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_function_parameter (^^T));
+   static_assert (!is_function_parameter (R));
+   static_assert (!is_function_parameter (R2));
+   static_assert (!is_function_parameter (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^p, ^^c>();
+   static_assert (!is_function_parameter (^^p));
+   static_assert (!is_function_parameter (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_parameter2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_parameter2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_parameter2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_parameter2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_function_parameter.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void fn (int a, bool &b, std::string *, ...);
+ 
+ static_assert (is_function_parameter (parameters_of(^^fn)[0]));
+ static_assert (is_function_parameter (parameters_of(^^fn)[1]));
+ static_assert (is_function_parameter (parameters_of(^^fn)[2]));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_function_template.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_function_template (null_reflection));
+ static_assert (!is_function_template (^^::));
+ static_assert (!is_function_template (^^ns));
+ static_assert (!is_function_template (^^ns_alias));
+ static_assert (!is_function_template (reflect_constant (3)));
+ static_assert (!is_function_template (^^cls));
+ static_assert (!is_function_template (^^cls::dm));
+ static_assert (!is_function_template (^^cls::ref_dm));
+ static_assert (!is_function_template (^^cls::static_dm));
+ static_assert (!is_function_template (^^cls::mem_fun));
+ static_assert (!is_function_template (^^cls::static_mem_fun));
+ static_assert (!is_function_template (^^cls::type));
+ static_assert (!is_function_template (^^cls_var));
+ static_assert (!is_function_template (^^onion));
+ static_assert (!is_function_template (^^anon));
+ static_assert (!is_function_template (^^fun));
+ static_assert (!is_function_template (^^alias));
+ static_assert (!is_function_template (^^var));
+ static_assert (!is_function_template (^^ref));
+ static_assert (!is_function_template (^^rref));
+ static_assert (!is_function_template (^^ptr));
+ static_assert (!is_function_template (^^cls_tmpl));
+ static_assert (!is_function_template (^^cls_tmpl<int>));
+ static_assert (!is_function_template (^^incomplete_cls<int>));
+ static_assert (is_function_template (^^fun_tmpl));
+ static_assert (!is_function_template (^^fun_tmpl<int>));
+ static_assert (!is_function_template (^^conc));
+ static_assert (!is_function_template (substitute (^^conc, { ^^int })));
+ static_assert (!is_function_template (^^var_tmpl));
+ static_assert (!is_function_template (^^var_tmpl<int>));
+ static_assert (!is_function_template (^^cls_tmpl_alias));
+ static_assert (!is_function_template (^^cls_tmpl_alias<int>));
+ static_assert (!is_function_template (^^Enum));
+ static_assert (!is_function_template (^^Enum::A));
+ static_assert (!is_function_template (^^Enum_class));
+ static_assert (!is_function_template (^^Enum_class::A));
+ static_assert (!is_function_template (^^decomp));
+ static_assert (!is_function_template (^^decomp_ref));
+ static_assert (!is_function_template (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_function_template (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_function_template (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_function_template (^^T));
+   static_assert (!is_function_template (R));
+   static_assert (!is_function_template (R2));
+   static_assert (is_function_template (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^fun_tmpl>();
+   static_assert (!is_function_template (^^p));
+   static_assert (!is_function_template (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_template2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_template2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_template2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_template2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,44 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_function_template.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   template<typename T>
+   void ovl (T) { }
+ 
+   template<typename T>
+   void static_ovl (T) { }
+ };
+ 
+ static_assert (is_function_template (^^S::ovl));
+ static_assert (!is_function_template (^^S::ovl<int>));
+ static_assert (is_function_template (^^S::static_ovl));
+ static_assert (!is_function_template (^^S::static_ovl<int>));
+ 
+ static_assert (!is_function_template (^^void()));
+ 
+ template<info R1, info R2>
+ void
+ f ()
+ {
+   static_assert (is_function_template (R1));
+   static_assert (!is_function_template (R2));
+ }
+ 
+ template<typename T>
+ void
+ g ()
+ {
+   f<^^S::ovl, ^^S::ovl<T>>();
+   f<^^S::static_ovl, ^^S::static_ovl<T>>();
+ }
+ 
+ void
+ h ()
+ {
+   g<int>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_type1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_type1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_function_type1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_function_type1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,26 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_function_type.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct cls {
+   void mem_fun ();
+   static void static_mem_fun ();
+ };
+ int fun (bool, char) noexcept { return 0; }
+ 
+ static_assert (is_function_type (type_of (^^cls::mem_fun)));
+ static_assert (is_function_type (type_of (^^cls::static_mem_fun)));
+ static_assert (is_function_type (type_of (^^::fun)));
+ static_assert (!is_function_type (^^void(*)(short)));
+ static_assert (is_function_type (remove_pointer (^^void(*)(short))));
+ static_assert (!is_function_type (remove_pointer (^^void(**)(short))));
+ static_assert (is_function_type (remove_pointer (remove_pointer (^^void(**)(short)))));
+ static_assert (!is_function_type (^^void(&)()));
+ static_assert (is_function_type (remove_reference (^^void(&)())));
+ using U = void(*)(void);
+ static_assert (!is_function_type (^^U[3]));
+ static_assert (is_function_type (remove_pointer (remove_extent (^^U[3]))));
+ static_assert (!is_function_type (remove_pointer (^^int (cls::*)())));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_literal_operator1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_literal_operator1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_literal_operator1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_literal_operator1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_literal_operator.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S &operator+(const S&);
+ 
+   template <typename T>
+   S &operator-(const S&);
+ 
+   operator int();
+ 
+   void fn();
+ };
+ 
+ struct T {
+   template <typename T>
+   operator T();
+ };
+ 
+ bool operator&&(const S&, const S&);
+ 
+ template <typename T>
+ bool operator||(const S&, const T&);
+ 
+ int operator""_a(const char *);
+ 
+ template<char...>
+ int operator""_b();
+ 
+ constexpr auto conversion_template
+   = (members_of (^^T, access_context::current ()) | std::views::filter (std::meta::is_template)).front ();
+ 
+ static_assert (!is_literal_operator (null_reflection));
+ static_assert (!is_literal_operator (^^int));
+ static_assert (!is_literal_operator (^^::));
+ static_assert (!is_literal_operator (^^foo));
+ static_assert (!is_literal_operator (^^S::operator+));
+ static_assert (!is_literal_operator (^^operator&&));
+ static_assert (!is_literal_operator (^^operator||));
+ static_assert (!is_literal_operator (^^operator||<int>));
+ static_assert (!is_literal_operator (^^S::operator-));
+ static_assert (!is_literal_operator (^^S::operator-<int>));
+ static_assert (!is_literal_operator (^^S::operator int));
+ static_assert (!is_literal_operator (conversion_template));
+ static_assert (!is_literal_operator (^^S::fn));
+ static_assert (is_literal_operator (^^operator""_a));
+ static_assert (!is_literal_operator (^^operator""_b));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_literal_operator_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_literal_operator_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_literal_operator_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_literal_operator_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_literal_operator_template.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S &operator+(const S&);
+ 
+   template <typename T>
+   S &operator-(const S&);
+ 
+   operator int();
+ 
+   void fn();
+ };
+ 
+ struct T {
+   template <typename T>
+   operator T();
+ };
+ 
+ bool operator&&(const S&, const S&);
+ 
+ template <typename T>
+ bool operator||(const S&, const T&);
+ 
+ int operator""_a(const char *);
+ 
+ template<char...>
+ int operator""_b();
+ 
+ constexpr auto conversion_template
+   = (members_of (^^T, access_context::current ()) | std::views::filter (is_template)).front ();
+ 
+ static_assert (!is_literal_operator_template (null_reflection));
+ static_assert (!is_literal_operator_template (^^int));
+ static_assert (!is_literal_operator_template (^^::));
+ static_assert (!is_literal_operator_template (^^foo));
+ static_assert (!is_literal_operator_template (^^S::operator+));
+ static_assert (!is_literal_operator_template (^^operator&&));
+ static_assert (!is_literal_operator_template (^^operator||));
+ static_assert (!is_literal_operator_template (^^operator||<int>));
+ static_assert (!is_literal_operator_template (^^S::operator-));
+ static_assert (!is_literal_operator_template (^^S::operator-<int>));
+ static_assert (!is_literal_operator_template (^^S::operator int));
+ static_assert (!is_literal_operator_template (conversion_template));
+ static_assert (!is_literal_operator_template (^^S::fn));
+ static_assert (!is_literal_operator_template (^^operator""_a));
+ static_assert (is_literal_operator_template (^^operator""_b));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_lrvalue_reference_qualified1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_lrvalue_reference_qualified1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_lrvalue_reference_qualified1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_lrvalue_reference_qualified1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,93 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_[lr]value_reference_qualified.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   void fn1 ();
+   void fn2 () &;
+   void fn3 () &&;
+   static void fn4 ();
+   /* Static member functions cannot have ref-qualifiers.  */
+   template<typename>
+   void fn5 ();
+   template<typename>
+   void fn6 () &;
+   template<typename>
+   void fn7 () &&;
+ };
+ 
+ void foo ();
+ template<typename>
+ void bar ();
+ /* Non-member functions cannot have ref-qualifiers.  */
+ 
+ static_assert (!is_lvalue_reference_qualified (^^S::fn1));
+ static_assert (!is_rvalue_reference_qualified (^^S::fn1));
+ 
+ static_assert (is_lvalue_reference_qualified (^^S::fn2));
+ static_assert (!is_rvalue_reference_qualified (^^S::fn2));
+ 
+ static_assert (!is_lvalue_reference_qualified (^^S::fn3));
+ static_assert (is_rvalue_reference_qualified (^^S::fn3));
+ 
+ static_assert (!is_lvalue_reference_qualified (^^S::fn4));
+ static_assert (!is_rvalue_reference_qualified (^^S::fn4));
+ 
+ static_assert (!is_lvalue_reference_qualified (^^S::fn5<int>));
+ static_assert (!is_rvalue_reference_qualified (^^S::fn5<int>));
+ 
+ static_assert (is_lvalue_reference_qualified (^^S::fn6<int>));
+ static_assert (!is_rvalue_reference_qualified (^^S::fn6<int>));
+ 
+ static_assert (!is_lvalue_reference_qualified (^^S::fn7<int>));
+ static_assert (is_rvalue_reference_qualified (^^S::fn7<int>));
+ 
+ static_assert (!is_lvalue_reference_qualified (^^::foo));
+ static_assert (!is_rvalue_reference_qualified (^^::foo));
+ 
+ static_assert (!is_lvalue_reference_qualified (^^::bar<int>));
+ static_assert (!is_rvalue_reference_qualified (^^::bar<int>));
+ 
+ static_assert (!is_lvalue_reference_qualified (type_of (^^S::fn1)));
+ static_assert (!is_rvalue_reference_qualified (type_of (^^S::fn1)));
+ 
+ static_assert (is_lvalue_reference_qualified (type_of (^^S::fn2)));
+ static_assert (!is_rvalue_reference_qualified (type_of (^^S::fn2)));
+ 
+ static_assert (!is_lvalue_reference_qualified (type_of (^^S::fn3)));
+ static_assert (is_rvalue_reference_qualified (type_of (^^S::fn3)));
+ 
+ static_assert (!is_lvalue_reference_qualified (type_of (^^S::fn4)));
+ static_assert (!is_rvalue_reference_qualified (type_of (^^S::fn4)));
+ 
+ static_assert (!is_lvalue_reference_qualified (type_of (^^S::fn5<int>)));
+ static_assert (!is_rvalue_reference_qualified (type_of (^^S::fn5<int>)));
+ 
+ static_assert (is_lvalue_reference_qualified (type_of (^^S::fn6<int>)));
+ static_assert (!is_rvalue_reference_qualified (type_of (^^S::fn6<int>)));
+ 
+ static_assert (!is_lvalue_reference_qualified (type_of (^^S::fn7<int>)));
+ static_assert (is_rvalue_reference_qualified (type_of (^^S::fn7<int>)));
+ 
+ static_assert (!is_lvalue_reference_qualified (type_of (^^::foo)));
+ static_assert (!is_rvalue_reference_qualified (type_of (^^::foo)));
+ 
+ static_assert (!is_lvalue_reference_qualified (type_of (^^::bar<int>)));
+ static_assert (!is_rvalue_reference_qualified (type_of (^^::bar<int>)));
+ 
+ static_assert (!is_lvalue_reference_qualified (^^void (int)));
+ static_assert (!is_rvalue_reference_qualified (^^void (int)));
+ 
+ static_assert (is_lvalue_reference_qualified (^^void (int) &));
+ static_assert (!is_rvalue_reference_qualified (^^void (int) &));
+ 
+ static_assert (!is_lvalue_reference_qualified (^^void (int) &&));
+ static_assert (is_rvalue_reference_qualified (^^void (int) &&));
+ 
+ static_assert (!is_lvalue_reference_qualified (std::meta::info {}));
+ static_assert (!is_lvalue_reference_qualified (^^int));
+ static_assert (!is_lvalue_reference_qualified (^^::));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_move_assignment1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_move_assignment1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_move_assignment1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_move_assignment1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,101 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_move_assignment.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S ()
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+   }
+   S (int)
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+   }
+   S (const S &)
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+   }
+   S (S &&)
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+   }
+   S &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+     return *this;
+   }
+   S &operator += (const S &)
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+     return *this;
+   }
+   void bar ()
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+   }
+   ~S ()
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+   }
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &)
+   {
+     int a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct U {
+   template <typename T>
+   U (T &)
+   {
+     T a;
+     static_assert (!is_move_assignment (parent_of (^^a)));
+   }
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (is_move_assignment (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct V {
+   V (int a = 42, long b = 18)
+   {
+     static_assert (!is_move_assignment (parent_of (^^a)));
+   }
+ };
+ 
+ static_assert (!is_move_assignment (null_reflection));
+ static_assert (!is_move_assignment (^^int));
+ static_assert (!is_move_assignment (^^::));
+ static_assert (!is_move_assignment (^^foo));
+ static_assert (!is_move_assignment (^^S::bar));
+ static_assert (!is_move_assignment (^^S::operator =));
+ static_assert (!is_move_assignment (^^S::operator +=));
+ static_assert (!is_move_assignment (^^T::operator *=));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_move_constructor1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_move_constructor1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_move_constructor1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_move_constructor1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,101 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_move_constructor.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S ()
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+   }
+   S (int)
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+   }
+   S (const S &)
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+   }
+   S (S &&)
+   {
+     int a;
+     static_assert (is_move_constructor (parent_of (^^a)));
+   }
+   S &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+     return *this;
+   }
+   S &operator += (const S &)
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+     return *this;
+   }
+   void bar ()
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+   }
+   ~S ()
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+   }
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &)
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct U {
+   template <typename T>
+   U (T &)
+   {
+     T a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+   }
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (!is_move_constructor (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct V {
+   V (int a = 42, long b = 18)
+   {
+     static_assert (!is_move_constructor (parent_of (^^a)));
+   }
+ };
+ 
+ static_assert (!is_move_constructor (null_reflection));
+ static_assert (!is_move_constructor (^^int));
+ static_assert (!is_move_constructor (^^::));
+ static_assert (!is_move_constructor (^^foo));
+ static_assert (!is_move_constructor (^^S::bar));
+ static_assert (!is_move_constructor (^^S::operator =));
+ static_assert (!is_move_constructor (^^S::operator +=));
+ static_assert (!is_move_constructor (^^T::operator *=));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_mutable_member1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_mutable_member1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_mutable_member1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_mutable_member1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,133 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_mutable_member.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   mutable int dm2;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+   mutable S dm3;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ static union { mutable int anon2; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_mutable_member (null_reflection));
+ static_assert (!is_mutable_member (^^::));
+ static_assert (!is_mutable_member (^^ns));
+ static_assert (!is_mutable_member (^^ns_alias));
+ static_assert (!is_mutable_member (reflect_constant (3)));
+ static_assert (!is_mutable_member (^^cls));
+ static_assert (!is_mutable_member (^^cls::dm));
+ static_assert (is_mutable_member (^^cls::dm2));
+ static_assert (is_mutable_member (^^cls::dm3));
+ static_assert (!is_mutable_member (^^cls::ref_dm));
+ static_assert (!is_mutable_member (^^cls::static_dm));
+ static_assert (!is_mutable_member (^^cls::mem_fun));
+ static_assert (!is_mutable_member (^^cls::static_mem_fun));
+ static_assert (!is_mutable_member (^^cls::type));
+ static_assert (!is_mutable_member (^^cls::E));
+ static_assert (!is_mutable_member (^^cls::B));
+ static_assert (!is_mutable_member (^^cls::C));
+ static_assert (!is_mutable_member (^^cls::D));
+ static_assert (!is_mutable_member (^^cls::F));
+ static_assert (!is_mutable_member (^^cls::F::G));
+ static_assert (!is_mutable_member (^^cls::F::H));
+ static_assert (!is_mutable_member (^^cls::S));
+ static_assert (!is_mutable_member (^^cls::U));
+ static_assert (!is_mutable_member (^^cls::foo));
+ static_assert (!is_mutable_member (^^cls::foo <0>));
+ static_assert (!is_mutable_member (^^cls::bar));
+ static_assert (!is_mutable_member (^^cls::bar <42>));
+ static_assert (!is_mutable_member (^^cls_var));
+ static_assert (!is_mutable_member (^^onion));
+ static_assert (!is_mutable_member (^^anon));
+ static_assert (is_mutable_member (^^anon2));
+ static_assert (!is_mutable_member (^^fun));
+ static_assert (!is_mutable_member (^^alias));
+ static_assert (!is_mutable_member (^^var));
+ static_assert (!is_mutable_member (^^ref));
+ static_assert (!is_mutable_member (^^rref));
+ static_assert (!is_mutable_member (^^ptr));
+ static_assert (!is_mutable_member (^^cls_tmpl));
+ static_assert (!is_mutable_member (^^cls_tmpl<int>));
+ static_assert (!is_mutable_member (^^incomplete_cls<int>));
+ static_assert (!is_mutable_member (^^fun_tmpl));
+ static_assert (!is_mutable_member (^^fun_tmpl<int>));
+ static_assert (!is_mutable_member (^^conc));
+ static_assert (!is_mutable_member (substitute (^^conc, { ^^int })));
+ static_assert (!is_mutable_member (^^var_tmpl));
+ static_assert (!is_mutable_member (^^var_tmpl<int>));
+ static_assert (!is_mutable_member (^^cls_tmpl_alias));
+ static_assert (!is_mutable_member (^^cls_tmpl_alias<int>));
+ static_assert (!is_mutable_member (^^Enum));
+ static_assert (!is_mutable_member (^^Enum::A));
+ static_assert (!is_mutable_member (^^Enum_class));
+ static_assert (!is_mutable_member (^^Enum_class::A));
+ static_assert (!is_mutable_member (^^decomp));
+ static_assert (!is_mutable_member (^^decomp_ref));
+ static_assert (!is_mutable_member (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_mutable_member (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_mutable_member (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_mutable_member (^^x));
+   static_assert (!is_mutable_member (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_mutable_member (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_mutable_member (^^S));
+   static_assert (!is_mutable_member (^^E));
+   static_assert (!is_mutable_member (^^F));
+   static_assert (!is_mutable_member (^^G));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_namespace1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_namespace1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_namespace1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_namespace1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_namespace.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_namespace (null_reflection));
+ static_assert (is_namespace (^^::));
+ static_assert (is_namespace (^^ns));
+ static_assert (is_namespace (^^ns_alias));
+ static_assert (!is_namespace (reflect_constant (3)));
+ static_assert (!is_namespace (^^cls));
+ static_assert (!is_namespace (^^cls::dm));
+ static_assert (!is_namespace (^^cls::ref_dm));
+ static_assert (!is_namespace (^^cls::static_dm));
+ static_assert (!is_namespace (^^cls::mem_fun));
+ static_assert (!is_namespace (^^cls::static_mem_fun));
+ static_assert (!is_namespace (^^cls::type));
+ static_assert (!is_namespace (^^cls_var));
+ static_assert (!is_namespace (^^onion));
+ static_assert (!is_namespace (^^anon));
+ static_assert (!is_namespace (^^fun));
+ static_assert (!is_namespace (^^alias));
+ static_assert (!is_namespace (^^var));
+ static_assert (!is_namespace (^^ref));
+ static_assert (!is_namespace (^^rref));
+ static_assert (!is_namespace (^^ptr));
+ static_assert (!is_namespace (^^cls_tmpl));
+ static_assert (!is_namespace (^^cls_tmpl<int>));
+ static_assert (!is_namespace (^^incomplete_cls<int>));
+ static_assert (!is_namespace (^^fun_tmpl));
+ static_assert (!is_namespace (^^fun_tmpl<int>));
+ static_assert (!is_namespace (^^conc));
+ static_assert (!is_namespace (substitute (^^conc, { ^^int })));
+ static_assert (!is_namespace (^^var_tmpl));
+ static_assert (!is_namespace (^^var_tmpl<int>));
+ static_assert (!is_namespace (^^cls_tmpl_alias));
+ static_assert (!is_namespace (^^cls_tmpl_alias<int>));
+ static_assert (!is_namespace (^^Enum));
+ static_assert (!is_namespace (^^Enum::A));
+ static_assert (!is_namespace (^^Enum_class));
+ static_assert (!is_namespace (^^Enum_class::A));
+ static_assert (!is_namespace (^^decomp));
+ static_assert (!is_namespace (^^decomp_ref));
+ static_assert (!is_namespace (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_namespace (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_namespace (bases_of (^^Derived, access_context::unprivileged ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_namespace (^^T));
+   static_assert (!is_namespace (R));
+   static_assert (is_namespace (R2));
+   static_assert (!is_namespace (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!is_namespace (^^p));
+   static_assert (!is_namespace (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_namespace_alias1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_namespace_alias1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_namespace_alias1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_namespace_alias1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_namespace_alias.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_namespace_alias (null_reflection));
+ static_assert (!is_namespace_alias (^^::));
+ static_assert (!is_namespace_alias (^^ns));
+ static_assert (is_namespace_alias (^^ns_alias));
+ static_assert (!is_namespace_alias (reflect_constant (3)));
+ static_assert (!is_namespace_alias (^^cls));
+ static_assert (!is_namespace_alias (^^cls::dm));
+ static_assert (!is_namespace_alias (^^cls::ref_dm));
+ static_assert (!is_namespace_alias (^^cls::static_dm));
+ static_assert (!is_namespace_alias (^^cls::mem_fun));
+ static_assert (!is_namespace_alias (^^cls::static_mem_fun));
+ static_assert (!is_namespace_alias (^^cls::type));
+ static_assert (!is_namespace_alias (^^cls_var));
+ static_assert (!is_namespace_alias (^^onion));
+ static_assert (!is_namespace_alias (^^anon));
+ static_assert (!is_namespace_alias (^^fun));
+ static_assert (!is_namespace_alias (^^alias));
+ static_assert (!is_namespace_alias (^^var));
+ static_assert (!is_namespace_alias (^^ref));
+ static_assert (!is_namespace_alias (^^rref));
+ static_assert (!is_namespace_alias (^^ptr));
+ static_assert (!is_namespace_alias (^^cls_tmpl));
+ static_assert (!is_namespace_alias (^^cls_tmpl<int>));
+ static_assert (!is_namespace_alias (^^incomplete_cls<int>));
+ static_assert (!is_namespace_alias (^^fun_tmpl));
+ static_assert (!is_namespace_alias (^^fun_tmpl<int>));
+ static_assert (!is_namespace_alias (^^conc));
+ static_assert (!is_namespace_alias (substitute (^^conc, { ^^int })));
+ static_assert (!is_namespace_alias (^^var_tmpl));
+ static_assert (!is_namespace_alias (^^var_tmpl<int>));
+ static_assert (!is_namespace_alias (^^cls_tmpl_alias));
+ static_assert (!is_namespace_alias (^^cls_tmpl_alias<int>));
+ static_assert (!is_namespace_alias (^^Enum));
+ static_assert (!is_namespace_alias (^^Enum::A));
+ static_assert (!is_namespace_alias (^^Enum_class));
+ static_assert (!is_namespace_alias (^^Enum_class::A));
+ static_assert (!is_namespace_alias (^^decomp));
+ static_assert (!is_namespace_alias (^^decomp_ref));
+ static_assert (!is_namespace_alias (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_namespace_alias (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_namespace_alias (bases_of (^^Derived, access_context::unchecked ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_namespace_alias (^^T));
+   static_assert (!is_namespace_alias (R));
+   static_assert (!is_namespace_alias (R2));
+   static_assert (is_namespace_alias (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^ns_alias>();
+   static_assert (!is_namespace_alias (^^p));
+   static_assert (!is_namespace_alias (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_namespace_member1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_namespace_member1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_namespace_member1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_namespace_member1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,147 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_namespace_member.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ namespace NN
+ {
+   int a;
+   int &b = a;
+   int &&c = 42;
+   int *d = &a;
+   namespace ns {}
+   namespace ns_alias = ns;
+   enum E { F };
+ }
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_namespace_member (null_reflection));
+ static_assert (!is_namespace_member (^^::));
+ static_assert (is_namespace_member (^^ns));
+ static_assert (is_namespace_member (^^ns_alias));
+ static_assert (!is_namespace_member (reflect_constant (3)));
+ static_assert (is_namespace_member (^^cls));
+ static_assert (!is_namespace_member (^^cls::dm));
+ static_assert (!is_namespace_member (^^cls::ref_dm));
+ static_assert (!is_namespace_member (^^cls::static_dm));
+ static_assert (!is_namespace_member (^^cls::mem_fun));
+ static_assert (!is_namespace_member (^^cls::static_mem_fun));
+ static_assert (!is_namespace_member (^^cls::type));
+ static_assert (!is_namespace_member (^^cls::E));
+ static_assert (!is_namespace_member (^^cls::B));
+ static_assert (!is_namespace_member (^^cls::C));
+ static_assert (!is_namespace_member (^^cls::D));
+ static_assert (!is_namespace_member (^^cls::F));
+ static_assert (!is_namespace_member (^^cls::F::G));
+ static_assert (!is_namespace_member (^^cls::F::H));
+ static_assert (!is_namespace_member (^^cls::S));
+ static_assert (!is_namespace_member (^^cls::U));
+ static_assert (!is_namespace_member (^^cls::foo));
+ static_assert (!is_namespace_member (^^cls::foo <0>));
+ static_assert (!is_namespace_member (^^cls::bar));
+ static_assert (!is_namespace_member (^^cls::bar <42>));
+ static_assert (is_namespace_member (^^cls_var));
+ static_assert (is_namespace_member (^^onion));
+ static_assert (!is_namespace_member (^^anon));
+ static_assert (is_namespace_member (^^fun));
+ static_assert (is_namespace_member (^^alias));
+ static_assert (is_namespace_member (^^var));
+ static_assert (is_namespace_member (^^ref));
+ static_assert (is_namespace_member (^^rref));
+ static_assert (is_namespace_member (^^ptr));
+ static_assert (is_namespace_member (^^cls_tmpl));
+ static_assert (is_namespace_member (^^cls_tmpl<int>));
+ static_assert (is_namespace_member (^^incomplete_cls<int>));
+ static_assert (is_namespace_member (^^fun_tmpl));
+ static_assert (is_namespace_member (^^fun_tmpl<int>));
+ static_assert (is_namespace_member (^^conc));
+ static_assert (!is_namespace_member (substitute (^^conc, { ^^int })));
+ static_assert (is_namespace_member (^^var_tmpl));
+ static_assert (is_namespace_member (^^var_tmpl<int>));
+ static_assert (is_namespace_member (^^cls_tmpl_alias));
+ static_assert (is_namespace_member (^^cls_tmpl_alias<int>));
+ static_assert (is_namespace_member (^^Enum));
+ static_assert (is_namespace_member (^^Enum::A));
+ static_assert (is_namespace_member (^^A));
+ static_assert (is_namespace_member (^^Enum_class));
+ static_assert (!is_namespace_member (^^Enum_class::A));
+ static_assert (is_namespace_member (^^decomp));
+ static_assert (is_namespace_member (^^decomp_ref));
+ static_assert (is_namespace_member (^^arr));
+ static_assert (is_namespace_member (^^NN::a));
+ static_assert (is_namespace_member (^^NN::a));
+ static_assert (is_namespace_member (^^NN::b));
+ static_assert (is_namespace_member (^^NN::c));
+ static_assert (is_namespace_member (^^NN::d));
+ static_assert (is_namespace_member (^^NN::ns));
+ static_assert (is_namespace_member (^^NN::ns_alias));
+ static_assert (is_namespace_member (^^NN::E));
+ static_assert (is_namespace_member (^^NN::F));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_namespace_member (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_namespace_member (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_namespace_member (^^x));
+   static_assert (!is_namespace_member (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_namespace_member (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_namespace_member (^^S));
+   static_assert (!is_namespace_member (^^E));
+   static_assert (!is_namespace_member (^^F));
+   static_assert (!is_namespace_member (^^G));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_noexcept1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_noexcept1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_noexcept1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_noexcept1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,180 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_noexcept.
+ 
+ #include <meta>
+ 
+ // Basic noexcept specifications
+ void noexcept_function () noexcept;
+ void noexcept_true_function () noexcept(true);
+ void noexcept_false_function () noexcept(false);
+ void not_noexcept_function ();
+ 
+ static_assert(std::meta::is_noexcept (^^noexcept_function));
+ static_assert(std::meta::is_noexcept (^^noexcept_true_function));
+ static_assert(!std::meta::is_noexcept (^^noexcept_false_function));
+ static_assert(!std::meta::is_noexcept (^^not_noexcept_function));
+ 
+ // throw()
+ void throw_function () throw();
+ // void func () throw(int) -->  error: ISO C++17 does not allow dynamic exception specifications
+ 
+ static_assert (std::meta::is_noexcept (^^throw_function));
+ 
+ // Template functions
+ template <class T>
+ void noexcept_template_function(T param) noexcept(true);
+ 
+ // Note 2 from P2996: If r represents a function template that is declared noexcept,
+ // is_noexcept(r) is still false because in general such queries
+ // for templates cannot be answered.
+ static_assert (!std::meta::is_noexcept (^^noexcept_template_function));
+ // Note 5 from P2996: A template specialization is not a template.
+ static_assert (std::meta::is_noexcept (^^noexcept_template_function<bool>));
+ 
+ template <class T>
+ void template_function(T param);
+ 
+ static_assert (!std::meta::is_noexcept (^^template_function));
+ static_assert (!std::meta::is_noexcept (^^template_function<int>));
+ 
+ template<bool B>
+ void conditional_noexcept() noexcept(B);
+ 
+ static_assert (!std::meta::is_noexcept (^^conditional_noexcept));
+ static_assert (std::meta::is_noexcept (^^conditional_noexcept<true>));
+ static_assert (!std::meta::is_noexcept (^^conditional_noexcept<false>));
+ 
+ struct S {
+   void noexcept_method() noexcept;
+   void noexcept_true_method() noexcept(true);
+   void noexcept_false_method() noexcept(false);
+   void not_noexcept_method();
+ 
+   virtual void noexcept_virtual_method() noexcept {}
+   virtual void noexcept_true_virtual_method() noexcept(true) {}
+   virtual void noexcept_false_virtual_method() noexcept(false) {}
+   virtual void not_noexcept_virtual_method() {}
+ 
+   template <typename T>
+   void noexcept_template_method() noexcept;
+   template <typename T>
+   void noexcept_true_template_method() noexcept(true);
+   template <typename T>
+   void noexcept_false_template_method() noexcept(false);
+   template <typename T>
+   void noexcept_cond_template_method() noexcept(sizeof(T) > 4);
+   template <typename T>
+   void not_noexcept_template_method();
+ };
+ 
+ // Methods
+ static_assert (std::meta::is_noexcept (^^S::noexcept_method));
+ static_assert (std::meta::is_noexcept (^^S::noexcept_true_method));
+ static_assert (!std::meta::is_noexcept (^^S::noexcept_false_method));
+ static_assert (!std::meta::is_noexcept (^^S::not_noexcept_method));
+ 
+ // Virtual methods
+ static_assert (std::meta::is_noexcept (^^S::noexcept_virtual_method));
+ static_assert (std::meta::is_noexcept (^^S::noexcept_true_virtual_method));
+ static_assert (!std::meta::is_noexcept (^^S::noexcept_false_virtual_method));
+ static_assert (!std::meta::is_noexcept (^^S::not_noexcept_virtual_method));
+ 
+ // Template methods
+ static_assert (!std::meta::is_noexcept (^^S::noexcept_template_method));
+ static_assert (!std::meta::is_noexcept (^^S::noexcept_true_template_method));
+ static_assert (!std::meta::is_noexcept (^^S::noexcept_false_template_method));
+ static_assert (!std::meta::is_noexcept (^^S::noexcept_cond_template_method));
+ static_assert (!std::meta::is_noexcept (^^S::not_noexcept_template_method));
+ 
+ static_assert (std::meta::is_noexcept (^^S::noexcept_template_method<int>));
+ static_assert (std::meta::is_noexcept (^^S::noexcept_true_template_method<int>));
+ static_assert (!std::meta::is_noexcept (^^S::noexcept_false_template_method<int>));
+ static_assert (!std::meta::is_noexcept (^^S::not_noexcept_template_method<int>));
+ 
+ struct SS : public S {
+ 
+ };
+ 
+ // Inherited methods
+ static_assert (std::meta::is_noexcept (^^SS::noexcept_method));
+ static_assert (std::meta::is_noexcept (^^SS::noexcept_true_method));
+ static_assert (!std::meta::is_noexcept (^^SS::noexcept_false_method));
+ static_assert (!std::meta::is_noexcept (^^SS::not_noexcept_method));
+ 
+ // Function types
+ static_assert (std::meta::is_noexcept (^^void() noexcept));
+ static_assert (!std::meta::is_noexcept (^^void()));
+ 
+ using not_noexcept_func_type = void();
+ using noexcept_func_type = void() noexcept;
+ 
+ static_assert (!std::meta::is_noexcept (^^not_noexcept_func_type));
+ static_assert (std::meta::is_noexcept (^^noexcept_func_type));
+ 
+ template<typename T, bool B>
+ using conditional_noexcept_func_type = void(T) noexcept(B);
+ 
+ static_assert (!std::meta::is_noexcept (^^conditional_noexcept_func_type));
+ static_assert (!std::meta::is_noexcept (^^conditional_noexcept_func_type<int, false>));
+ static_assert (std::meta::is_noexcept (^^conditional_noexcept_func_type<int, true>));
+ 
+ // Constructors
+ struct T {
+     T() = default;
+ 
+     T(int) {
+       int a;
+       static_assert (!std::meta::is_noexcept (std::meta::parent_of (^^a)));
+     }
+ 
+     T(double) noexcept {
+       int a;
+       static_assert (std::meta::is_noexcept (std::meta::parent_of (^^a)));
+     }
+ 
+     T(bool) noexcept(true) {
+       int a;
+       static_assert (std::meta::is_noexcept (std::meta::parent_of (^^a)));
+     }
+ 
+     T(S) noexcept(false) {
+       int a;
+       static_assert (!std::meta::is_noexcept (std::meta::parent_of (^^a)));
+     }
+ };
+ 
+ static_assert (noexcept (T()));
+ static_assert (!noexcept (T(123)));
+ static_assert (noexcept (T(123.123)));
+ static_assert (noexcept (T(true)));
+ static_assert (!noexcept (T(S())));
+ 
+ // Destructors
+ struct U { };
+ U u;
+ static_assert (std::meta::is_noexcept (^^U::~U));
+ static_assert (noexcept (u.~U()));
+ 
+ struct V { ~V() = delete; };
+ static_assert (std::meta::is_noexcept (^^V::~V));
+ 
+ struct W { ~W() = default; };
+ W w;
+ static_assert (std::meta::is_noexcept (^^W::~W));
+ static_assert (noexcept (w.~W()));
+ 
+ struct X { ~X(); };
+ X x;
+ static_assert (std::meta::is_noexcept (^^X::~X));
+ static_assert (noexcept (x.~X()));
+ 
+ struct Y { ~Y() noexcept(true); };
+ Y y;
+ static_assert (std::meta::is_noexcept (^^Y::~Y));
+ static_assert (noexcept (y.~Y()));
+ 
+ struct Z { ~Z() noexcept(false); };
+ Z z;
+ static_assert(!std::meta::is_noexcept (^^Z::~Z));
+ static_assert(!noexcept (z.~Z()));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_noexcept2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_noexcept2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_noexcept2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_noexcept2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,65 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_noexcept.  Negative cases.
+ 
+ #include <meta>
+ #include <functional>
+ 
+ // Lambdas
+ const auto noexcept_lambda = []() noexcept {};
+ const auto not_noexcept_lambda = []{};
+ 
+ static_assert (!std::meta::is_noexcept (^^noexcept_lambda));
+ static_assert (!std::meta::is_noexcept (^^not_noexcept_lambda));
+ 
+ // Template lamdas
+ const auto noexcept_template_lambda = []<typename T>(T arg) noexcept {};
+ const auto not_noexcept_template_lambda = []<typename T>(T arg) {};
+ 
+ static_assert (!std::meta::is_noexcept (^^noexcept_template_lambda));
+ static_assert (!std::meta::is_noexcept (^^not_noexcept_template_lambda));
+ 
+ void noexcept_function () noexcept;
+ void not_noexcept_function ();
+ 
+ // Function pointers
+ void (*noexcept_function_pointer)() noexcept = noexcept_function;
+ void (*not_noexcept_function_pointer)() = not_noexcept_function;
+ 
+ static_assert (!std::meta::is_noexcept (^^noexcept_function_pointer));
+ static_assert (!std::meta::is_noexcept (^^not_noexcept_function_pointer));
+ 
+ // Function reference
+ void (&noexcept_function_reference)() noexcept = noexcept_function;
+ void (&not_noexcept_function_reference)() = not_noexcept_function;
+ 
+ static_assert (!std::meta::is_noexcept (^^noexcept_function_reference));
+ static_assert (!std::meta::is_noexcept (^^not_noexcept_function_reference));
+ 
+ struct S {
+ };
+ 
+ // Member function pointers
+ void (S::*noexcept_member_pointer)() noexcept;
+ void (S::*not_noexcept_member_pointer)();
+ 
+ static_assert (!std::meta::is_noexcept (^^noexcept_member_pointer));
+ static_assert (!std::meta::is_noexcept (^^not_noexcept_member_pointer));
+ 
+ // Function pointer as a parameter in function
+ void function_with_noexcept_function_pointer_as_input(void (*noexcept_function_pointer)() noexcept) {
+   static_assert (!std::meta::is_noexcept (^^noexcept_function_pointer));
+ }
+ 
+ void function_with_not_noexcept_function_pointer_as_input(void (*not_noexcept_function_pointer)()) {
+   static_assert (!std::meta::is_noexcept (^^not_noexcept_function_pointer));
+ }
+ 
+ // Misc
+ std::function<void(int)> f;
+ int n = 42;
+ 
+ static_assert (!std::meta::is_noexcept (^^f));
+ static_assert (!std::meta::is_noexcept (^^n));
+ static_assert (!std::meta::is_noexcept (^^S));
+ static_assert (!std::meta::is_noexcept (^^::));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_noexcept3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_noexcept3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_noexcept3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_noexcept3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,175 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_noexcept.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S1 {
+   void foo () noexcept {
+     static_assert (is_noexcept (^^foo));
+   }
+ 
+   void bar () {
+     static_assert (!is_noexcept (^^bar));
+   }
+ };
+ 
+ template<typename>
+ struct S2 {
+   void foo () noexcept {
+     static_assert (is_noexcept (^^foo));
+   }
+ 
+   void bar () {
+     static_assert (!is_noexcept (^^bar));
+   }
+ 
+   template<typename>
+   void tfoo () noexcept {
+     static_assert (is_noexcept (^^tfoo<int>));
+   }
+ 
+   template<typename>
+   void tbar () {
+     static_assert (!is_noexcept (^^tbar<int>));
+   }
+ };
+ 
+ S2<int> s2;
+ 
+ void fn1 ();
+ void fn2 () noexcept;
+ void fn3 () noexcept(false);
+ 
+ static_assert (!is_noexcept (type_of (^^::fn1)));
+ static_assert (is_noexcept (type_of (^^::fn2)));
+ static_assert (!is_noexcept (type_of (^^::fn3)));
+ 
+ static_assert (!is_noexcept (reflect_constant (&::fn1)));
+ static_assert (!is_noexcept (reflect_constant (&::fn2)));
+ static_assert (!is_noexcept (reflect_constant (&::fn3)));
+ 
+ static_assert (!is_noexcept (type_of (reflect_constant (&::fn1))));
+ static_assert (!is_noexcept (type_of (reflect_constant (&::fn2))));
+ static_assert (!is_noexcept (type_of (reflect_constant (&::fn3))));
+ 
+ template<typename>
+ void tfn1 ();
+ template<typename>
+ void tfn2 () noexcept;
+ template<typename>
+ void tfn3 () noexcept(false);
+ 
+ static_assert (!is_noexcept (type_of (^^::tfn1<int>)));
+ static_assert (is_noexcept (type_of (^^::tfn2<int>)));
+ static_assert (!is_noexcept (type_of (^^::tfn3<int>)));
+ 
+ static_assert (!is_noexcept (reflect_constant (^^::tfn1<int>)));
+ static_assert (!is_noexcept (reflect_constant (^^::tfn2<int>)));
+ static_assert (!is_noexcept (reflect_constant (^^::tfn3<int>)));
+ 
+ static_assert (!is_noexcept (type_of (reflect_constant (^^::tfn1<int>))));
+ static_assert (!is_noexcept (type_of (reflect_constant (^^::tfn2<int>))));
+ static_assert (!is_noexcept (type_of (reflect_constant (^^::tfn3<int>))));
+ 
+ struct S {
+   void memfn1 ();
+   void memfn2 () noexcept;
+   void memfn3 () noexcept(false);
+ 
+   virtual void vmemfn1 () {}
+   virtual void vmemfn2 () noexcept {}
+   virtual void vmemfn3 () noexcept(false) {}
+ 
+   template<typename>
+   void tmemfn1 ();
+   template<typename>
+   void tmemfn2 () noexcept;
+   template<typename>
+   void tmemfn3 () noexcept(false);
+ };
+ 
+ static_assert (!is_noexcept (type_of (^^S::memfn1)));
+ static_assert (is_noexcept (type_of (^^S::memfn2)));
+ static_assert (!is_noexcept (type_of (^^S::memfn3)));
+ 
+ static_assert (!is_noexcept (type_of (^^S::vmemfn1)));
+ static_assert (is_noexcept (type_of (^^S::vmemfn2)));
+ static_assert (!is_noexcept (type_of (^^S::vmemfn3)));
+ 
+ static_assert (!is_noexcept (type_of (^^S::tmemfn1<int>)));
+ static_assert (is_noexcept (type_of (^^S::tmemfn2<int>)));
+ static_assert (!is_noexcept (type_of (^^S::tmemfn3<int>)));
+ 
+ static_assert (!is_noexcept (reflect_constant (&S::memfn1)));
+ static_assert (!is_noexcept (reflect_constant (&S::memfn2)));
+ static_assert (!is_noexcept (reflect_constant (&S::memfn3)));
+ 
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::memfn1))));
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::memfn2))));
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::memfn3))));
+ 
+ static_assert (!is_noexcept (reflect_constant (&S::vmemfn1)));
+ static_assert (!is_noexcept (reflect_constant (&S::vmemfn2)));
+ static_assert (!is_noexcept (reflect_constant (&S::vmemfn3)));
+ 
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::vmemfn1))));
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::vmemfn2))));
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::vmemfn3))));
+ 
+ static_assert (!is_noexcept (reflect_constant (&S::tmemfn1<int>)));
+ static_assert (!is_noexcept (reflect_constant (&S::tmemfn2<int>)));
+ static_assert (!is_noexcept (reflect_constant (&S::tmemfn3<int>)));
+ 
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::tmemfn1<int>))));
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::tmemfn2<int>))));
+ static_assert (!is_noexcept (type_of (reflect_constant (&S::tmemfn3<int>))));
+ 
+ constexpr auto noexcept_lambda = []() noexcept {};
+ constexpr auto not_noexcept_lambda = []{};
+ static_assert (!is_noexcept (type_of (^^noexcept_lambda)));
+ static_assert (!is_noexcept (type_of (^^not_noexcept_lambda)));
+ 
+ constexpr auto noexcept_generic_lambda = []<typename T>() noexcept {};
+ constexpr auto not_noexcept_generic_lambda = []<typename T>() {};
+ static_assert (!is_noexcept (type_of (^^noexcept_generic_lambda)));
+ static_assert (!is_noexcept (type_of (^^not_noexcept_generic_lambda)));
+ 
+ struct T {
+   static const int static_mem = 1;
+   int non_static_mem = 2;
+ };
+ 
+ template <typename>
+ struct TT {};
+ 
+ enum class EC { X };
+ enum E { X };
+ 
+ static auto static_x = 1;
+ auto non_static_x = static_x;
+ auto t = T();
+ auto template_t = TT<int>();
+ int c_array[] = {1, 2};
+ auto [sb1, sb2] = c_array;
+ 
+ static_assert (!is_noexcept (^^static_x));
+ static_assert (!is_noexcept (type_of (^^static_x)));
+ static_assert (!is_noexcept (^^non_static_x));
+ static_assert (!is_noexcept (type_of (^^non_static_x)));
+ static_assert (!is_noexcept (^^T::static_mem));
+ static_assert (!is_noexcept (type_of (^^T::static_mem)));
+ static_assert (!is_noexcept (^^sb1));
+ static_assert (!is_noexcept (^^T::non_static_mem));
+ static_assert (!is_noexcept (type_of (^^T::non_static_mem)));
+ static_assert (!is_noexcept (^^TT));
+ static_assert (!is_noexcept (^^template_t));
+ static_assert (!is_noexcept (type_of (^^template_t)));
+ static_assert (!is_noexcept (^^EC));
+ static_assert (!is_noexcept (^^EC::X));
+ static_assert (!is_noexcept (type_of (^^EC::X)));
+ static_assert (!is_noexcept (^^E));
+ static_assert (!is_noexcept (^^X));
+ static_assert (!is_noexcept (type_of (^^X)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_noexcept4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_noexcept4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_noexcept4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_noexcept4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,120 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_noexcept.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template<bool Noex>
+ struct Mem {
+   Mem() noexcept(Noex);
+   Mem(Mem const&) noexcept(Noex);
+   Mem(Mem&&) noexcept(Noex);
+   Mem& operator=(Mem const&) noexcept(Noex);
+   Mem& operator=(Mem&&) noexcept(Noex);
+   ~Mem() noexcept(Noex);
+ 
+   bool operator==(const Mem&) const noexcept(Noex);
+   std::strong_ordering operator<=>(const Mem&) const noexcept(Noex);
+ };
+ 
+ template<typename F>
+ consteval info
+ select_mem(info clazz, F f)
+ {
+   for (info x : members_of(clazz, access_context::unchecked()))
+     if (f(x))
+       return x;
+ }
+ 
+ template<bool Noex>
+ struct ExplicitDef
+ {
+   ExplicitDef() = default;
+   ExplicitDef(const ExplicitDef&) = default;
+   ExplicitDef(ExplicitDef&&) = default;
+ 
+   ExplicitDef& operator=(const ExplicitDef&) = default;
+   ExplicitDef& operator=(ExplicitDef&&) = default;
+ 
+   ~ExplicitDef() = default;
+ 
+   Mem<Noex> d;
+ };
+ 
+ static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_default_constructor)));
+ static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_copy_constructor)));
+ static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_move_constructor)));
+ static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_copy_assignment)));
+ static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_move_assignment)));
+ static_assert (is_noexcept (select_mem (^^ExplicitDef<true>, is_destructor)));
+ 
+ static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_default_constructor)));
+ static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_copy_constructor)));
+ static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_move_constructor)));
+ static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_copy_assignment)));
+ static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_move_assignment)));
+ static_assert (!is_noexcept (select_mem (^^ExplicitDef<false>, is_destructor)));
+ 
+ template<bool Noex>
+ struct ImplicitDef
+ {
+   Mem<Noex> d;
+ };
+ 
+ static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_default_constructor)));
+ static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_copy_constructor)));
+ static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_move_constructor)));
+ static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_copy_assignment)));
+ static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_move_assignment)));
+ static_assert (is_noexcept (select_mem (^^ImplicitDef<true>, is_destructor)));
+ 
+ static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_default_constructor)));
+ static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_copy_constructor)));
+ static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_move_constructor)));
+ static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_copy_assignment)));
+ static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_move_assignment)));
+ static_assert (!is_noexcept (select_mem (^^ImplicitDef<false>, is_destructor)));
+ 
+ template<bool Noex>
+ struct ExplicitRelOps
+ {
+   bool operator==(const ExplicitRelOps&) const = default;
+   auto operator<=>(const ExplicitRelOps&) const = default;
+ 
+   Mem<Noex> d;
+ };
+ static_assert (is_noexcept (^^ExplicitRelOps<true>::operator==));
+ static_assert (is_noexcept (^^ExplicitRelOps<true>::operator<=>));
+ 
+ ExplicitRelOps<true> x1;
+ static_assert (noexcept (x1 == x1));
+ static_assert (noexcept (x1 <=> x1));
+ static_assert (is_noexcept (^^ExplicitRelOps<true>::operator==));
+ static_assert (is_noexcept (^^ExplicitRelOps<true>::operator<=>));
+ 
+ static_assert (!is_noexcept (^^ExplicitRelOps<false>::operator==));
+ static_assert (!is_noexcept (^^ExplicitRelOps<false>::operator<=>));
+ 
+ template<bool Noex>
+ struct ImplicitRelOps
+ {
+   // operator== is implicitly declared
+   auto operator<=>(const ImplicitRelOps&) const = default;
+ 
+   Mem<Noex> d;
+ };
+ 
+ static_assert (is_noexcept (^^ImplicitRelOps<true>::operator==));
+ static_assert (is_noexcept (^^ImplicitRelOps<true>::operator<=>));
+ 
+ ImplicitRelOps<true> x2;
+ static_assert (noexcept (x2 == x2));
+ static_assert (noexcept (x2 <=> x2));
+ static_assert (is_noexcept (^^ImplicitRelOps<true>::operator==));
+ static_assert (is_noexcept (^^ImplicitRelOps<true>::operator<=>));
+ 
+ static_assert (!is_noexcept (^^ImplicitRelOps<false>::operator==));
+ static_assert (!is_noexcept (^^ImplicitRelOps<false>::operator<=>));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_nonstatic_data_member1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_nonstatic_data_member1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_nonstatic_data_member1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_nonstatic_data_member1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,127 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_nonstatic_data_member.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_nonstatic_data_member (null_reflection));
+ static_assert (!is_nonstatic_data_member (^^::));
+ static_assert (!is_nonstatic_data_member (^^ns));
+ static_assert (!is_nonstatic_data_member (^^ns_alias));
+ static_assert (!is_nonstatic_data_member (reflect_constant (3)));
+ static_assert (!is_nonstatic_data_member (^^cls));
+ static_assert (is_nonstatic_data_member (^^cls::dm));
+ static_assert (is_nonstatic_data_member (^^cls::ref_dm));
+ static_assert (!is_nonstatic_data_member (^^cls::static_dm));
+ static_assert (!is_nonstatic_data_member (^^cls::mem_fun));
+ static_assert (!is_nonstatic_data_member (^^cls::static_mem_fun));
+ static_assert (!is_nonstatic_data_member (^^cls::type));
+ static_assert (!is_nonstatic_data_member (^^cls::E));
+ static_assert (!is_nonstatic_data_member (^^cls::B));
+ static_assert (!is_nonstatic_data_member (^^cls::C));
+ static_assert (!is_nonstatic_data_member (^^cls::D));
+ static_assert (!is_nonstatic_data_member (^^cls::F));
+ static_assert (!is_nonstatic_data_member (^^cls::F::G));
+ static_assert (!is_nonstatic_data_member (^^cls::F::H));
+ static_assert (!is_nonstatic_data_member (^^cls::S));
+ static_assert (!is_nonstatic_data_member (^^cls::U));
+ static_assert (!is_nonstatic_data_member (^^cls::foo));
+ static_assert (!is_nonstatic_data_member (^^cls::foo <0>));
+ static_assert (!is_nonstatic_data_member (^^cls::bar));
+ static_assert (!is_nonstatic_data_member (^^cls::bar <42>));
+ static_assert (!is_nonstatic_data_member (^^cls_var));
+ static_assert (!is_nonstatic_data_member (^^onion));
+ static_assert (is_nonstatic_data_member (^^anon));
+ static_assert (!is_nonstatic_data_member (^^fun));
+ static_assert (!is_nonstatic_data_member (^^alias));
+ static_assert (!is_nonstatic_data_member (^^var));
+ static_assert (!is_nonstatic_data_member (^^ref));
+ static_assert (!is_nonstatic_data_member (^^rref));
+ static_assert (!is_nonstatic_data_member (^^ptr));
+ static_assert (!is_nonstatic_data_member (^^cls_tmpl));
+ static_assert (!is_nonstatic_data_member (^^cls_tmpl<int>));
+ static_assert (!is_nonstatic_data_member (^^incomplete_cls<int>));
+ static_assert (!is_nonstatic_data_member (^^fun_tmpl));
+ static_assert (!is_nonstatic_data_member (^^fun_tmpl<int>));
+ static_assert (!is_nonstatic_data_member (^^conc));
+ static_assert (!is_nonstatic_data_member (substitute (^^conc, { ^^int })));
+ static_assert (!is_nonstatic_data_member (^^var_tmpl));
+ static_assert (!is_nonstatic_data_member (^^var_tmpl<int>));
+ static_assert (!is_nonstatic_data_member (^^cls_tmpl_alias));
+ static_assert (!is_nonstatic_data_member (^^cls_tmpl_alias<int>));
+ static_assert (!is_nonstatic_data_member (^^Enum));
+ static_assert (!is_nonstatic_data_member (^^Enum::A));
+ static_assert (!is_nonstatic_data_member (^^Enum_class));
+ static_assert (!is_nonstatic_data_member (^^Enum_class::A));
+ static_assert (!is_nonstatic_data_member (^^decomp));
+ static_assert (!is_nonstatic_data_member (^^decomp_ref));
+ static_assert (!is_nonstatic_data_member (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_nonstatic_data_member (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_nonstatic_data_member (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_nonstatic_data_member (^^x));
+   static_assert (!is_nonstatic_data_member (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_nonstatic_data_member (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_nonstatic_data_member (^^S));
+   static_assert (!is_nonstatic_data_member (^^E));
+   static_assert (!is_nonstatic_data_member (^^F));
+   static_assert (!is_nonstatic_data_member (^^G));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_object1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_object1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_object1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_object1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_object.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_object (null_reflection));
+ static_assert (!is_object (^^::));
+ static_assert (!is_object (^^ns));
+ static_assert (!is_object (^^ns_alias));
+ static_assert (!is_object (reflect_constant (3)));
+ static_assert (!is_object (^^cls));
+ static_assert (!is_object (^^cls::dm));
+ static_assert (!is_object (^^cls::ref_dm));
+ static_assert (!is_object (^^cls::static_dm));
+ static_assert (!is_object (^^cls::mem_fun));
+ static_assert (!is_object (^^cls::static_mem_fun));
+ static_assert (!is_object (^^cls::type));
+ static_assert (!is_object (^^cls_var));
+ static_assert (!is_object (^^onion));
+ static_assert (!is_object (^^anon));
+ static_assert (!is_object (^^fun));
+ static_assert (!is_object (^^alias));
+ static_assert (!is_object (^^var));
+ static_assert (!is_object (^^ref));
+ static_assert (!is_object (^^rref));
+ static_assert (!is_object (^^ptr));
+ static_assert (!is_object (^^cls_tmpl));
+ static_assert (!is_object (^^cls_tmpl<int>));
+ static_assert (!is_object (^^incomplete_cls<int>));
+ static_assert (!is_object (^^fun_tmpl));
+ static_assert (!is_object (^^fun_tmpl<int>));
+ static_assert (!is_object (^^conc));
+ static_assert (!is_object (substitute (^^conc, { ^^int })));
+ static_assert (!is_object (^^var_tmpl));
+ static_assert (!is_object (^^var_tmpl<int>));
+ static_assert (!is_object (^^cls_tmpl_alias));
+ static_assert (!is_object (^^cls_tmpl_alias<int>));
+ static_assert (!is_object (^^Enum));
+ static_assert (!is_object (^^Enum::A));
+ static_assert (!is_object (^^Enum_class));
+ static_assert (!is_object (^^Enum_class::A));
+ static_assert (!is_object (^^decomp));
+ static_assert (!is_object (^^decomp_ref));
+ static_assert (!is_object (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_object (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_object (bases_of (^^Derived, access_context::unchecked ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_object (^^T));
+   static_assert (!is_object (R));
+   static_assert (!is_object (R2));
+   static_assert (!is_object (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!is_object (^^p));
+   static_assert (!is_object (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_object2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_object2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_object2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_object2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_object.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ void f();
+ 
+ template <void (&F)()>
+ consteval void tfn() { }
+ 
+ static_assert (!is_object (template_arguments_of (^^tfn<f>)[0]));
+ static_assert (!is_object (^^f));
+ static_assert (template_arguments_of (^^tfn<f>)[0] == ^^f);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_operator_function1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_operator_function1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_operator_function1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_operator_function1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_operator_function.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S &operator+(const S&);
+ 
+   template <typename T>
+   S &operator-(const S&);
+ 
+   operator int();
+ 
+   void fn();
+ };
+ 
+ struct T {
+   template <typename T>
+   operator T();
+ };
+ 
+ bool operator&&(const S&, const S&);
+ 
+ template <typename T>
+ bool operator||(const S&, const T&);
+ 
+ int operator""_a(const char *);
+ 
+ template<char...>
+ int operator""_b();
+ 
+ constexpr auto conversion_template
+   = (members_of (^^T, access_context::current ()) | std::views::filter (is_template)).front ();
+ 
+ static_assert (!is_operator_function (null_reflection));
+ static_assert (!is_operator_function (^^int));
+ static_assert (!is_operator_function (^^::));
+ static_assert (!is_operator_function (^^foo));
+ static_assert (is_operator_function (^^S::operator+));
+ static_assert (is_operator_function (^^operator&&));
+ static_assert (!is_operator_function (^^operator||));
+ static_assert (is_operator_function (^^operator||<int>));
+ static_assert (!is_operator_function (^^S::operator-));
+ static_assert (is_operator_function (^^S::operator-<int>));
+ static_assert (!is_operator_function (^^S::operator int));
+ static_assert (!is_operator_function (conversion_template));
+ static_assert (!is_operator_function (^^S::fn));
+ static_assert (!is_operator_function (^^operator""_a));
+ static_assert (!is_operator_function (^^operator""_b));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_operator_function_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_operator_function_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_operator_function_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_operator_function_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,57 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_operator_function_template.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S &operator+(const S&);
+ 
+   template <typename T>
+   S &operator-(const S&);
+ 
+   operator int();
+ 
+   void fn();
+ };
+ 
+ struct T {
+   template <typename T>
+   operator T ();
+ };
+ 
+ bool operator&&(const S&, const S&);
+ 
+ template <typename T>
+ bool operator||(const S&, const T&);
+ 
+ int operator""_a(const char *);
+ 
+ template<char...>
+ int operator""_b();
+ 
+ constexpr auto conversion_template
+   = (members_of (^^T, access_context::current ()) | std::views::filter (is_template)).front ();
+ 
+ static_assert (!is_operator_function_template (null_reflection));
+ static_assert (!is_operator_function_template (^^int));
+ static_assert (!is_operator_function_template (^^::));
+ static_assert (!is_operator_function_template (^^foo));
+ static_assert (!is_operator_function_template (^^S::operator+));
+ static_assert (!is_operator_function_template (^^operator&&));
+ static_assert (is_operator_function_template (^^operator||));
+ static_assert (!is_operator_function_template (^^operator||<int>));
+ static_assert (is_operator_function_template (^^S::operator-));
+ static_assert (!is_operator_function_template (^^S::operator-<int>));
+ static_assert (is_operator_function_template (template_of (^^S::operator-<int>)));
+ static_assert (!is_operator_function_template (^^S::operator int));
+ static_assert (!is_operator_function_template (conversion_template));
+ static_assert (!is_operator_function_template (^^S::fn));
+ static_assert (!is_operator_function_template (^^operator""_a));
+ static_assert (!is_operator_function_template (^^operator""_b));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_override1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_override1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_override1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_override1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,154 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_override.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_override (null_reflection));
+ static_assert (!is_override (^^::));
+ static_assert (!is_override (^^ns));
+ static_assert (!is_override (^^ns_alias));
+ static_assert (!is_override (reflect_constant (3)));
+ static_assert (!is_override (^^cls));
+ static_assert (!is_override (^^cls::dm));
+ static_assert (!is_override (^^cls::ref_dm));
+ static_assert (!is_override (^^cls::static_dm));
+ static_assert (!is_override (^^cls::mem_fun));
+ static_assert (!is_override (^^cls::static_mem_fun));
+ static_assert (!is_override (^^cls::type));
+ static_assert (!is_override (^^cls_var));
+ static_assert (!is_override (^^onion));
+ static_assert (!is_override (^^anon));
+ static_assert (!is_override (^^fun));
+ static_assert (!is_override (^^alias));
+ static_assert (!is_override (^^var));
+ static_assert (!is_override (^^ref));
+ static_assert (!is_override (^^rref));
+ static_assert (!is_override (^^ptr));
+ static_assert (!is_override (^^cls_tmpl));
+ static_assert (!is_override (^^cls_tmpl<int>));
+ static_assert (!is_override (^^incomplete_cls<int>));
+ static_assert (!is_override (^^fun_tmpl));
+ static_assert (!is_override (^^fun_tmpl<int>));
+ static_assert (!is_override (^^conc));
+ static_assert (!is_override (substitute (^^conc, { ^^int })));
+ static_assert (!is_override (^^var_tmpl));
+ static_assert (!is_override (^^var_tmpl<int>));
+ static_assert (!is_override (^^cls_tmpl_alias));
+ static_assert (!is_override (^^cls_tmpl_alias<int>));
+ static_assert (!is_override (^^Enum));
+ static_assert (!is_override (^^Enum::A));
+ static_assert (!is_override (^^Enum_class));
+ static_assert (!is_override (^^Enum_class::A));
+ static_assert (!is_override (^^decomp));
+ static_assert (!is_override (^^decomp_ref));
+ static_assert (!is_override (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_override (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_override (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_override (^^T));
+   static_assert (!is_override (R));
+   static_assert (!is_override (R2));
+   static_assert (!is_override (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^conc>();
+   static_assert (!is_override (^^p));
+   static_assert (!is_override (^^c));
+ }
+ 
+ struct Base2 {
+   void foo ();
+   virtual void bar ();
+   virtual void baz ();
+   virtual void qux ();
+   virtual void corge () = 0;
+   virtual void garply ();
+   virtual ~Base2 ();
+ };
+ 
+ struct Derived2 : Base2 {
+   void foo ();
+   virtual void baz ();
+   virtual void qux () override;
+   virtual void corge ();
+   virtual void freddy ();
+ };
+ 
+ struct Derived3 : Derived2 {
+   void foo ();
+   virtual void qux () override;
+   virtual void corge ();
+   virtual void freddy ();
+ };
+ 
+ static_assert (!is_override (^^Base2::foo));
+ static_assert (!is_override (^^Base2::bar));
+ static_assert (!is_override (^^Base2::baz));
+ static_assert (!is_override (^^Base2::qux));
+ static_assert (!is_override (^^Base2::corge));
+ static_assert (!is_override (^^Base2::garply));
+ static_assert (!is_override (^^Base2::~Base2));
+ static_assert (!is_override (^^Derived2::foo));
+ static_assert (!is_override (^^Derived2::bar));
+ static_assert (is_override (^^Derived2::baz));
+ static_assert (is_override (^^Derived2::qux));
+ static_assert (is_override (^^Derived2::corge));
+ static_assert (!is_override (^^Derived2::garply));
+ static_assert (!is_override (^^Derived2::freddy));
+ static_assert (is_override (^^Derived2::~Derived2));
+ static_assert (!is_override (^^Derived3::foo));
+ static_assert (!is_override (^^Derived3::bar));
+ static_assert (is_override (^^Derived3::baz));
+ static_assert (is_override (^^Derived3::qux));
+ static_assert (is_override (^^Derived3::corge));
+ static_assert (!is_override (^^Derived3::garply));
+ static_assert (is_override (^^Derived3::freddy));
+ static_assert (is_override (^^Derived3::~Derived3));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_pure_virtual1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_pure_virtual1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_pure_virtual1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_pure_virtual1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,48 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_pure_virtual.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void func() {}
+ 
+ struct B {
+   void nonvirt();
+   virtual void virt_no_override();
+   virtual void virt_implicit_override();
+   virtual void virt_explicit_override();
+   virtual void pure_virt() = 0;
+   virtual ~B() = 0;
+ };
+ 
+ struct D : B {
+   void nonvirt();
+   void virt_implicit_override();
+   void virt_explicit_override() override;
+   void pure_virt();
+   virtual ~D() = 0;
+ };
+ 
+ struct DD {
+   ~DD() = delete;
+ };
+ 
+ static_assert (!is_pure_virtual (^^func));
+ 
+ static_assert (!is_pure_virtual (^^B::nonvirt));
+ static_assert (!is_pure_virtual (^^B::virt_no_override));
+ static_assert (!is_pure_virtual (^^B::virt_implicit_override));
+ static_assert (!is_pure_virtual (^^B::virt_explicit_override));
+ static_assert (is_pure_virtual (^^B::pure_virt));
+ static_assert (is_pure_virtual (^^B::~B));
+ 
+ static_assert (!is_pure_virtual (^^D::nonvirt));
+ static_assert (!is_pure_virtual (^^D::virt_no_override));
+ static_assert (!is_pure_virtual (^^D::virt_implicit_override));
+ static_assert (!is_pure_virtual (^^D::virt_explicit_override));
+ static_assert (!is_pure_virtual (^^D::pure_virt));
+ static_assert (is_pure_virtual (^^D::~D));
+ 
+ static_assert (!is_pure_virtual (^^DD::~DD));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_special_member_function1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_special_member_function1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_special_member_function1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_special_member_function1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,101 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_special_member_function.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ void foo ();
+ 
+ struct S {
+   S ()
+   {
+     int a;
+     static_assert (is_special_member_function (parent_of (^^a)));
+   }
+   S (int)
+   {
+     int a;
+     static_assert (!is_special_member_function (parent_of (^^a)));
+   }
+   S (const S &)
+   {
+     int a;
+     static_assert (is_special_member_function (parent_of (^^a)));
+   }
+   S (S &&)
+   {
+     int a;
+     static_assert (is_special_member_function (parent_of (^^a)));
+   }
+   S &operator = (const S &)
+   {
+     int a;
+     static_assert (is_special_member_function (parent_of (^^a)));
+     return *this;
+   }
+   S &operator += (const S &)
+   {
+     int a;
+     static_assert (!is_special_member_function (parent_of (^^a)));
+     return *this;
+   }
+   void bar ()
+   {
+     int a;
+     static_assert (!is_special_member_function (parent_of (^^a)));
+   }
+   ~S ()
+   {
+     int a;
+     static_assert (is_special_member_function (parent_of (^^a)));
+   }
+ };
+ 
+ struct T {
+   T &operator = (const S &)
+   {
+     int a;
+     static_assert (!is_special_member_function (parent_of (^^a)));
+     return *this;
+   }
+   T &operator *= (const S &)
+   {
+     int a;
+     static_assert (!is_special_member_function (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct U {
+   template <typename T>
+   U (T &)
+   {
+     T a;
+     static_assert (is_constructor (parent_of (^^a)));
+   }
+   U &operator = (U &&)
+   {
+     int a;
+     static_assert (is_special_member_function (parent_of (^^a)));
+     return *this;
+   }
+ };
+ 
+ struct V {
+   V (int a = 42, long b = 18)
+   {
+     static_assert (is_special_member_function (parent_of (^^a)));
+   }
+ };
+ 
+ static_assert (!is_special_member_function (null_reflection));
+ static_assert (!is_special_member_function (^^int));
+ static_assert (!is_special_member_function (^^::));
+ static_assert (!is_special_member_function (^^foo));
+ static_assert (!is_special_member_function (^^S::bar));
+ static_assert (is_special_member_function (^^S::operator =));
+ static_assert (!is_special_member_function (^^S::operator +=));
+ static_assert (!is_special_member_function (^^T::operator *=));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_static_member1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_static_member1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_static_member1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_static_member1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,127 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_static_member.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_static_member (null_reflection));
+ static_assert (!is_static_member (^^::));
+ static_assert (!is_static_member (^^ns));
+ static_assert (!is_static_member (^^ns_alias));
+ static_assert (!is_static_member (reflect_constant (3)));
+ static_assert (!is_static_member (^^cls));
+ static_assert (!is_static_member (^^cls::dm));
+ static_assert (!is_static_member (^^cls::ref_dm));
+ static_assert (is_static_member (^^cls::static_dm));
+ static_assert (!is_static_member (^^cls::mem_fun));
+ static_assert (is_static_member (^^cls::static_mem_fun));
+ static_assert (!is_static_member (^^cls::type));
+ static_assert (!is_static_member (^^cls::E));
+ static_assert (!is_static_member (^^cls::B));
+ static_assert (!is_static_member (^^cls::C));
+ static_assert (!is_static_member (^^cls::D));
+ static_assert (!is_static_member (^^cls::F));
+ static_assert (!is_static_member (^^cls::F::G));
+ static_assert (!is_static_member (^^cls::F::H));
+ static_assert (!is_static_member (^^cls::S));
+ static_assert (!is_static_member (^^cls::U));
+ static_assert (!is_static_member (^^cls::foo));
+ static_assert (!is_static_member (^^cls::foo <0>));
+ static_assert (is_static_member (^^cls::bar));
+ static_assert (is_static_member (^^cls::bar <42>));
+ static_assert (!is_static_member (^^cls_var));
+ static_assert (!is_static_member (^^onion));
+ static_assert (!is_static_member (^^anon));
+ static_assert (!is_static_member (^^fun));
+ static_assert (!is_static_member (^^alias));
+ static_assert (!is_static_member (^^var));
+ static_assert (!is_static_member (^^ref));
+ static_assert (!is_static_member (^^rref));
+ static_assert (!is_static_member (^^ptr));
+ static_assert (!is_static_member (^^cls_tmpl));
+ static_assert (!is_static_member (^^cls_tmpl<int>));
+ static_assert (!is_static_member (^^incomplete_cls<int>));
+ static_assert (!is_static_member (^^fun_tmpl));
+ static_assert (!is_static_member (^^fun_tmpl<int>));
+ static_assert (!is_static_member (^^conc));
+ static_assert (!is_static_member (substitute (^^conc, { ^^int })));
+ static_assert (!is_static_member (^^var_tmpl));
+ static_assert (!is_static_member (^^var_tmpl<int>));
+ static_assert (!is_static_member (^^cls_tmpl_alias));
+ static_assert (!is_static_member (^^cls_tmpl_alias<int>));
+ static_assert (!is_static_member (^^Enum));
+ static_assert (!is_static_member (^^Enum::A));
+ static_assert (!is_static_member (^^Enum_class));
+ static_assert (!is_static_member (^^Enum_class::A));
+ static_assert (!is_static_member (^^decomp));
+ static_assert (!is_static_member (^^decomp_ref));
+ static_assert (!is_static_member (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_static_member (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_static_member (bases_of (^^Derived, access_context::unprivileged ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_static_member (^^x));
+   static_assert (!is_static_member (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_static_member (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_static_member (^^S));
+   static_assert (!is_static_member (^^E));
+   static_assert (!is_static_member (^^F));
+   static_assert (!is_static_member (^^G));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_string_literal1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_string_literal1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_string_literal1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_string_literal1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,40 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::is_string_literal.
+ 
+ #include <meta>
+ 
+ constexpr char a = '\0';
+ constexpr wchar_t b = L'\0';
+ constexpr char16_t c = u'\0';
+ constexpr char32_t d = U'\0';
+ constexpr char8_t e = u8'\0';
+ constexpr char f[] = "foobar";
+ static_assert (!std::is_string_literal (&a));
+ static_assert (!std::is_string_literal (&b));
+ static_assert (!std::is_string_literal (&c));
+ static_assert (!std::is_string_literal (&d));
+ static_assert (!std::is_string_literal (&e));
+ static_assert (!std::is_string_literal (&f[0]));
+ static_assert (!std::is_string_literal (f + 2));
+ static_assert (!std::is_string_literal (&f[2] + 3));
+ static_assert (std::is_string_literal ("abcd"));
+ static_assert (std::is_string_literal (&"abcd"[4]));
+ static_assert (std::is_string_literal ("abcd" + 2));
+ static_assert (std::is_string_literal (&"abcd"[1] + 1));
+ static_assert (std::is_string_literal (L"foobar"));
+ static_assert (std::is_string_literal (&L"foobar"[4]));
+ static_assert (std::is_string_literal (L"foobar" + 2));
+ static_assert (std::is_string_literal (&L"foobar"[1] + 1));
+ static_assert (std::is_string_literal (u"corge"));
+ static_assert (std::is_string_literal (&u"corge"[4]));
+ static_assert (std::is_string_literal (u"corge" + 2));
+ static_assert (std::is_string_literal (&u"corge"[1] + 1));
+ static_assert (std::is_string_literal (U"garply"));
+ static_assert (std::is_string_literal (&U"garply"[4]));
+ static_assert (std::is_string_literal (U"garply" + 2));
+ static_assert (std::is_string_literal (&U"garply"[1] + 1));
+ static_assert (std::is_string_literal (u8"Certe, inquam, pértinax non ero tibíque, si mihi probábis ea, quæ dices, libénter asséntiar."));
+ static_assert (std::is_string_literal (&u8"Certe, inquam, pértinax non ero tibíque, si mihi probábis ea, quæ dices, libénter asséntiar."[4]));
+ static_assert (std::is_string_literal (u8"Certe, inquam, pértinax non ero tibíque, si mihi probábis ea, quæ dices, libénter asséntiar." + 2));
+ static_assert (std::is_string_literal (&u8"Certe, inquam, pértinax non ero tibíque, si mihi probábis ea, quæ dices, libénter asséntiar."[1] + 1));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_structured_binding1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_structured_binding1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_structured_binding1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_structured_binding1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,99 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ #include <meta>
+ #include <tuple>
+ 
+ struct S
+ {
+   int a;
+   int b;
+   double c;
+ };
+ 
+ int
+ main ()
+ {
+   {
+     // The initializer for the structured binding declaration has array type.
+     const int struct_binding[] = { 1, 2, 3 };
+ 
+     auto [x, y, z] = struct_binding;
+ 
+     static_assert (std::meta::is_structured_binding (^^x));
+     static_assert (std::meta::is_structured_binding (^^y));
+     static_assert (std::meta::is_structured_binding (^^z));
+   }
+ 
+   {
+     // The initializer for the structured binding declaration is tuple-like.
+     auto struct_binding = std::make_tuple (1, 2, 3);
+ 
+     auto [x, y, z] = struct_binding;
+ 
+     static_assert (std::meta::is_structured_binding (^^x));
+     static_assert (std::meta::is_structured_binding (^^y));
+     static_assert (std::meta::is_structured_binding (^^z));
+   }
+ 
+   {
+     // The initializer for the structured binding declaration is a struct
+     auto struct_binding = S{ 1, 2, 3.14 };
+     auto [x, y, z] = struct_binding;
+ 
+     static_assert (std::meta::is_structured_binding (^^x));
+     static_assert (std::meta::is_structured_binding (^^y));
+     static_assert (std::meta::is_structured_binding (^^z));
+   }
+ 
+   {
+     // const auto structured binding
+     const int struct_binding[] = { 10, 20 };
+     const auto [x, y] = struct_binding;
+ 
+     static_assert (std::meta::is_structured_binding (^^x));
+     static_assert (std::meta::is_structured_binding (^^y));
+   }
+ 
+   {
+     // auto& structured binding
+     int struct_binding[] = { 30, 40 };
+     auto &[x, y] = struct_binding;
+ 
+     static_assert (std::meta::is_structured_binding (^^x));
+     static_assert (std::meta::is_structured_binding (^^y));
+   }
+ 
+   {
+     // const auto& structured binding
+     const int struct_binding[] = { 50, 60 };
+     const auto &[x, y] = struct_binding;
+ 
+     static_assert (std::meta::is_structured_binding (^^x));
+     static_assert (std::meta::is_structured_binding (^^y));
+   }
+ 
+   {
+     // auto&& with rvalue
+     auto &&[x, y] = std::make_tuple (90, 100);
+ 
+     static_assert (std::meta::is_structured_binding (^^x));
+     static_assert (std::meta::is_structured_binding (^^y));
+   }
+ 
+   {
+     // Negative cases
+     int var = 42;
+     const int const_var = 43;
+     int &ref_var = var;
+ 
+     S s{ 1, 2, 3.14 };
+ 
+     static_assert (!std::meta::is_structured_binding (^^var));
+     static_assert (!std::meta::is_structured_binding (^^const_var));
+     static_assert (!std::meta::is_structured_binding (^^ref_var));
+     static_assert (!std::meta::is_structured_binding (^^s));
+     static_assert (!std::meta::is_structured_binding (^^S));
+     static_assert (!std::meta::is_structured_binding (^^int));
+     static_assert (!std::meta::is_structured_binding (^^::));
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_structured_binding2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_structured_binding2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_structured_binding2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_structured_binding2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,35 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ struct S
+ {
+   int a, b;
+   explicit operator bool () const noexcept { return a == b; }
+ };
+ 
+ template <typename S>
+ void
+ bar ()
+ {
+   if (auto [i, j] = S{ 7, 7 })
+     {
+       constexpr auto ri = ^^i;
+       constexpr auto rj = ^^j;
+ 
+       static_assert (std::meta::is_structured_binding (ri));
+       static_assert (std::meta::is_structured_binding (rj));
+ 
+       static_assert (std::meta::is_structured_binding (^^i));
+       static_assert (std::meta::is_structured_binding (^^j));
+ 
+       static_assert (!std::meta::is_structured_binding (^^S));
+     }
+ }
+ 
+ int
+ main ()
+ {
+   bar<S> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_template.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_template (null_reflection));
+ static_assert (!is_template (^^::));
+ static_assert (!is_template (^^ns));
+ static_assert (!is_template (^^ns_alias));
+ static_assert (!is_template (reflect_constant (3)));
+ static_assert (!is_template (^^cls));
+ static_assert (!is_template (^^cls::dm));
+ static_assert (!is_template (^^cls::ref_dm));
+ static_assert (!is_template (^^cls::static_dm));
+ static_assert (!is_template (^^cls::mem_fun));
+ static_assert (!is_template (^^cls::static_mem_fun));
+ static_assert (!is_template (^^cls::type));
+ static_assert (!is_template (^^cls_var));
+ static_assert (!is_template (^^onion));
+ static_assert (!is_template (^^anon));
+ static_assert (!is_template (^^fun));
+ static_assert (!is_template (^^alias));
+ static_assert (!is_template (^^var));
+ static_assert (!is_template (^^ref));
+ static_assert (!is_template (^^rref));
+ static_assert (!is_template (^^ptr));
+ static_assert (is_template (^^cls_tmpl));
+ static_assert (!is_template (^^cls_tmpl<int>));
+ static_assert (!is_template (^^incomplete_cls<int>));
+ static_assert (is_template (^^fun_tmpl));
+ static_assert (!is_template (^^fun_tmpl<int>));
+ static_assert (is_template (^^conc));
+ static_assert (!is_template (substitute (^^conc, { ^^int })));
+ static_assert (is_template (^^var_tmpl));
+ static_assert (!is_template (^^var_tmpl<int>));
+ static_assert (is_template (^^cls_tmpl_alias));
+ static_assert (!is_template (^^cls_tmpl_alias<int>));
+ static_assert (!is_template (^^Enum));
+ static_assert (!is_template (^^Enum::A));
+ static_assert (!is_template (^^Enum_class));
+ static_assert (!is_template (^^Enum_class::A));
+ static_assert (!is_template (^^decomp));
+ static_assert (!is_template (^^decomp_ref));
+ static_assert (!is_template (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_template (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_template (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_template (^^T));
+   static_assert (!is_template (R));
+   static_assert (!is_template (R2));
+   static_assert (is_template (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls_tmpl_alias>();
+   static_assert (!is_template (^^p));
+   static_assert (!is_template (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_template2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_template2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_template2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_template2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,9 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_template.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ static_assert (std::meta::is_template (^^std::vector));
+ static_assert (!std::meta::is_template (^^std::vector<int>));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_type1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_type1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_type1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_type1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_type.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_type (null_reflection));
+ static_assert (!is_type (^^::));
+ static_assert (!is_type (^^ns));
+ static_assert (!is_type (^^ns_alias));
+ static_assert (!is_type (reflect_constant (3)));
+ static_assert (is_type (^^cls));
+ static_assert (!is_type (^^cls::dm));
+ static_assert (!is_type (^^cls::ref_dm));
+ static_assert (!is_type (^^cls::static_dm));
+ static_assert (!is_type (^^cls::mem_fun));
+ static_assert (!is_type (^^cls::static_mem_fun));
+ static_assert (is_type (^^cls::type));
+ static_assert (!is_type (^^cls_var));
+ static_assert (is_type (^^onion));
+ static_assert (!is_type (^^anon));
+ static_assert (!is_type (^^fun));
+ static_assert (is_type (^^alias));
+ static_assert (!is_type (^^var));
+ static_assert (!is_type (^^ref));
+ static_assert (!is_type (^^rref));
+ static_assert (!is_type (^^ptr));
+ static_assert (!is_type (^^cls_tmpl));
+ static_assert (is_type (^^cls_tmpl<int>));
+ static_assert (is_type (^^incomplete_cls<int>));
+ static_assert (!is_type (^^fun_tmpl));
+ static_assert (!is_type (^^fun_tmpl<int>));
+ static_assert (!is_type (^^conc));
+ static_assert (!is_type (substitute (^^conc, { ^^int })));
+ static_assert (!is_type (^^var_tmpl));
+ static_assert (!is_type (^^var_tmpl<int>));
+ static_assert (!is_type (^^cls_tmpl_alias));
+ static_assert (is_type (^^cls_tmpl_alias<int>));
+ static_assert (is_type (^^Enum));
+ static_assert (!is_type (^^Enum::A));
+ static_assert (is_type (^^Enum_class));
+ static_assert (!is_type (^^Enum_class::A));
+ static_assert (!is_type (^^decomp));
+ static_assert (!is_type (^^decomp_ref));
+ static_assert (!is_type (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_type (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_type (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (is_type (^^T));
+   static_assert (!is_type (R));
+   static_assert (!is_type (R2));
+   static_assert (is_type (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!is_type (^^p));
+   static_assert (!is_type (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_type_alias1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_type_alias1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_type_alias1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_type_alias1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_type_alias.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_type_alias (null_reflection));
+ static_assert (!is_type_alias (^^::));
+ static_assert (!is_type_alias (^^ns));
+ static_assert (!is_type_alias (^^ns_alias));
+ static_assert (!is_type_alias (reflect_constant (3)));
+ static_assert (!is_type_alias (^^cls));
+ static_assert (!is_type_alias (^^cls::dm));
+ static_assert (!is_type_alias (^^cls::ref_dm));
+ static_assert (!is_type_alias (^^cls::static_dm));
+ static_assert (!is_type_alias (^^cls::mem_fun));
+ static_assert (!is_type_alias (^^cls::static_mem_fun));
+ static_assert (is_type_alias (^^cls::type));
+ static_assert (!is_type_alias (^^cls_var));
+ static_assert (!is_type_alias (^^onion));
+ static_assert (!is_type_alias (^^anon));
+ static_assert (!is_type_alias (^^fun));
+ static_assert (is_type_alias (^^alias));
+ static_assert (!is_type_alias (^^var));
+ static_assert (!is_type_alias (^^ref));
+ static_assert (!is_type_alias (^^rref));
+ static_assert (!is_type_alias (^^ptr));
+ static_assert (!is_type_alias (^^cls_tmpl));
+ static_assert (!is_type_alias (^^cls_tmpl<int>));
+ static_assert (!is_type_alias (^^incomplete_cls<int>));
+ static_assert (!is_type_alias (^^fun_tmpl));
+ static_assert (!is_type_alias (^^fun_tmpl<int>));
+ static_assert (!is_type_alias (^^conc));
+ static_assert (!is_type_alias (substitute (^^conc, { ^^int })));
+ static_assert (!is_type_alias (^^var_tmpl));
+ static_assert (!is_type_alias (^^var_tmpl<int>));
+ static_assert (!is_type_alias (^^cls_tmpl_alias));
+ static_assert (is_type_alias (^^cls_tmpl_alias<int>));
+ static_assert (!is_type_alias (^^Enum));
+ static_assert (!is_type_alias (^^Enum::A));
+ static_assert (!is_type_alias (^^Enum_class));
+ static_assert (!is_type_alias (^^Enum_class::A));
+ static_assert (!is_type_alias (^^decomp));
+ static_assert (!is_type_alias (^^decomp_ref));
+ static_assert (!is_type_alias (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_type_alias (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_type_alias (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_type_alias (^^T));
+   static_assert (!is_type_alias (R));
+   static_assert (!is_type_alias (R2));
+   static_assert (!is_type_alias (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!is_type_alias (^^p));
+   static_assert (!is_type_alias (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_type_alias2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_type_alias2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_type_alias2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_type_alias2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_type_alias.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template<typename T>
+ struct S { };
+ 
+ using U = S<int>;
+ 
+ template<typename T>
+ using V = S<T*>;
+ 
+ typedef int T;
+ 
+ static_assert (!is_type_alias (^^S<int>));
+ static_assert (is_type_alias (^^U));
+ static_assert (!is_type_alias (^^V));
+ static_assert (is_type_alias (^^V<int>));
+ static_assert (is_type_alias (^^T));
+ static_assert (!is_type_alias (^^wchar_t));
+ static_assert (is_type_alias (^^size_t));
+ 
+ using A = void(int, int);
+ static_assert (is_type_alias (^^A));
+ static_assert (!is_type_alias (dealias(^^A)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_type_alias3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_type_alias3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_type_alias3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_type_alias3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,77 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_type_alias.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ typedef int I;
+ static_assert (is_type_alias (^^I));
+ static_assert (!is_type_alias (^^const I));
+ static_assert (!is_type_alias (^^I const));
+ static_assert (!is_type_alias (^^I &&));
+ static_assert (^^I != ^^int);
+ static_assert (^^const I == ^^const int);
+ static_assert (^^I const == ^^const int);
+ static_assert (^^I && == ^^int &&);
+ 
+ typedef const int J;
+ static_assert (is_type_alias (^^J));
+ static_assert (!is_type_alias (^^const J));
+ static_assert (!is_type_alias (^^J const));
+ static_assert (!is_type_alias (^^J &));
+ static_assert (^^J != ^^const int);
+ static_assert (^^const J == ^^const int);
+ static_assert (^^J const == ^^const int);
+ static_assert (^^J & == ^^const int &);
+ 
+ template <typename> struct cls_tmpl {};
+ template <typename T> using cls_tmpl_alias = const cls_tmpl <T>;
+ 
+ static_assert (is_type_alias (^^cls_tmpl_alias <int>));
+ static_assert (!is_type_alias (^^const cls_tmpl_alias <int>));
+ static_assert (!is_type_alias (^^cls_tmpl_alias <int> const));
+ static_assert (!is_type_alias (^^cls_tmpl_alias <int> &&));
+ static_assert (^^cls_tmpl_alias <int> != ^^const cls_tmpl <int>);
+ static_assert (^^cls_tmpl_alias <int> != ^^const cls_tmpl_alias <int>);
+ static_assert (^^const cls_tmpl_alias <int> == ^^const cls_tmpl <int>);
+ static_assert (^^cls_tmpl_alias <int> const == ^^const cls_tmpl <int>);
+ static_assert (^^cls_tmpl_alias <int> && == ^^const cls_tmpl <int> &&);
+ 
+ namespace N1
+ {
+   template <typename> struct cls_tmpl {};
+   template <typename T> using cls_tmpl_alias = const cls_tmpl <T>;
+ 
+   static_assert (is_type_alias (^^N1::cls_tmpl_alias <int>));
+   static_assert (!is_type_alias (^^const N1::cls_tmpl_alias <int>));
+   static_assert (!is_type_alias (^^N1::cls_tmpl_alias <int> const));
+   static_assert (!is_type_alias (^^N1::cls_tmpl_alias <int> &&));
+   static_assert (^^N1::cls_tmpl_alias <int> != ^^const N1::cls_tmpl <int>);
+   static_assert (^^N1::cls_tmpl_alias <int> != ^^const N1::cls_tmpl_alias <int>);
+   static_assert (^^const N1::cls_tmpl_alias <int> == ^^const N1::cls_tmpl <int>);
+   static_assert (^^N1::cls_tmpl_alias <int> const == ^^const N1::cls_tmpl <int>);
+   static_assert (^^N1::cls_tmpl_alias <int> && == ^^const N1::cls_tmpl <int> &&);
+   static_assert (is_type_alias (^^N1:: template cls_tmpl_alias <int>));
+   static_assert (!is_type_alias (^^const N1:: template cls_tmpl_alias <int>));
+   static_assert (!is_type_alias (^^N1:: template cls_tmpl_alias <int> const));
+   static_assert (!is_type_alias (^^N1:: template cls_tmpl_alias <int> &&));
+   static_assert (^^N1:: template cls_tmpl_alias <int> != ^^const N1:: template cls_tmpl <int>);
+   static_assert (^^N1:: template cls_tmpl_alias <int> != ^^const N1:: template cls_tmpl_alias <int>);
+   static_assert (^^const N1:: template cls_tmpl_alias <int> == ^^const N1:: template cls_tmpl <int>);
+   static_assert (^^N1:: template cls_tmpl_alias <int> const == ^^const N1:: template cls_tmpl <int>);
+   static_assert (^^N1:: template cls_tmpl_alias <int> && == ^^const N1:: template cls_tmpl <int> &&);
+ }
+ 
+ const I a = 42;
+ static_assert (!is_type_alias (type_of (^^a)));
+ static_assert (type_of (^^a) == ^^const int);
+ 
+ J b = 42;
+ static_assert (!is_type_alias (type_of (^^b)));
+ static_assert (type_of (^^b) == ^^const int);
+ 
+ cls_tmpl_alias <long> c;
+ static_assert (!is_type_alias (type_of (^^c)));
+ static_assert (type_of (^^c) == ^^const cls_tmpl <long>);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_user_declared1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_user_declared1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_user_declared1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_user_declared1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,210 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_user_declared.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_user_declared (null_reflection));
+ static_assert (!is_user_declared (^^::));
+ static_assert (!is_user_declared (^^ns));
+ static_assert (!is_user_declared (^^ns_alias));
+ static_assert (!is_user_declared (reflect_constant (3)));
+ static_assert (!is_user_declared (^^cls));
+ static_assert (!is_user_declared (^^cls::dm));
+ static_assert (!is_user_declared (^^cls::ref_dm));
+ static_assert (!is_user_declared (^^cls::static_dm));
+ static_assert (is_user_declared (^^cls::mem_fun));
+ static_assert (is_user_declared (^^cls::static_mem_fun));
+ static_assert (!is_user_declared (^^cls::type));
+ static_assert (!is_user_declared (^^cls::E));
+ static_assert (!is_user_declared (^^cls::B));
+ static_assert (!is_user_declared (^^cls::C));
+ static_assert (!is_user_declared (^^cls::D));
+ static_assert (!is_user_declared (^^cls::F));
+ static_assert (!is_user_declared (^^cls::F::G));
+ static_assert (!is_user_declared (^^cls::F::H));
+ static_assert (!is_user_declared (^^cls::S));
+ static_assert (!is_user_declared (^^cls::U));
+ static_assert (!is_user_declared (^^cls::foo));
+ static_assert (is_user_declared (^^cls::foo <0>));
+ static_assert (!is_user_declared (^^cls::bar));
+ static_assert (is_user_declared (^^cls::bar <42>));
+ static_assert (!is_user_declared (^^cls_var));
+ static_assert (!is_user_declared (^^onion));
+ static_assert (!is_user_declared (^^anon));
+ static_assert (is_user_declared (^^fun));
+ static_assert (!is_user_declared (^^alias));
+ static_assert (!is_user_declared (^^var));
+ static_assert (!is_user_declared (^^ref));
+ static_assert (!is_user_declared (^^rref));
+ static_assert (!is_user_declared (^^ptr));
+ static_assert (!is_user_declared (^^cls_tmpl));
+ static_assert (!is_user_declared (^^cls_tmpl<int>));
+ static_assert (!is_user_declared (^^incomplete_cls<int>));
+ static_assert (!is_user_declared (^^fun_tmpl));
+ static_assert (is_user_declared (^^fun_tmpl<int>));
+ static_assert (!is_user_declared (^^conc));
+ static_assert (!is_user_declared (substitute (^^conc, { ^^int })));
+ static_assert (!is_user_declared (^^var_tmpl));
+ static_assert (!is_user_declared (^^var_tmpl<int>));
+ static_assert (!is_user_declared (^^cls_tmpl_alias));
+ static_assert (!is_user_declared (^^cls_tmpl_alias<int>));
+ static_assert (!is_user_declared (^^Enum));
+ static_assert (!is_user_declared (^^Enum::A));
+ static_assert (!is_user_declared (^^Enum_class));
+ static_assert (!is_user_declared (^^Enum_class::A));
+ static_assert (!is_user_declared (^^decomp));
+ static_assert (!is_user_declared (^^decomp_ref));
+ static_assert (!is_user_declared (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_user_declared (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_user_declared (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_user_declared (^^x));
+   static_assert (!is_user_declared (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_user_declared (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_user_declared (^^S));
+   static_assert (!is_user_declared (^^E));
+   static_assert (!is_user_declared (^^F));
+   static_assert (!is_user_declared (^^G));
+ }
+ 
+ void bar (int, long) = delete;
+ void baz (int) = delete ("foobar");
+ static_assert (is_user_declared (^^bar));
+ static_assert (is_user_declared (^^baz));
+ 
+ struct S
+ {
+   bool operator == (const S &) const = default;
+   auto operator <=> (const S &) const = default;
+   S &operator = (const S &) = default;
+   int s;
+   void foo ();
+   template <int N>
+   void bar ();
+ };
+ 
+ struct V
+ {
+   V (const V &);
+ };
+ 
+ struct W
+ {
+   W (const W &);
+   bool operator == (const W &) const;
+   auto operator <=> (const W &) const;
+   W &operator = (const W &) { return *this; }
+ };
+ 
+ struct X
+ {
+   X (const X &);
+   bool operator == (const X &) const = delete;
+   auto operator <=> (const X &) const = delete;
+   X &operator = (const X &) = delete;
+   void foo () = delete;
+   template <int N>
+   void bar () = delete;
+ };
+ 
+ static_assert (is_user_declared (^^S::operator ==));
+ static_assert (is_user_declared (^^S::operator <=>));
+ static_assert (is_user_declared (^^S::operator =));
+ static_assert (is_user_declared (^^S::foo));
+ static_assert (!is_user_declared (^^S::bar));
+ static_assert (is_user_declared (^^S::bar <42>));
+ static_assert (!is_user_declared (^^V::operator =));
+ static_assert (is_user_declared (^^W::operator ==));
+ static_assert (is_user_declared (^^W::operator <=>));
+ static_assert (is_user_declared (^^W::operator =));
+ static_assert (is_user_declared (^^X::operator ==));
+ static_assert (is_user_declared (^^X::operator <=>));
+ static_assert (is_user_declared (^^X::operator =));
+ static_assert (is_user_declared (^^X::foo));
+ static_assert (!is_user_declared (^^X::bar));
+ 
+ struct Y
+ {
+   ~Y () = default;
+   int y;
+ };
+ static_assert (is_user_declared (^^Y::~Y));
+ 
+ struct Z
+ {
+   int z;
+ };
+ static_assert (!is_user_declared (^^Z::~Z));
+ 
+ struct R
+ {
+   ~R ();
+   int r;
+ };
+ static_assert (is_user_declared (^^R::~R));
+ 
+ struct H
+ {
+   ~H () = delete;
+   int h;
+ };
+ static_assert (is_user_declared (^^H::~H));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_user_declared2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_user_declared2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_user_declared2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_user_declared2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,91 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_deleted.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template<typename F>
+ consteval info
+ select_mem(info clazz, F f)
+ {
+   for (info x : members_of(clazz, access_context::unchecked()))
+     if (f(x))
+       return x;
+ }
+ 
+ struct ExplicitDef
+ {
+   ExplicitDef() = default;
+   ExplicitDef(const ExplicitDef&) = default;
+   ExplicitDef(ExplicitDef&&) = default;
+ 
+   ExplicitDef& operator=(const ExplicitDef&) = default;
+   ExplicitDef& operator=(ExplicitDef&&) = default;
+   
+   ~ExplicitDef() = default;
+ };
+ 
+ static_assert (is_user_declared (select_mem (^^ExplicitDef, is_default_constructor)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDef, is_copy_constructor)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDef, is_move_constructor)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDef, is_copy_assignment)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDef, is_move_assignment)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDef, is_destructor)));
+ 
+ struct ExplicitDel
+ {
+   ExplicitDel() = default;
+   ExplicitDel(const ExplicitDel&) = default;
+   ExplicitDel(ExplicitDel&&) = default;
+ 
+   ExplicitDel& operator=(const ExplicitDel&) = default;
+   ExplicitDel& operator=(ExplicitDel&&) = default;
+   
+   ~ExplicitDel() = default;
+ };
+ 
+ static_assert (is_user_declared (select_mem (^^ExplicitDel, is_default_constructor)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDel, is_copy_constructor)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDel, is_move_constructor)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDel, is_copy_assignment)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDel, is_move_assignment)));
+ static_assert (is_user_declared (select_mem (^^ExplicitDel, is_destructor)));
+ 
+ struct ImplicitDef
+ {
+ };
+ 
+ static_assert (!is_user_declared (select_mem (^^ImplicitDef, is_default_constructor)));
+ static_assert (!is_user_declared (select_mem (^^ImplicitDef, is_copy_constructor)));
+ static_assert (!is_user_declared (select_mem (^^ImplicitDef, is_move_constructor)));
+ static_assert (!is_user_declared (select_mem (^^ImplicitDef, is_copy_assignment)));
+ static_assert (!is_user_declared (select_mem (^^ImplicitDef, is_move_assignment)));
+ static_assert (!is_user_declared (select_mem (^^ImplicitDef, is_destructor)));
+ 
+ struct ExplicitRelOps
+ {
+   bool operator==(const ExplicitRelOps&) const = default;
+   auto operator<=>(const ExplicitRelOps&) const = default;
+ };
+ static_assert (is_user_declared (^^ExplicitRelOps::operator==));
+ static_assert (is_user_declared (^^ExplicitRelOps::operator<=>));
+ 
+ struct DelRelOps
+ {
+   bool operator==(const DelRelOps&) const = delete;
+   auto operator<=>(const DelRelOps&) const = delete;
+ };
+ static_assert (is_user_declared (^^DelRelOps::operator==));
+ static_assert (is_user_declared (^^DelRelOps::operator<=>));
+ 
+ struct ImplicitRelOps
+ {
+   // operator== is implicitly declared
+   auto operator<=>(const ImplicitRelOps&) const = default;
+ };
+ static_assert (!is_user_declared (^^ImplicitRelOps::operator==));
+ static_assert (is_user_declared (^^ImplicitRelOps::operator<=>));
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_user_provided1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_user_provided1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_user_provided1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_user_provided1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,210 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_user_provided.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+   enum E {
+     B, C, D
+   };
+   enum class F {
+     G, H
+   };
+   struct S {};
+   union U {};
+   template <int N>
+   void foo ();
+   template <int N>
+   static void bar ();
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_user_provided (null_reflection));
+ static_assert (!is_user_provided (^^::));
+ static_assert (!is_user_provided (^^ns));
+ static_assert (!is_user_provided (^^ns_alias));
+ static_assert (!is_user_provided (reflect_constant (3)));
+ static_assert (!is_user_provided (^^cls));
+ static_assert (!is_user_provided (^^cls::dm));
+ static_assert (!is_user_provided (^^cls::ref_dm));
+ static_assert (!is_user_provided (^^cls::static_dm));
+ static_assert (is_user_provided (^^cls::mem_fun));
+ static_assert (is_user_provided (^^cls::static_mem_fun));
+ static_assert (!is_user_provided (^^cls::type));
+ static_assert (!is_user_provided (^^cls::E));
+ static_assert (!is_user_provided (^^cls::B));
+ static_assert (!is_user_provided (^^cls::C));
+ static_assert (!is_user_provided (^^cls::D));
+ static_assert (!is_user_provided (^^cls::F));
+ static_assert (!is_user_provided (^^cls::F::G));
+ static_assert (!is_user_provided (^^cls::F::H));
+ static_assert (!is_user_provided (^^cls::S));
+ static_assert (!is_user_provided (^^cls::U));
+ static_assert (!is_user_provided (^^cls::foo));
+ static_assert (is_user_provided (^^cls::foo <0>));
+ static_assert (!is_user_provided (^^cls::bar));
+ static_assert (is_user_provided (^^cls::bar <42>));
+ static_assert (!is_user_provided (^^cls_var));
+ static_assert (!is_user_provided (^^onion));
+ static_assert (!is_user_provided (^^anon));
+ static_assert (is_user_provided (^^fun));
+ static_assert (!is_user_provided (^^alias));
+ static_assert (!is_user_provided (^^var));
+ static_assert (!is_user_provided (^^ref));
+ static_assert (!is_user_provided (^^rref));
+ static_assert (!is_user_provided (^^ptr));
+ static_assert (!is_user_provided (^^cls_tmpl));
+ static_assert (!is_user_provided (^^cls_tmpl<int>));
+ static_assert (!is_user_provided (^^incomplete_cls<int>));
+ static_assert (!is_user_provided (^^fun_tmpl));
+ static_assert (is_user_provided (^^fun_tmpl<int>));
+ static_assert (!is_user_provided (^^conc));
+ static_assert (!is_user_provided (substitute (^^conc, { ^^int })));
+ static_assert (!is_user_provided (^^var_tmpl));
+ static_assert (!is_user_provided (^^var_tmpl<int>));
+ static_assert (!is_user_provided (^^cls_tmpl_alias));
+ static_assert (!is_user_provided (^^cls_tmpl_alias<int>));
+ static_assert (!is_user_provided (^^Enum));
+ static_assert (!is_user_provided (^^Enum::A));
+ static_assert (!is_user_provided (^^Enum_class));
+ static_assert (!is_user_provided (^^Enum_class::A));
+ static_assert (!is_user_provided (^^decomp));
+ static_assert (!is_user_provided (^^decomp_ref));
+ static_assert (!is_user_provided (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_user_provided (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_user_provided (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ void
+ foo (int x)
+ {
+   static_assert (!is_user_provided (^^x));
+   static_assert (!is_user_provided (parameters_of (^^foo)[0]));
+   int v;
+   static_assert (!is_user_provided (^^v));
+   struct S {};
+   enum E { F, G };
+   static_assert (!is_user_provided (^^S));
+   static_assert (!is_user_provided (^^E));
+   static_assert (!is_user_provided (^^F));
+   static_assert (!is_user_provided (^^G));
+ }
+ 
+ void bar (int, long) = delete;
+ void baz (int) = delete ("foobar");
+ static_assert (!is_user_provided (^^bar));
+ static_assert (!is_user_provided (^^baz));
+ 
+ struct S
+ {
+   bool operator == (const S &) const = default;
+   auto operator <=> (const S &) const = default;
+   S &operator = (const S &) = default;
+   int s;
+   void foo ();
+   template <int N>
+   void bar ();
+ };
+ 
+ struct V
+ {
+   V (const V &);
+ };
+ 
+ struct W
+ {
+   W (const W &);
+   bool operator == (const W &) const;
+   auto operator <=> (const W &) const;
+   W &operator = (const W &) { return *this; }
+ };
+ 
+ struct X
+ {
+   X (const X &);
+   bool operator == (const X &) const = delete;
+   auto operator <=> (const X &) const = delete;
+   X &operator = (const X &) = delete;
+   void foo () = delete;
+   template <int N>
+   void bar () = delete;
+ };
+ 
+ static_assert (!is_user_provided (^^S::operator ==));
+ static_assert (!is_user_provided (^^S::operator <=>));
+ static_assert (!is_user_provided (^^S::operator =));
+ static_assert (is_user_provided (^^S::foo));
+ static_assert (!is_user_provided (^^S::bar));
+ static_assert (is_user_provided (^^S::bar <42>));
+ static_assert (!is_user_provided (^^V::operator =));
+ static_assert (is_user_provided (^^W::operator ==));
+ static_assert (is_user_provided (^^W::operator <=>));
+ static_assert (is_user_provided (^^W::operator =));
+ static_assert (!is_user_provided (^^X::operator ==));
+ static_assert (!is_user_provided (^^X::operator <=>));
+ static_assert (!is_user_provided (^^X::operator =));
+ static_assert (!is_user_provided (^^X::foo));
+ static_assert (!is_user_provided (^^X::bar));
+ 
+ struct Y
+ {
+   ~Y () = default;
+   int y;
+ };
+ static_assert (!is_user_provided (^^Y::~Y));
+ 
+ struct Z
+ {
+   int z;
+ };
+ static_assert (!is_user_provided (^^Z::~Z));
+ 
+ struct R
+ {
+   ~R ();
+   int r;
+ };
+ static_assert (is_user_provided (^^R::~R));
+ 
+ struct H
+ {
+   ~H () = delete;
+   int h;
+ };
+ static_assert (!is_user_provided (^^H::~H));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_user_provided2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_user_provided2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_user_provided2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_user_provided2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,91 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_deleted.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template<typename F>
+ consteval info
+ select_mem(info clazz, F f)
+ {
+   for (info x : members_of(clazz, access_context::unchecked()))
+     if (f(x))
+       return x;
+ }
+ 
+ struct ExplicitDef
+ {
+   ExplicitDef() = default;
+   ExplicitDef(const ExplicitDef&) = default;
+   ExplicitDef(ExplicitDef&&) = default;
+ 
+   ExplicitDef& operator=(const ExplicitDef&) = default;
+   ExplicitDef& operator=(ExplicitDef&&) = default;
+   
+   ~ExplicitDef() = default;
+ };
+ 
+ static_assert (!is_user_provided (select_mem (^^ExplicitDef, is_default_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDef, is_copy_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDef, is_move_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDef, is_copy_assignment)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDef, is_move_assignment)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDef, is_destructor)));
+ 
+ struct ExplicitDel
+ {
+   ExplicitDel() = default;
+   ExplicitDel(const ExplicitDel&) = default;
+   ExplicitDel(ExplicitDel&&) = default;
+ 
+   ExplicitDel& operator=(const ExplicitDel&) = default;
+   ExplicitDel& operator=(ExplicitDel&&) = default;
+   
+   ~ExplicitDel() = default;
+ };
+ 
+ static_assert (!is_user_provided (select_mem (^^ExplicitDel, is_default_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDel, is_copy_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDel, is_move_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDel, is_copy_assignment)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDel, is_move_assignment)));
+ static_assert (!is_user_provided (select_mem (^^ExplicitDel, is_destructor)));
+ 
+ struct ImplicitDef
+ {
+ };
+ 
+ static_assert (!is_user_provided (select_mem (^^ImplicitDef, is_default_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ImplicitDef, is_copy_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ImplicitDef, is_move_constructor)));
+ static_assert (!is_user_provided (select_mem (^^ImplicitDef, is_copy_assignment)));
+ static_assert (!is_user_provided (select_mem (^^ImplicitDef, is_move_assignment)));
+ static_assert (!is_user_provided (select_mem (^^ImplicitDef, is_destructor)));
+ 
+ struct ExplicitRelOps
+ {
+   bool operator==(const ExplicitRelOps&) const = default;
+   auto operator<=>(const ExplicitRelOps&) const = default;
+ };
+ static_assert (!is_user_provided (^^ExplicitRelOps::operator==));
+ static_assert (!is_user_provided (^^ExplicitRelOps::operator<=>));
+ 
+ struct DelRelOps
+ {
+   bool operator==(const DelRelOps&) const = delete;
+   auto operator<=>(const DelRelOps&) const = delete;
+ };
+ static_assert (!is_user_provided (^^DelRelOps::operator==));
+ static_assert (!is_user_provided (^^DelRelOps::operator<=>));
+ 
+ struct ImplicitRelOps
+ {
+   // operator== is implicitly declared
+   auto operator<=>(const ImplicitRelOps&) const = default;
+ };
+ static_assert (!is_user_provided (^^ImplicitRelOps::operator==));
+ static_assert (!is_user_provided (^^ImplicitRelOps::operator<=>));
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_variable1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_variable1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_variable1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_variable1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,104 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_variable.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_variable (null_reflection));
+ static_assert (!is_variable (^^::));
+ static_assert (!is_variable (^^ns));
+ static_assert (!is_variable (^^ns_alias));
+ static_assert (!is_variable (reflect_constant (3)));
+ static_assert (!is_variable (^^cls));
+ static_assert (!is_variable (^^cls::dm));
+ static_assert (!is_variable (^^cls::ref_dm));
+ static_assert (is_variable (^^cls::static_dm));
+ static_assert (!is_variable (^^cls::mem_fun));
+ static_assert (!is_variable (^^cls::static_mem_fun));
+ static_assert (!is_variable (^^cls::type));
+ static_assert (is_variable (^^cls_var));
+ static_assert (!is_variable (^^onion));
+ static_assert (!is_variable (^^anon));
+ static_assert (!is_variable (^^fun));
+ static_assert (!is_variable (^^alias));
+ static_assert (is_variable (^^var));
+ // ??? EDG says this is _not_ a variable.
+ static_assert (is_variable (^^ref));
+ static_assert (is_variable (^^rref));
+ static_assert (is_variable (^^ptr));
+ static_assert (!is_variable (^^cls_tmpl));
+ static_assert (!is_variable (^^cls_tmpl<int>));
+ static_assert (!is_variable (^^incomplete_cls<int>));
+ static_assert (!is_variable (^^fun_tmpl));
+ static_assert (!is_variable (^^fun_tmpl<int>));
+ static_assert (!is_variable (^^conc));
+ static_assert (!is_variable (substitute (^^conc, { ^^int })));
+ static_assert (!is_variable (^^var_tmpl));
+ static_assert (is_variable (^^var_tmpl<int>));
+ static_assert (!is_variable (^^cls_tmpl_alias));
+ static_assert (!is_variable (^^cls_tmpl_alias<int>));
+ static_assert (!is_variable (^^Enum));
+ static_assert (!is_variable (^^Enum::A));
+ static_assert (!is_variable (^^Enum_class));
+ static_assert (!is_variable (^^Enum_class::A));
+ static_assert (!is_variable (^^decomp));
+ static_assert (!is_variable (^^decomp_ref));
+ static_assert (is_variable (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_variable (dms));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_variable (^^T));
+   static_assert (is_variable (R));
+   static_assert (!is_variable (R2));
+   static_assert (!is_variable (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (is_variable (^^p));
+   static_assert (is_variable (^^c));
+   static_assert (!is_variable (parameters_of (^^g)[0]));
+   static_assert (!is_variable (parameters_of (^^g)[1]));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_variable_template1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_variable_template1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_variable_template1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_variable_template1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,105 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_variable_template.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!is_variable_template (null_reflection));
+ static_assert (!is_variable_template (^^::));
+ static_assert (!is_variable_template (^^ns));
+ static_assert (!is_variable_template (^^ns_alias));
+ static_assert (!is_variable_template (reflect_constant (3)));
+ static_assert (!is_variable_template (^^cls));
+ static_assert (!is_variable_template (^^cls::dm));
+ static_assert (!is_variable_template (^^cls::ref_dm));
+ static_assert (!is_variable_template (^^cls::static_dm));
+ static_assert (!is_variable_template (^^cls::mem_fun));
+ static_assert (!is_variable_template (^^cls::static_mem_fun));
+ static_assert (!is_variable_template (^^cls::type));
+ static_assert (!is_variable_template (^^cls_var));
+ static_assert (!is_variable_template (^^onion));
+ static_assert (!is_variable_template (^^anon));
+ static_assert (!is_variable_template (^^fun));
+ static_assert (!is_variable_template (^^alias));
+ static_assert (!is_variable_template (^^var));
+ static_assert (!is_variable_template (^^ref));
+ static_assert (!is_variable_template (^^rref));
+ static_assert (!is_variable_template (^^ptr));
+ static_assert (!is_variable_template (^^cls_tmpl));
+ static_assert (!is_variable_template (^^cls_tmpl<int>));
+ static_assert (!is_variable_template (^^incomplete_cls<int>));
+ static_assert (!is_variable_template (^^fun_tmpl));
+ static_assert (!is_variable_template (^^fun_tmpl<int>));
+ static_assert (!is_variable_template (^^conc));
+ static_assert (!is_variable_template (substitute (^^conc, { ^^int })));
+ static_assert (is_variable_template (^^var_tmpl));
+ static_assert (!is_variable_template (^^var_tmpl<int>));
+ static_assert (!is_variable_template (^^cls_tmpl_alias));
+ static_assert (!is_variable_template (^^cls_tmpl_alias<int>));
+ static_assert (!is_variable_template (^^Enum));
+ static_assert (!is_variable_template (^^Enum::A));
+ static_assert (!is_variable_template (^^Enum_class));
+ static_assert (!is_variable_template (^^Enum_class::A));
+ static_assert (!is_variable_template (^^decomp));
+ static_assert (!is_variable_template (^^decomp_ref));
+ static_assert (!is_variable_template (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_variable_template (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_variable_template (bases_of (^^Derived, access_context::unchecked ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_variable_template (^^T));
+   static_assert (!is_variable_template (R));
+   static_assert (!is_variable_template (R2));
+   static_assert (is_variable_template (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^var_tmpl>();
+   static_assert (!is_variable_template (^^p));
+   static_assert (!is_variable_template (^^c));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_virtual1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_virtual1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_virtual1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_virtual1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,60 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_virtual.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void func () {}
+ 
+ struct B {
+   void nonvirt ();
+   virtual void virt_no_override ();
+   virtual void virt_implicit_override ();
+   virtual void virt_explicit_override ();
+   virtual void pure_virt () = 0;
+   virtual ~B ();
+ };
+ 
+ struct D : B {
+   void nonvirt ();
+   void virt_implicit_override ();
+   void virt_explicit_override () override;
+   void pure_virt ();
+   ~D ();
+ };
+ 
+ static_assert (!is_virtual (^^func));
+ static_assert (!is_virtual (^^B::nonvirt));
+ static_assert (is_virtual (^^B::virt_no_override));
+ static_assert (is_virtual (^^B::virt_implicit_override));
+ static_assert (is_virtual (^^B::virt_explicit_override));
+ static_assert (is_virtual (^^B::pure_virt));
+ static_assert (is_virtual (^^B::~B));
+ 
+ static_assert (!is_virtual (^^D::nonvirt));
+ static_assert (is_virtual (^^D::virt_no_override));
+ static_assert (is_virtual (^^D::virt_implicit_override));
+ static_assert (is_virtual (^^D::virt_explicit_override));
+ static_assert (is_virtual (^^D::pure_virt));
+ static_assert (is_virtual (^^D::~D));
+ 
+ struct E {
+   ~E () = delete;
+ };
+ 
+ struct F {
+   virtual ~F () = delete;
+ };
+ 
+ static_assert (!is_virtual (^^E::~E));
+ static_assert (is_virtual (^^F::~F));
+ 
+ struct B1 {};
+ struct B2 {};
+ struct D2 : B1, virtual B2 { };
+ constexpr auto ctx = access_context::unchecked ();
+ 
+ static_assert (!is_virtual (bases_of (^^D2, ctx)[0]));
+ static_assert (is_virtual (bases_of (^^D2, ctx)[1]));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_volatile1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_volatile1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/is_volatile1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/is_volatile1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,116 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_volatile.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+ };
+ struct U {
+   int u;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ static_assert (!is_volatile (std::meta::reflect_constant (42)));
+ static_assert (!is_volatile (std::meta::reflect_object (arr[1])));
+ static_assert (!is_volatile (^^arr));
+ static_assert (!is_volatile (^^a3));
+ static_assert (!is_volatile (^^fn));
+ static_assert (!is_volatile (^^fn2));
+ static_assert (!is_volatile (^^Enum::A));
+ static_assert (!is_volatile (^^Alias));
+ static_assert (!is_volatile (^^S));
+ static_assert (!is_volatile (^^S::mem));
+ static_assert (!is_volatile (std::meta::members_of (^^S, ctx)[1]));
+ static_assert (!is_volatile (^^TCls));
+ static_assert (!is_volatile (^^TFn));
+ static_assert (!is_volatile (^^TVar));
+ static_assert (!is_volatile (^^Concept));
+ static_assert (!is_volatile (^^NSAlias));
+ static_assert (!is_volatile (^^NS));
+ static_assert (!is_volatile (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (!is_volatile (std::meta::data_member_spec (^^int, { .name = "member" })));
+ 
+ int
+ foo (int a, const long b, T c, int d[4], T &e)
+ {
+   static_assert (!is_volatile (^^a));
+   static_assert (!is_volatile (^^b));
+   static_assert (!is_volatile (^^c));
+   static_assert (!is_volatile (^^d));
+   static_assert (!is_volatile (^^e));
+   static_assert (!is_const (parameters_of (^^foo)[0]));
+   static_assert (!is_const (parameters_of (^^foo)[1]));
+   static_assert (!is_const (parameters_of (^^foo)[2]));
+   static_assert (!is_const (parameters_of (^^foo)[3]));
+   static_assert (!is_const (parameters_of (^^foo)[4]));
+   return 0;
+ }
+ 
+ static_assert (!is_volatile (std::meta::reflect_constant (42)));
+ static_assert (!is_volatile (std::meta::reflect_constant (42.0)));
+ static_assert (!is_volatile (std::meta::reflect_constant (U { 42 })));
+ static_assert (!is_volatile (std::meta::reflect_object (arr[1])));
+ static_assert (!is_volatile (^^arr));
+ static_assert (!is_volatile (^^fn));
+ static_assert (!is_volatile (^^Enum::A));
+ static_assert (!is_volatile (^^A));
+ static_assert (!is_volatile (^^S::mem));
+ 
+ volatile int vi = 42;
+ static_assert (is_volatile (^^vi));
+ using uvi = volatile int;
+ static_assert (is_volatile (^^uvi));
+ const volatile long vl = 42L;
+ static_assert (is_volatile (^^vl));
+ extern const volatile short cv = 2;
+ static_assert (is_volatile (^^cv));
+ struct V { volatile int a; static volatile int b; };
+ static_assert (is_volatile (^^V::a));
+ static_assert (is_volatile (^^V::b));
+ 
+ volatile int arr2[] = {3, 4, 5};
+ volatile int arr3[2][2][2] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
+ struct W {
+   void foo () volatile {}
+   void bar () const {}
+ };
+ static_assert (is_volatile (^^arr2));
+ static_assert (is_volatile (^^arr3));
+ static_assert (is_volatile (^^W::foo));
+ static_assert (!is_volatile (^^W::bar));
+ static_assert (!is_volatile (^^int));
+ static_assert (!is_volatile (^^const int));
+ static_assert (is_volatile (^^volatile int));
+ static_assert (is_volatile (^^const volatile int));
+ static_assert (!is_volatile (^^int [2]));
+ static_assert (!is_volatile (^^const int [2]));
+ static_assert (is_volatile (^^volatile int [2]));
+ static_assert (is_volatile (^^const volatile int [2]));
+ static_assert (!is_volatile (^^int (int)));
+ static_assert (!is_volatile (^^int (int) const));
+ static_assert (is_volatile (^^int (int) volatile));
+ static_assert (is_volatile (^^int (int) const volatile));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/lex1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/lex1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/lex1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/lex1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test lexical aspects of reflection.
+ 
+ constexpr int sz = 2;
+ 
+ void
+ g ()
+ {
+   int arr[10];
+   arr[::sz] = 42;
+   int arr2[:> = { 1, 2 };
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/lex2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/lex2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/lex2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/lex2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^int);
+ 
+ namespace colon_parsing {
+ constexpr int x = 4;
+ constexpr auto rx = ^^x;
+ static_assert([:rx:] == 4);
+ 
+ constexpr unsigned Idx = 1;
+ constexpr int arr[] = {1, 2, 3};
+ static_assert(arr[::colon_parsing::Idx] == 2);
+ 
+ constexpr info rIdx = ^^Idx;
+ static_assert([:::colon_parsing::rIdx:] == 1);
+ 
+ struct WithIndexOperator {
+   bool operator[:>(int);  // Test interaction with ':>'-digraph (i.e., ']').
+ };
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/mangle1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/mangle1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/mangle1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/mangle1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,253 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection -O0" }
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ [[=1]] void fn (int n);
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+   static int var;
+ };
+ template <auto> struct TCls {};
+ template <auto> void TFn ();
+ template <auto> int TVar;
+ template <auto N> using TAlias = TCls <N>;
+ template <auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ namespace NS2 {
+   int arr[] = {1, 2, 3};
+   auto [a1, a2, a3] = arr;
+   [[=1]] void fn (int n, long m);
+   enum Enum { A };
+   using Alias = decltype (^^int);
+   struct B {};
+   struct S : B {
+     int mem;
+     int : 0;
+     int : 3;
+     int : 5;
+     static int var;
+     template <typename T> static T TVar;
+   };
+   template <auto> struct TCls {};
+   template <auto> void TFn ();
+   template <auto> int TVar;
+   template <auto N> using TAlias = TCls <N>;
+   template <auto> concept Concept = requires { true; };
+   struct V { int a, b, c; };
+   S s;
+   namespace NS3 {
+     auto [a1, a2, a3] = arr;
+   }
+   namespace NSAlias = NS3;
+   enum { C };
+   template <typename T>
+   struct W : B, ::B {};
+   static union { int au; };
+   struct X {
+     union { int a; };
+     X &operator + (const X &);
+     operator int ();
+   };
+   template <typename T>
+   struct Y {
+     union { T a; };
+   };
+   struct Z {
+   };
+ }
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ template <int N, typename T>
+ void
+ foo ()
+ {
+ }
+ 
+ template <int N, std::meta::info I>
+ void
+ bar ()
+ {
+ }
+ 
+ void
+ baz (int x)
+ {
+   int v = 42;
+   foo <1, std::meta::info> ();
+   foo <2, const std::meta::info> ();
+   bar <110, std::meta::info {}> (); // null reflection
+   bar <120, std::meta::reflect_constant (42)> (); // value
+   bar <121, std::meta::reflect_constant (42.0)> (); // value
+   bar <122, std::meta::reflect_constant (NS2::V { 1, 2, 3 })> (); // value
+   bar <130, std::meta::reflect_object (arr[1])> (); // object
+   bar <131, std::meta::reflect_object (NS2::arr[1])> (); // object
+   bar <132, std::meta::reflect_object (NS2::s.mem)> (); // object
+   bar <140, ^^arr> (); // variable
+   bar <141, ^^NS2::arr> (); // variable
+   bar <142, ^^x> (); // variable
+   bar <143, ^^v> (); // variable
+   bar <144, members_of (^^NS2::NS3, ctx)[0]> (); // variable
+   bar <145, ^^S::var> (); // variable
+   bar <146, ^^NS2::S::var> (); // variable
+   bar <147, ^^TVar <42>> (); // variable
+   bar <148, ^^TVar <42>> (); // variable
+   bar <149, ^^NS2::S::TVar <int>> (); // variable
+   bar <150, ^^a3> (); // structured binding
+   bar <151, ^^NS2::a3> (); // structured binding
+   bar <160, ^^fn> (); // function
+   bar <161, ^^NS2::fn> (); // function
+   bar <162, ^^TFn <42>> (); // function
+   bar <163, ^^NS2::TFn <0U>> (); // function
+   bar <164, ^^NS2::TFn <^^int>> (); // function
+   bar <165, ^^NS2::X::operator+> (); // function
+   bar <166, (members_of (^^NS2::Z, ctx) | std::views::filter (std::meta::is_default_constructor) | std::ranges::to <std::vector> ())[0]> (); // function
+   bar <167, (members_of (^^NS2::Z, ctx) | std::views::filter (std::meta::is_copy_constructor) | std::ranges::to <std::vector> ())[0]> (); // function
+   bar <168, (members_of (^^NS2::Z, ctx) | std::views::filter (std::meta::is_copy_assignment) | std::ranges::to <std::vector> ())[0]> (); // function
+   bar <169, (members_of (^^NS2::Z, ctx) | std::views::filter (std::meta::is_destructor) | std::ranges::to <std::vector> ())[0]> (); // function
+   bar <170, parameters_of (^^fn)[0]> (); // function parameter
+   bar <171, parameters_of (^^NS2::fn)[0]> (); // function parameter
+   bar <172, parameters_of (^^NS2::fn)[1]> (); // function parameter
+   bar <180, ^^Enum::A> (); // enumerator
+   bar <181, ^^NS2::Enum::A> (); // enumerator
+   bar <182, ^^NS2::C> (); // enumerator
+   bar <190, annotations_of (^^fn)[0]> (); // annotation
+   bar <200, ^^Alias> (); // type alias
+   bar <201, ^^NS2::Alias> (); // type alias
+   bar <202, ^^TAlias <42>> (); // type alias
+   bar <203, ^^NS2::TAlias <0U>> (); // type alias
+   bar <210, ^^S> (); // type
+   bar <211, ^^NS2::S> (); // type
+   bar <212, ^^const int> (); // type
+   bar <213, ^^decltype (nullptr)> (); // type
+   bar <214, ^^decltype (^^::)> (); // type
+   bar <215, ^^TCls <42>> (); // type
+   bar <216, ^^NS2::TCls <42>> (); // type
+   bar <220, ^^S::mem> (); // non-static data member
+   bar <221, ^^NS2::S::mem> (); // non-static data member
+   bar <222, ^^NS2::au> (); // non-static data member
+   bar <223, ^^NS2::X::a> (); // non-static data member
+   bar <224, ^^NS2::Y <int>::a> (); // non-static data member
+   bar <230, members_of (^^S, ctx)[1]> (); // unnamed bit-field
+   bar <231, members_of (^^NS2::S, ctx)[1]> (); // unnamed bit-field
+   bar <232, members_of (^^NS2::S, ctx)[2]> (); // unnamed bit-field
+   bar <233, members_of (^^NS2::S, ctx)[3]> (); // unnamed bit-field
+   bar <240, ^^TCls> (); // class template
+   bar <241, ^^NS2::TCls> (); // class template
+   bar <250, ^^TFn> (); // function template
+   bar <251, ^^NS2::TFn> (); // function template
+   bar <260, ^^TVar> (); // variable template
+   bar <261, ^^NS2::TVar> (); // variable template
+   bar <270, ^^TAlias> (); // alias template
+   bar <271, ^^NS2::TAlias> (); // alias template
+   bar <280, ^^Concept> (); // concept
+   bar <281, ^^NS2::Concept> (); // concept
+   bar <290, ^^NSAlias> (); // namespace alias
+   bar <291, ^^NS2::NSAlias> (); // namespace alias
+   bar <300, ^^NS> (); // namespace
+   bar <301, ^^NS2::NS3> (); // namespace
+   bar <310, ^^::> (); // global namespace
+   bar <320, bases_of (^^S, ctx)[0]> (); // direct base class relationship
+   bar <321, bases_of (^^NS2::S, ctx)[0]> (); // direct base class relationship
+   bar <322, bases_of (^^NS2::W <int>, ctx)[0]> (); // direct base class relationship
+   bar <323, bases_of (^^NS2::W <float>, ctx)[1]> (); // direct base class relationship
+   bar <330, data_member_spec (^^S, { .name = "member" })> (); // data member description
+   bar <331, data_member_spec (^^NS2::S, { .name = "m", .alignment = 16, .no_unique_address = true })> (); // data member description
+   bar <332, data_member_spec (^^unsigned short, { .name = "b", .bit_width = 5 })> (); // data member description
+   bar <333, data_member_spec (^^long, { .bit_width = 3 })> (); // data member description
+   bar <334, data_member_spec (^^int, { .bit_width = 0 })> (); // data member description
+   bar <340, ^^NS2::X::~X> (); // function
+ }
+ 
+ // { dg-final { scan-assembler "_Z3fooILi1EDmEvv" } }
+ // { dg-final { scan-assembler "_Z3fooILi2EKDmEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi110ELDmnuEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi120ELDmvlLi42EEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi121ELDmvlLd4045000000000000EEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi122ELDmobL_Z29_ZTAXtlN3NS21VELi1ELi2ELi3EEEEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi130ELDmobixL_Z3arrEL\[ilx]1EEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi131ELDmobixL_ZN3NS23arrEEL\[ilx]1EEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi132ELDmobdtL_ZN3NS21sEE3memEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi140ELDmvr3arrEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi141ELDmvrN3NS23arrEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi142ELDmvrZ3baziE1xEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi143ELDmvrZ3baziE1vEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi144ELDmvrN3NS23NS324_ZN3NS23NS3DC2a12a22a3EEEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi145ELDmvrN1S3varEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi146ELDmvrN3NS21S3varEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi147ELDmvr4TVarILi42EEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi148ELDmvr4TVarILi42EEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi149ELDmvrN3NS21S4TVarIiEEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi150ELDmsb2a3EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi151ELDmsbN3NS22a3EEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi160ELDmfn2fniEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi161ELDmfnN3NS22fnEilEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi162ELDmfn3TFnITnDaLi42EEvvEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi163ELDmfnN3NS23TFnILj0EEEvvEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi164ELDmfnN3NS23TFnILDmtyiEEEvvEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi165ELDmfnN3NS21XplERKS1_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi166ELDmfnN3NS21ZC4EvEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi167ELDmfnN3NS21ZC4ERKS1_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi168ELDmfnN3NS21ZaSERKS1_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi169ELDmfnN3NS21ZD4EvEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi170ELDmpa_2fniEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi171ELDmpa_N3NS22fnEilEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi172ELDmpa0_N3NS22fnEilEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi180ELDmen4Enum1AEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi181ELDmen3NS24Enum1AEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi182ELDmen3NS2Uej1C1CEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi190ELDman_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi200ELDmta5AliasEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi201ELDmta3NS25AliasEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi202ELDmta6TAliasILi42EEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi203ELDmta3NS26TAliasILj0EEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi210ELDmty1SEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi211ELDmtyN3NS21SEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi212ELDmtyKiEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi213ELDmtyDnEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi214ELDmtyDmEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi215ELDmty4TClsILi42EEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi216ELDmtyN3NS24TClsILi42EEEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi220ELDmdm1S3memEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi221ELDmdm3NS21S3memEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi222ELDmdm3NS22auEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi223ELDmdm3NS21X1aEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi224ELDmdm3NS21YIiE1aEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi230ELDmun1S_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi231ELDmun3NS21S_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi232ELDmun3NS21S0_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi233ELDmun3NS21S1_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi240ELDmct4TClsEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi241ELDmct3NS24TClsEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi250ELDmft3TFnEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi251ELDmft3NS23TFnEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi260ELDmvt4TVarEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi261ELDmvt3NS24TVarEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi270ELDmat6TAliasEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi271ELDmat3NS26TAliasEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi280ELDmco7ConceptEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi281ELDmco3NS27ConceptEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi290ELDmna7NSAliasEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi291ELDmna3NS27NSAliasEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi300ELDmns2NSEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi301ELDmns3NS23NS3EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi310ELDmngEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi320ELDmba_1SEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi321ELDmba_N3NS21SEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi322ELDmba_N3NS21WIiEEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi323ELDmba0_N3NS21WIfEEEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi330ELDmds1S_6member___EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi331ELDmdsN3NS21SE_1m_16__nEEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi332ELDmdst_1b__5_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi333ELDmdsl___3_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi334ELDmdsi___0_EEvv" } }
+ // { dg-final { scan-assembler "_Z3barILi340ELDmfnN3NS21XD4EvEEvv" } }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member-visibility1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member-visibility1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member-visibility1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member-visibility1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,412 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Tests std::meta::is_public, std::meta::is_private, std::meta::is_protected
+ #include <meta>
+ 
+ class PublicBase {  };
+ class ProtectedBase {  };
+ class PrivateBase {  };
+ class VirtualBase {  };
+ class VirtualProtectedBase {  };
+ 
+ class A : public PublicBase, protected ProtectedBase, private PrivateBase, 
+ 	  virtual VirtualBase, protected virtual VirtualProtectedBase
+ {
+   void test_bases_visibility()
+   {
+     constexpr auto ctx = std::meta::access_context::unchecked();
+     static_assert (std::meta::bases_of (^^A, ctx).size() == 5);
+ 
+     static_assert (std::meta::is_public (std::meta::bases_of (^^A, ctx)[0]));
+     static_assert (std::meta::is_protected (std::meta::bases_of (^^A, ctx)[1]));
+     static_assert (std::meta::is_private (std::meta::bases_of (^^A, ctx)[2]));
+     static_assert (std::meta::is_private (std::meta::bases_of (^^A, ctx)[3]));
+     static_assert (std::meta::is_protected (std::meta::bases_of (^^A, ctx)[4]));
+   }
+ 
+ // private:
+   A(int)
+   {
+     int a;
+     static_assert (!std::meta::is_public (std::meta::parent_of (^^a)));
+     static_assert (!std::meta::is_protected (std::meta::parent_of (^^a)));
+     static_assert (std::meta::is_private (std::meta::parent_of (^^a)));
+   }
+ 
+ protected:
+   A(bool)
+   {
+     int a;
+     static_assert (!std::meta::is_public (std::meta::parent_of (^^a)));
+     static_assert (std::meta::is_protected (std::meta::parent_of (^^a)));
+     static_assert (!std::meta::is_private (std::meta::parent_of (^^a)));
+   }
+ 
+   ~A() = default;
+ 
+ public:
+   A()
+   {
+     int a;
+     static_assert (std::meta::is_public (std::meta::parent_of (^^a)));
+     static_assert (!std::meta::is_protected (std::meta::parent_of (^^a)));
+     static_assert (!std::meta::is_private (std::meta::parent_of (^^a)));
+   }
+ 
+   int public_field;
+   static int public_static_field;
+ 
+   int public_function();
+   static int public_static_function();
+   virtual void public_virtual_function() = 0;
+ 
+   template <typename T> 
+   void public_template_function();
+   template <typename T> 
+   static void public_static_template_function();
+ 
+   using public_type_alias = int;
+ 
+   struct PublicCls {};
+ 
+   enum PublicEnum {
+     B, C, D
+   };
+ 
+   enum class PublicEnumClass {
+     E, F
+   };
+ 
+   union PublicUnion {};
+ 
+ protected:
+ 
+   int protected_field;
+   static int protected_static_field;
+ 
+   int protected_function();
+   static int protected_static_function();
+   virtual void protected_virtual_function() = 0;
+ 
+   template <typename T> 
+   void protected_template_function();
+   template <typename T> 
+   static void protected_static_template_function();
+ 
+   using protected_type_alias = int;
+ 
+   struct ProtectedCls {};
+ 
+   enum ProtectedEnum {
+     G, H
+   };
+ 
+   enum class ProtectedEnumClass {
+     I, J
+   };
+ 
+   union ProtectedUnion {};
+ 
+ private:
+ 
+   int private_field;
+   static int private_static_field;
+ 
+   int private_function();
+   static int private_static_function();
+   virtual void private_virtual_function() = 0;
+ 
+   template <typename T> 
+   void private_template_function();
+   template <typename T> 
+   static void private_static_template_function();
+ 
+   using private_type_alias = int;
+ 
+   struct PrivateCls {};
+ 
+   enum PrivateEnum {
+     K, L
+   };
+ 
+   enum class PrivateEnumClass {
+     M, N
+   };
+ 
+   union PrivateUnion {};
+ 
+ 
+   void test_is_public()
+   {
+     // positive cases for public class members
+     static_assert (std::meta::is_public (^^public_field));
+     static_assert (std::meta::is_public (^^public_static_field));
+ 
+     static_assert (std::meta::is_public(^^public_function));
+     static_assert (std::meta::is_public (^^public_static_function));
+     static_assert (std::meta::is_public (^^public_virtual_function));
+ 
+     static_assert (std::meta::is_public (^^public_template_function));
+     static_assert (std::meta::is_public (^^public_template_function<int>));
+ 
+     static_assert (std::meta::is_public (^^public_static_template_function));
+     static_assert (std::meta::is_public (^^public_static_template_function<int>));
+ 
+     static_assert (std::meta::is_public (^^public_type_alias));
+     static_assert (std::meta::is_public (^^PublicCls));
+     static_assert (std::meta::is_public (^^PublicUnion));
+ 
+     static_assert (std::meta::is_public (^^PublicEnum));
+     static_assert (std::meta::is_public (^^PublicEnumClass)); 
+ 
+     static_assert (std::meta::is_public (^^B));
+     static_assert (std::meta::is_public (^^C));
+     static_assert (std::meta::is_public (^^D));
+ 
+     // negative test cases
+     static_assert (!std::meta::is_public (^^A));
+ 
+     // scoped enum values are not class members
+     static_assert (!std::meta::is_public (^^PublicEnumClass::E));
+     static_assert (!std::meta::is_public (^^PublicEnumClass::F));
+ 
+     static_assert (!std::meta::is_public (^^ProtectedEnumClass::I));
+     static_assert (!std::meta::is_public (^^ProtectedEnumClass::J));
+ 
+     static_assert (!std::meta::is_public (^^PrivateEnumClass::M));
+     static_assert (!std::meta::is_public (^^PrivateEnumClass::N));
+ 
+     // protected class members
+     static_assert (!std::meta::is_public (^^~A));
+ 
+     static_assert (!std::meta::is_public (^^protected_field));
+     static_assert (!std::meta::is_public (^^protected_static_field));
+ 
+     static_assert (!std::meta::is_public (^^protected_function));
+     static_assert (!std::meta::is_public (^^protected_static_function));
+     static_assert (!std::meta::is_public (^^protected_virtual_function));
+ 
+     static_assert (!std::meta::is_public (^^protected_template_function));
+     static_assert (!std::meta::is_public (^^protected_template_function<int>));
+ 
+     static_assert (!std::meta::is_public (^^protected_static_template_function));
+     static_assert (!std::meta::is_public (^^protected_static_template_function<int>));
+ 
+     static_assert (!std::meta::is_public (^^protected_type_alias)); 
+     static_assert (!std::meta::is_public (^^ProtectedCls));  
+     static_assert (!std::meta::is_public (^^ProtectedUnion));
+ 
+     static_assert (!std::meta::is_public (^^ProtectedEnum));
+     static_assert (!std::meta::is_public (^^ProtectedEnumClass)); 
+ 
+     static_assert (!std::meta::is_public (^^G));
+     static_assert (!std::meta::is_public (^^H));
+ 
+     // private class members
+     static_assert (!std::meta::is_public (^^private_field));
+     static_assert (!std::meta::is_public (^^private_static_field));
+ 
+     static_assert (!std::meta::is_public (^^private_function));
+     static_assert (!std::meta::is_public (^^private_static_function));
+     static_assert (!std::meta::is_public (^^private_virtual_function));
+ 
+     static_assert (!std::meta::is_public (^^private_template_function));
+     static_assert (!std::meta::is_public (^^private_template_function<int>));
+ 
+     static_assert (!std::meta::is_public (^^private_static_template_function));
+     static_assert (!std::meta::is_public (^^private_static_template_function<int>));
+ 
+     static_assert (!std::meta::is_public (^^private_type_alias)); 
+     static_assert (!std::meta::is_public (^^PrivateCls));  
+     static_assert (!std::meta::is_public (^^PrivateUnion));
+ 
+     static_assert (!std::meta::is_public (^^PrivateEnum));
+     static_assert (!std::meta::is_public (^^PrivateEnumClass)); 
+ 
+     static_assert (!std::meta::is_public (^^K));
+     static_assert (!std::meta::is_public (^^L));
+   }
+ 
+   void test_is_protected()
+   {
+     // positive cases for protected class members
+     static_assert (std::meta::is_protected (^^~A));
+ 
+     static_assert (std::meta::is_protected (^^protected_field));
+     static_assert (std::meta::is_protected (^^protected_static_field));
+ 
+     static_assert (std::meta::is_protected (^^protected_function));
+     static_assert (std::meta::is_protected (^^protected_static_function));
+     static_assert (std::meta::is_protected (^^protected_virtual_function));
+ 
+     static_assert (std::meta::is_protected (^^protected_template_function));
+     static_assert (std::meta::is_protected (^^protected_template_function<int>));
+ 
+     static_assert (std::meta::is_protected (^^protected_static_template_function));
+     static_assert (std::meta::is_protected (^^protected_static_template_function<int>));
+ 
+     static_assert (std::meta::is_protected (^^protected_type_alias)); 
+     static_assert (std::meta::is_protected (^^ProtectedCls));  
+     static_assert (std::meta::is_protected (^^ProtectedUnion));
+ 
+     static_assert (std::meta::is_protected (^^ProtectedEnum));
+     static_assert (std::meta::is_protected (^^ProtectedEnumClass)); 
+ 
+     static_assert (std::meta::is_protected (^^G));
+     static_assert (std::meta::is_protected (^^H));
+ 
+     // negative cases:
+     static_assert (!std::meta::is_protected (^^A));
+     // scoped enum values are not class members
+     static_assert (!std::meta::is_protected (^^PublicEnumClass::E));
+     static_assert (!std::meta::is_protected (^^PublicEnumClass::F));
+ 
+     static_assert (!std::meta::is_protected (^^ProtectedEnumClass::I));
+     static_assert (!std::meta::is_protected (^^ProtectedEnumClass::J));
+ 
+     static_assert (!std::meta::is_protected (^^PrivateEnumClass::M));
+     static_assert (!std::meta::is_protected (^^PrivateEnumClass::N));
+ 
+     // public class members
+     static_assert (!std::meta::is_protected (^^public_field));
+     static_assert (!std::meta::is_protected (^^public_static_field));
+ 
+     static_assert (!std::meta::is_protected (^^public_function));
+     static_assert (!std::meta::is_protected (^^public_static_function));
+     static_assert (!std::meta::is_protected (^^public_virtual_function));
+ 
+     static_assert (!std::meta::is_protected (^^public_template_function));
+     static_assert (!std::meta::is_protected (^^public_template_function<int>));
+ 
+     static_assert (!std::meta::is_protected (^^public_static_template_function));
+     static_assert (!std::meta::is_protected (^^public_static_template_function<int>));
+ 
+     static_assert (!std::meta::is_protected (^^public_type_alias)); 
+     static_assert (!std::meta::is_protected (^^PublicCls));  
+     static_assert (!std::meta::is_protected (^^PublicUnion));
+ 
+     static_assert (!std::meta::is_protected (^^PublicEnum));
+     static_assert (!std::meta::is_protected (^^PublicEnumClass)); 
+ 
+     static_assert (!std::meta::is_protected (^^B));
+     static_assert (!std::meta::is_protected (^^C));
+     static_assert (!std::meta::is_protected (^^D));
+ 
+ 
+     // private class members
+     static_assert (!std::meta::is_protected (^^private_field));
+     static_assert (!std::meta::is_protected (^^private_static_field));
+ 
+     static_assert (!std::meta::is_protected (^^private_function));
+     static_assert (!std::meta::is_protected (^^private_static_function));
+     static_assert (!std::meta::is_protected (^^private_virtual_function));
+ 
+     static_assert (!std::meta::is_protected (^^private_template_function));
+     static_assert (!std::meta::is_protected (^^private_template_function<int>));
+ 
+     static_assert (!std::meta::is_protected (^^private_static_template_function));
+     static_assert (!std::meta::is_protected (^^private_static_template_function<int>));
+ 
+     static_assert (!std::meta::is_protected (^^private_type_alias)); 
+     static_assert (!std::meta::is_protected (^^PrivateCls));  
+     static_assert (!std::meta::is_protected (^^PrivateUnion));
+ 
+     static_assert (!std::meta::is_protected (^^PrivateEnum));
+     static_assert (!std::meta::is_protected (^^PrivateEnumClass)); 
+ 
+     static_assert (!std::meta::is_protected (^^K));
+     static_assert (!std::meta::is_protected (^^L));
+   }
+ 
+   void test_is_private()
+   {
+     // positive test cases: private class members
+     static_assert (std::meta::is_private (^^private_field));
+     static_assert (std::meta::is_private (^^private_static_field));
+ 
+     static_assert (std::meta::is_private (^^private_function));
+     static_assert (std::meta::is_private (^^private_static_function));
+     static_assert (std::meta::is_private (^^private_virtual_function));
+ 
+     static_assert (std::meta::is_private (^^private_template_function));
+     static_assert (std::meta::is_private (^^private_template_function<int>));
+ 
+     static_assert (std::meta::is_private (^^private_static_template_function));
+     static_assert (std::meta::is_private (^^private_static_template_function<int>));
+ 
+     static_assert (std::meta::is_private (^^private_type_alias)); 
+     static_assert (std::meta::is_private (^^PrivateCls));  
+     static_assert (std::meta::is_private (^^PrivateUnion));
+ 
+     static_assert (std::meta::is_private (^^PrivateEnum));
+     static_assert (std::meta::is_private (^^PrivateEnumClass)); 
+ 
+     static_assert (std::meta::is_private (^^K));
+     static_assert (std::meta::is_private (^^L));
+ 
+     // negative cases:
+     static_assert (!std::meta::is_private (^^A));
+ 
+     // scoped enum values are not class members
+     static_assert (!std::meta::is_private (^^PublicEnumClass::E));
+     static_assert (!std::meta::is_private (^^PublicEnumClass::F));
+ 
+     static_assert (!std::meta::is_private (^^ProtectedEnumClass::I));
+     static_assert (!std::meta::is_private (^^ProtectedEnumClass::J));
+ 
+     static_assert (!std::meta::is_private (^^PrivateEnumClass::M));
+     static_assert (!std::meta::is_private (^^PrivateEnumClass::N));
+ 
+     // public class members
+     static_assert (!std::meta::is_private (^^public_field));
+     static_assert (!std::meta::is_private (^^public_static_field));
+ 
+     static_assert (!std::meta::is_private (^^public_function));
+     static_assert (!std::meta::is_private (^^public_static_function));
+     static_assert (!std::meta::is_private (^^public_virtual_function));
+ 
+     static_assert (!std::meta::is_private (^^public_template_function));
+     static_assert (!std::meta::is_private (^^public_template_function<int>));
+ 
+     static_assert (!std::meta::is_private (^^public_static_template_function));
+     static_assert (!std::meta::is_private (^^public_static_template_function<int>));
+ 
+     static_assert (!std::meta::is_private (^^public_type_alias)); 
+     static_assert (!std::meta::is_private (^^PublicCls));  
+     static_assert (!std::meta::is_private (^^PublicUnion));
+ 
+     static_assert (!std::meta::is_private (^^PublicEnum));
+     static_assert (!std::meta::is_private (^^PublicEnumClass)); 
+ 
+     static_assert (!std::meta::is_private (^^B));
+     static_assert (!std::meta::is_private (^^C));
+     static_assert (!std::meta::is_private (^^D));
+ 
+     // protected class members
+     static_assert (!std::meta::is_private (^^~A));
+ 
+     static_assert (!std::meta::is_private (^^protected_field));
+     static_assert (!std::meta::is_private (^^protected_static_field));
+ 
+     static_assert (!std::meta::is_private (^^protected_function));
+     static_assert (!std::meta::is_private (^^protected_static_function));
+     static_assert (!std::meta::is_private (^^protected_virtual_function));
+ 
+     static_assert (!std::meta::is_private (^^protected_template_function));
+     static_assert (!std::meta::is_private (^^protected_template_function<int>));
+ 
+     static_assert (!std::meta::is_private (^^protected_static_template_function));
+     static_assert (!std::meta::is_private (^^protected_static_template_function<int>));
+ 
+     static_assert (!std::meta::is_private (^^protected_type_alias)); 
+     static_assert (!std::meta::is_private (^^ProtectedCls));  
+     static_assert (!std::meta::is_private (^^ProtectedUnion));
+ 
+     static_assert (!std::meta::is_private (^^ProtectedEnum));
+     static_assert (!std::meta::is_private (^^ProtectedEnumClass)); 
+ 
+     static_assert (!std::meta::is_private (^^G));
+     static_assert (!std::meta::is_private (^^H));
+   }
+ };
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member-visibility2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member-visibility2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member-visibility2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member-visibility2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,61 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Tests std::meta::is_public, std::meta::is_private, std::meta::is_protected
+ #include <meta>
+ 
+ // Test bit-fields
+ struct S {
+   unsigned char b1 : 3;
+ protected:
+   unsigned char    : 2;
+ private:
+   unsigned char b2 : 6;
+ };
+ 
+ constexpr auto ctx = std::meta::access_context::unchecked();
+ static_assert (std::meta::members_of (^^S, ctx).size() > 3);
+ 
+ static_assert (std::meta::is_bit_field (std::meta::members_of (^^S, ctx)[0]));
+ static_assert (std::meta::has_identifier (std::meta::members_of (^^S, ctx)[0]));
+ static_assert (std::meta::is_public (std::meta::members_of (^^S, ctx)[0]));
+ 
+ static_assert (std::meta::is_bit_field (std::meta::members_of (^^S, ctx)[1]));
+ static_assert (!std::meta::has_identifier (std::meta::members_of (^^S, ctx)[1]));
+ static_assert (std::meta::is_protected (std::meta::members_of (^^S, ctx)[1]));
+ 
+ static_assert (std::meta::is_bit_field (std::meta::members_of (^^S, ctx)[2]));
+ static_assert (std::meta::has_identifier (std::meta::members_of (^^S, ctx)[2]));
+ static_assert (std::meta::is_private (std::meta::members_of (^^S, ctx)[2]));
+ 
+ // Test inheritance and change of access modifier
+ class A {
+ protected:
+   int protected_member;
+ 
+   void protected_function();
+ 
+   virtual void protected_virtual_function();
+ 
+   void test() {
+     static_assert (std::meta::is_protected (^^protected_member));
+     static_assert (std::meta::is_protected (^^protected_function));
+     static_assert (std::meta::is_protected (^^protected_virtual_function));
+   }
+ };
+ 
+ 
+ class B : public A {
+ private:
+   void protected_virtual_function() override;
+ 
+   void test() {
+     static_assert (std::meta::is_protected (^^B::protected_member));
+     static_assert (std::meta::is_protected (^^B::protected_function));
+ 
+     static_assert (std::meta::is_protected (^^A::protected_virtual_function));
+     static_assert (std::meta::is_private (^^B::protected_virtual_function));
+   }
+ };
+ 
+ // TODO: add more tests for inheritance and change of access modification
+ // TODO: add more tests for base access during multilevel inheritance
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,99 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test various forms of member access.
+ 
+ struct A {
+   int val;
+ };
+ 
+ struct B {
+   A a;
+ };
+ 
+ struct S {
+   int x;
+   static constexpr int sx = 42;
+   void fn (int) { }
+   template<typename T>
+   void tfn (T) { }
+   template<typename>
+   struct N { };
+   template<typename T>
+   static T var;
+   B b;
+ };
+ 
+ template<typename T>
+ struct C {
+   int x;
+   static constexpr int sx = 42;
+   void fn (int) { }
+   template<typename U>
+   void tfn (U) { }
+   template<typename>
+   struct N { };
+   template<typename U>
+   static U var;
+   B b;
+ };
+ 
+ void
+ f ()
+ {
+   S s;
+   S *sp = &s;
+   C<int> c;
+   C<int> *cp = &c;
+ 
+   s.[: ^^S::x :] = 1;
+   sp->[: ^^S::x :] = 2;
+   s.[: ^^S::fn :](42);
+   sp->[: ^^S::fn :](42);
+   int a = s.[: ^^S::sx :];
+   a += sp->[: ^^S::sx :];
+   s.template [: ^^S::tfn :](42);
+   sp->template [: ^^S::tfn :](42);
+   s.template [: ^^S::tfn :]<int>(42);
+   sp->template [: ^^S::tfn :]<int>(42);
+   s.[: ^^S::var :]<int> = 1; // { dg-error "reflection .var<int>. not usable in a splice expression with template arguments" }
+   s.template [: ^^S::var :]<int> = 1;
+   sp->[: ^^S::var :]<int> = 1; // { dg-error "reflection .var<int>. not usable in a splice expression with template arguments" }
+   sp->template [: ^^S::var :]<int> = 1;
+   s.[: ^^S::b :].[: ^^B::a :].val;
+   sp->[: ^^S::b :].[: ^^B::a :].val;
+   [: ^^s :].[: ^^S::b :].[: ^^B::a :].val;
+   [: ^^sp :]->[: ^^S::b :].[: ^^B::a :].val;
+ 
+   c.[: ^^C<int>::x :] = 1;
+   cp->[: ^^C<int>::x :] = 1;
+   c.[: ^^C<int>::fn :](42);
+   cp->[: ^^C<int>::fn :](42);
+   a += c.[: ^^C<int>::sx :];
+   a += cp->[: ^^C<int>::sx :];
+   c.template [: ^^C<int>::tfn :](42);
+   cp->template [: ^^C<int>::tfn :](42);
+   c.template [: ^^C<int>::tfn :]<int>(42);
+   cp->template [: ^^C<int>::tfn :]<int>(42);
+   c.[: ^^C<int>::var :]<int> = 1; // { dg-error "reflection .var<int>. not usable in a splice expression with template arguments" }
+   c.template [: ^^C<int>::var :]<int> = 1;
+   cp->[: ^^C<int>::var :]<int> = 1; // { dg-error "reflection .var<int>. not usable in a splice expression with template arguments" }
+   cp->template [: ^^C<int>::var :]<int> = 1;
+   c.[: ^^C<int>::b :].[: ^^B::a :].val;
+   cp->[: ^^C<int>::b :].[: ^^B::a :].val;
+   [: ^^c :].[: ^^C<int>::b :].[: ^^B::a :].val;
+   [: ^^cp :]->[: ^^C<int>::b :].[: ^^B::a :].val;
+ 
+   [: ^^S :]::template N<int> n1;
+   [: ^^C<int> :]::template N<int> n2;
+   [: ^^C :]<int>::template N<int> n3;  // { dg-error "missing .template.|expected" }
+   typename [: ^^C :]<int>::template N<int> n4;
+ 
+   s->[: ^^S::x :] = 2; // { dg-error "non-pointer type" }
+   sp.[: ^^S::x :] = 2; // { dg-error "which is of pointer type" }
+   c.[: ^^C<char>::x :] = 1; // { dg-error "is not a base of" }
+   cp->[: ^^C<char>::x :] = 1; // { dg-error "is not a base of" }
+   s.template [: ^^S::N :].t;  // { dg-error "reflection .S::N. not usable in a template splice" }
+   S::template [: ^^S::N<int> :] e1;  // { dg-error "expected unqualified-id" }
+   C<int>::template [: ^^S::N<int> :] e2;  // { dg-error "expected unqualified-id" }
+   s.template [: ^^S::var<int> :] = 1;  // { dg-error "reflection .S::var<int>. not usable in a template splice" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,42 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^int);
+ 
+ /* ??? clang rejects all of these; I'm not entirely sure why.
+    [expr.prim.id.general]/2 says that the implicit transformation
+    whereby an id-expression denoting a NSDM becomes a class member
+    access doesn't apply to a splice-expression.  OK, so we reject
+    [:^^k:], but [:^^S:]::k doesn't seem to be the same case?  */
+ 
+ // Non-dependent case
+ struct S {
+   int k;
+ 
+   void fn2() { }
+ 
+   void fn() {
+     (void) [:^^k:];  // { dg-error "cannot implicitly reference" }
+     (void) [:^^S:]::k;
+     [:^^fn:]();  // { dg-error "cannot implicitly reference" }
+     [:^^S:]::fn2();
+   }
+ };
+ 
+ // Dependent case
+ struct D {
+   int k;
+ 
+   void fn2() { }
+ 
+   template <typename T>
+   void fn() {
+     (void) [:^^T:]::k;
+     [:^^T:]::fn2();
+   }
+ };
+ 
+ void runner() {
+     D f = {4};
+     f.fn<D>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member11.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member11.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member11.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Cf. <https://github.com/cplusplus/CWG/issues/784>
+ 
+ class Base {
+ private:
+   int m;
+ public:
+   static constexpr auto rm = ^^m;
+ };
+ class Derived { static constexpr auto mp = &[:Base::rm:]; };
+ 
+ class Base2 {
+ protected:
+   int m;
+ public:
+   static constexpr auto rm = ^^m;
+ };
+ class Derived2 { static constexpr auto mp = &[:Base2::rm:]; };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member12.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member12.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member12.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member12.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,37 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   int a;
+   static int b;
+   void foo () {}
+   static void bar () {}
+ };
+ int S::b = 42;
+ 
+ void
+ baz ()
+ {
+   S s {};
+   s.[:^^S::a:]++;
+   s.[:^^S::b:]++;
+   s.[:^^S::foo:] ();
+   s.[:^^S::bar:] ();
+ }
+ 
+ template <typename T>
+ void
+ qux ()
+ {
+   S s {};
+   s.[:(T) ^^S::a:]++;
+   s.[:(T) ^^S::b:]++;
+   s.[:(T) ^^S::foo:] ();
+   s.[:(T) ^^S::bar:] ();
+ }
+ 
+ void
+ corge ()
+ {
+   qux <decltype (^^int)> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member13.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member13.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member13.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member13.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,46 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   int a;
+   static int b;
+   void foo () {}
+   static void bar () {}
+   template <int N>
+   void baz () {}
+   template <int N>
+   static void qux () {}
+ };
+ int S::b = 42;
+ 
+ struct V {
+   int a;
+   static int b;
+   void foo () {}
+   static void bar () {}
+   template <int N>
+   void baz () {}
+   template <int N>
+   static void qux () {}
+ };
+ int V::b = 42;
+ static constexpr auto va = ^^V::a;
+ static constexpr auto vb = ^^V::b;
+ static constexpr auto vfoo = ^^V::foo;
+ static constexpr auto vbar = ^^V::bar;
+ 
+ void
+ corge ()
+ {
+   S s {};
+   s.[:^^V::a:]++;			// { dg-error ".V. is not a base of .S." }
+   s.[:^^V::b:]++;			// { dg-error ".V. is not a base of .S." }
+   s.[:^^V::foo:] ();			// { dg-error ".V::foo\\\(\\\). is not a member of .S." }
+   s.[:^^V::bar:] ();			// { dg-error ".V::bar\\\(\\\). is not a member of .S." }
+   s.[:va:]++;				// { dg-error ".V. is not a base of .S." }
+   s.[:vb:]++;				// { dg-error ".V. is not a base of .S." }
+   s.[:vfoo:] ();			// { dg-error ".V::foo\\\(\\\). is not a member of .S." }
+   s.[:vbar:] ();			// { dg-error ".V::bar\\\(\\\). is not a member of .S." }
+   s.template [:^^V::baz:] <42> ();	// { dg-error "is not a member of .S." }
+   s.template [:^^V::qux:] <42> ();	// { dg-error "is not a member of .S." }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member14.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member14.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member14.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member14.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,27 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ class A {
+   int a = 0;
+   consteval int foo () const { return 5; }
+ public:
+   int b = 0;
+   consteval A () = default;
+   consteval A (int x, int y) : a (x), b (y) {}
+ };
+ 
+ constexpr auto ctx = std::meta::access_context::unchecked ();
+ static_assert (identifier_of (members_of (^^A, ctx)[0]) == "a");
+ static_assert (identifier_of (members_of (^^A, ctx)[1]) == "foo");
+ static_assert (identifier_of (members_of(^^A, ctx)[2]) == "b");
+ 
+ constexpr A c, d = { 42, 6 };
+ // TODO, these don't work yet due to access failure.
+ static_assert (c.[: members_of (^^A, ctx)[0] :] == 0);
+ //static_assert (c.[: members_of (^^A, ctx)[1] :] () == 5);
+ static_assert (c.[: members_of (^^A, ctx)[2] :] == 0);
+ static_assert (d.[: members_of (^^A, ctx)[0] :] == 42);
+ //static_assert (d.[: members_of (^^A, ctx)[1] :] () == 5);
+ static_assert (d.[: members_of (^^A, ctx)[2] :] == 6);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member15.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member15.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member15.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member15.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,169 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S { int _; long _; short _; };
+ struct T { int _; int _; int _; };
+ struct U { enum E { F, G, H, I } j, k; };
+ struct V : S, T { int _; int _; };
+ 
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ void
+ foo ()
+ {
+   S s = { 1, 2, 3 };
+   s.[:members_of (^^S, uctx)[1]:] += 10;
+   s.[:members_of (^^S, uctx)[0]:] += 20;
+   s.[:members_of (^^S, uctx)[2]:] += 30;
+   auto [ sa, sb, sc ] = s;
+   if (sa != 21 || sb != 12 || sc != 33)
+     __builtin_abort ();
+   T t = { 4, 5, 6 };
+   t.[:members_of (^^T, uctx)[1]:] += 40;
+   t.[:members_of (^^T, uctx)[2]:] += 50;
+   t.[:members_of (^^T, uctx)[0]:] += 60;
+   auto [ ta, tb, tc ] = t;
+   if (ta != 64 || tb != 45 || tc != 56)
+     __builtin_abort ();
+   U u = { U::F, U::I };
+   u.[:nonstatic_data_members_of (^^U, uctx)[0]:] = u.[:^^U::E::G:];
+   u.[:nonstatic_data_members_of (^^U, uctx)[1]:] = u.[:^^U::H:];
+   if (u.j != U::G || u.k != U::E::H)
+     __builtin_abort ();
+   V v = {};
+   v.[:members_of (^^S, uctx)[1]:] = 1;
+   v.[:members_of (^^T, uctx)[2]:] = 2;
+   v.[:members_of (^^V, uctx)[0]:] = 3;
+ }
+ 
+ template <int N>
+ void
+ bar ()
+ {
+   S s = { 1, 2, 3 };
+   s.[:members_of (^^S, uctx)[1]:] += 10;
+   s.[:members_of (^^S, uctx)[0]:] += 20;
+   s.[:members_of (^^S, uctx)[2]:] += 30;
+   auto [ sa, sb, sc ] = s;
+   if (sa != 21 || sb != 12 || sc != 33)
+     __builtin_abort ();
+   T t = { 4, 5, 6 };
+   t.[:members_of (^^T, uctx)[1]:] += 40;
+   t.[:members_of (^^T, uctx)[2]:] += 50;
+   t.[:members_of (^^T, uctx)[0]:] += 60;
+   auto [ ta, tb, tc ] = t;
+   if (ta != 64 || tb != 45 || tc != 56)
+     __builtin_abort ();
+   U u = { U::F, U::I };
+   u.[:nonstatic_data_members_of (^^U, uctx)[0]:] = u.[:^^U::E::G:];
+   u.[:nonstatic_data_members_of (^^U, uctx)[1]:] = u.[:^^U::H:];
+   if (u.j != U::G || u.k != U::E::H)
+     __builtin_abort ();
+   V v = {};
+   v.[:members_of (^^S, uctx)[1]:] = 1;
+   v.[:members_of (^^T, uctx)[2]:] = 2;
+   v.[:members_of (^^V, uctx)[0]:] = 3;
+ }
+ 
+ template <typename A, typename B, typename C, typename D>
+ void
+ baz ()
+ {
+   A s = { 1, 2, 3 };
+   s.[:members_of (^^S, uctx)[1]:] += 10;
+   s.[:members_of (^^S, uctx)[0]:] += 20;
+   s.[:members_of (^^S, uctx)[2]:] += 30;
+   auto [ sa, sb, sc ] = s;
+   if (sa != 21 || sb != 12 || sc != 33)
+     __builtin_abort ();
+   B t = { 4, 5, 6 };
+   t.[:members_of (^^T, uctx)[1]:] += 40;
+   t.[:members_of (^^T, uctx)[2]:] += 50;
+   t.[:members_of (^^T, uctx)[0]:] += 60;
+   auto [ ta, tb, tc ] = t;
+   if (ta != 64 || tb != 45 || tc != 56)
+     __builtin_abort ();
+   C u = { U::F, U::I };
+   u.[:nonstatic_data_members_of (^^U, uctx)[0]:] = u.[:^^U::E::G:];
+   u.[:nonstatic_data_members_of (^^U, uctx)[1]:] = u.[:^^U::H:];
+   if (u.j != U::G || u.k != U::E::H)
+     __builtin_abort ();
+   D v = {};
+   v.[:members_of (^^S, uctx)[1]:] = 1;
+   v.[:members_of (^^T, uctx)[2]:] = 2;
+   v.[:members_of (^^V, uctx)[0]:] = 3;
+ }
+ 
+ template <typename A, typename B, typename C, typename D>
+ void
+ qux ()
+ {
+   S s = { 1, 2, 3 };
+   s.[:members_of (^^A, uctx)[1]:] += 10;
+   s.[:members_of (^^A, uctx)[0]:] += 20;
+   s.[:members_of (^^A, uctx)[2]:] += 30;
+   auto [ sa, sb, sc ] = s;
+   if (sa != 21 || sb != 12 || sc != 33)
+     __builtin_abort ();
+   T t = { 4, 5, 6 };
+   t.[:members_of (^^B, uctx)[1]:] += 40;
+   t.[:members_of (^^B, uctx)[2]:] += 50;
+   t.[:members_of (^^B, uctx)[0]:] += 60;
+   auto [ ta, tb, tc ] = t;
+   if (ta != 64 || tb != 45 || tc != 56)
+     __builtin_abort ();
+   U u = { U::F, U::I };
+   u.[:nonstatic_data_members_of (^^C, uctx)[0]:] = u.[:^^C::E::G:];
+   u.[:nonstatic_data_members_of (^^C, uctx)[0]:] = u.[:^^C::G:];
+   u.[:nonstatic_data_members_of (^^C, uctx)[1]:] = u.[:^^C::H:];
+   if (u.j != U::G || u.k != U::E::H)
+     __builtin_abort ();
+   V v = {};
+   v.[:members_of (^^A, uctx)[1]:] = 1;
+   v.[:members_of (^^B, uctx)[2]:] = 2;
+   v.[:members_of (^^D, uctx)[0]:] = 3;
+ }
+ 
+ template <typename A, typename B, typename C, typename D>
+ void
+ fred ()
+ {
+   A s = { 1, 2, 3 };
+   s.[:members_of (^^A, uctx)[1]:] += 10;
+   s.[:members_of (^^A, uctx)[0]:] += 20;
+   s.[:members_of (^^A, uctx)[2]:] += 30;
+   auto [ sa, sb, sc ] = s;
+   if (sa != 21 || sb != 12 || sc != 33)
+     __builtin_abort ();
+   B t = { 4, 5, 6 };
+   t.[:members_of (^^B, uctx)[1]:] += 40;
+   t.[:members_of (^^B, uctx)[2]:] += 50;
+   t.[:members_of (^^B, uctx)[0]:] += 60;
+   auto [ ta, tb, tc ] = t;
+   if (ta != 64 || tb != 45 || tc != 56)
+     __builtin_abort ();
+   C u = { U::F, U::I };
+   u.[:nonstatic_data_members_of (^^C, uctx)[0]:] = u.[:^^C::E::G:];
+   u.[:nonstatic_data_members_of (^^C, uctx)[0]:] = u.[:^^C::G:];
+   u.[:nonstatic_data_members_of (^^C, uctx)[1]:] = u.[:^^C::H:];
+   if (u.j != U::G || u.k != U::E::H)
+     __builtin_abort ();
+   D v = {};
+   v.[:members_of (^^A, uctx)[1]:] = 1;
+   v.[:members_of (^^B, uctx)[2]:] = 2;
+   v.[:members_of (^^D, uctx)[0]:] = 3;
+ }
+ 
+ int
+ main ()
+ {
+   foo ();
+   bar <42> ();
+   baz <S, T, U, V> ();
+   qux <S, T, U, V> ();
+   fred <S, T, U, V> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member16.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member16.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member16.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member16.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,86 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct A { int a; };
+ struct B : public A { int b; };
+ struct C : public B { int c; };
+ struct D : public A, B, C { int d; };	// { dg-warning "direct base 'A' inaccessible in 'D' due to ambiguity" }
+ 					// { dg-warning "direct base 'B' inaccessible in 'D' due to ambiguity" "" { target *-*-* } .-1 }
+ struct E { int _; };
+ struct F : public E { int _; };
+ struct G : public F { int _; };
+ struct H : public E, F, G { int _; };	// { dg-warning "direct base 'E' inaccessible in 'H' due to ambiguity" }
+ 					// { dg-warning "direct base 'F' inaccessible in 'H' due to ambiguity" "" { target *-*-* } .-1 }
+ struct I { int i; };
+ struct J { int _; };
+ 
+ void
+ foo (C &c, D &d, G &g, H &h)
+ {
+   c.[: ^^A::a :] = 1;
+   c.[: ^^B::b :] = 2;
+   c.[: ^^C::c :] = 3;
+   d.[: ^^A::a :] = 4;			// { dg-error "'A' is an ambiguous base of 'D'" }
+   d.[: ^^B::b :] = 5;			// { dg-error "'B' is an ambiguous base of 'D'" }
+   d.[: ^^C::c :] = 6;
+   d.[: ^^D::d :] = 7;
+   d.[: ^^I::i :] = 8;			// { dg-error "'I' is not a base of 'D'" }
+   g.[: ^^E::_ :] = 1;
+   g.[: ^^F::_ :] = 2;
+   g.[: ^^G::_ :] = 3;
+   h.[: ^^E::_ :] = 4;			// { dg-error "'E' is an ambiguous base of 'H'" }
+   h.[: ^^F::_ :] = 5;			// { dg-error "'F' is an ambiguous base of 'H'" }
+   h.[: ^^G::_ :] = 6;
+   h.[: ^^H::_ :] = 7;
+   h.[: ^^J::_ :] = 8;			// { dg-error "'J' is not a base of 'H'" }
+ }
+ 
+ template <typename S, typename T, typename U, typename V>
+ void
+ bar (S &c, T &d, U &g, V &h)
+ {
+   c.[: ^^A::a :] = 1;
+   c.[: ^^B::b :] = 2;
+   c.[: ^^C::c :] = 3;
+   d.[: ^^A::a :] = 4;			// { dg-error "'A' is an ambiguous base of 'D'" }
+   d.[: ^^B::b :] = 5;			// { dg-error "'B' is an ambiguous base of 'D'" }
+   d.[: ^^C::c :] = 6;
+   d.[: ^^D::d :] = 7;
+   d.[: ^^I::i :] = 8;			// { dg-error "invalid use of non-static data member 'I::i'" }
+   g.[: ^^E::_ :] = 1;
+   g.[: ^^F::_ :] = 2;
+   g.[: ^^G::_ :] = 3;
+   h.[: ^^E::_ :] = 4;			// { dg-error "'E' is an ambiguous base of 'H'" }
+   h.[: ^^F::_ :] = 5;			// { dg-error "'F' is an ambiguous base of 'H'" }
+   h.[: ^^G::_ :] = 6;
+   h.[: ^^H::_ :] = 7;
+   h.[: ^^J::_ :] = 8;			// { dg-error "invalid use of non-static data member 'J::_'" }
+ }
+ 
+ void
+ baz (C &c, D &d, G &g, H &h)
+ {
+   bar (c, d, g, h);
+ }
+ 
+ template <int N>
+ void
+ qux (C &c, D &d, G &g, H &h)
+ {
+   c.[: ^^A::a :] = 1;
+   c.[: ^^B::b :] = 2;
+   c.[: ^^C::c :] = 3;
+   d.[: ^^A::a :] = 4;			// { dg-error "'A' is an ambiguous base of 'D'" }
+   d.[: ^^B::b :] = 5;			// { dg-error "'B' is an ambiguous base of 'D'" }
+   d.[: ^^C::c :] = 6;
+   d.[: ^^D::d :] = 7;
+   d.[: ^^I::i :] = 8;			// { dg-error "'I' is not a base of 'D'" }
+   g.[: ^^E::_ :] = 1;
+   g.[: ^^F::_ :] = 2;
+   g.[: ^^G::_ :] = 3;
+   h.[: ^^E::_ :] = 4;			// { dg-error "'E' is an ambiguous base of 'H'" }
+   h.[: ^^F::_ :] = 5;			// { dg-error "'F' is an ambiguous base of 'H'" }
+   h.[: ^^G::_ :] = 6;
+   h.[: ^^H::_ :] = 7;
+   h.[: ^^J::_ :] = 8;			// { dg-error "'J' is not a base of 'H'" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member17.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member17.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member17.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member17.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,402 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   constexpr int foo (int x) const { return 41 + x + s; }
+   constexpr int foo (long x) const { return 42 + x + s; }
+   constexpr int foo (long long x) const { return 43 + x + s; }
+   static constexpr int bar (int x) { return 72 + x; } 
+   static constexpr int bar (long x) { return 73 + x; } 
+   static constexpr int bar (long long x) { return 74 + x; } 
+   constexpr S (int x) : s (x) {}
+   int s;
+ };
+ struct T : public S {
+   constexpr int foo (int x) const { return 51 + x + s; }
+   constexpr int foo (long x) const { return 52 + x + s; }
+   constexpr int foo (long long x) const { return 53 + x + s; }
+   static constexpr int bar (int x) { return 82 + x; } 
+   static constexpr int bar (long x) { return 83 + x; } 
+   static constexpr int bar (long long x) { return 84 + x; } 
+   constexpr T (int x) : S (x) {}
+ };
+ 
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ constexpr S s = 1;
+ static_assert (s.foo (0) == 42);
+ static_assert (s.foo (0L) == 43);
+ static_assert (s.foo (0LL) == 44);
+ static_assert (s.[:members_of (^^S, uctx)[0]:] (10) == 52);
+ static_assert (s.[:members_of (^^S, uctx)[0]:] (20L) == 62);
+ static_assert (s.[:members_of (^^S, uctx)[0]:] (30LL) == 72);
+ static_assert (s.[:members_of (^^S, uctx)[1]:] (10) == 53);
+ static_assert (s.[:members_of (^^S, uctx)[1]:] (20L) == 63);
+ static_assert (s.[:members_of (^^S, uctx)[1]:] (30LL) == 73);
+ static_assert (s.[:members_of (^^S, uctx)[2]:] (10) == 54);
+ static_assert (s.[:members_of (^^S, uctx)[2]:] (20L) == 64);
+ static_assert (s.[:members_of (^^S, uctx)[2]:] (30LL) == 74);
+ static_assert (s.bar (0) == 72);
+ static_assert (s.bar (0L) == 73);
+ static_assert (s.bar (0LL) == 74);
+ static_assert (s.[:members_of (^^S, uctx)[3]:] (10) == 82);
+ static_assert (s.[:members_of (^^S, uctx)[3]:] (20L) == 92);
+ static_assert (s.[:members_of (^^S, uctx)[3]:] (30LL) == 102);
+ static_assert (s.[:members_of (^^S, uctx)[4]:] (10) == 83);
+ static_assert (s.[:members_of (^^S, uctx)[4]:] (20L) == 93);
+ static_assert (s.[:members_of (^^S, uctx)[4]:] (30LL) == 103);
+ static_assert (s.[:members_of (^^S, uctx)[5]:] (10) == 84);
+ static_assert (s.[:members_of (^^S, uctx)[5]:] (20L) == 94);
+ static_assert (s.[:members_of (^^S, uctx)[5]:] (30LL) == 104);
+ constexpr T t = 2;
+ static_assert (t.foo (0) == 53);
+ static_assert (t.foo (0L) == 54);
+ static_assert (t.foo (0LL) == 55);
+ static_assert (t.[:members_of (^^S, uctx)[0]:] (10) == 53);
+ static_assert (t.[:members_of (^^S, uctx)[0]:] (20L) == 63);
+ static_assert (t.[:members_of (^^S, uctx)[0]:] (30LL) == 73);
+ static_assert (t.[:members_of (^^S, uctx)[1]:] (10) == 54);
+ static_assert (t.[:members_of (^^S, uctx)[1]:] (20L) == 64);
+ static_assert (t.[:members_of (^^S, uctx)[1]:] (30LL) == 74);
+ static_assert (t.[:members_of (^^S, uctx)[2]:] (10) == 55);
+ static_assert (t.[:members_of (^^S, uctx)[2]:] (20L) == 65);
+ static_assert (t.[:members_of (^^S, uctx)[2]:] (30LL) == 75);
+ static_assert (t.[:members_of (^^T, uctx)[0]:] (10) == 63);
+ static_assert (t.[:members_of (^^T, uctx)[0]:] (20L) == 73);
+ static_assert (t.[:members_of (^^T, uctx)[0]:] (30LL) == 83);
+ static_assert (t.[:members_of (^^T, uctx)[1]:] (10) == 64);
+ static_assert (t.[:members_of (^^T, uctx)[1]:] (20L) == 74);
+ static_assert (t.[:members_of (^^T, uctx)[1]:] (30LL) == 84);
+ static_assert (t.[:members_of (^^T, uctx)[2]:] (10) == 65);
+ static_assert (t.[:members_of (^^T, uctx)[2]:] (20L) == 75);
+ static_assert (t.[:members_of (^^T, uctx)[2]:] (30LL) == 85);
+ static_assert (t.bar (0) == 82);
+ static_assert (t.bar (0L) == 83);
+ static_assert (t.bar (0LL) == 84);
+ static_assert (t.[:members_of (^^S, uctx)[3]:] (10) == 82);
+ static_assert (t.[:members_of (^^S, uctx)[3]:] (20L) == 92);
+ static_assert (t.[:members_of (^^S, uctx)[3]:] (30LL) == 102);
+ static_assert (t.[:members_of (^^S, uctx)[4]:] (10) == 83);
+ static_assert (t.[:members_of (^^S, uctx)[4]:] (20L) == 93);
+ static_assert (t.[:members_of (^^S, uctx)[4]:] (30LL) == 103);
+ static_assert (t.[:members_of (^^S, uctx)[5]:] (10) == 84);
+ static_assert (t.[:members_of (^^S, uctx)[5]:] (20L) == 94);
+ static_assert (t.[:members_of (^^S, uctx)[5]:] (30LL) == 104);
+ static_assert (t.[:members_of (^^T, uctx)[3]:] (10) == 92);
+ static_assert (t.[:members_of (^^T, uctx)[3]:] (20L) == 102);
+ static_assert (t.[:members_of (^^T, uctx)[3]:] (30LL) == 112);
+ static_assert (t.[:members_of (^^T, uctx)[4]:] (10) == 93);
+ static_assert (t.[:members_of (^^T, uctx)[4]:] (20L) == 103);
+ static_assert (t.[:members_of (^^T, uctx)[4]:] (30LL) == 113);
+ static_assert (t.[:members_of (^^T, uctx)[5]:] (10) == 94);
+ static_assert (t.[:members_of (^^T, uctx)[5]:] (20L) == 104);
+ static_assert (t.[:members_of (^^T, uctx)[5]:] (30LL) == 114);
+ 
+ template <int N>
+ void
+ foo ()
+ {
+   constexpr S s = 1;
+   static_assert (s.foo (0) == 42);
+   static_assert (s.foo (0L) == 43);
+   static_assert (s.foo (0LL) == 44);
+   static_assert (s.[:members_of (^^S, uctx)[0]:] (10) == 52);
+   static_assert (s.[:members_of (^^S, uctx)[0]:] (20L) == 62);
+   static_assert (s.[:members_of (^^S, uctx)[0]:] (30LL) == 72);
+   static_assert (s.[:members_of (^^S, uctx)[1]:] (10) == 53);
+   static_assert (s.[:members_of (^^S, uctx)[1]:] (20L) == 63);
+   static_assert (s.[:members_of (^^S, uctx)[1]:] (30LL) == 73);
+   static_assert (s.[:members_of (^^S, uctx)[2]:] (10) == 54);
+   static_assert (s.[:members_of (^^S, uctx)[2]:] (20L) == 64);
+   static_assert (s.[:members_of (^^S, uctx)[2]:] (30LL) == 74);
+   static_assert (s.bar (0) == 72);
+   static_assert (s.bar (0L) == 73);
+   static_assert (s.bar (0LL) == 74);
+   static_assert (s.[:members_of (^^S, uctx)[3]:] (10) == 82);
+   static_assert (s.[:members_of (^^S, uctx)[3]:] (20L) == 92);
+   static_assert (s.[:members_of (^^S, uctx)[3]:] (30LL) == 102);
+   static_assert (s.[:members_of (^^S, uctx)[4]:] (10) == 83);
+   static_assert (s.[:members_of (^^S, uctx)[4]:] (20L) == 93);
+   static_assert (s.[:members_of (^^S, uctx)[4]:] (30LL) == 103);
+   static_assert (s.[:members_of (^^S, uctx)[5]:] (10) == 84);
+   static_assert (s.[:members_of (^^S, uctx)[5]:] (20L) == 94);
+   static_assert (s.[:members_of (^^S, uctx)[5]:] (30LL) == 104);
+   constexpr T t = 2;
+   static_assert (t.foo (0) == 53);
+   static_assert (t.foo (0L) == 54);
+   static_assert (t.foo (0LL) == 55);
+   static_assert (t.[:members_of (^^S, uctx)[0]:] (10) == 53);
+   static_assert (t.[:members_of (^^S, uctx)[0]:] (20L) == 63);
+   static_assert (t.[:members_of (^^S, uctx)[0]:] (30LL) == 73);
+   static_assert (t.[:members_of (^^S, uctx)[1]:] (10) == 54);
+   static_assert (t.[:members_of (^^S, uctx)[1]:] (20L) == 64);
+   static_assert (t.[:members_of (^^S, uctx)[1]:] (30LL) == 74);
+   static_assert (t.[:members_of (^^S, uctx)[2]:] (10) == 55);
+   static_assert (t.[:members_of (^^S, uctx)[2]:] (20L) == 65);
+   static_assert (t.[:members_of (^^S, uctx)[2]:] (30LL) == 75);
+   static_assert (t.[:members_of (^^T, uctx)[0]:] (10) == 63);
+   static_assert (t.[:members_of (^^T, uctx)[0]:] (20L) == 73);
+   static_assert (t.[:members_of (^^T, uctx)[0]:] (30LL) == 83);
+   static_assert (t.[:members_of (^^T, uctx)[1]:] (10) == 64);
+   static_assert (t.[:members_of (^^T, uctx)[1]:] (20L) == 74);
+   static_assert (t.[:members_of (^^T, uctx)[1]:] (30LL) == 84);
+   static_assert (t.[:members_of (^^T, uctx)[2]:] (10) == 65);
+   static_assert (t.[:members_of (^^T, uctx)[2]:] (20L) == 75);
+   static_assert (t.[:members_of (^^T, uctx)[2]:] (30LL) == 85);
+   static_assert (t.bar (0) == 82);
+   static_assert (t.bar (0L) == 83);
+   static_assert (t.bar (0LL) == 84);
+   static_assert (t.[:members_of (^^S, uctx)[3]:] (10) == 82);
+   static_assert (t.[:members_of (^^S, uctx)[3]:] (20L) == 92);
+   static_assert (t.[:members_of (^^S, uctx)[3]:] (30LL) == 102);
+   static_assert (t.[:members_of (^^S, uctx)[4]:] (10) == 83);
+   static_assert (t.[:members_of (^^S, uctx)[4]:] (20L) == 93);
+   static_assert (t.[:members_of (^^S, uctx)[4]:] (30LL) == 103);
+   static_assert (t.[:members_of (^^S, uctx)[5]:] (10) == 84);
+   static_assert (t.[:members_of (^^S, uctx)[5]:] (20L) == 94);
+   static_assert (t.[:members_of (^^S, uctx)[5]:] (30LL) == 104);
+   static_assert (t.[:members_of (^^T, uctx)[3]:] (10) == 92);
+   static_assert (t.[:members_of (^^T, uctx)[3]:] (20L) == 102);
+   static_assert (t.[:members_of (^^T, uctx)[3]:] (30LL) == 112);
+   static_assert (t.[:members_of (^^T, uctx)[4]:] (10) == 93);
+   static_assert (t.[:members_of (^^T, uctx)[4]:] (20L) == 103);
+   static_assert (t.[:members_of (^^T, uctx)[4]:] (30LL) == 113);
+   static_assert (t.[:members_of (^^T, uctx)[5]:] (10) == 94);
+   static_assert (t.[:members_of (^^T, uctx)[5]:] (20L) == 104);
+   static_assert (t.[:members_of (^^T, uctx)[5]:] (30LL) == 114);
+ }
+ 
+ template <typename A, typename B>
+ void
+ bar ()
+ {
+   constexpr A s = 1;
+   static_assert (s.foo (0) == 42);
+   static_assert (s.foo (0L) == 43);
+   static_assert (s.foo (0LL) == 44);
+   static_assert (s.[:members_of (^^S, uctx)[0]:] (10) == 52);
+   static_assert (s.[:members_of (^^S, uctx)[0]:] (20L) == 62);
+   static_assert (s.[:members_of (^^S, uctx)[0]:] (30LL) == 72);
+   static_assert (s.[:members_of (^^S, uctx)[1]:] (10) == 53);
+   static_assert (s.[:members_of (^^S, uctx)[1]:] (20L) == 63);
+   static_assert (s.[:members_of (^^S, uctx)[1]:] (30LL) == 73);
+   static_assert (s.[:members_of (^^S, uctx)[2]:] (10) == 54);
+   static_assert (s.[:members_of (^^S, uctx)[2]:] (20L) == 64);
+   static_assert (s.[:members_of (^^S, uctx)[2]:] (30LL) == 74);
+   static_assert (s.bar (0) == 72);
+   static_assert (s.bar (0L) == 73);
+   static_assert (s.bar (0LL) == 74);
+   static_assert (s.[:members_of (^^S, uctx)[3]:] (10) == 82);
+   static_assert (s.[:members_of (^^S, uctx)[3]:] (20L) == 92);
+   static_assert (s.[:members_of (^^S, uctx)[3]:] (30LL) == 102);
+   static_assert (s.[:members_of (^^S, uctx)[4]:] (10) == 83);
+   static_assert (s.[:members_of (^^S, uctx)[4]:] (20L) == 93);
+   static_assert (s.[:members_of (^^S, uctx)[4]:] (30LL) == 103);
+   static_assert (s.[:members_of (^^S, uctx)[5]:] (10) == 84);
+   static_assert (s.[:members_of (^^S, uctx)[5]:] (20L) == 94);
+   static_assert (s.[:members_of (^^S, uctx)[5]:] (30LL) == 104);
+   constexpr B t = 2;
+   static_assert (t.foo (0) == 53);
+   static_assert (t.foo (0L) == 54);
+   static_assert (t.foo (0LL) == 55);
+   static_assert (t.[:members_of (^^S, uctx)[0]:] (10) == 53);
+   static_assert (t.[:members_of (^^S, uctx)[0]:] (20L) == 63);
+   static_assert (t.[:members_of (^^S, uctx)[0]:] (30LL) == 73);
+   static_assert (t.[:members_of (^^S, uctx)[1]:] (10) == 54);
+   static_assert (t.[:members_of (^^S, uctx)[1]:] (20L) == 64);
+   static_assert (t.[:members_of (^^S, uctx)[1]:] (30LL) == 74);
+   static_assert (t.[:members_of (^^S, uctx)[2]:] (10) == 55);
+   static_assert (t.[:members_of (^^S, uctx)[2]:] (20L) == 65);
+   static_assert (t.[:members_of (^^S, uctx)[2]:] (30LL) == 75);
+   static_assert (t.[:members_of (^^T, uctx)[0]:] (10) == 63);
+   static_assert (t.[:members_of (^^T, uctx)[0]:] (20L) == 73);
+   static_assert (t.[:members_of (^^T, uctx)[0]:] (30LL) == 83);
+   static_assert (t.[:members_of (^^T, uctx)[1]:] (10) == 64);
+   static_assert (t.[:members_of (^^T, uctx)[1]:] (20L) == 74);
+   static_assert (t.[:members_of (^^T, uctx)[1]:] (30LL) == 84);
+   static_assert (t.[:members_of (^^T, uctx)[2]:] (10) == 65);
+   static_assert (t.[:members_of (^^T, uctx)[2]:] (20L) == 75);
+   static_assert (t.[:members_of (^^T, uctx)[2]:] (30LL) == 85);
+   static_assert (t.bar (0) == 82);
+   static_assert (t.bar (0L) == 83);
+   static_assert (t.bar (0LL) == 84);
+   static_assert (t.[:members_of (^^S, uctx)[3]:] (10) == 82);
+   static_assert (t.[:members_of (^^S, uctx)[3]:] (20L) == 92);
+   static_assert (t.[:members_of (^^S, uctx)[3]:] (30LL) == 102);
+   static_assert (t.[:members_of (^^S, uctx)[4]:] (10) == 83);
+   static_assert (t.[:members_of (^^S, uctx)[4]:] (20L) == 93);
+   static_assert (t.[:members_of (^^S, uctx)[4]:] (30LL) == 103);
+   static_assert (t.[:members_of (^^S, uctx)[5]:] (10) == 84);
+   static_assert (t.[:members_of (^^S, uctx)[5]:] (20L) == 94);
+   static_assert (t.[:members_of (^^S, uctx)[5]:] (30LL) == 104);
+   static_assert (t.[:members_of (^^T, uctx)[3]:] (10) == 92);
+   static_assert (t.[:members_of (^^T, uctx)[3]:] (20L) == 102);
+   static_assert (t.[:members_of (^^T, uctx)[3]:] (30LL) == 112);
+   static_assert (t.[:members_of (^^T, uctx)[4]:] (10) == 93);
+   static_assert (t.[:members_of (^^T, uctx)[4]:] (20L) == 103);
+   static_assert (t.[:members_of (^^T, uctx)[4]:] (30LL) == 113);
+   static_assert (t.[:members_of (^^T, uctx)[5]:] (10) == 94);
+   static_assert (t.[:members_of (^^T, uctx)[5]:] (20L) == 104);
+   static_assert (t.[:members_of (^^T, uctx)[5]:] (30LL) == 114);
+ }
+ 
+ template <typename A, typename B>
+ void
+ baz ()
+ {
+   constexpr S s = 1;
+   static_assert (s.foo (0) == 42);
+   static_assert (s.foo (0L) == 43);
+   static_assert (s.foo (0LL) == 44);
+   static_assert (s.[:members_of (^^A, uctx)[0]:] (10) == 52);
+   static_assert (s.[:members_of (^^A, uctx)[0]:] (20L) == 62);
+   static_assert (s.[:members_of (^^A, uctx)[0]:] (30LL) == 72);
+   static_assert (s.[:members_of (^^A, uctx)[1]:] (10) == 53);
+   static_assert (s.[:members_of (^^A, uctx)[1]:] (20L) == 63);
+   static_assert (s.[:members_of (^^A, uctx)[1]:] (30LL) == 73);
+   static_assert (s.[:members_of (^^A, uctx)[2]:] (10) == 54);
+   static_assert (s.[:members_of (^^A, uctx)[2]:] (20L) == 64);
+   static_assert (s.[:members_of (^^A, uctx)[2]:] (30LL) == 74);
+   static_assert (s.bar (0) == 72);
+   static_assert (s.bar (0L) == 73);
+   static_assert (s.bar (0LL) == 74);
+   static_assert (s.[:members_of (^^A, uctx)[3]:] (10) == 82);
+   static_assert (s.[:members_of (^^A, uctx)[3]:] (20L) == 92);
+   static_assert (s.[:members_of (^^A, uctx)[3]:] (30LL) == 102);
+   static_assert (s.[:members_of (^^A, uctx)[4]:] (10) == 83);
+   static_assert (s.[:members_of (^^A, uctx)[4]:] (20L) == 93);
+   static_assert (s.[:members_of (^^A, uctx)[4]:] (30LL) == 103);
+   static_assert (s.[:members_of (^^A, uctx)[5]:] (10) == 84);
+   static_assert (s.[:members_of (^^A, uctx)[5]:] (20L) == 94);
+   static_assert (s.[:members_of (^^A, uctx)[5]:] (30LL) == 104);
+   constexpr T t = 2;
+   static_assert (t.foo (0) == 53);
+   static_assert (t.foo (0L) == 54);
+   static_assert (t.foo (0LL) == 55);
+   static_assert (t.[:members_of (^^A, uctx)[0]:] (10) == 53);
+   static_assert (t.[:members_of (^^A, uctx)[0]:] (20L) == 63);
+   static_assert (t.[:members_of (^^A, uctx)[0]:] (30LL) == 73);
+   static_assert (t.[:members_of (^^A, uctx)[1]:] (10) == 54);
+   static_assert (t.[:members_of (^^A, uctx)[1]:] (20L) == 64);
+   static_assert (t.[:members_of (^^A, uctx)[1]:] (30LL) == 74);
+   static_assert (t.[:members_of (^^A, uctx)[2]:] (10) == 55);
+   static_assert (t.[:members_of (^^A, uctx)[2]:] (20L) == 65);
+   static_assert (t.[:members_of (^^A, uctx)[2]:] (30LL) == 75);
+   static_assert (t.[:members_of (^^B, uctx)[0]:] (10) == 63);
+   static_assert (t.[:members_of (^^B, uctx)[0]:] (20L) == 73);
+   static_assert (t.[:members_of (^^B, uctx)[0]:] (30LL) == 83);
+   static_assert (t.[:members_of (^^B, uctx)[1]:] (10) == 64);
+   static_assert (t.[:members_of (^^B, uctx)[1]:] (20L) == 74);
+   static_assert (t.[:members_of (^^B, uctx)[1]:] (30LL) == 84);
+   static_assert (t.[:members_of (^^B, uctx)[2]:] (10) == 65);
+   static_assert (t.[:members_of (^^B, uctx)[2]:] (20L) == 75);
+   static_assert (t.[:members_of (^^B, uctx)[2]:] (30LL) == 85);
+   static_assert (t.bar (0) == 82);
+   static_assert (t.bar (0L) == 83);
+   static_assert (t.bar (0LL) == 84);
+   static_assert (t.[:members_of (^^A, uctx)[3]:] (10) == 82);
+   static_assert (t.[:members_of (^^A, uctx)[3]:] (20L) == 92);
+   static_assert (t.[:members_of (^^A, uctx)[3]:] (30LL) == 102);
+   static_assert (t.[:members_of (^^A, uctx)[4]:] (10) == 83);
+   static_assert (t.[:members_of (^^A, uctx)[4]:] (20L) == 93);
+   static_assert (t.[:members_of (^^A, uctx)[4]:] (30LL) == 103);
+   static_assert (t.[:members_of (^^A, uctx)[5]:] (10) == 84);
+   static_assert (t.[:members_of (^^A, uctx)[5]:] (20L) == 94);
+   static_assert (t.[:members_of (^^A, uctx)[5]:] (30LL) == 104);
+   static_assert (t.[:members_of (^^B, uctx)[3]:] (10) == 92);
+   static_assert (t.[:members_of (^^B, uctx)[3]:] (20L) == 102);
+   static_assert (t.[:members_of (^^B, uctx)[3]:] (30LL) == 112);
+   static_assert (t.[:members_of (^^B, uctx)[4]:] (10) == 93);
+   static_assert (t.[:members_of (^^B, uctx)[4]:] (20L) == 103);
+   static_assert (t.[:members_of (^^B, uctx)[4]:] (30LL) == 113);
+   static_assert (t.[:members_of (^^B, uctx)[5]:] (10) == 94);
+   static_assert (t.[:members_of (^^B, uctx)[5]:] (20L) == 104);
+   static_assert (t.[:members_of (^^B, uctx)[5]:] (30LL) == 114);
+ }
+ 
+ template <typename A, typename B>
+ void
+ qux ()
+ {
+   constexpr A s = 1;
+   static_assert (s.foo (0) == 42);
+   static_assert (s.foo (0L) == 43);
+   static_assert (s.foo (0LL) == 44);
+   static_assert (s.[:members_of (^^A, uctx)[0]:] (10) == 52);
+   static_assert (s.[:members_of (^^A, uctx)[0]:] (20L) == 62);
+   static_assert (s.[:members_of (^^A, uctx)[0]:] (30LL) == 72);
+   static_assert (s.[:members_of (^^A, uctx)[1]:] (10) == 53);
+   static_assert (s.[:members_of (^^A, uctx)[1]:] (20L) == 63);
+   static_assert (s.[:members_of (^^A, uctx)[1]:] (30LL) == 73);
+   static_assert (s.[:members_of (^^A, uctx)[2]:] (10) == 54);
+   static_assert (s.[:members_of (^^A, uctx)[2]:] (20L) == 64);
+   static_assert (s.[:members_of (^^A, uctx)[2]:] (30LL) == 74);
+   static_assert (s.bar (0) == 72);
+   static_assert (s.bar (0L) == 73);
+   static_assert (s.bar (0LL) == 74);
+   static_assert (s.[:members_of (^^A, uctx)[3]:] (10) == 82);
+   static_assert (s.[:members_of (^^A, uctx)[3]:] (20L) == 92);
+   static_assert (s.[:members_of (^^A, uctx)[3]:] (30LL) == 102);
+   static_assert (s.[:members_of (^^A, uctx)[4]:] (10) == 83);
+   static_assert (s.[:members_of (^^A, uctx)[4]:] (20L) == 93);
+   static_assert (s.[:members_of (^^A, uctx)[4]:] (30LL) == 103);
+   static_assert (s.[:members_of (^^A, uctx)[5]:] (10) == 84);
+   static_assert (s.[:members_of (^^A, uctx)[5]:] (20L) == 94);
+   static_assert (s.[:members_of (^^A, uctx)[5]:] (30LL) == 104);
+   constexpr B t = 2;
+   static_assert (t.foo (0) == 53);
+   static_assert (t.foo (0L) == 54);
+   static_assert (t.foo (0LL) == 55);
+   static_assert (t.[:members_of (^^A, uctx)[0]:] (10) == 53);
+   static_assert (t.[:members_of (^^A, uctx)[0]:] (20L) == 63);
+   static_assert (t.[:members_of (^^A, uctx)[0]:] (30LL) == 73);
+   static_assert (t.[:members_of (^^A, uctx)[1]:] (10) == 54);
+   static_assert (t.[:members_of (^^A, uctx)[1]:] (20L) == 64);
+   static_assert (t.[:members_of (^^A, uctx)[1]:] (30LL) == 74);
+   static_assert (t.[:members_of (^^A, uctx)[2]:] (10) == 55);
+   static_assert (t.[:members_of (^^A, uctx)[2]:] (20L) == 65);
+   static_assert (t.[:members_of (^^A, uctx)[2]:] (30LL) == 75);
+   static_assert (t.[:members_of (^^B, uctx)[0]:] (10) == 63);
+   static_assert (t.[:members_of (^^B, uctx)[0]:] (20L) == 73);
+   static_assert (t.[:members_of (^^B, uctx)[0]:] (30LL) == 83);
+   static_assert (t.[:members_of (^^B, uctx)[1]:] (10) == 64);
+   static_assert (t.[:members_of (^^B, uctx)[1]:] (20L) == 74);
+   static_assert (t.[:members_of (^^B, uctx)[1]:] (30LL) == 84);
+   static_assert (t.[:members_of (^^B, uctx)[2]:] (10) == 65);
+   static_assert (t.[:members_of (^^B, uctx)[2]:] (20L) == 75);
+   static_assert (t.[:members_of (^^B, uctx)[2]:] (30LL) == 85);
+   static_assert (t.bar (0) == 82);
+   static_assert (t.bar (0L) == 83);
+   static_assert (t.bar (0LL) == 84);
+   static_assert (t.[:members_of (^^A, uctx)[3]:] (10) == 82);
+   static_assert (t.[:members_of (^^A, uctx)[3]:] (20L) == 92);
+   static_assert (t.[:members_of (^^A, uctx)[3]:] (30LL) == 102);
+   static_assert (t.[:members_of (^^A, uctx)[4]:] (10) == 83);
+   static_assert (t.[:members_of (^^A, uctx)[4]:] (20L) == 93);
+   static_assert (t.[:members_of (^^A, uctx)[4]:] (30LL) == 103);
+   static_assert (t.[:members_of (^^A, uctx)[5]:] (10) == 84);
+   static_assert (t.[:members_of (^^A, uctx)[5]:] (20L) == 94);
+   static_assert (t.[:members_of (^^A, uctx)[5]:] (30LL) == 104);
+   static_assert (t.[:members_of (^^B, uctx)[3]:] (10) == 92);
+   static_assert (t.[:members_of (^^B, uctx)[3]:] (20L) == 102);
+   static_assert (t.[:members_of (^^B, uctx)[3]:] (30LL) == 112);
+   static_assert (t.[:members_of (^^B, uctx)[4]:] (10) == 93);
+   static_assert (t.[:members_of (^^B, uctx)[4]:] (20L) == 103);
+   static_assert (t.[:members_of (^^B, uctx)[4]:] (30LL) == 113);
+   static_assert (t.[:members_of (^^B, uctx)[5]:] (10) == 94);
+   static_assert (t.[:members_of (^^B, uctx)[5]:] (20L) == 104);
+   static_assert (t.[:members_of (^^B, uctx)[5]:] (30LL) == 114);
+ }
+ 
+ void
+ fred ()
+ {
+   foo <42> ();
+   bar <S, T> ();
+   baz <S, T> ();
+   qux <S, T> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member18.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member18.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member18.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member18.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,744 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   template <typename U>
+   constexpr int foo (int x, const U &) const { return 41 + x + s; }
+   template <typename U>
+   constexpr int foo (long x, const U &) const { return 42 + x + s; }
+   template <typename U>
+   constexpr int foo (long long x, const U &) const { return 43 + x + s; }
+   template <typename U>
+   static constexpr int bar (int x, const U &) { return 72 + x; } 
+   template <typename U>
+   static constexpr int bar (long x, const U &) { return 73 + x; } 
+   template <typename U>
+   static constexpr int bar (long long x, const U &) { return 74 + x; } 
+   constexpr S (int x) : s (x) {}
+   int s;
+ };
+ struct T : public S {
+   template <typename U>
+   constexpr int foo (int x, const U &) const { return 51 + x + s; }
+   template <typename U>
+   constexpr int foo (long x, const U &) const { return 52 + x + s; }
+   template <typename U>
+   constexpr int foo (long long x, const U &) const { return 53 + x + s; }
+   template <typename U>
+   static constexpr int bar (int x, const U &) { return 82 + x; } 
+   template <typename U>
+   static constexpr int bar (long x, const U &) { return 83 + x; } 
+   template <typename U>
+   static constexpr int bar (long long x, const U &) { return 84 + x; } 
+   constexpr T (int x) : S (x) {}
+ };
+ 
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ constexpr S s = 1;
+ static_assert (s.foo (0, 1.0f) == 42);
+ static_assert (s.foo (0L, 1.0) == 43);
+ static_assert (s.foo (0LL, 1.0L) == 44);
+ static_assert (s.template [:members_of (^^S, uctx)[0]:] (10, 1.0f) == 52);
+ static_assert (s.template [:members_of (^^S, uctx)[0]:] (20L, 1.0) == 62);
+ static_assert (s.template [:members_of (^^S, uctx)[0]:] (30LL, 1.0L) == 72);
+ static_assert (s.template [:members_of (^^S, uctx)[1]:] (10, 1.0f) == 53);
+ static_assert (s.template [:members_of (^^S, uctx)[1]:] (20L, 1.0) == 63);
+ static_assert (s.template [:members_of (^^S, uctx)[1]:] (30LL, 1.0L) == 73);
+ static_assert (s.template [:members_of (^^S, uctx)[2]:] (10, 1.0f) == 54);
+ static_assert (s.template [:members_of (^^S, uctx)[2]:] (20L, 1.0) == 64);
+ static_assert (s.template [:members_of (^^S, uctx)[2]:] (30LL, 1.0L) == 74);
+ static_assert (s.foo <float> (0, 1.0f) == 42);
+ static_assert (s.foo <double> (0L, 1.0) == 43);
+ static_assert (s.foo <long double> (0LL, 1.0L) == 44);
+ static_assert (s.template [:members_of (^^S, uctx)[0]:] <float> (10, 1.0f) == 52);
+ static_assert (s.template [:members_of (^^S, uctx)[0]:] <double> (20L, 1.0) == 62);
+ static_assert (s.template [:members_of (^^S, uctx)[0]:] <long double> (30LL, 1.0L) == 72);
+ static_assert (s.template [:members_of (^^S, uctx)[1]:] <float> (10, 1.0f) == 53);
+ static_assert (s.template [:members_of (^^S, uctx)[1]:] <double> (20L, 1.0) == 63);
+ static_assert (s.template [:members_of (^^S, uctx)[1]:] <long double> (30LL, 1.0L) == 73);
+ static_assert (s.template [:members_of (^^S, uctx)[2]:] <float> (10, 1.0f) == 54);
+ static_assert (s.template [:members_of (^^S, uctx)[2]:] <double> (20L, 1.0) == 64);
+ static_assert (s.template [:members_of (^^S, uctx)[2]:] <long double> (30LL, 1.0L) == 74);
+ static_assert (s.bar (0, 1.0f) == 72);
+ static_assert (s.bar (0L, 1.0) == 73);
+ static_assert (s.bar (0LL, 1.0L) == 74);
+ static_assert (s.template [:members_of (^^S, uctx)[3]:] (10, 1.0f) == 82);
+ static_assert (s.template [:members_of (^^S, uctx)[3]:] (20L, 1.0) == 92);
+ static_assert (s.template [:members_of (^^S, uctx)[3]:] (30LL, 1.0L) == 102);
+ static_assert (s.template [:members_of (^^S, uctx)[4]:] (10, 1.0f) == 83);
+ static_assert (s.template [:members_of (^^S, uctx)[4]:] (20L, 1.0) == 93);
+ static_assert (s.template [:members_of (^^S, uctx)[4]:] (30LL, 1.0L) == 103);
+ static_assert (s.template [:members_of (^^S, uctx)[5]:] (10, 1.0f) == 84);
+ static_assert (s.template [:members_of (^^S, uctx)[5]:] (20L, 1.0) == 94);
+ static_assert (s.template [:members_of (^^S, uctx)[5]:] (30LL, 1.0L) == 104);
+ static_assert (s.bar <float> (0, 1.0f) == 72);
+ static_assert (s.bar <double> (0L, 1.0) == 73);
+ static_assert (s.bar <long double> (0LL, 1.0L) == 74);
+ static_assert (s.template [:members_of (^^S, uctx)[3]:] <float> (10, 1.0f) == 82);
+ static_assert (s.template [:members_of (^^S, uctx)[3]:] <double> (20L, 1.0) == 92);
+ static_assert (s.template [:members_of (^^S, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+ static_assert (s.template [:members_of (^^S, uctx)[4]:] <float> (10, 1.0f) == 83);
+ static_assert (s.template [:members_of (^^S, uctx)[4]:] <double> (20L, 1.0) == 93);
+ static_assert (s.template [:members_of (^^S, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+ static_assert (s.template [:members_of (^^S, uctx)[5]:] <float> (10, 1.0f) == 84);
+ static_assert (s.template [:members_of (^^S, uctx)[5]:] <double> (20L, 1.0) == 94);
+ static_assert (s.template [:members_of (^^S, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+ constexpr T t = 2;
+ static_assert (t.foo (0, 1.0f) == 53);
+ static_assert (t.foo (0L, 1.0) == 54);
+ static_assert (t.foo (0LL, 1.0L) == 55);
+ static_assert (t.template [:members_of (^^S, uctx)[0]:] (10, 1.0f) == 53);
+ static_assert (t.template [:members_of (^^S, uctx)[0]:] (20L, 1.0) == 63);
+ static_assert (t.template [:members_of (^^S, uctx)[0]:] (30LL, 1.0L) == 73);
+ static_assert (t.template [:members_of (^^S, uctx)[1]:] (10, 1.0f) == 54);
+ static_assert (t.template [:members_of (^^S, uctx)[1]:] (20L, 1.0) == 64);
+ static_assert (t.template [:members_of (^^S, uctx)[1]:] (30LL, 1.0L) == 74);
+ static_assert (t.template [:members_of (^^S, uctx)[2]:] (10, 1.0f) == 55);
+ static_assert (t.template [:members_of (^^S, uctx)[2]:] (20L, 1.0) == 65);
+ static_assert (t.template [:members_of (^^S, uctx)[2]:] (30LL, 1.0L) == 75);
+ static_assert (t.template [:members_of (^^T, uctx)[0]:] (10, 1.0f) == 63);
+ static_assert (t.template [:members_of (^^T, uctx)[0]:] (20L, 1.0) == 73);
+ static_assert (t.template [:members_of (^^T, uctx)[0]:] (30LL, 1.0L) == 83);
+ static_assert (t.template [:members_of (^^T, uctx)[1]:] (10, 1.0f) == 64);
+ static_assert (t.template [:members_of (^^T, uctx)[1]:] (20L, 1.0) == 74);
+ static_assert (t.template [:members_of (^^T, uctx)[1]:] (30LL, 1.0L) == 84);
+ static_assert (t.template [:members_of (^^T, uctx)[2]:] (10, 1.0f) == 65);
+ static_assert (t.template [:members_of (^^T, uctx)[2]:] (20L, 1.0) == 75);
+ static_assert (t.template [:members_of (^^T, uctx)[2]:] (30LL, 1.0L) == 85);
+ static_assert (t.foo <float> (0, 1.0f) == 53);
+ static_assert (t.foo <double> (0L, 1.0) == 54);
+ static_assert (t.foo <long double> (0LL, 1.0L) == 55);
+ static_assert (t.template [:members_of (^^S, uctx)[0]:] <float> (10, 1.0f) == 53);
+ static_assert (t.template [:members_of (^^S, uctx)[0]:] <double> (20L, 1.0) == 63);
+ static_assert (t.template [:members_of (^^S, uctx)[0]:] <long double> (30LL, 1.0L) == 73);
+ static_assert (t.template [:members_of (^^S, uctx)[1]:] <float> (10, 1.0f) == 54);
+ static_assert (t.template [:members_of (^^S, uctx)[1]:] <double> (20L, 1.0) == 64);
+ static_assert (t.template [:members_of (^^S, uctx)[1]:] <long double> (30LL, 1.0L) == 74);
+ static_assert (t.template [:members_of (^^S, uctx)[2]:] <float> (10, 1.0f) == 55);
+ static_assert (t.template [:members_of (^^S, uctx)[2]:] <double> (20L, 1.0) == 65);
+ static_assert (t.template [:members_of (^^S, uctx)[2]:] <long double> (30LL, 1.0L) == 75);
+ static_assert (t.template [:members_of (^^T, uctx)[0]:] <float> (10, 1.0f) == 63);
+ static_assert (t.template [:members_of (^^T, uctx)[0]:] <double> (20L, 1.0) == 73);
+ static_assert (t.template [:members_of (^^T, uctx)[0]:] <long double> (30LL, 1.0L) == 83);
+ static_assert (t.template [:members_of (^^T, uctx)[1]:] <float> (10, 1.0f) == 64);
+ static_assert (t.template [:members_of (^^T, uctx)[1]:] <double> (20L, 1.0) == 74);
+ static_assert (t.template [:members_of (^^T, uctx)[1]:] <long double> (30LL, 1.0L) == 84);
+ static_assert (t.template [:members_of (^^T, uctx)[2]:] <float> (10, 1.0f) == 65);
+ static_assert (t.template [:members_of (^^T, uctx)[2]:] <double> (20L, 1.0) == 75);
+ static_assert (t.template [:members_of (^^T, uctx)[2]:] <long double> (30LL, 1.0L) == 85);
+ static_assert (t.bar (0, 1.0f) == 82);
+ static_assert (t.bar (0L, 1.0) == 83);
+ static_assert (t.bar (0LL, 1.0L) == 84);
+ static_assert (t.template [:members_of (^^S, uctx)[3]:] (10, 1.0f) == 82);
+ static_assert (t.template [:members_of (^^S, uctx)[3]:] (20L, 1.0) == 92);
+ static_assert (t.template [:members_of (^^S, uctx)[3]:] (30LL, 1.0L) == 102);
+ static_assert (t.template [:members_of (^^S, uctx)[4]:] (10, 1.0f) == 83);
+ static_assert (t.template [:members_of (^^S, uctx)[4]:] (20L, 1.0) == 93);
+ static_assert (t.template [:members_of (^^S, uctx)[4]:] (30LL, 1.0L) == 103);
+ static_assert (t.template [:members_of (^^S, uctx)[5]:] (10, 1.0f) == 84);
+ static_assert (t.template [:members_of (^^S, uctx)[5]:] (20L, 1.0) == 94);
+ static_assert (t.template [:members_of (^^S, uctx)[5]:] (30LL, 1.0L) == 104);
+ static_assert (t.template [:members_of (^^T, uctx)[3]:] (10, 1.0f) == 92);
+ static_assert (t.template [:members_of (^^T, uctx)[3]:] (20L, 1.0) == 102);
+ static_assert (t.template [:members_of (^^T, uctx)[3]:] (30LL, 1.0L) == 112);
+ static_assert (t.template [:members_of (^^T, uctx)[4]:] (10, 1.0f) == 93);
+ static_assert (t.template [:members_of (^^T, uctx)[4]:] (20L, 1.0) == 103);
+ static_assert (t.template [:members_of (^^T, uctx)[4]:] (30LL, 1.0L) == 113);
+ static_assert (t.template [:members_of (^^T, uctx)[5]:] (10, 1.0f) == 94);
+ static_assert (t.template [:members_of (^^T, uctx)[5]:] (20L, 1.0) == 104);
+ static_assert (t.template [:members_of (^^T, uctx)[5]:] (30LL, 1.0L) == 114);
+ static_assert (t.bar <float> (0, 1.0f) == 82);
+ static_assert (t.bar <double> (0L, 1.0) == 83);
+ static_assert (t.bar <long double> (0LL, 1.0L) == 84);
+ static_assert (t.template [:members_of (^^S, uctx)[3]:] <float> (10, 1.0f) == 82);
+ static_assert (t.template [:members_of (^^S, uctx)[3]:] <double> (20L, 1.0) == 92);
+ static_assert (t.template [:members_of (^^S, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+ static_assert (t.template [:members_of (^^S, uctx)[4]:] <float> (10, 1.0f) == 83);
+ static_assert (t.template [:members_of (^^S, uctx)[4]:] <double> (20L, 1.0) == 93);
+ static_assert (t.template [:members_of (^^S, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+ static_assert (t.template [:members_of (^^S, uctx)[5]:] <float> (10, 1.0f) == 84);
+ static_assert (t.template [:members_of (^^S, uctx)[5]:] <double> (20L, 1.0) == 94);
+ static_assert (t.template [:members_of (^^S, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+ static_assert (t.template [:members_of (^^T, uctx)[3]:] <float> (10, 1.0f) == 92);
+ static_assert (t.template [:members_of (^^T, uctx)[3]:] <double> (20L, 1.0) == 102);
+ static_assert (t.template [:members_of (^^T, uctx)[3]:] <long double> (30LL, 1.0L) == 112);
+ static_assert (t.template [:members_of (^^T, uctx)[4]:] <float> (10, 1.0f) == 93);
+ static_assert (t.template [:members_of (^^T, uctx)[4]:] <double> (20L, 1.0) == 103);
+ static_assert (t.template [:members_of (^^T, uctx)[4]:] <long double> (30LL, 1.0L) == 113);
+ static_assert (t.template [:members_of (^^T, uctx)[5]:] <float> (10, 1.0f) == 94);
+ static_assert (t.template [:members_of (^^T, uctx)[5]:] <double> (20L, 1.0) == 104);
+ static_assert (t.template [:members_of (^^T, uctx)[5]:] <long double> (30LL, 1.0L) == 114);
+ 
+ template <int N>
+ void
+ foo ()
+ {
+   constexpr S s = 1;
+   static_assert (s.foo (0, 1.0f) == 42);
+   static_assert (s.foo (0L, 1.0) == 43);
+   static_assert (s.foo (0LL, 1.0L) == 44);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] (10, 1.0f) == 52);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] (20L, 1.0) == 62);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] (30LL, 1.0L) == 72);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] (10, 1.0f) == 53);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] (20L, 1.0) == 63);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] (30LL, 1.0L) == 73);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] (10, 1.0f) == 54);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] (20L, 1.0) == 64);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] (30LL, 1.0L) == 74);
+   static_assert (s.foo <float> (0, 1.0f) == 42);
+   static_assert (s.foo <double> (0L, 1.0) == 43);
+   static_assert (s.foo <long double> (0LL, 1.0L) == 44);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <float> (10, 1.0f) == 52);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <double> (20L, 1.0) == 62);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <long double> (30LL, 1.0L) == 72);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] <float> (10, 1.0f) == 53);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] <double> (20L, 1.0) == 63);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] <long double> (30LL, 1.0L) == 73);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] <float> (10, 1.0f) == 54);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] <double> (20L, 1.0) == 64);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] <long double> (30LL, 1.0L) == 74);
+   static_assert (s.bar (0, 1.0f) == 72);
+   static_assert (s.bar (0L, 1.0) == 73);
+   static_assert (s.bar (0LL, 1.0L) == 74);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] (10, 1.0f) == 82);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] (20L, 1.0) == 92);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] (30LL, 1.0L) == 102);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] (10, 1.0f) == 83);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] (20L, 1.0) == 93);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] (30LL, 1.0L) == 103);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] (10, 1.0f) == 84);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] (20L, 1.0) == 94);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] (30LL, 1.0L) == 104);
+   static_assert (s.bar <float> (0, 1.0f) == 72);
+   static_assert (s.bar <double> (0L, 1.0) == 73);
+   static_assert (s.bar <long double> (0LL, 1.0L) == 74);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] <float> (10, 1.0f) == 82);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] <double> (20L, 1.0) == 92);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] <float> (10, 1.0f) == 83);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] <double> (20L, 1.0) == 93);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] <float> (10, 1.0f) == 84);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] <double> (20L, 1.0) == 94);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+   constexpr T t = 2;
+   static_assert (t.foo (0, 1.0f) == 53);
+   static_assert (t.foo (0L, 1.0) == 54);
+   static_assert (t.foo (0LL, 1.0L) == 55);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] (10, 1.0f) == 53);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] (20L, 1.0) == 63);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] (30LL, 1.0L) == 73);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] (10, 1.0f) == 54);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] (20L, 1.0) == 64);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] (30LL, 1.0L) == 74);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] (10, 1.0f) == 55);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] (20L, 1.0) == 65);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] (30LL, 1.0L) == 75);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] (10, 1.0f) == 63);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] (20L, 1.0) == 73);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] (30LL, 1.0L) == 83);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] (10, 1.0f) == 64);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] (20L, 1.0) == 74);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] (30LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] (10, 1.0f) == 65);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] (20L, 1.0) == 75);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] (30LL, 1.0L) == 85);
+   static_assert (t.foo <float> (0, 1.0f) == 53);
+   static_assert (t.foo <double> (0L, 1.0) == 54);
+   static_assert (t.foo <long double> (0LL, 1.0L) == 55);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <float> (10, 1.0f) == 53);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <double> (20L, 1.0) == 63);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <long double> (30LL, 1.0L) == 73);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] <float> (10, 1.0f) == 54);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] <double> (20L, 1.0) == 64);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] <long double> (30LL, 1.0L) == 74);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] <float> (10, 1.0f) == 55);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] <double> (20L, 1.0) == 65);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] <long double> (30LL, 1.0L) == 75);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <float> (10, 1.0f) == 63);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <double> (20L, 1.0) == 73);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <long double> (30LL, 1.0L) == 83);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] <float> (10, 1.0f) == 64);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] <double> (20L, 1.0) == 74);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] <long double> (30LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] <float> (10, 1.0f) == 65);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] <double> (20L, 1.0) == 75);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] <long double> (30LL, 1.0L) == 85);
+   static_assert (t.bar (0, 1.0f) == 82);
+   static_assert (t.bar (0L, 1.0) == 83);
+   static_assert (t.bar (0LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] (10, 1.0f) == 82);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] (20L, 1.0) == 92);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] (30LL, 1.0L) == 102);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] (10, 1.0f) == 83);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] (20L, 1.0) == 93);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] (30LL, 1.0L) == 103);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] (10, 1.0f) == 84);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] (20L, 1.0) == 94);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] (30LL, 1.0L) == 104);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] (10, 1.0f) == 92);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] (20L, 1.0) == 102);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] (30LL, 1.0L) == 112);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] (10, 1.0f) == 93);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] (20L, 1.0) == 103);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] (30LL, 1.0L) == 113);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] (10, 1.0f) == 94);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] (20L, 1.0) == 104);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] (30LL, 1.0L) == 114);
+   static_assert (t.bar <float> (0, 1.0f) == 82);
+   static_assert (t.bar <double> (0L, 1.0) == 83);
+   static_assert (t.bar <long double> (0LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] <float> (10, 1.0f) == 82);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] <double> (20L, 1.0) == 92);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] <float> (10, 1.0f) == 83);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] <double> (20L, 1.0) == 93);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] <float> (10, 1.0f) == 84);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] <double> (20L, 1.0) == 94);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] <float> (10, 1.0f) == 92);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] <double> (20L, 1.0) == 102);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] <long double> (30LL, 1.0L) == 112);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] <float> (10, 1.0f) == 93);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] <double> (20L, 1.0) == 103);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] <long double> (30LL, 1.0L) == 113);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] <float> (10, 1.0f) == 94);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] <double> (20L, 1.0) == 104);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] <long double> (30LL, 1.0L) == 114);
+ }
+ 
+ template <typename A, typename B>
+ void
+ bar ()
+ {
+   constexpr A s = 1;
+   static_assert (s.foo (0, 1.0f) == 42);
+   static_assert (s.foo (0L, 1.0) == 43);
+   static_assert (s.foo (0LL, 1.0L) == 44);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] (10, 1.0f) == 52);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] (20L, 1.0) == 62);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] (30LL, 1.0L) == 72);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] (10, 1.0f) == 53);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] (20L, 1.0) == 63);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] (30LL, 1.0L) == 73);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] (10, 1.0f) == 54);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] (20L, 1.0) == 64);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] (30LL, 1.0L) == 74);
+   static_assert (s.template foo <float> (0, 1.0f) == 42);
+   static_assert (s.template foo <double> (0L, 1.0) == 43);
+   static_assert (s.template foo <long double> (0LL, 1.0L) == 44);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <float> (10, 1.0f) == 52);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <double> (20L, 1.0) == 62);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <long double> (30LL, 1.0L) == 72);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] <float> (10, 1.0f) == 53);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] <double> (20L, 1.0) == 63);
+   static_assert (s.template [:members_of (^^S, uctx)[1]:] <long double> (30LL, 1.0L) == 73);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] <float> (10, 1.0f) == 54);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] <double> (20L, 1.0) == 64);
+   static_assert (s.template [:members_of (^^S, uctx)[2]:] <long double> (30LL, 1.0L) == 74);
+   static_assert (s.bar (0, 1.0f) == 72);
+   static_assert (s.bar (0L, 1.0) == 73);
+   static_assert (s.bar (0LL, 1.0L) == 74);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] (10, 1.0f) == 82);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] (20L, 1.0) == 92);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] (30LL, 1.0L) == 102);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] (10, 1.0f) == 83);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] (20L, 1.0) == 93);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] (30LL, 1.0L) == 103);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] (10, 1.0f) == 84);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] (20L, 1.0) == 94);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] (30LL, 1.0L) == 104);
+   static_assert (s.template bar <float> (0, 1.0f) == 72);
+   static_assert (s.template bar <double> (0L, 1.0) == 73);
+   static_assert (s.template bar <long double> (0LL, 1.0L) == 74);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] <float> (10, 1.0f) == 82);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] <double> (20L, 1.0) == 92);
+   static_assert (s.template [:members_of (^^S, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] <float> (10, 1.0f) == 83);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] <double> (20L, 1.0) == 93);
+   static_assert (s.template [:members_of (^^S, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] <float> (10, 1.0f) == 84);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] <double> (20L, 1.0) == 94);
+   static_assert (s.template [:members_of (^^S, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+   constexpr B t = 2;
+   static_assert (t.foo (0, 1.0f) == 53);
+   static_assert (t.foo (0L, 1.0) == 54);
+   static_assert (t.foo (0LL, 1.0L) == 55);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] (10, 1.0f) == 53);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] (20L, 1.0) == 63);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] (30LL, 1.0L) == 73);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] (10, 1.0f) == 54);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] (20L, 1.0) == 64);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] (30LL, 1.0L) == 74);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] (10, 1.0f) == 55);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] (20L, 1.0) == 65);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] (30LL, 1.0L) == 75);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] (10, 1.0f) == 63);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] (20L, 1.0) == 73);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] (30LL, 1.0L) == 83);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] (10, 1.0f) == 64);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] (20L, 1.0) == 74);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] (30LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] (10, 1.0f) == 65);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] (20L, 1.0) == 75);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] (30LL, 1.0L) == 85);
+   static_assert (t.template foo <float> (0, 1.0f) == 53);
+   static_assert (t.template foo <double> (0L, 1.0) == 54);
+   static_assert (t.template foo <long double> (0LL, 1.0L) == 55);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <float> (10, 1.0f) == 53);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <double> (20L, 1.0) == 63);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <long double> (30LL, 1.0L) == 73);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] <float> (10, 1.0f) == 54);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] <double> (20L, 1.0) == 64);
+   static_assert (t.template [:members_of (^^S, uctx)[1]:] <long double> (30LL, 1.0L) == 74);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] <float> (10, 1.0f) == 55);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] <double> (20L, 1.0) == 65);
+   static_assert (t.template [:members_of (^^S, uctx)[2]:] <long double> (30LL, 1.0L) == 75);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <float> (10, 1.0f) == 63);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <double> (20L, 1.0) == 73);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <long double> (30LL, 1.0L) == 83);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] <float> (10, 1.0f) == 64);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] <double> (20L, 1.0) == 74);
+   static_assert (t.template [:members_of (^^T, uctx)[1]:] <long double> (30LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] <float> (10, 1.0f) == 65);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] <double> (20L, 1.0) == 75);
+   static_assert (t.template [:members_of (^^T, uctx)[2]:] <long double> (30LL, 1.0L) == 85);
+   static_assert (t.bar (0, 1.0f) == 82);
+   static_assert (t.bar (0L, 1.0) == 83);
+   static_assert (t.bar (0LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] (10, 1.0f) == 82);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] (20L, 1.0) == 92);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] (30LL, 1.0L) == 102);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] (10, 1.0f) == 83);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] (20L, 1.0) == 93);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] (30LL, 1.0L) == 103);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] (10, 1.0f) == 84);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] (20L, 1.0) == 94);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] (30LL, 1.0L) == 104);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] (10, 1.0f) == 92);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] (20L, 1.0) == 102);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] (30LL, 1.0L) == 112);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] (10, 1.0f) == 93);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] (20L, 1.0) == 103);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] (30LL, 1.0L) == 113);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] (10, 1.0f) == 94);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] (20L, 1.0) == 104);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] (30LL, 1.0L) == 114);
+   static_assert (t.template bar <float> (0, 1.0f) == 82);
+   static_assert (t.template bar <double> (0L, 1.0) == 83);
+   static_assert (t.template bar <long double> (0LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] <float> (10, 1.0f) == 82);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] <double> (20L, 1.0) == 92);
+   static_assert (t.template [:members_of (^^S, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] <float> (10, 1.0f) == 83);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] <double> (20L, 1.0) == 93);
+   static_assert (t.template [:members_of (^^S, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] <float> (10, 1.0f) == 84);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] <double> (20L, 1.0) == 94);
+   static_assert (t.template [:members_of (^^S, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] <float> (10, 1.0f) == 92);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] <double> (20L, 1.0) == 102);
+   static_assert (t.template [:members_of (^^T, uctx)[3]:] <long double> (30LL, 1.0L) == 112);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] <float> (10, 1.0f) == 93);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] <double> (20L, 1.0) == 103);
+   static_assert (t.template [:members_of (^^T, uctx)[4]:] <long double> (30LL, 1.0L) == 113);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] <float> (10, 1.0f) == 94);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] <double> (20L, 1.0) == 104);
+   static_assert (t.template [:members_of (^^T, uctx)[5]:] <long double> (30LL, 1.0L) == 114);
+ }
+ 
+ template <typename A, typename B>
+ void
+ baz ()
+ {
+   constexpr S s = 1;
+   static_assert (s.foo (0, 1.0f) == 42);
+   static_assert (s.foo (0L, 1.0) == 43);
+   static_assert (s.foo (0LL, 1.0L) == 44);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] (10, 1.0f) == 52);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] (20L, 1.0) == 62);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] (30LL, 1.0L) == 72);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] (10, 1.0f) == 53);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] (20L, 1.0) == 63);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] (30LL, 1.0L) == 73);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] (10, 1.0f) == 54);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] (20L, 1.0) == 64);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] (30LL, 1.0L) == 74);
+   static_assert (s.foo <float> (0, 1.0f) == 42);
+   static_assert (s.foo <double> (0L, 1.0) == 43);
+   static_assert (s.foo <long double> (0LL, 1.0L) == 44);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <float> (10, 1.0f) == 52);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <double> (20L, 1.0) == 62);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <long double> (30LL, 1.0L) == 72);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] <float> (10, 1.0f) == 53);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] <double> (20L, 1.0) == 63);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] <long double> (30LL, 1.0L) == 73);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] <float> (10, 1.0f) == 54);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] <double> (20L, 1.0) == 64);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] <long double> (30LL, 1.0L) == 74);
+   static_assert (s.bar (0, 1.0f) == 72);
+   static_assert (s.bar (0L, 1.0) == 73);
+   static_assert (s.bar (0LL, 1.0L) == 74);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] (10, 1.0f) == 82);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] (20L, 1.0) == 92);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] (30LL, 1.0L) == 102);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] (10, 1.0f) == 83);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] (20L, 1.0) == 93);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] (30LL, 1.0L) == 103);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] (10, 1.0f) == 84);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] (20L, 1.0) == 94);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] (30LL, 1.0L) == 104);
+   static_assert (s.bar <float> (0, 1.0f) == 72);
+   static_assert (s.bar <double> (0L, 1.0) == 73);
+   static_assert (s.bar <long double> (0LL, 1.0L) == 74);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] <float> (10, 1.0f) == 82);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] <double> (20L, 1.0) == 92);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] <float> (10, 1.0f) == 83);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] <double> (20L, 1.0) == 93);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] <float> (10, 1.0f) == 84);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] <double> (20L, 1.0) == 94);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+   constexpr T t = 2;
+   static_assert (t.foo (0, 1.0f) == 53);
+   static_assert (t.foo (0L, 1.0) == 54);
+   static_assert (t.foo (0LL, 1.0L) == 55);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] (10, 1.0f) == 53);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] (20L, 1.0) == 63);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] (30LL, 1.0L) == 73);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] (10, 1.0f) == 54);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] (20L, 1.0) == 64);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] (30LL, 1.0L) == 74);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] (10, 1.0f) == 55);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] (20L, 1.0) == 65);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] (30LL, 1.0L) == 75);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] (10, 1.0f) == 63);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] (20L, 1.0) == 73);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] (30LL, 1.0L) == 83);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] (10, 1.0f) == 64);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] (20L, 1.0) == 74);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] (30LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] (10, 1.0f) == 65);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] (20L, 1.0) == 75);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] (30LL, 1.0L) == 85);
+   static_assert (t.foo <float> (0, 1.0f) == 53);
+   static_assert (t.foo <double> (0L, 1.0) == 54);
+   static_assert (t.foo <long double> (0LL, 1.0L) == 55);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <float> (10, 1.0f) == 53);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <double> (20L, 1.0) == 63);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <long double> (30LL, 1.0L) == 73);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] <float> (10, 1.0f) == 54);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] <double> (20L, 1.0) == 64);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] <long double> (30LL, 1.0L) == 74);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] <float> (10, 1.0f) == 55);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] <double> (20L, 1.0) == 65);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] <long double> (30LL, 1.0L) == 75);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <float> (10, 1.0f) == 63);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <double> (20L, 1.0) == 73);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <long double> (30LL, 1.0L) == 83);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] <float> (10, 1.0f) == 64);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] <double> (20L, 1.0) == 74);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] <long double> (30LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] <float> (10, 1.0f) == 65);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] <double> (20L, 1.0) == 75);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] <long double> (30LL, 1.0L) == 85);
+   static_assert (t.bar (0, 1.0f) == 82);
+   static_assert (t.bar (0L, 1.0) == 83);
+   static_assert (t.bar (0LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] (10, 1.0f) == 82);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] (20L, 1.0) == 92);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] (30LL, 1.0L) == 102);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] (10, 1.0f) == 83);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] (20L, 1.0) == 93);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] (30LL, 1.0L) == 103);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] (10, 1.0f) == 84);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] (20L, 1.0) == 94);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] (30LL, 1.0L) == 104);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] (10, 1.0f) == 92);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] (20L, 1.0) == 102);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] (30LL, 1.0L) == 112);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] (10, 1.0f) == 93);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] (20L, 1.0) == 103);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] (30LL, 1.0L) == 113);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] (10, 1.0f) == 94);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] (20L, 1.0) == 104);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] (30LL, 1.0L) == 114);
+   static_assert (t.bar <float> (0, 1.0f) == 82);
+   static_assert (t.bar <double> (0L, 1.0) == 83);
+   static_assert (t.bar <long double> (0LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] <float> (10, 1.0f) == 82);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] <double> (20L, 1.0) == 92);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] <float> (10, 1.0f) == 83);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] <double> (20L, 1.0) == 93);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] <float> (10, 1.0f) == 84);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] <double> (20L, 1.0) == 94);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] <float> (10, 1.0f) == 92);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] <double> (20L, 1.0) == 102);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] <long double> (30LL, 1.0L) == 112);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] <float> (10, 1.0f) == 93);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] <double> (20L, 1.0) == 103);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] <long double> (30LL, 1.0L) == 113);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] <float> (10, 1.0f) == 94);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] <double> (20L, 1.0) == 104);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] <long double> (30LL, 1.0L) == 114);
+ }
+ 
+ template <typename A, typename B>
+ void
+ qux ()
+ {
+   constexpr A s = 1;
+   static_assert (s.foo (0, 1.0f) == 42);
+   static_assert (s.foo (0L, 1.0) == 43);
+   static_assert (s.foo (0LL, 1.0L) == 44);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] (10, 1.0f) == 52);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] (20L, 1.0) == 62);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] (30LL, 1.0L) == 72);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] (10, 1.0f) == 53);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] (20L, 1.0) == 63);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] (30LL, 1.0L) == 73);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] (10, 1.0f) == 54);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] (20L, 1.0) == 64);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] (30LL, 1.0L) == 74);
+   static_assert (s.template foo <float> (0, 1.0f) == 42);
+   static_assert (s.template foo <double> (0L, 1.0) == 43);
+   static_assert (s.template foo <long double> (0LL, 1.0L) == 44);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <float> (10, 1.0f) == 52);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <double> (20L, 1.0) == 62);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <long double> (30LL, 1.0L) == 72);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] <float> (10, 1.0f) == 53);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] <double> (20L, 1.0) == 63);
+   static_assert (s.template [:members_of (^^A, uctx)[1]:] <long double> (30LL, 1.0L) == 73);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] <float> (10, 1.0f) == 54);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] <double> (20L, 1.0) == 64);
+   static_assert (s.template [:members_of (^^A, uctx)[2]:] <long double> (30LL, 1.0L) == 74);
+   static_assert (s.bar (0, 1.0f) == 72);
+   static_assert (s.bar (0L, 1.0) == 73);
+   static_assert (s.bar (0LL, 1.0L) == 74);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] (10, 1.0f) == 82);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] (20L, 1.0) == 92);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] (30LL, 1.0L) == 102);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] (10, 1.0f) == 83);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] (20L, 1.0) == 93);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] (30LL, 1.0L) == 103);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] (10, 1.0f) == 84);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] (20L, 1.0) == 94);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] (30LL, 1.0L) == 104);
+   static_assert (s.template bar <float> (0, 1.0f) == 72);
+   static_assert (s.template bar <double> (0L, 1.0) == 73);
+   static_assert (s.template bar <long double> (0LL, 1.0L) == 74);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] <float> (10, 1.0f) == 82);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] <double> (20L, 1.0) == 92);
+   static_assert (s.template [:members_of (^^A, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] <float> (10, 1.0f) == 83);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] <double> (20L, 1.0) == 93);
+   static_assert (s.template [:members_of (^^A, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] <float> (10, 1.0f) == 84);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] <double> (20L, 1.0) == 94);
+   static_assert (s.template [:members_of (^^A, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+   constexpr B t = 2;
+   static_assert (t.foo (0, 1.0f) == 53);
+   static_assert (t.foo (0L, 1.0) == 54);
+   static_assert (t.foo (0LL, 1.0L) == 55);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] (10, 1.0f) == 53);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] (20L, 1.0) == 63);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] (30LL, 1.0L) == 73);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] (10, 1.0f) == 54);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] (20L, 1.0) == 64);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] (30LL, 1.0L) == 74);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] (10, 1.0f) == 55);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] (20L, 1.0) == 65);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] (30LL, 1.0L) == 75);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] (10, 1.0f) == 63);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] (20L, 1.0) == 73);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] (30LL, 1.0L) == 83);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] (10, 1.0f) == 64);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] (20L, 1.0) == 74);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] (30LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] (10, 1.0f) == 65);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] (20L, 1.0) == 75);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] (30LL, 1.0L) == 85);
+   static_assert (t.template foo <float> (0, 1.0f) == 53);
+   static_assert (t.template foo <double> (0L, 1.0) == 54);
+   static_assert (t.template foo <long double> (0LL, 1.0L) == 55);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <float> (10, 1.0f) == 53);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <double> (20L, 1.0) == 63);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <long double> (30LL, 1.0L) == 73);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] <float> (10, 1.0f) == 54);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] <double> (20L, 1.0) == 64);
+   static_assert (t.template [:members_of (^^A, uctx)[1]:] <long double> (30LL, 1.0L) == 74);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] <float> (10, 1.0f) == 55);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] <double> (20L, 1.0) == 65);
+   static_assert (t.template [:members_of (^^A, uctx)[2]:] <long double> (30LL, 1.0L) == 75);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <float> (10, 1.0f) == 63);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <double> (20L, 1.0) == 73);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <long double> (30LL, 1.0L) == 83);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] <float> (10, 1.0f) == 64);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] <double> (20L, 1.0) == 74);
+   static_assert (t.template [:members_of (^^B, uctx)[1]:] <long double> (30LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] <float> (10, 1.0f) == 65);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] <double> (20L, 1.0) == 75);
+   static_assert (t.template [:members_of (^^B, uctx)[2]:] <long double> (30LL, 1.0L) == 85);
+   static_assert (t.bar (0, 1.0f) == 82);
+   static_assert (t.bar (0L, 1.0) == 83);
+   static_assert (t.bar (0LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] (10, 1.0f) == 82);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] (20L, 1.0) == 92);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] (30LL, 1.0L) == 102);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] (10, 1.0f) == 83);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] (20L, 1.0) == 93);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] (30LL, 1.0L) == 103);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] (10, 1.0f) == 84);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] (20L, 1.0) == 94);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] (30LL, 1.0L) == 104);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] (10, 1.0f) == 92);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] (20L, 1.0) == 102);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] (30LL, 1.0L) == 112);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] (10, 1.0f) == 93);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] (20L, 1.0) == 103);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] (30LL, 1.0L) == 113);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] (10, 1.0f) == 94);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] (20L, 1.0) == 104);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] (30LL, 1.0L) == 114);
+   static_assert (t.template bar <float> (0, 1.0f) == 82);
+   static_assert (t.template bar <double> (0L, 1.0) == 83);
+   static_assert (t.template bar <long double> (0LL, 1.0L) == 84);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] <float> (10, 1.0f) == 82);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] <double> (20L, 1.0) == 92);
+   static_assert (t.template [:members_of (^^A, uctx)[3]:] <long double> (30LL, 1.0L) == 102);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] <float> (10, 1.0f) == 83);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] <double> (20L, 1.0) == 93);
+   static_assert (t.template [:members_of (^^A, uctx)[4]:] <long double> (30LL, 1.0L) == 103);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] <float> (10, 1.0f) == 84);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] <double> (20L, 1.0) == 94);
+   static_assert (t.template [:members_of (^^A, uctx)[5]:] <long double> (30LL, 1.0L) == 104);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] <float> (10, 1.0f) == 92);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] <double> (20L, 1.0) == 102);
+   static_assert (t.template [:members_of (^^B, uctx)[3]:] <long double> (30LL, 1.0L) == 112);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] <float> (10, 1.0f) == 93);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] <double> (20L, 1.0) == 103);
+   static_assert (t.template [:members_of (^^B, uctx)[4]:] <long double> (30LL, 1.0L) == 113);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] <float> (10, 1.0f) == 94);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] <double> (20L, 1.0) == 104);
+   static_assert (t.template [:members_of (^^B, uctx)[5]:] <long double> (30LL, 1.0L) == 114);
+ }
+ 
+ void
+ fred ()
+ {
+   foo <42> ();
+   bar <S, T> ();
+   baz <S, T> ();
+   qux <S, T> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member19.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member19.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member19.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member19.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,159 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   template <int N>
+   static constexpr int a = N;
+ };
+ struct T : public S {
+   template <int N>
+   static constexpr int a = N + 100;
+ };
+ 
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ constexpr S s;
+ static_assert (s.a <42> == 42);
+ static_assert (s.a <43> == 43);
+ static_assert (s.template [:members_of (^^S, uctx)[0]:] <44> == 44);
+ static_assert (s.template [:members_of (^^S, uctx)[0]:] <45> == 45);
+ static_assert (s.template [:^^S::a:] <44> == 44);
+ static_assert (s.template [:^^S::a:] <45> == 45);
+ constexpr T t;
+ static_assert (t.a <42> == 142);
+ static_assert (t.a <43> == 143);
+ static_assert (t.template [:members_of (^^S, uctx)[0]:] <44> == 44);
+ static_assert (t.template [:members_of (^^S, uctx)[0]:] <45> == 45);
+ static_assert (t.template [:members_of (^^T, uctx)[0]:] <44> == 144);
+ static_assert (t.template [:members_of (^^T, uctx)[0]:] <45> == 145);
+ static_assert (t.template [:^^S::a:] <44> == 44);
+ static_assert (t.template [:^^S::a:] <45> == 45);
+ static_assert (t.template [:^^T::a:] <44> == 144);
+ static_assert (t.template [:^^T::a:] <45> == 145);
+ 
+ template <int N>
+ void
+ foo ()
+ {
+   constexpr S s;
+   static_assert (s.a <42> == 42);
+   static_assert (s.a <43> == 43);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <44> == 44);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <45> == 45);
+   static_assert (s.template [:^^S::a:] <44> == 44);
+   static_assert (s.template [:^^S::a:] <45> == 45);
+   constexpr T t;
+   static_assert (t.a <42> == 142);
+   static_assert (t.a <43> == 143);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <44> == 44);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <45> == 45);
+   static_assert (t.template [:^^S::a:] <44> == 44);
+   static_assert (t.template [:^^S::a:] <45> == 45);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <44> == 144);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <45> == 145);
+   static_assert (t.template [:^^T::a:] <44> == 144);
+   static_assert (t.template [:^^T::a:] <45> == 145);
+ }
+ 
+ template <typename A, typename B>
+ void
+ bar ()
+ {
+   constexpr A s;
+   static_assert (s.template a <42> == 42);
+   static_assert (s.template a <43> == 43);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <44> == 44);
+   static_assert (s.template [:members_of (^^S, uctx)[0]:] <45> == 45);
+   static_assert (s.template [:^^S::a:] <44> == 44);
+   static_assert (s.template [:^^S::a:] <45> == 45);
+   constexpr B t;
+   static_assert (t.template a <42> == 142);
+   static_assert (t.template a <43> == 143);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <44> == 44);
+   static_assert (t.template [:members_of (^^S, uctx)[0]:] <45> == 45);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <44> == 144);
+   static_assert (t.template [:members_of (^^T, uctx)[0]:] <45> == 145);
+   static_assert (t.template [:^^S::a:] <44> == 44);
+   static_assert (t.template [:^^S::a:] <45> == 45);
+   static_assert (t.template [:^^T::a:] <44> == 144);
+   static_assert (t.template [:^^T::a:] <45> == 145);
+ }
+ 
+ template <typename A, typename B>
+ void
+ baz ()
+ {
+   constexpr S s;
+   static_assert (s.a <42> == 42);
+   static_assert (s.a <43> == 43);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <44> == 44);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <45> == 45);
+ #if 0
+   // TODO: This doesn't work yet.
+   static_assert (s.template [:^^A::a:] <44> == 44);
+   static_assert (s.template [:^^A::a:] <45> == 45);
+ #endif
+   constexpr T t;
+   static_assert (t.a <42> == 142);
+   static_assert (t.a <43> == 143);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <44> == 44);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <45> == 45);
+ #if 0
+   // TODO: This doesn't work yet.
+   static_assert (t.template [:^^A::a:] <44> == 44);
+   static_assert (t.template [:^^A::a:] <45> == 45);
+ #endif
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <44> == 144);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <45> == 145);
+ #if 0
+   // TODO: This doesn't work yet.
+   static_assert (t.template [:^^B::a:] <44> == 144);
+   static_assert (t.template [:^^B::a:] <45> == 145);
+ #endif
+ }
+ 
+ template <typename A, typename B>
+ void
+ qux ()
+ {
+   constexpr A s;
+   static_assert (s.template a <42> == 42);
+   static_assert (s.template a <43> == 43);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <44> == 44);
+   static_assert (s.template [:members_of (^^A, uctx)[0]:] <45> == 45);
+ #if 0
+   // TODO: This doesn't work yet.
+   static_assert (s.template [:^^A::a:] <44> == 44);
+   static_assert (s.template [:^^A::a:] <45> == 45);
+ #endif
+   constexpr B t;
+   static_assert (t.template a <42> == 142);
+   static_assert (t.template a <43> == 143);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <44> == 44);
+   static_assert (t.template [:members_of (^^A, uctx)[0]:] <45> == 45);
+ #if 0
+   // TODO: This doesn't work yet.
+   static_assert (t.template [:^^A::a:] <44> == 44);
+   static_assert (t.template [:^^A::a:] <45> == 45);
+ #endif
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <44> == 144);
+   static_assert (t.template [:members_of (^^B, uctx)[0]:] <45> == 145);
+ #if 0
+   // TODO: This doesn't work yet.
+   static_assert (t.template [:^^B::a:] <44> == 144);
+   static_assert (t.template [:^^B::a:] <45> == 145);
+ #endif
+ }
+ 
+ void
+ fred ()
+ {
+   foo <42> ();
+   bar <S, T> ();
+   baz <S, T> ();
+   qux <S, T> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct B { consteval char fn() const { return 'B'; } };
+ struct D : B { consteval char fn() const { return 'D'; } };
+ 
+ constexpr auto rBfn = ^^B::fn;
+ constexpr auto rDfn = ^^D::fn;
+ 
+ constexpr D d;
+ constexpr auto rd = ^^d;
+ 
+ static_assert([:rd:].[:rBfn:]() == 'B');
+ static_assert([:rd:].[:rDfn:]() == 'D');
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member20.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member20.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member20.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member20.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,26 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template<decltype (^^::) R>
+ void
+ bar ()
+ {
+   constexpr auto t = [: R :]; // { dg-error "use of local variable" }
+ }
+ 
+ void
+ g (int p)
+ {
+   int x = 42;
+   bar<^^p> ();
+   constexpr auto r = ^^x;
+   struct S {
+     void foo () {
+       [: ^^x :];    // { dg-error "use of local variable" }
+       [: r :];	    // { dg-error "use of local variable" }
+       decltype ([: ^^x :]) a{};
+       decltype ([: r :]) b{};
+       constexpr auto rx = ^^x;
+     }
+   };
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,35 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test various forms of member access with this.
+ 
+ struct S {
+   int i;
+   static constexpr int j = 42;
+   int foo () { return 42; }
+ 
+   void
+   f ()
+   {
+     static_assert([: ^^ j :] == 42);
+     static_assert([: ^^S :]::j == 42);
+     int q = this->[: ^^i :];
+     q += this->[: ^^S :]::i;
+     this->[: ^^foo :] ();
+     this->[: ^^S :]::foo ();
+   }
+ };
+ 
+ struct D {
+   int i;
+   static constexpr int j = 42;
+   int foo () { return 42; }
+ 
+   template<typename T>
+   void
+   f ()
+   {
+     static_assert([: ^^T :]::j == 42);
+     int q = this->[: ^^T :]::j;
+     this->[: ^^T :]::foo ();
+   }
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct C {
+   union {
+     int i;
+   };
+ };
+ 
+ struct D { int i; };
+ 
+ auto c = C{.i=2};
+ auto v = c.[:^^C::i:];    // { dg-error "not a base" }
+ auto e = c.[: ^^D::i :];  // { dg-error "not a base" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct A { };
+ 
+ struct S {
+   int m(this S) { return 42; }
+   int n() const { return 42; }
+   enum { FOO } e;
+   A a;
+ };
+ 
+ auto p = &[: ^^S::m :];
+ auto q = &[: ^^S::m :];
+ 
+ auto rm = [: ^^S::m :];	 // { dg-error "cannot implicitly reference a class member .int S::m\\(this S\\). through a splice" }
+ auto rn = [: ^^S::n :];  // { dg-error "cannot implicitly reference a class member .int S::n\\(\\) const. through a splice" }
+ auto re = [: ^^S::e :];  // { dg-error "cannot implicitly reference a class member .S::e. through a splice" }
+ auto ra = [: ^^S::a :];  // { dg-error "cannot implicitly reference a class member .S::a. through a splice" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   int i;
+ };
+ 
+ constexpr auto r = ^^S::i;
+ /* A pointer to member is only formed when an explicit & is used and
+    its operand is a qualified-id or splice-expression not enclosed in
+    parentheses.  */
+ auto p = &([: r :]);  // { dg-error "cannot implicitly reference a class member .S::i. through a splice" }
+ auto q = &[: r :];
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,78 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // From clang/test/Reflection/splice-exprs.cpp.
+ 
+ using info = decltype(^^int);
+ 
+ struct S {
+   int j;
+   int k;
+ 
+   consteval int getJ() const { return j; }
+ 
+   template <int N>
+   consteval int getJPlusN() const { return j + N; }
+ 
+   static consteval int eleven() { return 11; }
+ 
+   template <int N>
+   static consteval int constant() { return N; }
+ };
+ 
+ // Splicing dependent member references.
+ template <info RMem>
+ consteval int fn() {
+   S s = {11, 13};
+   return s.[:RMem:] + (&s)->[:RMem:];
+ }
+ static_assert(fn<^^S::j>() == 22);
+ static_assert(fn<^^S::k>() == 26);
+ 
+ // Splicing dependent member references with arrow syntax.
+ template <info RMem>
+ consteval int fn2() {
+   S s = {11, 13};
+   return s.*(&[:RMem:]) + (&s)->*(&[:RMem:]);
+ }
+ static_assert(fn<^^S::j>() == 22);
+ static_assert(fn<^^S::k>() == 26);
+ 
+ // Splicing member functions.
+ constexpr info r_getJ = ^^S::getJ;
+ static_assert(S{2, 4}.[:r_getJ:]() == 2);
+ 
+ // Splicing static member functions.
+ constexpr auto rEleven = ^^S::eleven;
+ static_assert([:rEleven:]() == 11);
+ 
+ // Splicing static member template function instantiation.
+ constexpr auto rConst14 = ^^S::constant<14>;
+ static_assert([:rConst14:]() == 14);
+ 
+ // Splicing member function template instantiations.
+ constexpr auto rgetJPlus5 = ^^S::getJPlusN<5>;
+ static_assert(S{2, 4}.[:rgetJPlus5:]() == 7);
+ 
+ // Splicing member function template instantiations with spliced objects.
+ constexpr S instance {1, 4};
+ constexpr info rInstance = ^^instance;
+ static_assert([:rInstance:].[:rgetJPlus5:]() == 6);
+ static_assert((&[:rInstance:])->[:rgetJPlus5:]() == 6);
+ 
+ // Splicing dependent object in a member access expression.
+ template <info RObj>
+ consteval int fn3() {
+   return [:RObj:].k;
+ }
+ static_assert(fn3<^^instance>() == 4);
+ 
+ // Passing address of a spliced operand as an argument.
+ consteval int getMem(const S *s, int S::* mem) {
+   return s->*mem;
+ }
+ constexpr info rJ = ^^S::j;
+ static_assert(getMem(&instance, &[:rJ:]) == 1);
+ 
+ // Member access through a splice of a private member.
+ class WithPrivateBase : S {} d;
+ int dK = d.[:^^S::k:];
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct S {
+   int k;
+ };
+ 
+ struct Y {
+   int k;
+ };
+ struct X : S { };
+ 
+ class D : S , X {} d;	// { dg-warning "direct base .S. inaccessible in .D. due to ambiguity" }
+ int dK = d.[:^^S::k:];	// { dg-error ".S. is an ambiguous base of .D." }
+ int dY = d.[:^^Y::k:];	// { dg-error ".Y. is not a base of .D." }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/member9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/member9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct B { consteval virtual int fn() const { return 1; } };
+ struct D : B { consteval int fn() const override { return 2; } };
+ 
+ constexpr D d;
+ static_assert(d.[:^^D::fn:]() == 2);
+ static_assert(d.D::fn() == 2);
+ static_assert(d.[:^^B::fn:]() == 2);
+ static_assert(d.[:^^B:]::fn() == 1);
+ static_assert(d.B::fn() == 1);
+ 
+ // Splicing member as intermediate component of a member-access expression.
+ struct T { struct Inner { int v; } inner; };
+ constexpr auto r_inner = ^^T::inner;
+ constexpr T t = {{4}};
+ static_assert(t.[:r_inner:].v == 4);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,524 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::{,{,non}static_data_}members_of and
+ // has_inaccessible_nonstatic_data_members.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ using std::views::filter;
+ using std::ranges::to;
+ using std::vector;
+ using std::string_view;
+ 
+ consteval bool
+ check_special_members (const vector <info> &vec, int cnt, bool dct, bool cct, bool cas, bool mct, bool mas, bool dt)
+ {
+   if ((vec | filter (is_special_member_function) | filter (is_defaulted) | to <vector> ()).size () != cnt)
+     throw 1;
+   if ((vec | filter (is_default_constructor) | to <vector> ()).size () != dct)
+     throw 2;
+   if ((vec | filter (is_copy_constructor) | to <vector> ()).size () != cct)
+     throw 3;
+   if ((vec | filter (is_copy_assignment) | to <vector> ()).size () != cas)
+     throw 4;
+   if ((vec | filter (is_move_constructor) | to <vector> ()).size () != mct)
+     throw 5;
+   if ((vec | filter (is_move_assignment) | to <vector> ()).size () != mas)
+     throw 6;
+   if ((vec | filter (is_destructor) | to <vector> ()).size () != dt)
+     throw 7;
+   return true;
+ }
+ 
+ namespace N1 {
+   struct A {
+     int a;
+     static int b;
+     enum E { E0 };
+     using c = int;
+     typedef long d;
+     consteval {
+     }
+   };
+   int A::b = 24;
+   consteval {
+   }
+ }
+ namespace N2 {
+   struct B {};
+   struct C { int : 5; };
+   struct D { D (int = 42); int d; };
+   struct E { E (int); int e; };
+   struct F { int f; F (const F &); };
+   struct G { G &operator = (const G &); int g; };
+   struct H { int h; H (H &&); };
+   struct I { I &operator = (I &&); int i; };
+   struct J { ~J (); };
+   struct K {
+     int a;
+     static int b;
+     enum E { E0 };
+     using c = int;
+     typedef long d;
+     template <typename T>
+     struct A {};
+     template <typename T>
+     static consteval bool foo (const T &) { return true; }
+     template <int N>
+     static constexpr int e = N;
+     template <typename T>
+     using f = const T &;
+     void bar () {}
+     auto baz ();
+     int g : 3;
+     long : 2;
+     int : 0;
+     consteval {
+       A <int> z = {};
+       static_assert (e <42> == 42);
+       f <int> w = 42;
+     }
+   protected:
+     int Xa;
+     static int Xb;
+     enum XE { XE0 };
+     using Xc = int;
+     typedef long Xd;
+     template <typename T>
+     struct XA {};
+     template <typename T>
+     static consteval bool Xfoo (const T &) { return true; }
+     template <int N>
+     static constexpr int Xe = N;
+     template <typename T>
+     using Xf = const T &;
+     void Xbar () {}
+     auto Xbaz ();
+     int Xg : 5;
+     long : 4;
+     int : 0;
+   private:
+     int Ya;
+     static int Yb;
+     enum YE { YE0 };
+     using Yc = int;
+     typedef long Yd;
+     template <typename T>
+     struct YA {};
+     template <typename T>
+     static consteval bool Yfoo (const T &) { return true; }
+     template <int N>
+     static constexpr int Ye = N;
+     template <typename T>
+     using Yf = const T &;
+     void Ybar () {}
+     auto Ybaz ();
+     int Yg : 7;
+     long : 6;
+     int : 0;
+   public:
+     static constexpr info rXa = ^^Xa;
+     static constexpr info rXb = ^^Xb;
+     static constexpr info rXE = ^^XE;
+     static constexpr info rXg = ^^Xg;
+     static constexpr info rYa = ^^Ya;
+     static constexpr info rYb = ^^Yb;
+     static constexpr info rYE = ^^YE;
+     static constexpr info rYg = ^^Yg;
+   };
+   namespace W {}
+   namespace X = W;
+   namespace W {}
+   namespace W {}
+   inline namespace Y { int a; }
+   template <typename T>
+   concept Z = requires { true; };
+ }
+ static_assert (N2::K::foo (42) && N2::K::foo (42UL));
+ 
+ constexpr access_context gctx = access_context::current ();
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ static_assert (members_of (^^N1::A, gctx).size () == 11);
+ static_assert (members_of (^^N1::A, gctx)[0] == ^^N1::A::a);
+ static_assert (members_of (^^N1::A, gctx)[1] == ^^N1::A::b);
+ static_assert (members_of (^^N1::A, gctx)[2] == ^^N1::A::E);
+ static_assert (members_of (^^N1::A, gctx)[3] == ^^N1::A::c);
+ static_assert (members_of (^^N1::A, gctx)[4] == ^^N1::A::d);
+ static_assert (check_special_members (members_of (^^N1::A, gctx), 6, true, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N1::A, gctx).size () == 1);
+ static_assert (static_data_members_of (^^N1::A, gctx)[0] == ^^N1::A::b);
+ static_assert (nonstatic_data_members_of (^^N1::A, gctx).size () == 1);
+ static_assert (nonstatic_data_members_of (^^N1::A, gctx)[0] == ^^N1::A::a);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N1::A, gctx));
+ 
+ static_assert (members_of (^^N1, gctx).size () == 1);
+ static_assert (members_of (^^N1, gctx)[0] == ^^N1::A);
+ 
+ static_assert (members_of (^^N2::B, gctx).size () == 6);
+ static_assert (check_special_members (members_of (^^N2::B, gctx), 6, true, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N2::B, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::B, gctx).size () == 0);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::B, gctx));
+ 
+ static_assert (members_of (^^N2::C, gctx).size () == 7);
+ static_assert (is_bit_field (members_of (^^N2::C, gctx)[0]));
+ static_assert (!has_identifier (members_of (^^N2::C, gctx)[0]));
+ static_assert (bit_size_of (members_of (^^N2::C, gctx)[0]) == 5);
+ static_assert (type_of (members_of (^^N2::C, gctx)[0]) == ^^int);
+ static_assert (check_special_members (members_of (^^N2::C, gctx), 6, true, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N2::C, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::C, gctx).size () == 0);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::C, gctx));
+ 
+ static_assert (members_of (^^N2::D, gctx).size () == 7);
+ static_assert (is_default_constructor (members_of (^^N2::D, gctx)[0]));
+ static_assert (members_of (^^N2::D, gctx)[1] == ^^N2::D::d);
+ static_assert (check_special_members (members_of (^^N2::D, gctx), 5, true, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N2::D, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::D, gctx).size () == 1);
+ static_assert (nonstatic_data_members_of (^^N2::D, gctx)[0] == ^^N2::D::d);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::D, gctx));
+ 
+ static_assert (members_of (^^N2::E, gctx).size () == 7);
+ static_assert (is_constructor (members_of (^^N2::E, gctx)[0]));
+ static_assert (members_of (^^N2::E, gctx)[1] == ^^N2::E::e);
+ static_assert (check_special_members (members_of (^^N2::E, gctx), 5, false, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N2::E, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::E, gctx).size () == 1);
+ static_assert (nonstatic_data_members_of (^^N2::E, gctx)[0] == ^^N2::E::e);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::E, gctx));
+ 
+ static_assert (members_of (^^N2::F, gctx).size () == 4);
+ static_assert (members_of (^^N2::F, gctx)[0] == ^^N2::F::f);
+ static_assert (is_copy_constructor (members_of (^^N2::F, gctx)[1]));
+ static_assert (check_special_members (members_of (^^N2::F, gctx), 2, false, true, true, false, false, true));
+ static_assert (static_data_members_of (^^N2::F, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::F, gctx).size () == 1);
+ static_assert (nonstatic_data_members_of (^^N2::F, gctx)[0] == ^^N2::F::f);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::F, gctx));
+ 
+ static_assert (members_of (^^N2::G, gctx).size () == 5);
+ static_assert (is_copy_assignment (members_of (^^N2::G, gctx)[0]));
+ static_assert (members_of (^^N2::G, gctx)[1] == ^^N2::G::g);
+ static_assert (check_special_members (members_of (^^N2::G, gctx), 3, true, true, true, false, false, true));
+ static_assert (static_data_members_of (^^N2::G, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::G, gctx).size () == 1);
+ static_assert (nonstatic_data_members_of (^^N2::G, gctx)[0] == ^^N2::G::g);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::G, gctx));
+ 
+ static_assert (members_of (^^N2::H, gctx).size () == 5);
+ static_assert (members_of (^^N2::H, gctx)[0] == ^^N2::H::h);
+ static_assert (is_move_constructor (members_of (^^N2::H, gctx)[1]));
+ static_assert (check_special_members (members_of (^^N2::H, gctx), 3, false, true, true, true, false, true));
+ static_assert (static_data_members_of (^^N2::H, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::H, gctx).size () == 1);
+ static_assert (nonstatic_data_members_of (^^N2::H, gctx)[0] == ^^N2::H::h);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::H, gctx));
+ 
+ static_assert (members_of (^^N2::I, gctx).size () == 6);
+ static_assert (is_move_assignment (members_of (^^N2::I, gctx)[0]));
+ static_assert (members_of (^^N2::I, gctx)[1] == ^^N2::I::i);
+ static_assert (check_special_members (members_of (^^N2::I, gctx), 4, true, true, true, false, true, true));
+ static_assert (static_data_members_of (^^N2::I, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::I, gctx).size () == 1);
+ static_assert (nonstatic_data_members_of (^^N2::I, gctx)[0] == ^^N2::I::i);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::I, gctx));
+ 
+ static_assert (members_of (^^N2::J, gctx).size () == 4);
+ static_assert (is_destructor (members_of (^^N2::J, gctx)[0]));
+ static_assert (check_special_members (members_of (^^N2::J, gctx), 3, true, true, true, false, false, true));
+ static_assert (static_data_members_of (^^N2::J, gctx).size () == 0);
+ static_assert (nonstatic_data_members_of (^^N2::J, gctx).size () == 0);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::J, gctx));
+ 
+ static_assert (members_of (^^N2::K, gctx).size () == 27);
+ static_assert (members_of (^^N2::K, gctx)[0] == ^^N2::K::a);
+ static_assert (members_of (^^N2::K, gctx)[1] == ^^N2::K::b);
+ static_assert (members_of (^^N2::K, gctx)[2] == ^^N2::K::E);
+ static_assert (members_of (^^N2::K, gctx)[3] == ^^N2::K::c);
+ static_assert (members_of (^^N2::K, gctx)[4] == ^^N2::K::d);
+ static_assert (members_of (^^N2::K, gctx)[5] == ^^N2::K::A);
+ static_assert (members_of (^^N2::K, gctx)[6] == ^^N2::K::foo);
+ static_assert (members_of (^^N2::K, gctx)[7] == ^^N2::K::e);
+ static_assert (members_of (^^N2::K, gctx)[8] == ^^N2::K::f);
+ static_assert (members_of (^^N2::K, gctx)[9] == ^^N2::K::bar);
+ static_assert (members_of (^^N2::K, gctx)[10] == ^^N2::K::g);
+ static_assert (is_bit_field (members_of (^^N2::K, gctx)[11]));
+ static_assert (!has_identifier (members_of (^^N2::K, gctx)[11]));
+ static_assert (bit_size_of (members_of (^^N2::K, gctx)[11]) == 2);
+ static_assert (type_of (members_of (^^N2::K, gctx)[11]) == ^^long);
+ static_assert (is_bit_field (members_of (^^N2::K, gctx)[12]));
+ static_assert (!has_identifier (members_of (^^N2::K, gctx)[12]));
+ static_assert (bit_size_of (members_of (^^N2::K, gctx)[12]) == 0);
+ static_assert (type_of (members_of (^^N2::K, gctx)[12]) == ^^int);
+ static_assert (members_of (^^N2::K, gctx)[13] == ^^N2::K::rXa);
+ static_assert (members_of (^^N2::K, gctx)[14] == ^^N2::K::rXb);
+ static_assert (members_of (^^N2::K, gctx)[15] == ^^N2::K::rXE);
+ static_assert (members_of (^^N2::K, gctx)[16] == ^^N2::K::rXg);
+ static_assert (members_of (^^N2::K, gctx)[17] == ^^N2::K::rYa);
+ static_assert (members_of (^^N2::K, gctx)[18] == ^^N2::K::rYb);
+ static_assert (members_of (^^N2::K, gctx)[19] == ^^N2::K::rYE);
+ static_assert (members_of (^^N2::K, gctx)[20] == ^^N2::K::rYg);
+ static_assert (check_special_members (members_of (^^N2::K, gctx), 6, true, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N2::K, gctx).size () == 9);
+ static_assert (static_data_members_of (^^N2::K, gctx)[0] == ^^N2::K::b);
+ static_assert (static_data_members_of (^^N2::K, gctx)[1] == ^^N2::K::rXa);
+ static_assert (static_data_members_of (^^N2::K, gctx)[2] == ^^N2::K::rXb);
+ static_assert (static_data_members_of (^^N2::K, gctx)[3] == ^^N2::K::rXE);
+ static_assert (static_data_members_of (^^N2::K, gctx)[4] == ^^N2::K::rXg);
+ static_assert (static_data_members_of (^^N2::K, gctx)[5] == ^^N2::K::rYa);
+ static_assert (static_data_members_of (^^N2::K, gctx)[6] == ^^N2::K::rYb);
+ static_assert (static_data_members_of (^^N2::K, gctx)[7] == ^^N2::K::rYE);
+ static_assert (static_data_members_of (^^N2::K, gctx)[8] == ^^N2::K::rYg);
+ static_assert (nonstatic_data_members_of (^^N2::K, gctx).size () == 2);
+ static_assert (nonstatic_data_members_of (^^N2::K, gctx)[0] == ^^N2::K::a);
+ static_assert (nonstatic_data_members_of (^^N2::K, gctx)[1] == ^^N2::K::g);
+ static_assert (has_inaccessible_nonstatic_data_members (^^N2::K, gctx));
+ static_assert (members_of (^^N2::K, uctx).size () == 53);
+ static_assert (members_of (^^N2::K, uctx)[0] == ^^N2::K::a);
+ static_assert (members_of (^^N2::K, uctx)[1] == ^^N2::K::b);
+ static_assert (members_of (^^N2::K, uctx)[2] == ^^N2::K::E);
+ static_assert (members_of (^^N2::K, uctx)[3] == ^^N2::K::c);
+ static_assert (members_of (^^N2::K, uctx)[4] == ^^N2::K::d);
+ static_assert (members_of (^^N2::K, uctx)[5] == ^^N2::K::A);
+ static_assert (members_of (^^N2::K, uctx)[6] == ^^N2::K::foo);
+ static_assert (members_of (^^N2::K, uctx)[7] == ^^N2::K::e);
+ static_assert (members_of (^^N2::K, uctx)[8] == ^^N2::K::f);
+ static_assert (members_of (^^N2::K, uctx)[9] == ^^N2::K::bar);
+ static_assert (members_of (^^N2::K, uctx)[10] == ^^N2::K::g);
+ static_assert (is_bit_field (members_of (^^N2::K, uctx)[11]));
+ static_assert (!has_identifier (members_of (^^N2::K, uctx)[11]));
+ static_assert (bit_size_of (members_of (^^N2::K, uctx)[11]) == 2);
+ static_assert (type_of (members_of (^^N2::K, uctx)[11]) == ^^long);
+ static_assert (is_bit_field (members_of (^^N2::K, uctx)[12]));
+ static_assert (!has_identifier (members_of (^^N2::K, uctx)[12]));
+ static_assert (bit_size_of (members_of (^^N2::K, uctx)[12]) == 0);
+ static_assert (type_of (members_of (^^N2::K, uctx)[12]) == ^^int);
+ static_assert (members_of (^^N2::K, uctx)[13] == N2::K::rXa);
+ static_assert (members_of (^^N2::K, uctx)[14] == N2::K::rXb);
+ static_assert (members_of (^^N2::K, uctx)[15] == N2::K::rXE);
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[16]) == string_view ("Xc"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[17]) == string_view ("Xd"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[18]) == string_view ("XA"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[19]) == string_view ("Xfoo"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[20]) == string_view ("Xe"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[21]) == string_view ("Xf"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[22]) == string_view ("Xbar"));
+ static_assert (members_of (^^N2::K, uctx)[23] == N2::K::rXg);
+ static_assert (is_bit_field (members_of (^^N2::K, uctx)[24]));
+ static_assert (!has_identifier (members_of (^^N2::K, uctx)[24]));
+ static_assert (bit_size_of (members_of (^^N2::K, uctx)[24]) == 4);
+ static_assert (type_of (members_of (^^N2::K, uctx)[24]) == ^^long);
+ static_assert (is_bit_field (members_of (^^N2::K, uctx)[25]));
+ static_assert (!has_identifier (members_of (^^N2::K, uctx)[25]));
+ static_assert (bit_size_of (members_of (^^N2::K, uctx)[25]) == 0);
+ static_assert (type_of (members_of (^^N2::K, uctx)[25]) == ^^int);
+ static_assert (members_of (^^N2::K, uctx)[26] == N2::K::rYa);
+ static_assert (members_of (^^N2::K, uctx)[27] == N2::K::rYb);
+ static_assert (members_of (^^N2::K, uctx)[28] == N2::K::rYE);
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[29]) == string_view ("Yc"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[30]) == string_view ("Yd"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[31]) == string_view ("YA"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[32]) == string_view ("Yfoo"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[33]) == string_view ("Ye"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[34]) == string_view ("Yf"));
+ static_assert (identifier_of (members_of (^^N2::K, uctx)[35]) == string_view ("Ybar"));
+ static_assert (members_of (^^N2::K, uctx)[36] == N2::K::rYg);
+ static_assert (is_bit_field (members_of (^^N2::K, uctx)[37]));
+ static_assert (!has_identifier (members_of (^^N2::K, uctx)[37]));
+ static_assert (bit_size_of (members_of (^^N2::K, uctx)[37]) == 6);
+ static_assert (type_of (members_of (^^N2::K, uctx)[37]) == ^^long);
+ static_assert (is_bit_field (members_of (^^N2::K, uctx)[38]));
+ static_assert (!has_identifier (members_of (^^N2::K, uctx)[38]));
+ static_assert (bit_size_of (members_of (^^N2::K, uctx)[38]) == 0);
+ static_assert (type_of (members_of (^^N2::K, uctx)[38]) == ^^int);
+ static_assert (members_of (^^N2::K, uctx)[39] == ^^N2::K::rXa);
+ static_assert (members_of (^^N2::K, uctx)[40] == ^^N2::K::rXb);
+ static_assert (members_of (^^N2::K, uctx)[41] == ^^N2::K::rXE);
+ static_assert (members_of (^^N2::K, uctx)[42] == ^^N2::K::rXg);
+ static_assert (members_of (^^N2::K, uctx)[43] == ^^N2::K::rYa);
+ static_assert (members_of (^^N2::K, uctx)[44] == ^^N2::K::rYb);
+ static_assert (members_of (^^N2::K, uctx)[45] == ^^N2::K::rYE);
+ static_assert (members_of (^^N2::K, uctx)[46] == ^^N2::K::rYg);
+ static_assert (check_special_members (members_of (^^N2::K, uctx), 6, true, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N2::K, uctx).size () == 11);
+ static_assert (static_data_members_of (^^N2::K, uctx)[0] == ^^N2::K::b);
+ static_assert (static_data_members_of (^^N2::K, uctx)[1] == N2::K::rXb);
+ static_assert (static_data_members_of (^^N2::K, uctx)[2] == N2::K::rYb);
+ static_assert (static_data_members_of (^^N2::K, uctx)[3] == ^^N2::K::rXa);
+ static_assert (static_data_members_of (^^N2::K, uctx)[4] == ^^N2::K::rXb);
+ static_assert (static_data_members_of (^^N2::K, uctx)[5] == ^^N2::K::rXE);
+ static_assert (static_data_members_of (^^N2::K, uctx)[6] == ^^N2::K::rXg);
+ static_assert (static_data_members_of (^^N2::K, uctx)[7] == ^^N2::K::rYa);
+ static_assert (static_data_members_of (^^N2::K, uctx)[8] == ^^N2::K::rYb);
+ static_assert (static_data_members_of (^^N2::K, uctx)[9] == ^^N2::K::rYE);
+ static_assert (static_data_members_of (^^N2::K, uctx)[10] == ^^N2::K::rYg);
+ static_assert (nonstatic_data_members_of (^^N2::K, uctx).size () == 6);
+ static_assert (nonstatic_data_members_of (^^N2::K, uctx)[0] == ^^N2::K::a);
+ static_assert (nonstatic_data_members_of (^^N2::K, uctx)[1] == ^^N2::K::g);
+ static_assert (nonstatic_data_members_of (^^N2::K, uctx)[2] == N2::K::rXa);
+ static_assert (nonstatic_data_members_of (^^N2::K, uctx)[3] == N2::K::rXg);
+ static_assert (nonstatic_data_members_of (^^N2::K, uctx)[4] == N2::K::rYa);
+ static_assert (nonstatic_data_members_of (^^N2::K, uctx)[5] == N2::K::rYg);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::K, uctx));
+ 
+ static_assert (members_of (^^N2, gctx).size () == 14);
+ static_assert ((members_of (^^N2, gctx) | filter (is_type) | filter (is_class_type) | to <vector> ()).size () == 10);
+ static_assert ((members_of (^^N2, gctx) | filter (is_namespace) | to <vector> ()).size () == 3);
+ static_assert ((members_of (^^N2, gctx) | filter (is_namespace_alias) | to <vector> ()).size () == 1);
+ static_assert ((members_of (^^N2, gctx) | filter (is_concept) | to <vector> ()).size () == 1);
+ 
+ namespace N2 {
+   struct L : public K {
+     static constexpr auto ctx = access_context::current ();
+   };
+   static constexpr auto ctx = L::ctx.via (^^L);
+ }
+ 
+ static_assert (members_of (^^N2::K, N2::ctx).size () == 40);
+ static_assert (members_of (^^N2::K, N2::ctx)[0] == ^^N2::K::a);
+ static_assert (members_of (^^N2::K, N2::ctx)[1] == ^^N2::K::b);
+ static_assert (members_of (^^N2::K, N2::ctx)[2] == ^^N2::K::E);
+ static_assert (members_of (^^N2::K, N2::ctx)[3] == ^^N2::K::c);
+ static_assert (members_of (^^N2::K, N2::ctx)[4] == ^^N2::K::d);
+ static_assert (members_of (^^N2::K, N2::ctx)[5] == ^^N2::K::A);
+ static_assert (members_of (^^N2::K, N2::ctx)[6] == ^^N2::K::foo);
+ static_assert (members_of (^^N2::K, N2::ctx)[7] == ^^N2::K::e);
+ static_assert (members_of (^^N2::K, N2::ctx)[8] == ^^N2::K::f);
+ static_assert (members_of (^^N2::K, N2::ctx)[9] == ^^N2::K::bar);
+ static_assert (members_of (^^N2::K, N2::ctx)[10] == ^^N2::K::g);
+ static_assert (is_bit_field (members_of (^^N2::K, N2::ctx)[11]));
+ static_assert (!has_identifier (members_of (^^N2::K, N2::ctx)[11]));
+ static_assert (bit_size_of (members_of (^^N2::K, N2::ctx)[11]) == 2);
+ static_assert (type_of (members_of (^^N2::K, N2::ctx)[11]) == ^^long);
+ static_assert (is_bit_field (members_of (^^N2::K, N2::ctx)[12]));
+ static_assert (!has_identifier (members_of (^^N2::K, N2::ctx)[12]));
+ static_assert (bit_size_of (members_of (^^N2::K, N2::ctx)[12]) == 0);
+ static_assert (type_of (members_of (^^N2::K, N2::ctx)[12]) == ^^int);
+ static_assert (members_of (^^N2::K, N2::ctx)[13] == N2::K::rXa);
+ static_assert (members_of (^^N2::K, N2::ctx)[14] == N2::K::rXb);
+ static_assert (members_of (^^N2::K, N2::ctx)[15] == N2::K::rXE);
+ static_assert (identifier_of (members_of (^^N2::K, N2::ctx)[16]) == string_view ("Xc"));
+ static_assert (identifier_of (members_of (^^N2::K, N2::ctx)[17]) == string_view ("Xd"));
+ static_assert (identifier_of (members_of (^^N2::K, N2::ctx)[18]) == string_view ("XA"));
+ static_assert (identifier_of (members_of (^^N2::K, N2::ctx)[19]) == string_view ("Xfoo"));
+ static_assert (identifier_of (members_of (^^N2::K, N2::ctx)[20]) == string_view ("Xe"));
+ static_assert (identifier_of (members_of (^^N2::K, N2::ctx)[21]) == string_view ("Xf"));
+ static_assert (identifier_of (members_of (^^N2::K, N2::ctx)[22]) == string_view ("Xbar"));
+ static_assert (members_of (^^N2::K, N2::ctx)[23] == N2::K::rXg);
+ static_assert (is_bit_field (members_of (^^N2::K, N2::ctx)[24]));
+ static_assert (!has_identifier (members_of (^^N2::K, N2::ctx)[24]));
+ static_assert (bit_size_of (members_of (^^N2::K, N2::ctx)[24]) == 4);
+ static_assert (type_of (members_of (^^N2::K, N2::ctx)[24]) == ^^long);
+ static_assert (is_bit_field (members_of (^^N2::K, N2::ctx)[25]));
+ static_assert (!has_identifier (members_of (^^N2::K, N2::ctx)[25]));
+ static_assert (bit_size_of (members_of (^^N2::K, N2::ctx)[25]) == 0);
+ static_assert (type_of (members_of (^^N2::K, N2::ctx)[25]) == ^^int);
+ static_assert (members_of (^^N2::K, N2::ctx)[26] == ^^N2::K::rXa);
+ static_assert (members_of (^^N2::K, N2::ctx)[27] == ^^N2::K::rXb);
+ static_assert (members_of (^^N2::K, N2::ctx)[28] == ^^N2::K::rXE);
+ static_assert (members_of (^^N2::K, N2::ctx)[29] == ^^N2::K::rXg);
+ static_assert (members_of (^^N2::K, N2::ctx)[30] == ^^N2::K::rYa);
+ static_assert (members_of (^^N2::K, N2::ctx)[31] == ^^N2::K::rYb);
+ static_assert (members_of (^^N2::K, N2::ctx)[32] == ^^N2::K::rYE);
+ static_assert (members_of (^^N2::K, N2::ctx)[33] == ^^N2::K::rYg);
+ static_assert (check_special_members (members_of (^^N2::K, N2::ctx), 6, true, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N2::K, N2::ctx).size () == 10);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[0] == ^^N2::K::b);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[1] == N2::K::rXb);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[2] == ^^N2::K::rXa);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[3] == ^^N2::K::rXb);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[4] == ^^N2::K::rXE);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[5] == ^^N2::K::rXg);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[6] == ^^N2::K::rYa);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[7] == ^^N2::K::rYb);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[8] == ^^N2::K::rYE);
+ static_assert (static_data_members_of (^^N2::K, N2::ctx)[9] == ^^N2::K::rYg);
+ static_assert (nonstatic_data_members_of (^^N2::K, N2::ctx).size () == 4);
+ static_assert (nonstatic_data_members_of (^^N2::K, N2::ctx)[0] == ^^N2::K::a);
+ static_assert (nonstatic_data_members_of (^^N2::K, N2::ctx)[1] == ^^N2::K::g);
+ static_assert (nonstatic_data_members_of (^^N2::K, N2::ctx)[2] == N2::K::rXa);
+ static_assert (nonstatic_data_members_of (^^N2::K, N2::ctx)[3] == N2::K::rXg);
+ static_assert (has_inaccessible_nonstatic_data_members (^^N2::K, N2::ctx));
+ static_assert (members_of (^^N2::L, gctx).size () == 7);
+ static_assert (members_of (^^N2::L, gctx)[0] == ^^N2::L::ctx);
+ static_assert (check_special_members (members_of (^^N2::L, gctx), 6, true, true, true, true, true, true));
+ static_assert (static_data_members_of (^^N2::L, gctx).size () == 1);
+ static_assert (static_data_members_of (^^N2::L, gctx)[0] == ^^N2::L::ctx);
+ static_assert (nonstatic_data_members_of (^^N2::L, gctx).size () == 0);
+ static_assert (!has_inaccessible_nonstatic_data_members (^^N2::L, gctx));
+ 
+ static_assert (members_of (^^N2, gctx).size () == 16);
+ static_assert ((members_of (^^N2, gctx) | filter (is_type) | filter (is_class_type) | to <vector> ()).size () == 11);
+ static_assert ((members_of (^^N2, gctx) | filter (is_namespace) | to <vector> ()).size () == 3);
+ static_assert ((members_of (^^N2, gctx) | filter (is_namespace_alias) | to <vector> ()).size () == 1);
+ static_assert ((members_of (^^N2, gctx) | filter (is_concept) | to <vector> ()).size () == 1);
+ static_assert ((members_of (^^N2, gctx) | filter (is_variable) | to <vector> ()).size () == 1);
+ 
+ namespace N3 {
+   struct A {
+     union { int a; };
+   };
+ 
+   struct B {
+     static int foo (int);
+     static long foo (long);
+     static short foo (short);
+     static int foo (int, int);
+     static double foo (double, float);
+   };
+ 
+   template <typename, typename>
+   constexpr bool c = false;
+ 
+   template <typename T>
+   constexpr bool c <T, T> = true;
+ 
+   template <typename T>
+   struct C {
+     void foo () requires (c <T, int>);
+     void bar () requires (c <T, long>);
+     void baz () requires (c <T, long>);
+   };
+ }
+ 
+ static_assert (members_of (^^N3::A, gctx).size () == 8);
+ static_assert (is_union_type (members_of (^^N3::A, gctx)[0]));
+ static_assert (!has_identifier (members_of (^^N3::A, gctx)[0]));
+ static_assert (is_nonstatic_data_member (members_of (^^N3::A, gctx)[1]));
+ static_assert (!has_identifier (members_of (^^N3::A, gctx)[1]));
+ static_assert (check_special_members (members_of (^^N3::A, gctx), 6, true, true, true, true, true, true));
+ 
+ static_assert (members_of (^^N3::B, gctx).size () == 11);
+ static_assert (is_function (members_of (^^N3::B, gctx)[0]));
+ static_assert (identifier_of (members_of (^^N3::B, gctx)[0]) == "foo");
+ static_assert (type_of (members_of (^^N3::B, gctx)[0]) == ^^int (int));
+ static_assert (is_function (members_of (^^N3::B, gctx)[1]));
+ static_assert (identifier_of (members_of (^^N3::B, gctx)[1]) == "foo");
+ static_assert (type_of (members_of (^^N3::B, gctx)[1]) == ^^long (long));
+ static_assert (is_function (members_of (^^N3::B, gctx)[2]));
+ static_assert (identifier_of (members_of (^^N3::B, gctx)[2]) == "foo");
+ static_assert (type_of (members_of (^^N3::B, gctx)[2]) == ^^short (short));
+ static_assert (is_function (members_of (^^N3::B, gctx)[3]));
+ static_assert (identifier_of (members_of (^^N3::B, gctx)[3]) == "foo");
+ static_assert (type_of (members_of (^^N3::B, gctx)[3]) == ^^int (int, int));
+ static_assert (is_function (members_of (^^N3::B, gctx)[4]));
+ static_assert (identifier_of (members_of (^^N3::B, gctx)[4]) == "foo");
+ static_assert (type_of (members_of (^^N3::B, gctx)[4]) == ^^double (double, float));
+ static_assert (check_special_members (members_of (^^N3::B, gctx), 6, true, true, true, true, true, true));
+ 
+ static_assert (members_of (^^N3::C <int>, gctx).size () == 7);
+ static_assert (is_function (members_of (^^N3::C <int>, gctx)[0]));
+ static_assert (identifier_of (members_of (^^N3::C <int>, gctx)[0]) == "foo");
+ static_assert (check_special_members (members_of (^^N3::C <int>, gctx), 6, true, true, true, true, true, true));
+ static_assert (members_of (^^N3::C <long>, gctx).size () == 8);
+ static_assert (is_function (members_of (^^N3::C <long>, gctx)[0]));
+ static_assert (identifier_of (members_of (^^N3::C <long>, gctx)[0]) == "bar");
+ static_assert (is_function (members_of (^^N3::C <long>, gctx)[1]));
+ static_assert (identifier_of (members_of (^^N3::C <long>, gctx)[1]) == "baz");
+ static_assert (check_special_members (members_of (^^N3::C <long>, gctx), 6, true, true, true, true, true, true));
+ static_assert (members_of (^^N3::C <short>, gctx).size () == 6);
+ static_assert (check_special_members (members_of (^^N3::C <short>, gctx), 6, true, true, true, true, true, true));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,58 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::members_of.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ namespace N1
+ {
+   void foo (int);
+   void foo (long);
+   void foo (double);
+   void foo (long);
+   void foo (int);
+   void foo (float);
+ }
+ 
+ namespace N2
+ {
+   struct A {};
+   int A;
+   int B;
+   struct B {};
+ }
+ 
+ namespace N3
+ {
+   struct A {};
+   void A (int);
+   void A (long);
+   void B (int);
+   void B (long);
+   struct B {};
+ }
+ 
+ namespace N4
+ {
+   static union { int a; };
+ }
+ 
+ static constexpr auto ctx = access_context::current ();
+ static_assert (members_of (^^N1, ctx).size () == 4);
+ static_assert ((members_of (^^N1, ctx) | std::views::filter (is_function) | std::ranges::to <std::vector> ()).size () == 4);
+ static_assert ((members_of (^^N1, ctx) | std::views::filter (has_identifier) | std::ranges::to <std::vector> ()).size () == 4);
+ static_assert (members_of (^^N2, ctx).size () == 4);
+ static_assert ((members_of (^^N2, ctx) | std::views::filter (is_variable) | std::ranges::to <std::vector> ()).size () == 2);
+ static_assert ((members_of (^^N2, ctx) | std::views::filter (is_type) | std::ranges::to <std::vector> ()).size () == 2);
+ static_assert ((members_of (^^N2, ctx) | std::views::filter (has_identifier) | std::ranges::to <std::vector> ()).size () == 4);
+ static_assert (members_of (^^N3, ctx).size () == 6);
+ static_assert ((members_of (^^N3, ctx) | std::views::filter (is_function) | std::ranges::to <std::vector> ()).size () == 4);
+ static_assert ((members_of (^^N3, ctx) | std::views::filter (is_type) | std::ranges::to <std::vector> ()).size () == 2);
+ static_assert ((members_of (^^N3, ctx) | std::views::filter (has_identifier) | std::ranges::to <std::vector> ()).size () == 6);
+ static_assert (members_of (^^N4, ctx).size () == 2);
+ static_assert ((members_of (^^N4, ctx) | std::views::filter (is_variable) | std::ranges::to <std::vector> ()).size () == 1);
+ static_assert ((members_of (^^N4, ctx) | std::views::filter (is_type) | std::views::filter (is_union_type) | std::ranges::to <std::vector> ()).size () == 1);
+ static_assert ((members_of (^^N4, ctx) | std::views::filter (has_identifier) | std::ranges::to <std::vector> ()).size () == 0);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::members_of.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <tuple>
+ 
+ using namespace std::meta;
+ 
+ struct A {
+   int i;
+   template <int I> int &get () { return i; }
+ };
+ 
+ template <>
+ struct std::tuple_size <A>
+ {
+   static const int value = 4;
+ };
+ 
+ template <size_t I>
+ struct std::tuple_element <I, A>
+ {
+   using type = int;
+ };
+ 
+ int arr[4];
+ 
+ namespace N1
+ {
+   auto [x, y, z, w] = arr;
+ }
+ 
+ namespace N2
+ {
+   auto [x, y, z, w] = A {};
+ }
+ 
+ static constexpr auto ctx = access_context::current ();
+ static_assert (members_of (^^N1, ctx).size () == 1);
+ static_assert (is_variable (members_of (^^N1, ctx)[0]));
+ static_assert (!has_identifier (members_of (^^N1, ctx)[0]));
+ static_assert (type_of (members_of (^^N1, ctx)[0]) == ^^int [4]);
+ static_assert (!is_structured_binding (members_of (^^N1, ctx)[0]));
+ static_assert (members_of (^^N2, ctx).size () == 5);
+ static_assert ((members_of (^^N2, ctx) | std::views::filter (is_variable) | std::ranges::to <std::vector> ()).size () == 5);
+ static_assert ((members_of (^^N2, ctx) | std::views::filter (has_identifier) | std::ranges::to <std::vector> ()).size () == 4);
+ static_assert ((members_of (^^N2, ctx) | std::views::filter (is_structured_binding) | std::ranges::to <std::vector> ()).size () == 0);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::members_of.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <tuple>
+ 
+ using namespace std::meta;
+ 
+ auto l1 = [] (int x) {};
+ auto l2 = [] (auto x) {};
+ auto l3 = [] (int x) static {};
+ auto l4 = [] (auto x) static {};
+ 
+ static constexpr auto ctx = access_context::current ();
+ // FIXME these two should pass, call operator is guaranteed
+ // static_assert (std::ranges::distance (members_of (type_of (^^l1), ctx) | std::views::filter (is_operator_function)) >= 1);
+ static_assert (std::ranges::distance (members_of (type_of (^^l2), ctx) | std::views::filter (is_operator_function_template)) >= 1);
+ // static_assert (std::ranges::distance (members_of (type_of (^^l3), ctx) | std::views::filter (is_operator_function)) >= 1);
+ static_assert (std::ranges::distance (members_of (type_of (^^l4), ctx) | std::views::filter (is_operator_function_template)) >= 1);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,101 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::members_of.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template<typename F>
+ consteval bool
+ has_mem(info clazz, F f)
+ {
+   for (info x : members_of(clazz, access_context::unchecked()))
+     if (f(x))
+       return true;
+   return false;
+ }
+ 
+ consteval auto is_operator(operators op)
+ { return [op](info mem) { return is_operator_function(mem) && operator_of(mem) == op; }; }
+ 
+ struct ExplicitDef
+ {
+   ExplicitDef() = default;
+   ExplicitDef(const ExplicitDef&) = default;
+   ExplicitDef(ExplicitDef&&) = default;
+ 
+   ExplicitDef& operator=(const ExplicitDef&) = default;
+   ExplicitDef& operator=(ExplicitDef&&) = default;
+   
+   ~ExplicitDef() = default;
+ };
+ 
+ static_assert (has_mem (^^ExplicitDef, is_default_constructor));
+ static_assert (has_mem (^^ExplicitDef, is_copy_constructor));
+ static_assert (has_mem (^^ExplicitDef, is_move_constructor));
+ static_assert (has_mem (^^ExplicitDef, is_copy_assignment));
+ static_assert (has_mem (^^ExplicitDef, is_move_assignment));
+ static_assert (has_mem (^^ExplicitDef, is_destructor));
+ static_assert (!has_mem (^^ExplicitDef, is_operator(op_equals_equals)));
+ static_assert (!has_mem (^^ExplicitDef, is_operator(op_spaceship)));
+ 
+ struct NoMoveDecl
+ {
+   NoMoveDecl() = default;
+   NoMoveDecl(const NoMoveDecl&) = default;
+ 
+   NoMoveDecl& operator=(const NoMoveDecl&) = default;
+   
+   ~NoMoveDecl() = default;
+ };
+ 
+ static_assert (has_mem (^^NoMoveDecl, is_default_constructor));
+ static_assert (has_mem (^^NoMoveDecl, is_copy_constructor));
+ static_assert (!has_mem (^^NoMoveDecl, is_move_constructor));
+ static_assert (has_mem (^^NoMoveDecl, is_copy_assignment));
+ static_assert (!has_mem (^^NoMoveDecl, is_move_assignment));
+ static_assert (has_mem (^^NoMoveDecl, is_destructor));
+ static_assert (!has_mem (^^NoMoveDecl, is_operator(op_equals_equals)));
+ static_assert (!has_mem (^^NoMoveDecl, is_operator(op_spaceship)));
+ 
+ struct ImplicitDef
+ {
+ };
+ 
+ static_assert (has_mem (^^ImplicitDef, is_default_constructor));
+ static_assert (has_mem (^^ImplicitDef, is_copy_constructor));
+ static_assert (has_mem (^^ImplicitDef, is_move_constructor));
+ static_assert (has_mem (^^ImplicitDef, is_copy_assignment));
+ static_assert (has_mem (^^ImplicitDef, is_move_assignment));
+ static_assert (has_mem (^^ImplicitDef, is_destructor));
+ static_assert (!has_mem (^^ImplicitDef, is_operator(op_equals_equals)));
+ static_assert (!has_mem (^^ImplicitDef, is_operator(op_spaceship)));
+ 
+ struct ExplicitRelOps
+ {
+   bool operator==(const ExplicitRelOps&) const = default;
+   auto operator<=>(const ExplicitRelOps&) const = default;
+ };
+ ExplicitRelOps a,b;
+ static_assert (has_mem (^^ExplicitRelOps, is_operator(op_equals_equals)));
+ // FIXME, below check fails without this use
+ auto r = a <=> b;
+ static_assert (has_mem (^^ExplicitRelOps, is_operator(op_spaceship)));
+ 
+ struct NoEqualDecl
+ {
+   auto operator<=>(const NoEqualDecl&) const
+   { return std::strong_ordering::equal; }
+ };
+ static_assert (!has_mem (^^NoEqualDecl, is_operator(op_equals_equals)));
+ static_assert (has_mem (^^NoEqualDecl, is_operator(op_spaceship)));
+ 
+ struct ImplicitRelOps
+ {
+   // operator== is implicitly declared
+   auto operator<=>(const ImplicitRelOps&) const = default;
+ };
+ static_assert (has_mem (^^ImplicitRelOps, is_operator(op_equals_equals)));
+ static_assert (has_mem (^^ImplicitRelOps, is_operator(op_spaceship)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,34 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::members_of.
+ 
+ #include <compare>
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ struct S
+ {
+   auto operator <=> (const S &) const = default;
+ };
+ 
+ struct T
+ {
+   auto operator <=> (this T, T) = default;
+   auto operator <=> (this const T &, const T &) = default;
+ };
+ 
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ static_assert (members_of (^^S, uctx).size () == 8);
+ static_assert (operator_of (members_of (^^T, uctx)[0]) == op_spaceship);
+ static_assert ((members_of (^^S, uctx) | std::views::drop (1) | std::views::filter (is_special_member_function) | std::views::filter (is_defaulted) | std::ranges::to <std::vector> ()).size () == 6);
+ static_assert ((members_of (^^S, uctx) | std::views::drop (1) | std::views::filter (is_operator_function) | std::views::filter (is_defaulted) | std::ranges::to <std::vector> ()).size () == 3);
+ // TODO: Shouldn't the above have 2 implicitly-declared equality
+ // operators?
+ static_assert (members_of (^^T, uctx).size () == 9);
+ static_assert (operator_of (members_of (^^T, uctx)[0]) == op_spaceship);
+ static_assert (operator_of (members_of (^^T, uctx)[1]) == op_spaceship);
+ static_assert ((members_of (^^T, uctx) | std::views::drop (2) | std::views::filter (is_special_member_function) | std::views::filter (is_defaulted) | std::ranges::to <std::vector> ()).size () == 6);
+ static_assert ((members_of (^^T, uctx) | std::views::drop (2) | std::views::filter (is_operator_function) | std::views::filter (is_defaulted) | std::ranges::to <std::vector> ()).size () == 3);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/members_of7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/members_of7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,32 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::members_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ namespace N
+ {
+ }
+ 
+ consteval std::size_t
+ foo ()
+ {
+   return members_of (^^N, uctx).size ();
+ }
+ 
+ namespace N
+ {
+   static_assert (foo () == 0);
+   int a;
+   static_assert (foo () == 1);
+   void bar (int);
+   static_assert (foo () == 2);
+   void baz (long);
+   static_assert (foo () == 3);
+   void baz (short, float);
+   static_assert (foo () == 4);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/metafn-ptr1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/metafn-ptr1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/metafn-ptr1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/metafn-ptr1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Try to invoke a metafunction through a function pointer.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval size_t
+ invoke (size_t (*fp)(info))
+ {
+   return fp (^^int);
+ }
+ 
+ void
+ g ()
+ {
+   static_assert (invoke (size_of) == sizeof (int));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,37 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on namespaces.
+ 
+ constexpr auto glob = ^^::;
+ 
+ namespace Q { }
+ constexpr auto q = ^^Q;
+ namespace Q { }
+ static_assert (q == ^^Q);
+ 
+ namespace A { namespace B { using C = int; } }
+ constexpr auto r = ^^A::B::C &;
+ 
+ namespace N {
+   using T = int;
+   namespace M {
+     using TT = int;
+   }
+ }
+ 
+ void
+ f1 ()
+ {
+   constexpr auto n = ^^N;
+   [: n :]::T i = 42;
+   typename [: n :]::T it = 42;
+ 
+   constexpr auto t = ^^N::T;
+   typename [: t :] j = 42;
+ 
+   constexpr auto m = ^^N::M;
+   [: m :]::TT k = 42;
+   typename [: m :]::TT kt = 42;
+ 
+   constexpr auto m2 = ^^t;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on namespaces.  Invalid stuff.
+ 
+ void foo (int);
+ 
+ namespace N {
+ }
+ 
+ void
+ f1 ()
+ {
+   constexpr auto r = ^^::;
+   [: r :] foo (0); // { dg-error "expected" }
+ 
+   constexpr auto q = ^^int;
+   [: q :]::T x; // { dg-error "reflection not usable in a splice scope|expected" }
+   // { dg-message ".int. is not a class, namespace, or enumeration" "" { target *-*-* } .-1 }
+ 
+   constexpr auto x = ^^N::X;  // { dg-error ".N::X. has not been declared" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test dependent namespaces.
+ 
+ using info = decltype(^^int);
+ 
+ template <info R> int fn() {
+   return [:R:]::v;
+ }
+ 
+ namespace NS {
+   int v = 1;
+ }
+ 
+ int a = fn<^^NS>();
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,94 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test dependent namespaces in typenames.
+ 
+ using info = decltype(^^void);
+ 
+ namespace N {
+   struct A { int i; using Q = int; };
+   template<typename T>
+   struct B { T t; };
+   static int glob;
+   using U = int;
+   int foo (int i) { return i; }
+   template<typename T>
+   T baz (T t) { return t; }
+   template<typename T>
+   constexpr T pi = 3.14;
+ 
+   namespace M {
+     struct C { int i; };
+     template<typename T>
+     struct D { T t; };
+     int mglob;
+     using V = int;
+     void bar () { }
+     template<typename T>
+     T qux (T t) { return t; }
+     template<typename T>
+     constexpr T pi2 = 3.14;
+   }
+ }
+ 
+ template<info R>
+ void
+ f ()
+ {
+   typename [:R:]::A a{1};
+   typename[:R:]::template B<int> b{1};
+   typename [:R:]::A::Q i1;
+   typename [:R:]::U u;
+   [:R:]::M::bar ();
+   [:R:]::M::mglob++;
+   typename [:R:]::M::V i2;
+   typename [:R:]::M::C c{1};
+   typename [:R:]::M::template D<int> d{1};
+ 
+   // Not a TYPENAME_TYPE, but let's test it.
+   [:R:]::template baz<int>(42);
+   double d1 = [:R:]::template pi<double>;
+   int i3 = [:R:]::foo (42);
+   [:R:]::glob++;
+   [:R:]::M::template qux<int>(42);
+   double d2 = [:R:]::M::template pi2<double>;
+ }
+ 
+ template<info R>
+ void
+ g ()
+ {
+   typename [:R:]::C c{1};
+   typename [:R:]::template D<int> d{1};
+   [:R:]::mglob++;
+   typename [:R:]::V v;
+   [:R:]::bar ();
+   [:R:]::template qux<int>(42);
+   double d2 = [:R:]::template pi2<double>;
+ }
+ 
+ template<info R>
+ void
+ bad ()
+ {
+   typename [:R:]::NOTHERE x; // { dg-error ".NOTHERE. is not a member of .N." }
+   typename [:R:]::M::NOTHERE y;  // { dg-error ".NOTHERE. is not a member of .N::M." }
+ }
+ 
+ template<info R>
+ struct E {
+   typename [:R:]::A a;
+   typename[:R:]::template B<int> b;
+   typename [:R:]::U u;
+   typename [:R:]::M::V v;
+   typename [:R:]::M::C c{1};
+   typename [:R:]::M::template D<int> d{1};
+ };
+ 
+ void
+ doit ()
+ {
+   f<^^N>();
+   bad<^^N>();
+   E<^^N> e;
+   g<^^N::M>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,45 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ template<typename>
+ void foo () { }
+ void bar () { }
+ namespace N { }
+ namespace M = N;
+ template<typename T>
+ T vt{};
+ template<typename T>
+ concept C = true;
+ static int i;
+ enum E { X };
+ struct S { static int si; };
+ template<typename T>
+ struct D { static T di; };
+ template<typename T>
+ using Z = D<T>;
+ 
+ template<info R> void fn1 () { typename [:R:]::X x; }	// { dg-error "not usable in a splice scope" }
+ template<info R> void fn2 () { typename [:R:]::X x; }   // { dg-error "not usable in a splice scope" }
+ template<info R> void fn3 () { typename [:R:]::X x; }   // { dg-error "not usable in a splice scope" }
+ template<info R> void fn4 () { typename [:R:]::X x; }   // { dg-error "not usable in a splice scope" }
+ template<info R> void fn5 () { typename [:R:]::X x; }   // { dg-error "not usable in a splice scope" }
+ template<info R> void fn6 () { typename [:R:]::X x; }   // { dg-error "not usable in a splice scope" }
+ template<info R> void fn7 () { typename [:R:]::X x; }   // { dg-error "not usable in a splice scope" }
+ template<info R> void fn8 () { typename [:R:]::X x; }   // { dg-error "not usable in a splice scope" }
+ template<info R> void fn9 () { typename [:R:]::X x; }   // { dg-error "not usable in a splice scope" }
+ template<info R> void fn10 () { typename [:R:]::X x; }  // { dg-error "not usable in a splice scope" }
+ template<info R> void fn11 () { typename [:R:]::X x; }  // { dg-error "not usable in a splice scope" }
+ 
+ template void fn1<^^foo<int>>(); // { dg-message "required from here" }
+ template void fn2<^^foo>();	 // { dg-message "required from here" }
+ template void fn3<^^bar>();	 // { dg-message "required from here" }
+ template void fn4<^^vt<int>>();  // { dg-message "required from here" }
+ template void fn5<^^vt>();	 // { dg-message "required from here" }
+ template void fn6<^^C>();	 // { dg-message "required from here" }
+ template void fn7<^^i>();	 // { dg-message "required from here" }
+ template void fn8<^^X>();	 // { dg-message "required from here" }
+ template void fn9<^^S::si>();	 // { dg-message "required from here" }
+ template void fn10<^^D<int>::di>(); // { dg-message "required from here" }
+ template void fn11<^^Z>();	 // { dg-message "required from here" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/ns6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/ns6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ namespace N { void foo (); }
+ 
+ // P2996 doesn't allow this.
+ namespace [:^^N:] { } // { dg-error "expected" }
+ 
+ // But this is fine.
+ namespace A = [:^^N:];
+ using namespace [:^^A:];
+ 
+ void
+ g ()
+ {
+   foo ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test null reflection.
+ 
+ #include <meta>
+ 
+ struct S {};
+ 
+ static_assert(std::meta::info() == std::meta::info());
+ static_assert(std::meta::info{} == std::meta::info{});
+ static_assert(std::meta::info() != ^^S);
+ static_assert(std::meta::info{} != ^^S);
+ 
+ constexpr std::meta::info g;
+ constexpr std::meta::info g2{};
+ static_assert(g == std::meta::info());
+ static_assert(g == g2);
+ constexpr std::meta::info *g3{};
+ constexpr std::meta::info *g4{};
+ 
+ consteval void
+ f ()
+ {
+   std::meta::info m;
+   std::meta::info m2{};
+   static std::meta::info m3;
+   static std::meta::info m4{};
+   static constexpr std::meta::info m5;
+   static constexpr std::meta::info m6{};
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,7 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Here, x is a null reflection so should be allowed to compare equal
+ // to itself.  meta::info should be const-default-constructible.
+ 
+ constexpr decltype(^^::) x;
+ static_assert(x == x);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,9 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test null reflection.
+ 
+ using info = decltype(^^int);
+ consteval info foo () { return {}; }
+ static_assert (foo () == info ());
+ consteval auto bar () { return info{}; }
+ static_assert (bar () == info ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test null reflection.
+ 
+ using info = decltype(^^int);
+ 
+ struct S {
+   info i = {};
+ };
+ 
+ static_assert (S{}.i == info ());
+ 
+ struct Q {
+   info i;
+   consteval Q() : i{} {}
+ };
+ 
+ static_assert (Q{}.i == info ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/null5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/null5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,26 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test null reflection.
+ 
+ using info = decltype(^^int);
+ 
+ inline constexpr info Ag {};
+ 
+ consteval info return_null() {
+     return info{};
+ }
+ 
+ template <typename>
+ struct S {
+     static constexpr info Bt {^^::};
+     static constexpr info Ct {};
+     static constexpr info Dt = return_null();
+ };
+ 
+ template struct S<int>;
+ 
+ int main() {
+     template for (auto _ : {0}) {
+         constexpr info A {};
+     }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/object_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/object_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/object_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/object_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,85 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::object_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int x;
+ int& y = x;
+ 
+ static_assert (^^x != ^^y);
+ static_assert (object_of (^^x) == object_of (^^y));
+ static_assert (is_object (object_of (^^x)));
+ static_assert (is_object (object_of (^^y)));
+ 
+ constexpr int i = 1;
+ static_assert (object_of (^^i) == reflect_object (i));
+ static_assert (is_object (object_of (^^i)));
+ 
+ constexpr const int *p = &i;
+ constexpr auto ro = object_of (^^p);
+ static_assert (^^p != ro);
+ static_assert (!is_variable (ro));
+ static_assert (is_object (ro));
+ static_assert (!is_value (ro));
+ static_assert (ro == reflect_object (p));
+ static_assert (ro != reflect_constant (&i));
+ 
+ void
+ g ()
+ {
+   constexpr int &r = x;
+   constexpr auto r1 = object_of (^^r);
+   static_assert (is_object (object_of (^^r)));
+   static int sl = 42;
+   constexpr auto r2 = object_of (^^sl);
+   static_assert (is_object (object_of (^^sl)));
+ }
+ 
+ const int &rc = 42;
+ // Here, object_of yields _ZGR2rc_.
+ static_assert (object_of (^^rc) != reflect_constant (42));
+ static_assert (!is_variable (object_of (^^rc)));
+ static_assert (is_object (object_of (^^rc)));
+ static_assert (!is_value (object_of (^^rc)));
+ 
+ struct A { const int ci = 0; int nci; };
+ struct B : A { mutable int i; };
+ 
+ B arr[2];
+ static_assert (object_of (^^arr) != ^^arr);
+ static_assert (is_object (object_of (^^arr)));
+ static_assert (reflect_object (arr) == object_of (^^arr));
+ static_assert (reflect_object (arr[0]) != object_of (^^arr));
+ static_assert (type_of (object_of (^^arr)) == ^^B[2]);
+ 
+ const A &r = arr[1];
+ static_assert (object_of (^^r) != ^^r);
+ static_assert (is_object (object_of (^^r)));
+ static_assert (reflect_object (arr[1]) != object_of (^^r));
+ // TODO Fails because the array index has types long int x int.
+ //static_assert (reflect_object (static_cast<A&>(arr[1])) == object_of (^^r));
+ static_assert (type_of (^^r) == ^^const A&);
+ static_assert (type_of (object_of (^^r)) == ^^A);
+ 
+ struct S { int i; } s;
+ static_assert (object_of (^^s) != ^^s);
+ static_assert (is_object (object_of (^^s)));
+ static_assert (reflect_object (s) == object_of (^^s));
+ static_assert (type_of (object_of (^^s)) == ^^S);
+ 
+ template<int, int&, S>
+ struct X { };
+ constexpr auto T = ^^X<1, x, S{}>;
+ constexpr auto o1 = object_of (template_arguments_of (T)[1]);
+ constexpr auto o2 = object_of (template_arguments_of (T)[2]);
+ static_assert (is_object (o1));
+ static_assert (is_object (o2));
+ static_assert (o1 == template_arguments_of (T)[1]);
+ static_assert (o2 == template_arguments_of (T)[2]);
+ static_assert (o1 == reflect_object (x));
+ static_assert (type_of (o1) == ^^int);
+ // ??? May not be true.
+ static_assert (type_of (o2) == ^^const S);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/object_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/object_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/object_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/object_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,26 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::object_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void fn ();
+ constexpr auto r1 = object_of (reflect_constant (3)); // { dg-error "uncaught exception" }
+ constexpr auto r2 = object_of (^^fn); // { dg-error "uncaught exception" }
+ 
+ static int G;
+ 
+ void
+ f (int p)
+ {
+   int i = 42;
+   constexpr auto r3 = object_of (^^p); // { dg-error "uncaught exception" }
+   constexpr auto r4 = object_of (^^i); // { dg-error "uncaught exception" }
+ }
+ 
+ template<int>
+ struct X { };
+ constexpr auto T = ^^X<1>;
+ constexpr auto o = object_of (template_arguments_of (T)[0]); // { dg-error "uncaught exception" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/odr1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/odr1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/odr1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/odr1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,29 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ template<info val>
+ void
+ f ()
+ {
+   [:val:];	  // { dg-error "use of local variable with automatic storage from containing function" }
+   [:val:] = {};	  // { dg-error "use of local variable with automatic storage from containing function" }
+   /* This is ill-formed because:
+      - the splice-expression designates b,
+      - the splice-expression names b ([basic.def.odr]/5),
+      - the splice-expression odr-uses b ([basic.def.odr]/5),
+      - however, the local entity b is not odr-usable from the scope inhabited
+        by the splice-expression ([basic.def.odr]/10.2).  Since the local
+        entity b is odr-used within a scope where b is not odr-usable,
+        the program is ill-formed (also [basic.def.odr]/10).  */
+   [:val:] z;  // { dg-error "use of local variable with automatic storage from containing function|expected" }
+   float a = [:val:]; // { dg-error "use of local variable with automatic storage from containing function" }
+ }
+ 
+ void
+ g ()
+ {
+   float b = 2.5f;
+   f<^^b>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/offset_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/offset_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/offset_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/offset_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,132 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::offset_of.
+ 
+ #include <meta>
+ #include <cstddef>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+ };
+ struct U {
+   int u;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ consteval bool
+ has_offset_of (info r)
+ {
+   try { offset_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!has_offset_of (std::meta::reflect_constant (42)));
+ static_assert (!has_offset_of (std::meta::reflect_object (arr[1])));
+ static_assert (!has_offset_of (^^arr));
+ static_assert (!has_offset_of (^^a3));
+ static_assert (!has_offset_of (^^fn));
+ static_assert (!has_offset_of (^^fn2));
+ static_assert (!has_offset_of (^^Enum::A));
+ static_assert (!has_offset_of (^^Alias));
+ static_assert (!has_offset_of (^^S));
+ static_assert (has_offset_of (^^S::mem));
+ static_assert (has_offset_of (std::meta::members_of (^^S, ctx)[1]));
+ static_assert (!has_offset_of (^^TCls));
+ static_assert (!has_offset_of (^^TFn));
+ static_assert (!has_offset_of (^^TVar));
+ static_assert (!has_offset_of (^^Concept));
+ static_assert (!has_offset_of (^^NSAlias));
+ static_assert (!has_offset_of (^^NS));
+ static_assert (has_offset_of (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (!has_offset_of (std::meta::data_member_spec (^^int, { .name = "member" })));
+ void bar (long, const T f, int g[2], T &);
+ 
+ int
+ foo (int a, const long b, T c, int d[4], T &e)
+ {
+   static_assert (!has_offset_of (^^a));
+   static_assert (!has_offset_of (^^b));
+   static_assert (!has_offset_of (^^c));
+   static_assert (!has_offset_of (^^d));
+   static_assert (!has_offset_of (^^e));
+   static_assert (!has_offset_of (parameters_of (^^foo)[0]));
+   static_assert (!has_offset_of (parameters_of (^^bar)[0]));
+   return 0;
+ }
+ 
+ struct V
+ {
+   char a;
+   short b;
+   char c;
+   int d;
+   char e;
+   long long f;
+   int : 2;
+   int g : 3;
+   union {
+     int h;
+     long i;
+   };
+ };
+ 
+ union W
+ {
+   int a;
+   double b;
+ };
+ 
+ static_assert (offset_of (^^V::a).bytes == offsetof (V, a));
+ static_assert (offset_of (^^V::a).bits == 0);
+ static_assert (offset_of (^^V::b).bytes == offsetof (V, b));
+ static_assert (offset_of (^^V::b).bits == 0);
+ static_assert (offset_of (^^V::c).bytes == offsetof (V, c));
+ static_assert (offset_of (^^V::c).bits == 0);
+ static_assert (offset_of (^^V::d).bytes == offsetof (V, d));
+ static_assert (offset_of (^^V::d).bits == 0);
+ static_assert (offset_of (^^V::e).bytes == offsetof (V, e));
+ static_assert (offset_of (^^V::e).bits == 0);
+ static_assert (offset_of (^^V::f).bytes == offsetof (V, f));
+ static_assert (offset_of (^^V::f).bits == 0);
+ static_assert (offset_of (^^V::g).bytes == offsetof (V, f) + sizeof (long long));
+ static_assert (offset_of (^^V::g).bits == 2);
+ static_assert (offset_of (^^V::h).bytes == 0);
+ static_assert (offset_of (^^V::h).bits == 0);
+ static_assert (offset_of (^^V::i).bytes == 0);
+ static_assert (offset_of (^^V::i).bits == 0);
+ static_assert (offset_of (^^W::a).bytes == 0);
+ static_assert (offset_of (^^W::a).bits == 0);
+ static_assert (offset_of (^^W::b).bytes == 0);
+ static_assert (offset_of (^^W::b).bits == 0);
+ static_assert (offset_of (^^V::f) < offset_of (^^V::g));
+ static_assert (offset_of (^^V::f) > offset_of (^^V::e));
+ static_assert (offset_of (^^V::g) == offset_of (^^V::g));
+ static_assert (offset_of (^^V::e).total_bits () == offsetof (V, e) * __CHAR_BIT__);
+ static_assert (offset_of (^^V::g).total_bits () == (offsetof (V, f) + sizeof (long long)) * __CHAR_BIT__ + 2);
+ using mo = decltype (offset_of (^^V::g));
+ static_assert (dealias (^^mo) == ^^std::meta::member_offset);
+ constexpr std::meta::member_offset mov = { .bytes = 1, .bits = 2 };
+ static_assert (mov.total_bits () == __CHAR_BIT__ + 2);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/operator_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/operator_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/operator_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/operator_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,354 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::operator_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ consteval bool
+ is_operator (info r)
+ {
+   try { operator_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!is_operator (null_reflection));
+ static_assert (!is_operator (^^::));
+ static_assert (!is_operator (^^ns));
+ static_assert (!is_operator (^^ns_alias));
+ static_assert (!is_operator (reflect_constant (3)));
+ static_assert (!is_operator (^^cls));
+ static_assert (!is_operator (^^cls::dm));
+ static_assert (!is_operator (^^cls::ref_dm));
+ static_assert (!is_operator (^^cls::static_dm));
+ static_assert (!is_operator (^^cls::mem_fun));
+ static_assert (!is_operator (^^cls::static_mem_fun));
+ static_assert (!is_operator (^^cls::type));
+ static_assert (!is_operator (^^cls_var));
+ static_assert (!is_operator (^^onion));
+ static_assert (!is_operator (^^anon));
+ static_assert (!is_operator (^^fun));
+ static_assert (!is_operator (^^alias));
+ static_assert (!is_operator (^^var));
+ static_assert (!is_operator (^^ref));
+ static_assert (!is_operator (^^rref));
+ static_assert (!is_operator (^^ptr));
+ static_assert (!is_operator (^^cls_tmpl));
+ static_assert (!is_operator (^^cls_tmpl<int>));
+ static_assert (!is_operator (^^incomplete_cls<int>));
+ static_assert (!is_operator (^^fun_tmpl));
+ static_assert (!is_operator (^^fun_tmpl<int>));
+ static_assert (!is_operator (^^conc));
+ static_assert (!is_operator (substitute (^^conc, { ^^int })));
+ static_assert (!is_operator (^^var_tmpl));
+ static_assert (!is_operator (^^var_tmpl<int>));
+ static_assert (!is_operator (^^cls_tmpl_alias));
+ static_assert (!is_operator (^^cls_tmpl_alias<int>));
+ static_assert (!is_operator (^^Enum));
+ static_assert (!is_operator (^^Enum::A));
+ static_assert (!is_operator (^^Enum_class));
+ static_assert (!is_operator (^^Enum_class::A));
+ static_assert (!is_operator (^^decomp));
+ static_assert (!is_operator (^^decomp_ref));
+ static_assert (!is_operator (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!is_operator (dms));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!is_operator (bases_of (^^Derived, access_context::current ())[0]));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!is_operator (^^T));
+   static_assert (!is_operator (R));
+   static_assert (!is_operator (R2));
+   static_assert (!is_operator (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (!is_operator (^^p));
+   static_assert (!is_operator (^^c));
+ }
+ 
+ struct S
+ {
+   using size_t = decltype (sizeof 0);
+   void *operator new (size_t, void *);
+   void *operator new[] (size_t, void *);
+   void operator delete (void *);
+   void operator delete[] (void *);
+   S &operator () (const S &);
+   S &operator [] (const S &);
+   S &operator = (const S &);
+   S &operator << (int);
+   S &operator >> (int);
+   S &operator ++ ();
+   S &operator -- ();
+   S &operator ~ ();
+   S &operator ! ();
+   S &operator + (const S &);
+   S &operator - (const S &);
+   S &operator * (const S &);
+   S &operator / (const S &);
+   S &operator % (const S &);
+   S &operator ^ (const S &);
+   S &operator & (const S &);
+   S &operator | (const S &);
+   S &operator += (const S &);
+   S &operator -= (const S &);
+   S &operator *= (const S &);
+   S &operator /= (const S &);
+   S &operator %= (const S &);
+   S &operator ^= (const S &);
+   S &operator &= (const S &);
+   S &operator |= (const S &);
+   S &operator <<= (int);
+   S &operator >>= (int);
+   bool operator == (const S &);
+   bool operator != (const S &);
+   bool operator < (const S &);
+   bool operator > (const S &);
+   bool operator <= (const S &);
+   bool operator >= (const S &);
+   int operator <=> (const S &);
+   bool operator && (const S &);
+   bool operator || (const S &);
+   S &operator , (const S &);
+   S *operator -> ();
+   S &operator ->* (const S &);
+   S &operator co_await ();
+ };
+ 
+ struct T
+ {
+   T &operator ++ (int);
+   T &operator -- (int);	
+   T &operator + ();
+   T &operator - ();
+ };
+ 
+ struct U
+ {
+   U &operator compl ();
+   U &operator not ();
+   U &operator xor (const U &);
+   U &operator bitand (const U &);
+   U &operator bitor (const U &);
+   U &operator xor_eq (const U &);
+   U &operator and_eq (const U &);
+   U &operator or_eq (const U &);
+   bool operator and (const U &);
+   bool operator or (const U &);
+ 
+   template <typename... Args>
+   S &operator () (const Args&...);
+   template <typename... Args>
+   S &operator [] (const Args&...);
+ };
+ 
+ struct W
+ {
+   using size_t = decltype (sizeof 0);
+   template <int> void *operator new (size_t, void *);
+   template <int> void *operator new[] (size_t, void *);
+   template <int> void operator delete (void *, W);
+   template <int> void operator delete[] (void *, W);
+   template <int> W &operator () (const W &);
+   template <int> W &operator [] (const W &);
+   template <int> W &operator = (const W &);
+   template <int> W &operator << (int);
+   template <int> W &operator >> (int);
+   template <int> W &operator ++ ();
+   template <int> W &operator -- ();
+   template <int> W &operator ~ ();
+   template <int> W &operator ! ();
+   template <int> W &operator + (const W &);
+   template <int> W &operator - (const W &);
+   template <int> W &operator * (const W &);
+   template <int> W &operator / (const W &);
+   template <int> W &operator % (const W &);
+   template <int> W &operator ^ (const W &);
+   template <int> W &operator & (const W &);
+   template <int> W &operator | (const W &);
+   template <int> W &operator += (const W &);
+   template <int> W &operator -= (const W &);
+   template <int> W &operator *= (const W &);
+   template <int> W &operator /= (const W &);
+   template <int> W &operator %= (const W &);
+   template <int> W &operator ^= (const W &);
+   template <int> W &operator &= (const W &);
+   template <int> W &operator |= (const W &);
+   template <int> W &operator <<= (int);
+   template <int> W &operator >>= (int);
+   template <int> bool operator == (const W &);
+   template <int> bool operator != (const W &);
+   template <int> bool operator < (const W &);
+   template <int> bool operator > (const W &);
+   template <int> bool operator <= (const W &);
+   template <int> bool operator >= (const W &);
+   template <int> int operator <=> (const W &);
+   template <int> bool operator && (const W &);
+   template <int> bool operator || (const W &);
+   template <int> W &operator , (const W &);
+   template <int> W *operator -> ();
+   template <int> W &operator ->* (const W &);
+   template <int> W &operator co_await ();
+ };
+ 
+ struct X
+ {
+   template <int> X &operator ++ (int);
+   template <int> X &operator -- (int);	
+   template <int> X &operator + ();
+   template <int> X &operator - ();
+ };
+ 
+ static_assert (operator_of (^^S::operator new) == op_new);
+ static_assert (operator_of (^^S::operator delete) == std::meta::op_delete);
+ static_assert (operator_of (^^S::operator new[]) == std::meta::operators::op_array_new);
+ static_assert (operator_of (^^S::operator delete[]) == op_array_delete);
+ static_assert (operator_of (^^S::operator co_await) == op_co_await);
+ static_assert (operator_of (^^S::operator ()) == op_parentheses);
+ static_assert (operator_of (^^S::operator []) == op_square_brackets);
+ static_assert (operator_of (^^S::operator ->) == op_arrow);
+ static_assert (operator_of (^^S::operator ->*) == op_arrow_star);
+ static_assert (operator_of (^^S::operator ~) == op_tilde);
+ static_assert (operator_of (^^S::operator !) == op_exclamation);
+ static_assert (operator_of (^^S::operator +) == op_plus);
+ static_assert (operator_of (^^S::operator -) == op_minus);
+ static_assert (operator_of (^^S::operator *) == op_star);
+ static_assert (operator_of (^^S::operator /) == op_slash);
+ static_assert (operator_of (^^S::operator %) == op_percent);
+ static_assert (operator_of (^^S::operator ^) == op_caret);
+ static_assert (operator_of (^^S::operator &) == op_ampersand);
+ static_assert (operator_of (^^S::operator =) == op_equals);
+ static_assert (operator_of (^^S::operator |) == op_pipe);
+ static_assert (operator_of (^^S::operator +=) == op_plus_equals);
+ static_assert (operator_of (^^S::operator -=) == op_minus_equals);
+ static_assert (operator_of (^^S::operator *=) == op_star_equals);
+ static_assert (operator_of (^^S::operator /=) == op_slash_equals);
+ static_assert (operator_of (^^S::operator %=) == op_percent_equals);
+ static_assert (operator_of (^^S::operator ^=) == op_caret_equals);
+ static_assert (operator_of (^^S::operator &=) == op_ampersand_equals);
+ static_assert (operator_of (^^S::operator |=) == op_pipe_equals);
+ static_assert (operator_of (^^S::operator ==) == op_equals_equals);
+ static_assert (operator_of (^^S::operator !=) == op_exclamation_equals);
+ static_assert (operator_of (^^S::operator <) == op_less);
+ static_assert (operator_of (^^S::operator >) == op_greater);
+ static_assert (operator_of (^^S::operator <=) == op_less_equals);
+ static_assert (operator_of (^^S::operator >=) == op_greater_equals);
+ static_assert (operator_of (^^S::operator <=>) == op_spaceship);
+ static_assert (operator_of (^^S::operator &&) == op_ampersand_ampersand);
+ static_assert (operator_of (^^S::operator ||) == op_pipe_pipe);
+ static_assert (operator_of (^^S::operator <<) == op_less_less);
+ static_assert (operator_of (^^S::operator >>) == op_greater_greater);
+ static_assert (operator_of (^^S::operator <<=) == op_less_less_equals);
+ static_assert (operator_of (^^S::operator >>=) == op_greater_greater_equals);
+ static_assert (operator_of (^^S::operator ++) == op_plus_plus);
+ static_assert (operator_of (^^S::operator --) == op_minus_minus);
+ static_assert (operator_of (^^S::operator ,) == op_comma);
+ static_assert (operator_of (^^T::operator +) == op_plus);
+ static_assert (operator_of (^^T::operator -) == op_minus);
+ static_assert (operator_of (^^T::operator ++) == op_plus_plus);
+ static_assert (operator_of (^^T::operator --) == op_minus_minus);
+ static_assert (operator_of (^^U::operator compl) == op_tilde);
+ static_assert (operator_of (^^U::operator not) == op_exclamation);
+ static_assert (operator_of (^^U::operator bitand) == op_ampersand);
+ static_assert (operator_of (^^U::operator bitor) == op_pipe);
+ static_assert (operator_of (^^U::operator xor_eq) == op_caret_equals);
+ static_assert (operator_of (^^U::operator and_eq) == op_ampersand_equals);
+ static_assert (operator_of (^^U::operator or_eq) == op_pipe_equals);
+ static_assert (operator_of (^^U::operator and) == op_ampersand_ampersand);
+ static_assert (operator_of (^^U::operator or) == op_pipe_pipe);
+ static_assert (operator_of (^^U::operator ()) == op_parentheses);
+ static_assert (operator_of (^^U::operator []) == op_square_brackets);
+ static_assert (operator_of (^^W::operator new) == op_new);
+ static_assert (operator_of (^^W::operator delete) == std::meta::op_delete);
+ static_assert (operator_of (^^W::operator new[]) == std::meta::operators::op_array_new);
+ static_assert (operator_of (^^W::operator delete[]) == op_array_delete);
+ static_assert (operator_of (^^W::operator co_await) == op_co_await);
+ static_assert (operator_of (^^W::operator ()) == op_parentheses);
+ static_assert (operator_of (^^W::operator []) == op_square_brackets);
+ static_assert (operator_of (^^W::operator ->) == op_arrow);
+ static_assert (operator_of (^^W::operator ->*) == op_arrow_star);
+ static_assert (operator_of (^^W::operator ~) == op_tilde);
+ static_assert (operator_of (^^W::operator !) == op_exclamation);
+ static_assert (operator_of (^^W::operator +) == op_plus);
+ static_assert (operator_of (^^W::operator -) == op_minus);
+ static_assert (operator_of (^^W::operator *) == op_star);
+ static_assert (operator_of (^^W::operator /) == op_slash);
+ static_assert (operator_of (^^W::operator %) == op_percent);
+ static_assert (operator_of (^^W::operator ^) == op_caret);
+ static_assert (operator_of (^^W::operator &) == op_ampersand);
+ static_assert (operator_of (template_of (^^W::operator = <0>)) == op_equals);
+ static_assert (operator_of (^^W::operator |) == op_pipe);
+ static_assert (operator_of (^^W::operator +=) == op_plus_equals);
+ static_assert (operator_of (^^W::operator -=) == op_minus_equals);
+ static_assert (operator_of (^^W::operator *=) == op_star_equals);
+ static_assert (operator_of (^^W::operator /=) == op_slash_equals);
+ static_assert (operator_of (^^W::operator %=) == op_percent_equals);
+ static_assert (operator_of (^^W::operator ^=) == op_caret_equals);
+ static_assert (operator_of (^^W::operator &=) == op_ampersand_equals);
+ static_assert (operator_of (^^W::operator |=) == op_pipe_equals);
+ static_assert (operator_of (^^W::operator ==) == op_equals_equals);
+ static_assert (operator_of (^^W::operator !=) == op_exclamation_equals);
+ static_assert (operator_of (^^W::operator <) == op_less);
+ static_assert (operator_of (^^W::operator >) == op_greater);
+ static_assert (operator_of (^^W::operator <=) == op_less_equals);
+ static_assert (operator_of (^^W::operator >=) == op_greater_equals);
+ static_assert (operator_of (^^W::operator <=>) == op_spaceship);
+ static_assert (operator_of (^^W::operator &&) == op_ampersand_ampersand);
+ static_assert (operator_of (^^W::operator ||) == op_pipe_pipe);
+ static_assert (operator_of (^^W::operator <<) == op_less_less);
+ static_assert (operator_of (^^W::operator >>) == op_greater_greater);
+ static_assert (operator_of (^^W::operator <<=) == op_less_less_equals);
+ static_assert (operator_of (^^W::operator >>=) == op_greater_greater_equals);
+ static_assert (operator_of (^^W::operator ++) == op_plus_plus);
+ static_assert (operator_of (^^W::operator --) == op_minus_minus);
+ static_assert (operator_of (^^W::operator ,) == op_comma);
+ static_assert (operator_of (^^X::operator +) == op_plus);
+ static_assert (operator_of (^^X::operator -) == op_minus);
+ static_assert (operator_of (^^X::operator ++) == op_plus_plus);
+ static_assert (operator_of (^^X::operator --) == op_minus_minus);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/override1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/override1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/override1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/override1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,39 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // CWG 3117 - Overriding by a consteval virtual function
+ 
+ using info = decltype(^^::);
+ 
+ struct B {
+   virtual void foo();
+ };
+ 
+ struct D1 : B {
+   consteval virtual void foo() override { } // { dg-error "overriding" }
+ };
+ 
+ struct D2 : B {
+   info i;
+   consteval virtual void foo() override { }
+ };
+ 
+ struct D3 : B {
+   virtual void foo() override { }
+ };
+ 
+ struct B2 {
+   consteval virtual void foo() { }
+ };
+ 
+ struct D4 : B2 {
+   consteval virtual void foo() override { }
+ };
+ 
+ struct D5 : B2 {
+   virtual void foo() override { } // { dg-error "overriding" }
+ };
+ 
+ struct D6 : B2 {
+   info i;
+   virtual void foo() override { } // { dg-error "consteval-only type|overriding" }
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from the P2996 paper.
+ 
+ #include <meta>
+ 
+ static_assert(std::meta::is_type(^^int()));  // ^^ applies to the type-id "int()"
+ 
+ template<bool> struct X {};
+ consteval bool operator<(std::meta::info, X<false>) { return false; }
+ consteval void g(std::meta::info r, X<false> xv) {
+   r == ^^int && true;    // { dg-error "expected" }
+   r == ^^int & true;     // { dg-error "expected" }
+   r == (^^int) && true;  // OK
+   r == ^^int &&&& true;  // { dg-error "expected|cannot declare" }
+   ^^X < xv;              // { dg-error "could not convert" }
+ 			 // error: reflect-expression whose terminal name is a
+                          // template-name is followed by <
+   (^^X) < xv;            // OK
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [dcl.type.splice].
+ 
+ struct S { using type = int; };
+ template <auto R> struct TCls {
+   typename [:R:]::type member;  // typename applies to the qualified name
+ };
+ 
+ void fn() {
+   [:^^S::type:] *var;           // { dg-error "expected a reflection of an expression|not declared" }
+   typename [:^^S::type:] *var;  // OK, declares variable with type int*
+ }
+ 
+ using alias = [:^^S::type:];    // OK, type-only context
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-11.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-11.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-11.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [expr.prim.id.qual].
+ 
+ template<int V>
+ struct TCls {
+   static constexpr int s = V;
+   using type = int;
+ };
+ 
+ int v1 = [:^^TCls<1>:]::s;
+ int v2 = template [:^^TCls:]<2>::s;	    // OK, template binds to splice-scope-specifier
+ typename [:^^TCls:]<3>::type v3 = 3;	    // OK, typename binds to the qualified name
+ template [:^^TCls:]<3>::type v4 = 4;	    // OK, template binds to the splice-scope-specifier
+ typename template [:^^TCls:]<3>::type v5 = 5; // OK, same as v3
+ [:^^TCls:]<3>::type v6 = 6;	  // { dg-error "missing .template.|expected" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-12.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-12.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-12.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-12.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,24 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [basic.splice].
+ 
+ using info = decltype(^^int);
+ 
+ constexpr int v = 1;
+ template<int V> struct TCls {
+   static constexpr int s = V + 1;
+ };
+ 
+ // OK, a splice-specialization-specifier with a splice-expression as a template argument
+ using alias = [:^^TCls:]<([:^^v:])>;
+ 
+ static_assert(alias::s == 2);
+ 
+ // error: < means less than
+ auto o1 = [:^^TCls:]<([:^^v:])>();  // { dg-error "reflection .TCls<1>. not usable" }
+ // OK, o2 is an object of type TCls<1>
+ auto o2 = typename [:^^TCls:]<([:^^v:])>();
+ 
+ consteval int bad_splice(info v) {
+   return [:v:];	  // { dg-error ".v. is not a constant expression" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-13.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-13.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-13.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-13.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [expr.prim.req.type].
+ 
+ template<typename T, typename T::type = 0> struct S;
+ template<typename T> using Ref = T&;
+ template<typename T> concept C = requires {
+   typename T::inner;
+   // required nested member name
+   typename S<T>;
+   // required valid (13.3) template-id; fails if T::type does not exist as a type
+   // to which 0 can be implicitly converted
+   typename Ref<T>;
+   // required alias template substitution, fails if T is void
+   typename [:T::r1:];
+   // fails if T::r1 is not a reflection of a type
+   typename [:T::r2:]<int>;
+   // fails if T::r2 is not a reflection of a template Z for which Z<int> is a type
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-14.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-14.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-14.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-14.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [expr.reflect]/5.
+ 
+ using info = decltype(^^void);
+ 
+ struct A { struct S {}; };
+ struct B : A { using A::S; };
+ constexpr info r1 = ^^B::S;	// { dg-error "cannot be applied to a using-declaration" }
+ struct C : virtual B { struct S {}; };
+ struct D : virtual B, C {};
+ D::S s;
+ constexpr info r2 = ^^D::S;// OK, names C::S per 6.5.2
+ // OK, result C::S not found through using-declarator
+ 
+ struct E : A { };
+ constexpr info r3 = ^^E::S;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-15.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-15.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-15.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-15.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [expr.const].
+ 
+ using info = decltype(^^int);
+ 
+ struct Base { };
+ struct Derived : Base { info r; };
+ 
+ consteval const Base& fn(const Derived& derived) { return derived; }
+ 
+ constexpr Derived obj{.r=^^::}; // OK
+ constexpr const Derived& d = obj; // OK
+ constexpr const Base& b1 = fn(obj); // { dg-error "reference into an object of consteval-only" }
+ constexpr const Base& b2 = obj;	  // { dg-error "reference into an object of consteval-only" }
+ constexpr Base b3 = obj;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-16.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-16.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-16.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-16.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // List of Types to List of Sizes
+ 
+ #include <algorithm>
+ #include <array>
+ #include <meta>
+ #include <ranges>
+ 
+ constexpr std::array types = {^^int, ^^float, ^^double};
+ constexpr std::array sizes = []{
+   std::array<std::size_t, types.size()> r;
+   std::ranges::transform(types, r.begin(), std::meta::size_of);
+   return r;
+ }();
+ static_assert (sizes[0] == sizeof (int));
+ static_assert (sizes[1] == sizeof (float));
+ static_assert (sizes[2] == sizeof (double));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-17.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-17.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-17.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-17.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,32 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2996r13.html#compile-time-ticket-counter
+ 
+ #include <meta>
+ 
+ template<int N> struct Helper;
+ 
+ struct TU_Ticket {
+   static consteval int latest ()
+   {
+     int k = 0;
+     while (is_complete_type (substitute (^^Helper,
+ 					 { std::meta::reflect_constant (k) })))
+       ++k;
+     return k;
+   }
+   static consteval void increment ()
+   {
+     define_aggregate (substitute (^^Helper,
+ 				  { std::meta::reflect_constant (latest ()) }),
+ 		      {});
+   }
+ };
+ constexpr int x = TU_Ticket::latest ();  // x initialized to 0.
+ consteval { TU_Ticket::increment (); }
+ constexpr int y = TU_Ticket::latest ();  // y initialized to 1.
+ consteval { TU_Ticket::increment (); }
+ constexpr int z = TU_Ticket::latest ();  // z initialized to 2.
+ static_assert (x == 0);
+ static_assert (y == 1);
+ static_assert (z == 2);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-18.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-18.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-18.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-18.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,46 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [meta.reflection.access.context].
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A {
+   int a = 0;
+   consteval A(int p) : a(p) {}
+ };
+ struct B : A {
+   using A::A;
+   consteval B(int p, int q) : A(p * q) {}
+   info s = access_context::current().scope();
+ };
+ struct C : B { using B::B; };
+ 
+ struct Agg {
+   consteval bool eq(info rhs = access_context::current().scope()) {
+     return s == rhs;
+   }
+   info s = access_context::current().scope();
+ };
+ 
+ namespace NS {
+   static_assert(Agg{}.s == access_context::current().scope());              // OK
+   static_assert(Agg{}.eq());                                                // OK
+   static_assert(B(1).s == ^^B);                                             // OK
+   static_assert(is_constructor(B{1, 2}.s) && parent_of(B{1, 2}.s) == ^^B);  // OK
+   static_assert(is_constructor(C{1, 2}.s) && parent_of(C{1, 2}.s) == ^^B);  // OK
+ 
+   auto fn() -> [:is_namespace(access_context::current().scope()) ? ^^int : ^^bool:];
+   static_assert(return_type_of(type_of(^^fn)) == ^^int);
+   static_assert(type_of(^^fn) == ^^auto()->int);                            // OK
+ 
+   template<auto R>
+     struct TCls {
+       consteval bool fn()
+         requires (is_type(access_context::current().scope())) {
+           return true;                  // OK, scope is TCls<R>.
+         }
+     };
+   static_assert(TCls<0>{}.fn());        // OK
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-19.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-19.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-19.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-19.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [meta.reflection.access.queries].
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval access_context fn() {
+   return access_context::current();
+ }
+ 
+ class Cls {
+   int mem;
+   friend consteval access_context fn();
+ public:
+   static constexpr auto r = ^^mem;
+ };
+ 
+ static_assert(is_accessible(Cls::r, fn()));                             // OK
+ static_assert(!is_accessible(Cls::r, access_context::current()));       // OK
+ static_assert(is_accessible(Cls::r, access_context::unchecked()));      // OK
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,27 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from the P2996 paper.
+ 
+ #include <vector>
+ 
+ template <typename T> void fn() requires (^^T != ^^int);
+ template <typename T> void fn() requires (^^T == ^^int);
+ template <typename T> void fn() requires (sizeof(T) == sizeof(int));
+ 
+ constexpr auto a = ^^fn<char>;     // OK
+ constexpr auto b = ^^fn<int>;      // { dg-error "insufficient contextual information to determine type" }
+ 
+ constexpr auto c = ^^std::vector;  // OK
+ 
+ template <typename T>
+ struct S {
+   static constexpr auto r = ^^T;
+   using type = T;
+ };
+ static_assert(S<int>::r == ^^int);
+ static_assert(^^S<int>::type != ^^int);
+ 
+ typedef struct X {} Y;
+ typedef struct Z {} Z;
+ constexpr auto e = ^^Y;  // OK, represents the type alias Y
+ constexpr auto f = ^^Z;  // OK, represents the type Z (not the type alias)
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-20.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-20.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-20.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-20.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,61 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <functional>
+ #include <meta>
+ #include <utility>
+ #include <vector>
+ #include <initializer_list>
+ #include <tuple>
+ 
+ template<std::pair<std::size_t, std::size_t>... indices>
+ struct Indexer {
+    template<typename Tuples>
+    // Can use tuple indexing instead of tuple of tuples
+    constexpr auto operator()(Tuples&& tuples) const {
+      using ResultType = std::tuple<
+        std::tuple_element_t<
+          indices.second,
+          std::remove_cvref_t<std::tuple_element_t<indices.first, std::remove_cvref_t<Tuples>>>
+        >...
+      >;
+      return ResultType(std::get<indices.second>(std::get<indices.first>(std::forward<Tuples>(tuples)))...);
+    }
+ };
+ 
+ template <class T>
+ consteval auto subst_by_value(std::meta::info tmpl, std::vector<T> args)
+     -> std::meta::info
+ {
+     std::vector<std::meta::info> a2;
+     for (T x : args) {
+         a2.push_back(std::meta::reflect_constant(x));
+     }
+ 
+     return substitute(tmpl, a2);
+ }
+ 
+ consteval auto make_indexer(std::vector<std::size_t> sizes)
+     -> std::meta::info
+ {
+     std::vector<std::pair<int, int>> args;
+ 
+     for (std::size_t tidx = 0; tidx < sizes.size(); ++tidx) {
+         for (std::size_t eidx = 0; eidx < sizes[tidx]; ++eidx) {
+             args.push_back({tidx, eidx});
+         }
+     }
+ 
+     return subst_by_value(^^Indexer, args);
+ }
+ 
+ template<typename... Tuples>
+ constexpr auto my_tuple_cat(Tuples&&... tuples) {
+     constexpr typename [: make_indexer({tuple_size(remove_cvref(^^Tuples))...}) :] indexer;
+     return indexer(std::forward_as_tuple(std::forward<Tuples>(tuples)...));
+ }
+ 
+ int r;
+ constexpr auto x = my_tuple_cat(std::make_tuple(10, std::ref(r)), std::make_tuple(21.0, 22, 23, 24));
+ static_assert(std::same_as<decltype(x), const std::tuple<int, int&, double, int, int, int>>);
+ static_assert(std::get<5>(x) == 24);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-21.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-21.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-21.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-21.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,68 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [expr.const]/31.
+ 
+ #include <meta>
+ 
+ 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;
+ consteval { std::meta::define_aggregate(^^S1, {}); }	// OK
+ 
+ template <std::meta::info R> consteval void tfn1() {
+   std::meta::define_aggregate(R, {});
+ }
+ 
+ struct S2;
+ consteval { tfn1<^^S2>(); }				// OK
+ 
+ template <std::meta::info R> consteval void tfn2() {
+   consteval { std::meta::define_aggregate(R, {}); }	// { dg-error "'consteval void tfn2\\\(\\\) \\\[with std::meta::info R = \\\^\\\^S3\\\]' intervenes between 'consteval' block 'define_aggregate' is evaluated from and 'S3' scope" }
+ }							// { dg-message "'consteval' block defined here" "" { target *-*-* } .-1 }
+ 
+ struct S3;
+ consteval { tfn2<^^S3>(); }
+   // error: function parameter scope of tfn2<^^S3> intervenes between the declaration of S3
+   // and the consteval block that produces the injected declaration
+ 
+ template <typename> struct TCls {
+   struct S4;
+   static void sfn() requires ([] {
+     consteval { std::meta::define_aggregate(^^S4, {}); } // { dg-error "TCls<void>::<lambda\\\(\\\)>' intervenes between 'consteval' block 'define_aggregate' is evaluated from and 'TCls<void>::S4' scope" }
+     return true;					// { dg-message "'consteval' block defined here" "" { target *-*-* } .-1 }
+   }()) { }
+ };
+ 
+ consteval { TCls<void>::sfn(); }	// error: TCls<void>::S4 is not enclosed by requires-clause lambda
+ // { dg-error "call to non-'constexpr' function 'static void TCls< <template-parameter-1-1> >::sfn\\\(\\\) requires \\\(<lambda>\\\)\\\(\\\) \\\[with <template-parameter-1-1> = void\\\]'" "" { target *-*-* } .-1 }
+ 
+ struct S5;
+ struct Cls {
+   consteval { std::meta::define_aggregate(^^S5, {}); }  // error: S5 is not enclosed by class Cls
+ };						// { dg-error "'Cls' intervenes between 'consteval' block 'define_aggregate' is evaluated from and 'S5' scope" "" { target *-*-* } .-1 }
+ 						// { dg-message "'consteval' block defined here" "" { target *-*-* } .-2 }
+ 
+ struct S6;					// { dg-message "'consteval' block defined here" "" { target *-*-* } .+1 }
+ consteval {					// #1
+   struct S7;					// local class
+ 
+   std::meta::define_aggregate(^^S7, {});	// error: consteval block #1 does not enclose itself,
+ 						// but encloses S7
+ 						// { dg-error "'define_aggregate' evaluated from 'consteval' block which encloses '<lambda\\\(\\\)> static::S7' being defined" "" { target *-*-* } .-2 }
+ 
+   struct S8;
+   consteval {			       		// #2
+     std::meta::define_aggregate(^^S6, {});	// error: consteval block #1 encloses
+ 						// consteval block #2 but not S6
+ 						// { dg-error "'<lambda\\\(\\\)> static' intervenes between 'consteval' block 'define_aggregate' is evaluated from and 'S6' scope" "" { target *-*-* } .-2 }
+ 						// { dg-message "'consteval' block defined here" "" { target *-*-* } .-4 }
+ 
+     std::meta::define_aggregate(^^S8, {});	// OK, consteval block #1 encloses both #2 and S8
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,23 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test that was in [expr.prim.id.qual].
+ 
+ template <int V>
+ struct TCls {
+   static constexpr int s = V;
+   using type = int;
+ };
+ 
+ constexpr int v1 = [:^^TCls<1>:]::s;
+ static_assert (v1 == 1);
+ constexpr int v2 = template [:^^TCls:]<2>::s;
+   // OK, template binds to splice-scope-specifier
+ static_assert (v2 == 2);
+ 
+ constexpr typename [:^^TCls:]<3>::type v3 = 3;
+   // OK, typename binds to the qualified name
+ static_assert (v3 == 3);
+ 
+ constexpr [:^^TCls:]<3>::type v4 = 4; // { dg-error "missing .template.|expected" }
+   // error: [:^^TCls:]< is parsed as a splice-expression followed
+   // by a comparison operator
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,27 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [expr.prim.splice].
+ 
+ struct S { static constexpr int a = 1; };
+ template <typename> struct TCls { static constexpr int b = 2; };
+ 
+ constexpr int c = [:^^S:]::a;                   // [:^^S:] is not an expression
+ static_assert(c == 1);
+ 
+ constexpr int d = template [:^^TCls:]<int>::b;  // template [:^^TCls:]<int> is not
+                                                 // an expression
+ static_assert(d == 2);
+ 
+ template <auto V> constexpr int e = [:V:];   // splice-expression
+ constexpr int f1 = e<^^S::a>;  // splice-expression
+ constexpr int f2 = template [:^^e:]<^^S::a>;  // splice-expression
+ static_assert(f1 == 1);
+ static_assert(f2 == 1);
+ 
+ constexpr auto g = typename [:^^int:](42);
+   // [:^^int:] forms part of a type, not a splice-expression
+ static_assert(g == 42);
+ 
+ constexpr auto h = ^^g;
+ constexpr auto i = e<[:^^h:]>;	  // { dg-error "unparenthesized splice|invalid" }
+ constexpr auto j = e<([:^^h:])>;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,50 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [basic.fundamental].
+ 
+ #include <meta>
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ template <auto> struct TCls {};
+ template <auto> void TFn();
+ template <auto> int TVar;
+ template <auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ 
+ constexpr auto r1 = std::meta::reflect_constant(42);  // represents int value of 42
+ 
+ constexpr auto r2 = std::meta::reflect_object(arr[1]);  // represents int object
+ 
+ constexpr auto r3 = ^^arr;      // represents a variable
+ constexpr auto r4 = ^^a3;       // represents a structured binding
+ constexpr auto r5 = ^^fn;       // represents a function
+ constexpr auto r6 = ^^Enum::A;  // represents an enumerator
+ constexpr auto r7 = ^^Alias;    // represents a type alias
+ constexpr auto r8 = ^^S;        // represents a type
+ constexpr auto r9 = ^^S::mem;   // represents a class member
+ 
+ constexpr auto r10 = std::meta::members_of (^^S, std::meta::access_context::current ())[1];
+     // represents an unnamed bit-field
+ 
+ constexpr auto r11 = ^^TCls;     // represents a class template
+ constexpr auto r12 = ^^TFn;      // represents a function template
+ constexpr auto r13 = ^^TVar;     // represents a variable template
+ constexpr auto r14 = ^^Concept;  // represents a concept
+ constexpr auto r15 = ^^NSAlias;  // represents a namespace alias
+ constexpr auto r16 = ^^NS;       // represents a namespace
+ 
+ constexpr auto r17 = std::meta::bases_of(^^S, std::meta::access_context::current ())[0];
+     // represents a direct base class relationship
+ 
+ constexpr auto r18 = std::meta::data_member_spec(^^int, {.name="member"});
+     // represents a data member description
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [temp.dep.splice].
+ 
+ template <auto T, auto NS>
+ void fn() {
+   using a = [:T:]<1>;  // [:T:] and [:T:]<1> are dependent
+ 
+   static_assert([:NS:]::template TCls<1>::v == a::v);  // [:NS:] is dependent
+ }
+ 
+ namespace NS {
+ template <auto V> struct TCls { static constexpr int v = V; };
+ }
+ 
+ int main() {
+   fn<^^NS::TCls, ^^NS>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [temp.dep.namespace].
+ 
+ using info = decltype(^^int);
+ 
+ template <info R> int fn() {
+   namespace Alias = [:R:];  // [:R:] is dependent
+   return Alias::v;  // Alias is dependent
+ }
+ 
+ namespace NS {
+   int v = 1;
+ }
+ 
+ int a = fn<^^NS>();
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [temp.dep.splice].
+ 
+ template<template<class> class X>
+ struct S {
+   typename [: ^^X :]<int, float> m; // { dg-error "wrong number of template arguments" }
+ };
+ 
+ template<class> struct V1 {};
+ template<class, class = int> struct V2 {};
+ 
+ S<V1> s1; // { dg-message "required from here" }
+ S<V2> s2; // OK
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p2996-9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p2996-9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,24 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [over.match.viable].
+ // FIXME We should give the errors below.
+ 
+ namespace A {
+   extern "C" void f(int = 5);
+ }
+ namespace B {
+   extern "C" void f(int = 5);
+ }
+ 
+ void splice() {
+   [:^^A::f:](3);  // OK, default argument was not used for viability
+   [:^^A::f:]();   // error: found default argument twice
+ }
+ 
+ using A::f;
+ using B::f;
+ 
+ void use() {
+   f(3);           // OK, default argument was not used for viability
+   f();            // error: found default argument twice
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p3394-1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p3394-1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p3394-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p3394-1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,174 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Slightly tweaked test from P3394R4 3.2
+ // https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3394r4.html#test-parametrization
+ // TODO: Doesn't link currently, once it does, it should be dg-do run test
+ // with output checking or something like that.
+ 
+ #include <meta>
+ #include <array>
+ #include <print>
+ 
+ namespace impl {
+   template <auto... vals>
+   struct replicator_type {
+     template <typename F>
+     constexpr void operator >> (F body) const
+     {
+       (body.template operator () <vals> (), ...);
+     }
+   };
+ 
+   template <auto... vals>
+   replicator_type <vals...> replicator = {};
+ }
+ 
+ template <typename R>
+ consteval auto
+ expand (R range)
+ {
+   std::vector<std::meta::info> args;
+   for (auto r : range)
+     args.push_back (std::meta::reflect_constant (r));
+   return substitute (^^impl::replicator, args);
+ }
+ 
+ template <size_t N, class F>
+ constexpr decltype (auto)
+ with_indices (F f)
+ {
+   return [&] <size_t... Is> (std::index_sequence <Is...>) -> decltype (auto) {
+ 	   return f(std::integral_constant<size_t, Is>{}...);
+ 	 }  (std::make_index_sequence <N> {});
+ }
+ 
+ template <typename... Ts>
+ struct Tuple {
+   struct storage;
+   consteval {
+     define_aggregate (^^storage, { data_member_spec (^^Ts, { .name = "_" })... });
+   }
+   static constexpr auto ctx = std::meta::access_context::current ();
+   static constexpr auto nsdms
+     = define_static_array (nonstatic_data_members_of (^^storage, ctx));
+ 
+   storage s;
+ 
+   template <class F>
+   decltype (auto) apply (F f)
+   {
+     return with_indices <sizeof... (Ts)> ([&] (auto... Is) -> decltype (auto) {
+ 					    return f (s.[: nsdms[Is] :]...);
+ 					  });
+   }
+ };
+ 
+ template <typename... Ts>
+ Tuple (Ts...) -> Tuple <Ts...>;
+ 
+ template <size_t N, typename... Ts>
+ struct Parametrize {
+   Tuple <Ts...> arr[N];
+   auto begin () const { return arr; }
+   auto end () const { return arr + N; }
+ };
+ 
+ template <typename... Ts, size_t N>
+ constexpr auto
+ parametrize (Tuple<Ts...> (&&arr) [N])
+ {
+   return with_indices <N> ([&] (auto... Is) {
+ 			     return Parametrize <N, Ts...> { { arr[Is]... } };
+ 			   });
+ }
+ 
+ consteval auto
+ nonstatic_member_functions_of (std::meta::info type)
+ {
+   auto ctx = std::meta::access_context::current ();
+   auto members = members_of (type, ctx);
+   std::erase_if (members, [] (std::meta::info m) {
+ 			    return not (is_function (m)
+ 					and not is_static_member (m)
+ 					and not is_special_member_function (m));
+ 			  });
+   return members;
+ }
+ 
+ consteval std::meta::info
+ parametrization_of (std::meta::info M)
+ {
+   for (auto a : annotations_of (M))
+     {
+       auto t = type_of (a);
+       if (has_template_arguments (t) and template_of (t) == ^^Parametrize)
+ 	return a;
+     }
+   return std::meta::info ();
+ }
+ 
+ template <std::meta::info M, class F>
+ void
+ invoke_single_test (F f)
+ {
+   constexpr auto A = parametrization_of (M);
+ 
+   if constexpr (A != std::meta::info ())
+     {
+       constexpr auto Params = extract <typename [: type_of (A) :]> (A);
+       for (auto P : Params)
+ 	P.apply (f);
+     }
+   else
+     f ();
+ }
+ 
+ template <std::meta::info M>
+ void
+ invoke_single_test ()
+ {
+   invoke_single_test <M> ([: M :]);
+ }
+ 
+ template <std::meta::info Namespace>
+ void
+ invoke_all ()
+ {
+   [: expand (members_of (Namespace, std::meta::access_context::current ())) :]
+     >> [] <std::meta::info M> {
+ 	 if constexpr (is_function(M) and identifier_of (M).starts_with ("test_"))
+ 	   invoke_single_test <M> ();
+ 	 else if constexpr (is_type (M))
+ 	   [: expand (nonstatic_member_functions_of (M)) :]
+ 	     >> [] <std::meta::info F> {
+ 		  if constexpr (identifier_of (F).starts_with ("test_"))
+ 		    invoke_single_test <F> ([&] (auto... args) {
+ 					      typename [: M :] fixture;
+ 					      fixture.[: F :] (args...);
+ 					    });
+ 		};
+        };
+ }
+ 
+ namespace N
+ {
+   [[=parametrize ({ Tuple {1, 1, 2}, Tuple {1, 2, 3} })]]
+   void test_sum (int x, int y, int z)
+   {
+     std::println ("Called test_sum (x={}, y={}, z={})", x, y, z);
+   }
+ 
+   struct Fixture {
+     Fixture () { std::println ("setup fixture"); }
+     ~Fixture() { std::println ("teardown fixture"); }
+     [[=parametrize ({ Tuple {1}, Tuple {2} })]]
+     void test_one (int x) { std::println ("test one({})", x); }
+     void test_two () { std::println("test two"); }
+   };
+ }
+ 
+ int
+ main ()
+ {
+   invoke_all <^^N> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p3491-1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p3491-1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p3491-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p3491-1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from P3491R3 3.3
+ // https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3491r3.html#return-type-and-layering
+ 
+ #include <meta>
+ #include <ranges>
+ #include <type_traits>
+ 
+ template <std::size_t N>
+ struct FixedString {
+   char data[N] = {};
+ 
+   constexpr FixedString (char const (&str) [N]) { std::ranges::copy (str, str + N, data); }
+ };
+ 
+ template <FixedString S>
+ struct Test { };
+ 
+ using A = Test <"foo">;
+ using E = Test <([: std::meta::reflect_constant_string ("foo") :])>;
+ using F = [: substitute (^^Test, { std::meta::reflect_constant_string ("foo") }) :];
+ 
+ static_assert (std::is_same_v <A, E>);
+ static_assert (std::is_same_v <A, F>);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p3491-2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p3491-2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p3491-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p3491-2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,50 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from P3491R3 3.5.4
+ // https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3491r3.html#with-expansion-statements
+ 
+ #include <meta>
+ #include <ranges>
+ #include <type_traits>
+ 
+ constexpr auto foo() -> std::vector<int> { return {1, 2, 3}; }
+ 
+ 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;
+ }
+ 
+ consteval int qux() {
+     int r = 0;
+     template for (constexpr int I : [: std::meta::reflect_constant_array(foo()) :]) {
+         r += I;
+     }
+     return r;
+ }
+ 
+ template <typename>
+ consteval int fred() {
+     constexpr auto [...m] = [: std::meta::reflect_constant_array(foo()) :];
+     return (... + m);
+ }
+ 
+ static_assert (baz() == 6);
+ static_assert (qux() == 6);
+ static_assert (fred<int>() == 6);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p3491-3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p3491-3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/p3491-3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/p3491-3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,45 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from P3491R3 3.5.5
+ // https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3491r3.html#implementing-source_location
+ 
+ #include <meta>
+ 
+ class source_location {
+     struct impl {
+ 	char const* filename;
+ 	int line;
+     };
+     impl const* p_;
+     constexpr source_location(impl const* x) noexcept : p_{x} {}
+ 
+ public:
+     static consteval auto current(char const* file = __builtin_FILE(),
+ 				  int line = __builtin_LINE()) noexcept
+ 	-> source_location
+     {
+ 	// first, we canonicalize the file
+ 	// Note, the paper uses just define_static_string(file), but that
+ 	// doesn't work, char const* argument isn't a valid input_range.
+ 	impl data = {.filename = std::define_static_string(std::string_view(file)), .line = line};
+ 
+ 	// then we canonicalize the data
+ 	impl const* p = std::define_static_object(data);
+ 
+ 	// and now we have an external linkage object mangled with this location
+ 	return source_location{p};
+     }
+     constexpr source_location() noexcept : p_{nullptr} { }
+     constexpr int line() const noexcept { return p_ ? p_->line : 0; }
+     constexpr const char* file_name() const noexcept { return p_ ? p_->filename : ""; }
+ };
+ 
+ static_assert (::source_location::current ().line() == std::source_location::current ().line ());
+ static_assert (::source_location::current ().line() == std::source_location::current ().line ());
+ static_assert (::source_location::current ().line()
+ 	       == std::source_location::current ().line () - 1);
+ static_assert (std::string_view (::source_location::current ().file_name ())
+ 	       == std::string_view (std::source_location::current ().file_name ()));
+ static_assert (::source_location().line() == 0);
+ static_assert (std::string_view (::source_location ().file_name ())
+ 	       == std::string_view (""));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/pack-index1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/pack-index1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/pack-index1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/pack-index1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,28 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections and pack indexing.
+ 
+ struct S {
+   int x;
+   static int sx;
+   using type = int;
+ };
+ 
+ template<typename... Ts>
+ void
+ f ()
+ {
+   constexpr auto r1 = ^^Ts...[0]::sx;
+   constexpr auto r2 = ^^typename Ts...[0]::type;
+ 
+   // NTTPs and pack-index-expressions cannot appear as operands
+   // of the reflection operator.
+   constexpr auto e = ^^Ts...[0]; // { dg-error "cannot be applied" }
+ }
+ 
+ 
+ void
+ g ()
+ {
+   f<S>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,35 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::parameters_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template<class, class> struct same_type;
+ template<class T> struct same_type<T, T> {};
+ 
+ void fun (int, float, double, char);
+ 
+ consteval void
+ f ()
+ {
+   auto parms = parameters_of (^^fun);
+ 
+   same_type<decltype(parms), std::vector<info>>();
+ 
+   constexpr auto p0 = parameters_of (^^fun)[0];
+   static_assert (is_function_parameter (p0));
+   constexpr auto p1 = parameters_of (^^fun)[1];
+   static_assert (is_function_parameter (p1));
+   constexpr auto p2 = parameters_of (^^fun)[2];
+   static_assert (is_function_parameter (p2));
+   constexpr auto p3 = parameters_of (^^fun)[3];
+   static_assert (is_function_parameter (p3));
+ }
+ 
+ void
+ g ()
+ {
+   f ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,41 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::parameters_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void fn0 ();
+ void fn1 (int);
+ void fn2 (int, int);
+ void fn3 (int, int, int);
+ void fn4 (int, int, int, int);
+ template<typename... Ts>
+ void tfn (Ts...);
+ 
+ static_assert (parameters_of (^^void()).size() == 0);
+ static_assert (parameters_of (^^void(void)).size() == 0);
+ static_assert (parameters_of (^^void(...)).size() == 0);
+ static_assert (parameters_of (^^void(int)).size() == 1);
+ static_assert (parameters_of (^^void(int, ...)).size() == 1);
+ static_assert (parameters_of (^^void(int, int)).size() == 2);
+ static_assert (parameters_of (^^void(int, int, ...)).size() == 2);
+ static_assert (parameters_of (^^void(int, int, int)).size() == 3);
+ static_assert (parameters_of (^^void(int, int, int, ...)).size() == 3);
+ static_assert (parameters_of (^^void(int, int, int, int)).size() == 4);
+ static_assert (parameters_of (^^void(int, int, int, int, ...)).size() == 4);
+ static_assert (parameters_of (^^void(int, int, int, int, int)).size() == 5);
+ static_assert (parameters_of (^^void(int, int, int, int, int, ...)).size() == 5);
+ static_assert (parameters_of (^^void(int, int, int, int, int, int)).size() == 6);
+ static_assert (parameters_of (^^void(int, int, int, int, int, int, ...)).size() == 6);
+ static_assert (parameters_of (^^void(int, int, int, int, int, int, int)).size() == 7);
+ static_assert (parameters_of (^^void(int, int, int, int, int, int, int, ...)).size() == 7);
+ 
+ static_assert (parameters_of (^^fn0).size() == 0);
+ static_assert (parameters_of (^^fn1).size() == 1);
+ static_assert (parameters_of (^^fn2).size() == 2);
+ static_assert (parameters_of (^^fn3).size() == 3);
+ static_assert (parameters_of (^^fn4).size() == 4);
+ 
+ static_assert (parameters_of (^^tfn<>).size() == 0);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,41 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::parameters_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void lox (int = 0, int = 0, int = 0);
+ static_assert (parameters_of (^^lox).size() == 3);
+ 
+ struct C {
+   ~C();
+   void foo (int, bool = false);
+   bool bar (this C &self, int, ...);
+   static C &baz (int, ...);
+   using U = void(int, int, int);
+ };
+ 
+ static_assert (parameters_of (^^C::foo).size() == 2);
+ static_assert (parameters_of (^^C::bar).size() == 2);
+ static_assert (parameters_of (^^C::baz).size() == 1);
+ static_assert (parameters_of (^^C::~C).size() == 0);
+ 
+ template<typename... Ts>
+ void pack (Ts...) { }
+ static_assert (parameters_of (^^pack<>).size() == 0);
+ static_assert (parameters_of (^^pack<int>).size() == 1);
+ static_assert (parameters_of (^^pack<int, char>).size() == 2);
+ static_assert (parameters_of (^^pack<int, char, float>).size() == 3);
+ static_assert (parameters_of (^^pack<int, char, float, unsigned>).size() == 4);
+ static_assert (parameters_of (^^pack<int, char, float, unsigned, short>).size() == 5);
+ 
+ void fn (int a, bool b);
+ void fn (int a, bool b = false);
+ void fn (int a, bool b);
+ static_assert (parameters_of (^^fn).size() == 2);
+ 
+ using A = void(int, int);
+ static_assert (parameters_of (dealias(^^A)).size() == 2);
+ static_assert (parameters_of (dealias(^^C::U)).size() == 3);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::parameters_of.
+ 
+ #include <meta>
+ 
+ template<auto R> void foo () {}  // { dg-message "sorry, unimplemented: mangling" }
+ void
+ g ()
+ {
+   foo<std::meta::parameters_of(^^g)[0]>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,43 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::parameters_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct C {
+   ~C();
+ };
+ 
+ consteval void
+ f1 ()
+ {
+   parameters_of (^^C);
+ }
+ 
+ consteval bool
+ test1 ()
+ {
+   try { f1 (); }
+   catch (std::meta::exception &) { return true; }
+   catch (...) { return false; }
+   return false;
+ }
+ 
+ consteval void
+ f2 ()
+ {
+   parameters_of (^^int);
+ }
+ 
+ consteval bool
+ test2 ()
+ {
+   try { f2 (); }
+   catch (std::meta::exception &) { return true; }
+   catch (...) { return false; }
+   return false;
+ }
+ 
+ static_assert (test1 () && test2 ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parameters_of6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parameters_of6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ constexpr auto x = ^^std::meta::type_of;
+ constexpr auto m = parameters_of(x)[0];
+ static_assert (std::meta::type_of (m) == dealias (^^std::meta::info));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parent_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parent_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parent_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parent_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,238 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::parent_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ consteval bool
+ has_parent_of (info r)
+ {
+   try { parent_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!has_parent_of (null_reflection));
+ static_assert (!has_parent_of (^^::));
+ static_assert (parent_of (^^ns) == ^^::);
+ static_assert (parent_of (^^std) == ^^::);
+ static_assert (parent_of (^^ns_alias) == ^^::);
+ static_assert (!has_parent_of (reflect_constant (3)));
+ static_assert (parent_of (^^cls) == ^^::);
+ static_assert (parent_of (^^cls::dm) == ^^cls);
+ static_assert (parent_of (^^cls::ref_dm) == ^^cls);
+ static_assert (parent_of (^^cls::static_dm) == ^^cls);
+ static_assert (parent_of (^^cls::mem_fun) == ^^cls);
+ static_assert (parent_of (^^cls::static_mem_fun) == ^^cls);
+ static_assert (parent_of (^^cls::type) == ^^cls);
+ static_assert (parent_of (^^cls_var) == ^^::);
+ static_assert (parent_of (^^onion) == ^^::);
+ static_assert (is_union_type (parent_of (^^anon)));
+ static_assert (parent_of (parent_of (^^anon)) == ^^::);
+ static_assert (parent_of (^^fun) == ^^::);
+ static_assert (parent_of (^^alias) == ^^::);
+ static_assert (parent_of (^^var) == ^^::);
+ static_assert (parent_of (^^ref) == ^^::);
+ static_assert (parent_of (^^rref) == ^^::);
+ static_assert (parent_of (^^ptr) == ^^::);
+ static_assert (parent_of (^^cls_tmpl) == ^^::);
+ static_assert (parent_of (^^cls_tmpl<int>) == ^^::);
+ static_assert (parent_of (^^incomplete_cls<int>) == ^^::);
+ static_assert (parent_of (^^fun_tmpl) == ^^::);
+ static_assert (parent_of (^^fun_tmpl<int>) == ^^::);
+ static_assert (parent_of (^^conc) == ^^::);
+ static_assert (!has_parent_of (substitute (^^conc, { ^^int })));
+ static_assert (parent_of (^^var_tmpl) == ^^::);
+ static_assert (parent_of (^^var_tmpl<int>) == ^^::);
+ static_assert (parent_of (^^cls_tmpl_alias) == ^^::);
+ static_assert (parent_of (^^cls_tmpl_alias<int>) == ^^::);
+ static_assert (parent_of (^^Enum) == ^^::);
+ static_assert (parent_of (^^Enum::A) == ^^Enum);
+ static_assert (parent_of (^^A) == ^^Enum);
+ static_assert (parent_of (^^Enum_class) == ^^::);
+ static_assert (parent_of (^^Enum_class::A) == ^^Enum_class);
+ static_assert (parent_of (^^decomp) == ^^::);
+ static_assert (parent_of (^^decomp_ref) == ^^::);
+ static_assert (parent_of (^^arr) == ^^::);
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!has_parent_of (dms));
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (parent_of (bases_of (^^Derived, ctx)[0]) == ^^Derived);
+ 
+ consteval {
+   int a = 42;
+   static_assert (parent_of (^^a) == ^^::);
+   consteval {
+     int b = 42;
+     static_assert (parent_of (^^b) == ^^::);
+   }
+ }
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_parent_of (^^T));
+ //  static_assert (parent_of (R));
+ //  static_assert (parent_of (R2));
+ //  static_assert (parent_of (R3));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+   static_assert (parent_of (^^p) == ^^g);
+   static_assert (parent_of (^^c) == ^^g);
+   static_assert (parent_of (parameters_of (^^g)[0]) == ^^g);
+   static_assert (parent_of (^^g) == ^^::);
+   consteval {
+     int a = 42;
+     static_assert (parent_of (^^a) == ^^g);
+     consteval {
+       int b = 42;
+       static_assert (parent_of (^^b) == ^^g);
+       consteval {
+ 	int c = 42;
+ 	static_assert (parent_of (^^c) == ^^g);
+       }
+     }
+   }
+ }
+ 
+ int
+ main ()
+ {
+ }
+ 
+ namespace N
+ {
+   extern "C" void foo (int);
+   void baz (int);
+   namespace M
+   {
+     namespace O
+     {
+       struct S {};
+     }
+   }
+   consteval {
+     int a = 42;
+     static_assert (parent_of (^^a) == ^^N);
+     consteval {
+       int b = 42;
+       static_assert (parent_of (^^b) == ^^N);
+     }
+   }
+ }
+ extern "C" void bar ();
+ 
+ static_assert (!has_parent_of (^^main));
+ static_assert (!has_parent_of (^^N::foo));
+ static_assert (!has_parent_of (^^bar));
+ static_assert (parent_of (^^N::baz) == ^^N);
+ static_assert (parent_of (^^N::M::O::S) == ^^N::M::O);
+ static_assert (parent_of (^^N::M::O) == ^^N::M);
+ static_assert (parent_of (^^N::M) == ^^N);
+ static_assert (parent_of (^^N) == ^^::);
+ 
+ enum F {
+   F1,
+   F2 = parent_of (^^F1) == ^^F,
+   F3 = (parent_of (^^F2) == ^^F) + 1,
+ };
+ static_assert (F2 == 1 && F3 == 2);
+ 
+ void
+ qux ()
+ {
+   auto a = [] ()
+     {
+       int b;
+       static_assert (is_function (parent_of (^^b)));
+       static_assert (is_class_type (parent_of (parent_of (^^b))));
+       static_assert (parent_of (parent_of (parent_of (^^b))) == ^^qux);
+     };
+   static_assert (parent_of (^^a) == ^^qux);
+   static_assert (parent_of (type_of (^^a)) == ^^qux);
+ }
+ 
+ struct I { };
+ 
+ struct J : I {
+   union {
+     int o;
+   };
+ 
+   enum N {
+     A
+   };
+ 
+   consteval {
+     int a = 42;
+     static_assert (parent_of (^^a) == ^^J);
+     consteval {
+       int b = 42;
+       static_assert (parent_of (^^b) == ^^J);
+       consteval {
+ 	int c = 42;
+ 	static_assert (parent_of (^^c) == ^^J);
+       }
+     }
+   }
+ };
+ 
+ static_assert (parent_of (^^J) == ^^::);
+ static_assert (parent_of (bases_of (^^J, ctx)[0]) == ^^J);
+ static_assert (is_union_type (parent_of (^^J::o)));
+ static_assert (parent_of(^^J::N) == ^^J);
+ static_assert (parent_of(^^J::A) == ^^J::N);
+ 
+ static union { union { int anon2; union { int anon3; }; }; };
+ static_assert (is_union_type (parent_of (^^anon2)));
+ static_assert (is_union_type (parent_of (parent_of (^^anon2))));
+ static_assert (parent_of (parent_of (parent_of (^^anon2))) == ^^::);
+ static_assert (is_union_type (parent_of (^^anon3)));
+ static_assert (is_union_type (parent_of (parent_of (^^anon3))));
+ static_assert (is_union_type (parent_of (parent_of (parent_of (^^anon3)))));
+ static_assert (parent_of (parent_of (parent_of (parent_of (^^anon3)))) == ^^::);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parm1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parm1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parm1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parm1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,56 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections as function parameters.
+ 
+ #include <meta>
+ 
+ // FIXME PR62244
+ //consteval int fn(decltype(^^::) x = ^^x) { return 0; }
+ //constexpr int x = fn ();
+ 
+ consteval auto
+ ref (std::meta::info r)
+ {
+   return r;
+ }
+ 
+ consteval std::meta::info
+ def (std::meta::info r = std::meta::info(^^int))
+ {
+   return r;
+ }
+ 
+ consteval std::meta::info
+ def2 (std::meta::info r = ^^int)
+ {
+   return r;
+ }
+ 
+ void
+ g (int p)
+ {
+   constexpr auto r = ref (^^int);
+   [: r :] i1 = 42;  // { dg-error "expected a reflection of an expression" }
+   typename [: r :] i2 = 42;
+   [: ref (r) :] i3 = 42;  // { dg-error "expected a reflection of an expression" }
+ 
+   constexpr auto r2 = def ();
+   [: r2 :] i4 = 42;  // { dg-error "expected a reflection of an expression" }
+   typename [: r2 :] i5 = 42;
+   [: def () :] i6 = 42;  // { dg-error "expected a reflection of an expression" }
+ 
+   constexpr auto r3 = def2 ();
+   [: r3 :] i7 = 42;  // { dg-error "expected a reflection of an expression" }
+   typename [: r3 :] i8 = 42;
+   [: def2 () :] i9 = 42;  // { dg-error "expected a reflection of an expression" }
+ 
+   constexpr auto r4 = std::meta::info(^^int);
+   [: r4 :] i10 = 42;  // { dg-error "expected a reflection of an expression" }
+   typename [: r4 :] i11 = 42;
+ 
+   constexpr auto r5 = std::meta::info(r4);
+   [: r5 :] i12 = 42;  // { dg-error "expected a reflection of an expression" }
+   typename [: r5 :] i13 = 42;
+ 
+   constexpr auto r6 = ^^p;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parm2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parm2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parm2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parm2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // From [dcl.fct.default].
+ 
+ using info = decltype(^^int);
+ 
+ int b;
+ class X {
+   int a;
+   int mem1(int i = a);    // { dg-error "invalid use of non-static data member .X::a." }
+   int mem2(int i = b);    // OK; use X::b
+   consteval void mem3(info r = ^^a) {};    // OK
+   int mem4(int i = [:^^a:]); // { dg-error "cannot implicitly reference" }
+ 
+   static int b;
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parm3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parm3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parm3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parm3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,33 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test invoking functions with a reflection argument.
+ 
+ using info = decltype(^^int);
+ 
+ consteval void foo (info) { }
+ constexpr void bar (info) { } // { dg-error "function of consteval-only type must be declared .consteval." }
+ void baz (info) { }  // { dg-error "function of consteval-only type must be declared .consteval." }
+ 
+ void
+ f ()
+ {
+   foo (^^void);
+   bar (^^void);  // { dg-error "consteval-only expressions" }
+   baz (^^void);  // { dg-error "consteval-only expressions" }
+ }
+ 
+ constexpr void
+ g ()
+ {
+   foo (^^void);
+   bar (^^void);  // { dg-error "consteval-only expressions" }
+   baz (^^void);  // { dg-error "consteval-only expressions" }
+ }
+ 
+ consteval void
+ h ()
+ {
+   foo (^^void);
+   bar (^^void);
+   baz (^^void);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parm4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parm4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/parm4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/parm4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,32 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test invoking functions with a reflection argument.
+ 
+ using info = decltype(^^int);
+ 
+ struct S {
+   int mfn0 (info) { return 0; }  // { dg-error "function of consteval-only type must be declared .consteval." }
+   constexpr int mfn1 (info) { return 1; }  // { dg-error "function of consteval-only type must be declared .consteval." }
+   consteval int mfn2 (info) { return 2; }
+   int mfn3 (int, info) { return 0; }  // { dg-error "function of consteval-only type must be declared .consteval." }
+   info mfn4 () { return ^^int; }  // { dg-error "consteval-only expressions|function of consteval-only type must be declared .consteval." }
+ };
+ 
+ void
+ g (S s)
+ {
+   int i0 = s.mfn0 (^^int);  // { dg-error "consteval-only expressions" }
+   constexpr int i1 = s.mfn1 (^^int);
+   constexpr int i2 = s.mfn2 (^^int);
+   int i3 = s.mfn3 (42, ^^int);  // { dg-error "consteval-only expressions" }
+   info i4 = s.mfn4 ();  // { dg-error "consteval-only variable" }
+ }
+ 
+ template<typename T>
+ int fn (T) { return 4; } // { dg-error "function of consteval-only type must be declared .consteval." }
+ const int a = fn (^^int); // { dg-error "consteval-only expressions" }
+ int b = fn (^^int); // { dg-error "consteval-only expressions" }
+ 
+ template<typename T>
+ T fn2 () { return ^^void; } // { dg-error "consteval-only" }
+ const info i = fn2<info>(); // { dg-error "consteval-only variable" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/pr122634-1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/pr122634-1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/pr122634-1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/pr122634-1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,65 ----
+ // PR c++/122634
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A { int a; };
+ namespace N { struct B { int b; }; }
+ struct C : typename [: ^^A :] {};
+ struct D : [: ^^A :] {};
+ struct E : [: ^^N :] :: B {};
+ struct F : [: ^^:: :] :: A {};
+ struct G : public typename [: ^^A :] {};
+ struct H : public [: ^^A :] {};
+ struct I : public [: ^^N :] :: B {};
+ struct J : public [: ^^:: :] :: A {};
+ template <auto I>
+ struct K : typename [: I :] {};
+ template <auto I>
+ struct L : [: I :] {};
+ template <auto I>
+ struct M : [: I :] :: B {};
+ template <auto I>
+ struct O : [: I :] :: A {};
+ template <auto I>
+ struct P : public typename [: I :] {};
+ template <auto I>
+ struct Q : public [: I :] {};
+ template <auto I>
+ struct R : public [: I :] :: B {};
+ template <auto I>
+ struct S : public [: I :] :: A {};
+ 
+ constexpr access_context ctx = access_context::unprivileged ();
+ static_assert (type_of (bases_of (^^C, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^D, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^E, ctx)[0]) == ^^N::B);
+ static_assert (type_of (bases_of (^^F, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^G, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^H, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^I, ctx)[0]) == ^^N::B);
+ static_assert (type_of (bases_of (^^J, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^K <^^A>, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^L <^^A>, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^M <^^N>, ctx)[0]) == ^^N::B);
+ static_assert (type_of (bases_of (^^O <^^::>, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^P <^^A>, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^Q <^^A>, ctx)[0]) == ^^A);
+ static_assert (type_of (bases_of (^^R <^^N>, ctx)[0]) == ^^N::B);
+ static_assert (type_of (bases_of (^^S <^^::>, ctx)[0]) == ^^A);
+ 
+ int
+ foo (C &c, D &d, E &e, F &f, G &g, H &h, I &i, J &j)
+ {
+   return c.a + d.a + e.b + f.a + g.a + h.a + i.b + j.a;
+ }
+ 
+ int
+ bar (K <^^A> &k, L <^^A> &l, M <^^N> &m, O <^^::> &o,
+      P <^^A> &p, Q <^^A> &q, R <^^N> &r, S <^^::> &s)
+ {
+   return k.a + l.a + m.b + o.a + p.a + q.a + r.b + s.a;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/pr122634-2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/pr122634-2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/pr122634-2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/pr122634-2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,10 ----
+ // PR c++/122634
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ namespace N { struct A {}; }
+ struct B : typename [: ^^N :] :: A {};	// { dg-error "keyword 'typename' not allowed outside of templates" }
+ template <auto I>
+ struct C : typename [: ^^N :] :: A {}; 	// { dg-error "keyword 'typename' not allowed in this context" }
+ template <auto I>
+ struct D : typename [: I :] :: A {}; 	// { dg-error "keyword 'typename' not allowed in this context" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/qrn1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/qrn1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/qrn1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/qrn1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,272 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on reflection-names.
+ //   reflection-name:
+ //    nested-name-specifier[opt] identifier
+ //    nested-name-specifier template identifier
+ 
+ int i;
+ using T = int;
+ typedef int TY;
+ 
+ template<typename T>
+ concept F = requires { typename T::type; };
+ 
+ template<typename T>
+ void foo (T) { }
+ 
+ void bar () { }
+ 
+ template<typename T>
+ T V{};
+ 
+ enum E { E1 };
+ struct S {
+   static constexpr int i = 42;
+   using type = int;
+ };
+ template<typename T>
+ struct C {
+   static constexpr T t{};
+   using type = T;
+ };
+ 
+ using US = S;
+ using UC = C<int>;
+ 
+ template<typename T>
+ using AT = C<T>;
+ 
+ namespace N {
+   int n;
+   using W = int;
+ 
+   template<typename T>
+   concept FF = requires { typename T::type; };
+ 
+   namespace M {
+     int m;
+     using WW = int;
+     enum EE { EE1 };
+     struct SS {
+       static constexpr int i = 42;
+       using type = int;
+     };
+     template<typename T>
+     struct CC {
+       static constexpr T t{};
+       using type = T;
+     };
+ 
+     using NMSS = SS;
+     using NMCC = CC<int>;
+   }
+ };
+ 
+ namespace NN = N;
+ 
+ // nested-name-specifier[opt] identifier
+ void
+ f1 (S s)
+ {
+   constexpr auto m0 = ^^::N::M;
+   constexpr auto m1 = ^^N::M;
+   constexpr auto m2 = ^^N;
+   constexpr auto m3 = ^^NN;
+   constexpr auto m4 = ^^::N;
+   constexpr auto m5 = ^^::NN;
+ 
+   [: m0 :]::m = 0;
+   [: m0 :]::WW v37 = 0;
+   [: m1 :]::m = 0;
+   [: m1 :]::WW v32 = 0;
+   [: m2 :]::n = 0;
+   [: m2 :]::W v33 = 0;
+   [: m3 :]::n = 0;
+   [: m3 :]::W v34 = 0;
+   [: m4 :]::n = 0;
+   [: m4 :]::W v35 = 0;
+   [: m5 :]::n = 0;
+   [: m5 :]::W v36 = 0;
+ 
+   constexpr auto r1 = ^^i;
+   constexpr auto r2 = ^^::i;
+   constexpr auto r3 = ^^T;
+   constexpr auto r4 = ^^::T;
+   constexpr auto r5 = ^^::TY;
+   constexpr auto r6 = ^^E::E1;
+   constexpr auto r7 = ^^S::i;
+   constexpr auto r8 = ^^S::type;
+   constexpr auto r9 = ^^C<int>::t;
+   constexpr auto r10 = ^^C<int>::type;
+   constexpr auto r11 = ^^US::i;
+   constexpr auto r12 = ^^US::type;
+   constexpr auto r13 = ^^UC::t;
+   constexpr auto r14 = ^^UC::type;
+   constexpr auto r15 = ^^N::n;
+   constexpr auto r16 = ^^N::W;
+   constexpr auto r17 = ^^NN::n;
+   constexpr auto r18 = ^^NN::W;
+   constexpr auto r19 = ^^decltype(s)::i;
+   constexpr auto r20 = ^^decltype(s)::type;
+   // For pack-indexing, see pack-index1.C.
+   constexpr auto rs = ^^S;
+   constexpr auto r21 = ^^[: rs :]::type;
+   constexpr auto r22 = ^^typename [: rs :]::type;
+   constexpr auto rc = ^^C;
+   constexpr auto r23 = ^^[: rc :]<int>::type;  // { dg-error "missing .template.|declared" }
+   constexpr auto r24 = ^^typename [: rc :]<int>::type;
+   constexpr auto r25 = ^^::N::n;
+   constexpr auto r26 = ^^::N::W;
+   constexpr auto r27 = ^^N::M::m;
+   constexpr auto r28 = ^^N::M::WW;
+   constexpr auto r29 = ^^N::M::EE;
+   constexpr auto r30 = ^^N::M::EE::EE1;
+   constexpr auto r31 = ^^[: m1 :]::EE::EE1;
+   constexpr N::M::SS ss{};
+   constexpr auto r32 = ^^decltype(ss)::type;
+   constexpr N::M::CC<int> cc{};
+   constexpr auto r33 = ^^decltype(cc)::type;
+   constexpr auto r34 = ^^N::M::SS::type;
+   constexpr auto r35 = ^^N::M::CC<int>::type;
+   constexpr auto r36 = ^^N::M::NMSS::type;
+   constexpr auto r37 = ^^N::M::NMCC::type;
+   constexpr auto r38 = ^^[: m1 :]::SS::type;
+   constexpr auto r39 = ^^typename [: m1 :]::SS::type;
+   constexpr auto r40 = ^^[: m1 :]::CC<int>::type;
+   constexpr auto r41 = ^^typename [: m1 :]::CC<int>::type;
+   constexpr auto r42 = ^^::C<int>::type;
+ 
+   [: r1 :] = 42;
+   ++[: r2 :];
+   typename [: r3 :] v1 = 3;
+   typename [: r4 :] v2 = 2;
+   typename [: r5 :] v3 = 1;
+   int n = [: r6 :];
+   n += [: r7 :];
+   typename [: r8 :] v5 = 1;
+   n += [: r9 :];
+   typename [: r10 :] v6 = 4;
+   n += [: r11 :];
+   typename [: r12 :] v7 = 4;
+   n += [: r13 :];
+   typename [: r14 :] v8 = 4;
+   [: r15 :]++;
+   typename [: r16 :] v9 = 4;
+   --[: r17 :];
+   typename [: r18 :] v10 = 4;
+   n *= [: r19 :];
+   typename [: r20 :] v11 = 4;
+   typename [: r21 :] v12 = 4;
+   typename [: r22 :] v13 = 4;
+   typename [: r24 :] v15 = 4;
+   [: r25 :]--;
+   typename [: r26 :] v16 = 7;
+   [: r27 :] = 1;
+   typename [: r28 :] v17 = 7;
+   typename [: r29 :] v18;
+   v18 = [: r30 :];
+   v18 = [: r31 :];
+   typename [: r32 :] v19 = 7;
+   typename [: r33 :] v20 = 7;
+   typename [: r34 :] v21 = 7;
+   typename [: r35 :] v22 = 7;
+   typename [: r36 :] v23 = 7;
+   typename [: r37 :] v24 = 7;
+   typename [: r38 :] v25 = 7;
+   typename [: r39 :] v26 = 7;
+   typename [: r40 :] v27 = 7;
+   typename [: r41 :] v28 = 7;
+   typename [: r42 :] v29 = 7;
+ 
+   constexpr auto r46 = ^^::F;
+   constexpr auto r47 = ^^::F;
+   constexpr auto r48 = ^^N::FF;
+   constexpr auto r49 = ^^::N::FF;
+   constexpr auto r50 = ^^NN::FF;
+   constexpr auto r51 = ^^::NN::FF;
+ 
+   constexpr auto r52 = ^^C;
+   constexpr auto r53 = ^^C<int>;
+   constexpr auto r54 = ^^::C;
+   constexpr auto r55 = ^^::template C;
+   constexpr auto r56 = ^^::C<int>;
+   constexpr auto r57 = ^^::template C<int>;
+ 
+   typename [: r53 :] c1;
+   typename [: r56 :] c2;
+   typename [: r57 :] c3;
+ 
+   constexpr auto r58 = ^^foo;
+   constexpr auto r59 = ^^::foo;
+ 
+   constexpr auto r60 = ^^V;
+   constexpr auto r61 = ^^::V;
+ 
+   constexpr auto r62 = ^^AT;
+   constexpr auto r63 = ^^::AT;
+ 
+   constexpr auto r64 = ^^bar;
+   constexpr auto r65 = ^^::bar;
+ }
+ 
+ // nested-name-specifier template identifier
+ consteval void
+ f2 ()
+ {
+   constexpr auto r1 = ^^::template C<int>;
+   constexpr auto r2 = ^^::template C<int>::type;
+   constexpr auto r3 = ^^N::M::template CC<int>::type;
+   constexpr auto r4 = ^^N::M::template CC<int>::t;
+   constexpr auto r5 = ^^N::M::template CC;
+   constexpr auto r6 = ^^NN::M::template CC<int>::type;
+   constexpr auto r7 = ^^NN::M::template CC<int>::t;
+   constexpr auto r8 = ^^NN::M::template CC;
+ 
+   // clang rejects these.
+   constexpr auto r9 = ^^N::M::template NMCC::type;
+   constexpr auto r10 = ^^N::M::template NMCC::t;
+   constexpr auto r11 = ^^N::M::template NMCC;
+   constexpr auto r12 = ^^NN::M::template NMCC::type;
+   constexpr auto r13 = ^^NN::M::template NMCC::t;
+   constexpr auto r14 = ^^NN::M::template NMCC;
+   //constexpr auto r15 = ^^::template UC;
+   constexpr auto r16 = ^^::template UC::type;
+ 
+   typename [: r2 :] v1 = 7;
+   typename [: r3 :] v2 = 7;
+   int n = [: r4 :];
+   typename [: r6 :] v3 = 1;
+   n += [: r7 :];
+ }
+ 
+ template<typename T>
+ void
+ f3 (T t)
+ {
+   /* Otherwise, if the identifier names a type alias that was introduced
+      by the declaration of a template parameter, R represents the underlying
+      entity of that type alias.
+      So the reflection here should reflect the targ (int), not T itself?  */
+   constexpr auto r = ^^T;
+   static_assert (r == ^^int);
+ }
+ 
+ struct B {
+   unsigned int a:32;
+   unsigned int:32;
+ };
+ 
+ void
+ f4 ()
+ {
+   constexpr auto r = ^^B::a;
+ }
+ 
+ void
+ g ()
+ {
+   f1 (S{});
+   f2 ();
+   f3 (42);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/qrn2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/qrn2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/qrn2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/qrn2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,43 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on reflection-names.  Invalid code.
+ 
+ class A { int x; };
+ template<typename T>
+ class B { T x; };
+ struct C { int x; };
+ template<typename T>
+ struct D { T x; };
+ 
+ template<typename T>
+ void foo (T) { }
+ 
+ template<typename T>
+ void foo (T, T) { }
+ 
+ void bar (int) { }
+ void bar (int, int) { }
+ 
+ void
+ g ()
+ {
+   constexpr auto r1 = ^^A::x;	  // { dg-error "private within this context" }
+   constexpr auto r2 = ^^B<int>::x;  // { dg-error "private within this context" }
+ 
+   constexpr auto r3 = ^^C::x;
+   int i1 = [: r3 :];	  // { dg-error "cannot implicitly reference a class member .C::x. through a splice" }
+   [: r3 :];		  // { dg-error "cannot implicitly reference a class member .C::x. through a splice" }
+   [: r3 :] = 0;		  // { dg-error "cannot implicitly reference a class member .C::x. through a splice" }
+ 
+   constexpr auto r4 = ^^foo;  // { dg-error "reflection of an overload set" }
+   constexpr auto r5 = ^^bar;  // { dg-error "reflection of an overload set" }
+   constexpr auto r6 = ^^D::x; // { dg-error "expected" }
+   constexpr auto r7 = ^^D<int>::x;
+   [: r7 :];   // { dg-error "cannot implicitly reference a class member .D<int>::x. through a splice" }
+ }
+ 
+ void
+ f ()
+ {
+   g ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/range_args.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/range_args.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/range_args.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/range_args.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,96 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_constructible_type.
+ 
+ #include <array>
+ #include <forward_list>
+ #include <list>
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template <class... Args>
+ struct SupportArgs { 
+   SupportArgs (Args...) noexcept;
+ 
+   int operator() (Args...) noexcept;
+ };
+ 
+ void error();
+ 
+ template<typename Rg>
+ consteval bool
+ test_type_range(Rg&& rg)
+ {
+   info _ = common_type(rg);
+   info _ = common_reference(rg);
+       
+   if (!can_substitute (^^SupportArgs, rg)) error();
+   auto target = substitute(^^SupportArgs, rg);
+   if (!is_constructible_type (target, rg)) error();
+   if (!is_nothrow_constructible_type (target, rg)) error();
+   if (!!is_trivially_constructible_type (target, rg)) error();
+ 
+   auto result = invoke_result(target, rg);
+   if (!is_invocable_type (target, rg)) error();
+   if (!is_invocable_r_type (result, target, rg)) error();
+   if (!is_nothrow_invocable_type (target, rg)) error();
+   if (!is_nothrow_invocable_r_type (result, target, rg)) error();
+   return true;
+ }
+ 
+ constexpr info vt[] = {^^int, ^^int, ^^float, ^^int, ^^float, ^^double};
+ static_assert (test_type_range (vt | std::views::filter (is_integral_type))); // bidirectional
+ static_assert (test_type_range (vt | std::views::take_while (is_integral_type))); // non-common
+ static_assert (test_type_range (vt | std::views::to_input)); // input
+ static_assert (test_type_range (vt | std::views::cache_latest)); // input, move-only
+ 
+ template<typename Rg>
+ consteval bool
+ test_value_range(Rg&& rg)
+ {
+   using V = std::ranges::range_value_t<Rg>;
+ 
+   info ra = reflect_constant_array(rg);
+   std::span<const V> va = define_static_array(rg);
+   if (extract<const V*>(ra) != va.data())
+     error();
+ 
+   info rs = reflect_constant_string(rg);
+   const V* vs = define_static_string(rg);
+   if (extract<const V*>(rs) != vs)
+     error();
+ 
+   return true;
+ }
+ 
+ constexpr std::span<const char> vv = "abcd01234";
+ constexpr bool not_digit(char c) {
+   return c < '0' || c > '9';
+ }
+ 
+ static_assert (test_value_range (vv | std::views::filter (not_digit))); // bidirectional
+ static_assert (test_value_range (vv | std::views::take_while (not_digit))); // non-common
+ static_assert (test_value_range (vv | std::views::to_input)); // input
+ static_assert (test_value_range (vv | std::views::cache_latest)); // input, move-only
+ 								 
+ template<int> struct Aggr;
+ constexpr info dmt[] = {
+   data_member_spec(^^int, {.name = "a"}),
+   data_member_spec(^^int, {.name = "b"}),
+   data_member_spec(^^float, {.name = "c"}),
+   data_member_spec(^^double, {.name = "d"}),
+ };
+ consteval bool of_int_type(info dm) {
+   return type_of(dm) == ^^int;
+ }
+ 
+ consteval {
+   define_aggregate (^^Aggr<0>, dmt | std::views::filter (of_int_type)); // bidirectional
+   define_aggregate (^^Aggr<1>, dmt | std::views::take_while (of_int_type)); // non-common
+   define_aggregate (^^Aggr<2>, dmt | std::views::to_input); // input
+   define_aggregate (^^Aggr<3>, dmt | std::views::cache_latest); // input, move-only
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ template<auto D>
+   struct A { };
+ 
+ struct N { int x; };
+ struct K { char const* p; };
+ 
+ 
+ constexpr info r1 = reflect_constant(42);
+ static_assert(is_value(r1));
+ static_assert(r1 == template_arguments_of(^^A<42>)[0]);
+ 
+ constexpr info r2 = reflect_constant(N{42});
+ static_assert(is_object(r2));
+ static_assert(r2 == template_arguments_of(^^A<N{42}>)[0]);
+ 
+ constexpr info r3 = reflect_constant(K{nullptr});   // OK
+ static_assert(is_object(r3));
+ constexpr info r4 = reflect_constant(K{"ebab"});    // { dg-error "uncaught exception" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,31 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr auto one = reflect_constant(1);
+ static_assert ([:one:] == 1);
+ 
+ template<info> struct S {};
+ template<info> void foo () {}
+ 
+ template<int P>
+ void
+ fn_tmpl ()
+ {
+   static_assert(is_value(reflect_constant(P)));
+   static_assert(!is_object(reflect_constant(P)));
+   static_assert(type_of(reflect_constant(P)) == ^^int);
+   static_assert([:reflect_constant(P):] == 1);
+ }
+ 
+ void
+ g ()
+ {
+   S<reflect_constant (nullptr)> s;
+   foo<reflect_constant (nullptr)>();
+   fn_tmpl<1>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,67 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ static_assert ([:reflect_constant (42):] == 42);
+ static_assert (type_of (reflect_constant (42)) == ^^int);
+ static_assert (is_value (reflect_constant (42)));
+ static_assert (!is_object (reflect_constant (42)));
+ 
+ enum E { A = 42 };
+ static_assert ([:reflect_constant (A):] == A);
+ static_assert (type_of (reflect_constant (E::A)) == ^^E);
+ static_assert (is_value (reflect_constant (E::A)));
+ static_assert (!is_object (reflect_constant (E::A)));
+ 
+ enum class EC { A = 42 };
+ static_assert ([:reflect_constant (EC::A):] == EC::A);
+ static_assert (type_of (reflect_constant (EC::A)) == ^^EC);
+ static_assert (is_value (reflect_constant (EC::A)));
+ static_assert (!is_object (reflect_constant (EC::A)));
+ 
+ const int i = 42;
+ static_assert ([:reflect_constant (i):] == i);
+ static_assert (type_of (reflect_constant (i)) == ^^int);
+ static_assert (is_value (reflect_constant (i)));
+ static_assert (!is_object (reflect_constant (i)));
+ 
+ const int &r = 42;
+ static_assert ([:reflect_constant (r):] == r);
+ static_assert (type_of (reflect_constant (r)) == ^^int);
+ static_assert (is_value (reflect_constant (r)));
+ static_assert (!is_object (reflect_constant (r)));
+ 
+ constexpr int ci = 42;
+ static_assert ([:reflect_constant (ci):] == ci);
+ static_assert (type_of (reflect_constant (ci)) == ^^int);
+ static_assert (is_value (reflect_constant (ci)));
+ static_assert (!is_object (reflect_constant (ci)));
+ 
+ void fn() {}
+ static_assert ([:reflect_constant (&fn):] == &fn);
+ static_assert (type_of (reflect_constant (&fn)) == ^^void(*)());
+ static_assert (is_value (reflect_constant (&fn)));
+ static_assert (!is_object (reflect_constant (&fn)));
+ 
+ constexpr int cfn () { return 42; }
+ static_assert ([:reflect_constant (cfn ()):] == 42);
+ static_assert (type_of (reflect_constant (cfn ())) == ^^int);
+ static_assert (is_value (reflect_constant (cfn ())));
+ static_assert (!is_object (reflect_constant (cfn ())));
+ 
+ struct S {
+   int k;
+   void fn();
+ };
+ static_assert ([:reflect_constant (&S::k):] == &S::k);
+ static_assert (type_of (reflect_constant (&S::k)) == ^^int (S::*));
+ static_assert (is_value (reflect_constant (&S::k)));
+ static_assert (!is_object (reflect_constant (&S::k)));
+ static_assert ([:reflect_constant (&S::fn):] == &S::fn);
+ static_assert (type_of (reflect_constant (&S::fn)) == ^^void (S::*)());
+ static_assert (is_value (reflect_constant (&S::fn)));
+ static_assert (!is_object (reflect_constant (&S::fn)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int i;
+ int foo ();
+ struct S {};
+ 
+ constexpr auto r1 = reflect_constant (i); // { dg-error "not usable in a constant expression" }
+ constexpr auto r2 = reflect_constant (foo ()); // { dg-error "call to non-.constexpr." }
+ constexpr auto r3 = reflect_constant (S); // { dg-error "expected" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {};
+ constexpr auto r = reflect_constant (S{});
+ S s = [:r:];
+ static_assert (!is_value (r));
+ static_assert (is_object (r));
+ 
+ struct R { int i; };
+ constexpr auto rr = reflect_constant (R{42});
+ static_assert ([:rr:].i == 42);
+ static_assert (!is_value (rr));
+ static_assert (is_object (rr));
+ 
+ static_assert (is_value (reflect_constant (nullptr_t{})));
+ static_assert (!is_object (reflect_constant (nullptr_t{})));
+ static_assert (is_value (reflect_constant (auto(42))));
+ static_assert (!is_object (reflect_constant (auto(42))));
+ constexpr int foo () { return 42; }
+ static_assert (is_value (reflect_constant (foo ())));
+ static_assert (!is_object (reflect_constant (foo ())));
+ static constexpr int i = 0;
+ static_assert (is_value (reflect_constant (&i)));
+ static_assert (!is_object (reflect_constant (&i)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,46 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant.  The glvalue-to-prvalue conversion may have
+ // side-effects as part of the constant expression evaluation that the call to
+ // reflect_constant is part of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct B {
+   int *const p;
+   consteval B(int *p) : p(p) {}
+ };
+ 
+ consteval int g() {
+   int x = 42;
+   B b(&x);
+   reflect_constant (b);
+   return x;
+ }
+ static_assert(g() == 43); // { dg-error "uncaught exception|non-constant" }
+ 
+ struct A {
+   int *const p;
+   consteval A(int *p) : p(p) {}
+   consteval A(const A &oth) : p(nullptr) {
+     if (oth.p) {
+       ++*oth.p;
+     }
+   }
+ };
+ 
+ consteval int f() {
+   int x = 42;
+   A a(&x);
+   reflect_constant (a);
+   return x;
+ }
+ 
+ // FIXME Clang++ accepts this, but we throw: we think that the temporary
+ // argument to reflect_constant can't be a NTTP.
+ // As reflect_constant accept by value, the parameter of reflect_constant(a)
+ // is copy-initialized with a, which set p to nullptr, i.e. we no longer 
+ // have pointer to stack variable.
+ static_assert(f() == 43); // { dg-error "uncaught exception|non-constant" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct A {
+   int *const p;
+   constexpr A(int *p) : p(p) { delete p; }
+   constexpr A(const A &) : p(0) {}
+ };
+ 
+ consteval info f() {
+   return reflect_constant<A>(new int);
+ }
+ 
+ const A &a = [:f():];
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,33 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ // Not copy-constructible.
+ struct S {
+   S();
+   S(const S&) = delete;
+ };
+ 
+ constexpr info r1 = reflect_constant (S{}); // { dg-error "no matching function for call" }
+ 
+ // Not copy-constructible.
+ struct S2 {
+   S2();
+   S2(S2&) = delete;
+ };
+ 
+ constexpr info r2 = reflect_constant (S2{}); // { dg-error "no matching function for call" }
+ 
+ volatile constexpr int vi = 42;
+ constexpr info r3 = reflect_constant (vi); // { dg-error "lvalue-to-rvalue conversion" }
+ 
+ // Not a structural type.
+ struct M {
+   mutable int i;
+ };
+ constexpr info r4 = reflect_constant (M{42}); // { dg-error ".M. must be a cv-unqualified structural type" }
+ 
+ // { dg-error "use of deleted function" "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,33 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Per N5014 [temp.arg.nontype] copying an template
+ // parameter object of class type must produce structurally
+ // equivalent values, but both clang and GCC does not seem
+ // to implement that.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A {
+   int x;
+   constexpr A(int p) : x(p) {}
+   constexpr A(const A &oth) : x(oth.x ? oth.x-1 : oth.x) {
+   }
+ };
+ 
+ consteval bool
+ can_reflect_constant (int x)
+ {
+   try { reflect_constant (A(x)); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ // FIXME
+ // This should pass, with A::x being zero, copies are equivalent.
+ static_assert(!can_reflect_constant(0));
+ // As neither GCC and clang see to implement the aforementioned
+ // rule, I believe all should work.
+ static_assert(!can_reflect_constant(1));
+ static_assert(!can_reflect_constant(4));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_array1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_array1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_array1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_array1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,110 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant_array.
+ 
+ #include <array>
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ 
+ using namespace std::meta;
+ 
+ struct V { int a, b, c; };
+ constexpr auto a = reflect_constant_array ("abcd");
+ constexpr auto b = reflect_constant_array (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}");
+ constexpr auto c = reflect_constant_array (std::vector <char> {});
+ constexpr auto d = reflect_constant_array (std::array { 1, 2, 42, 3 });
+ constexpr float ea[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f };
+ constexpr auto e = reflect_constant_array (ea);
+ constexpr int fb[] = { 1, 2, 3, 4, 5, 6 };
+ constexpr std::span <const int> fa (fb);
+ constexpr auto f = reflect_constant_array (fa);
+ constexpr auto g = reflect_constant_array (fa.subspan (1, 4));
+ constexpr auto h = reflect_constant_array (fa.subspan (1, 4) | std::views::reverse);
+ constexpr auto i = reflect_constant_array (std::vector <V> { V { 1, 2, 3 }, V { 2, 3, 4 }, V { 3, 4, 5 } });
+ static_assert (a == reflect_constant_string ("abcd"));
+ static_assert (b == reflect_constant_string (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}"));
+ static_assert (c == reflect_constant_array (std::vector <char> {}));
+ static_assert (d == reflect_constant_array (std::vector <int> { 1, 2, 42, 3 }));
+ static_assert (e == reflect_constant_array (std::array { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }));
+ static_assert (f == reflect_constant_array (std::vector <int> { 1, 2, 3, 4, 5, 6 }));
+ static_assert (d != f);
+ static_assert (g == reflect_constant_array (std::array { 2, 3, 4, 5 }));
+ static_assert (h == reflect_constant_array (std::vector <int> { 5, 4, 3, 2 }));
+ //static_assert (i == reflect_constant_array (std::vector <V> { V { 1, 2, 3 }, V { 2, 3, 4 }, V { 3, 4, 5 } }));
+ static_assert (is_variable (a));
+ static_assert (is_variable (b));
+ static_assert (is_variable (c));
+ static_assert (is_variable (d));
+ static_assert (is_variable (e));
+ static_assert (is_variable (f));
+ static_assert (is_variable (g));
+ static_assert (is_variable (h));
+ static_assert (is_variable (i));
+ static_assert (type_of (a) == ^^const char [5]);
+ static_assert (type_of (b) == ^^const char32_t [9]);
+ static_assert (type_of (c) == ^^const std::array <char, 0>);
+ static_assert (type_of (d) == ^^const int [4]);
+ static_assert (type_of (e) == ^^const float [6]);
+ static_assert (type_of (f) == ^^const int [6]);
+ static_assert (type_of (g) == ^^const int [4]);
+ static_assert (type_of (h) == ^^const int [4]);
+ static_assert (type_of (i) == ^^const V [3]);
+ auto as = &[: a :];
+ auto bs = &[: b :];
+ auto cs = &[: c :];
+ auto ds = &[: d :];
+ auto es = &[: e :];
+ auto fs = &[: f :];
+ auto gs = &[: g :];
+ auto hs = &[: h :];
+ auto is = &[: i :];
+ 
+ int
+ main ()
+ {
+   if (std::string_view (*as) != std::string_view ("abcd"))
+     __builtin_abort ();
+   if (std::u32string_view (*bs) != std::u32string_view (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}"))
+     __builtin_abort ();
+   for (const char &x : *cs)
+     __builtin_abort ();
+   int i = 0;
+   for (const int &x : *ds)
+     if (x != "\x{1}\x{2}\x{2a}\x{3}"[i++])
+       __builtin_abort ();
+   if (i != 4)
+     __builtin_abort ();
+   i = 0;
+   for (const float &x : *es)
+     if (x != ++i)
+       __builtin_abort ();
+   if (i != 6)
+     __builtin_abort ();
+   i = 0;
+   for (const int &x : *fs)
+     if (x != ++i)
+       __builtin_abort ();
+   if (i != 6)
+     __builtin_abort ();
+   i = 1;
+   for (const int &x : *gs)
+     if (x != ++i)
+       __builtin_abort ();
+   if (i != 5)
+     __builtin_abort ();
+   i = 6;
+   for (const int &x : *hs)
+     if (x != --i)
+       __builtin_abort ();
+   if (i != 2)
+     __builtin_abort ();
+   i = 0;
+   for (const V &x : *is)
+     if (x.a != i + 1 || x.b != i + 2 || x.c != i + 3)
+       __builtin_abort ();
+     else
+       ++i;
+   if (i != 3)
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_array2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_array2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_array2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_array2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant_string.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ 
+ using namespace std::meta;
+ 
+ struct A { int a, b; mutable int c; };
+ constexpr auto a = reflect_constant_array (std::vector <A> { A { 1, 2, 3 } });
+ // { dg-error "'reflect_constant_array' argument with 'std::ranges::range_value_t<std::vector<A> >' \\\{aka 'A'\\\} which is not a structural type" "" { target *-*-* } .-1 }
+ struct B { constexpr B (int x, int y) : a (x), b (y) {} constexpr ~B () {} B (const B &) = delete; int a, b; };
+ constexpr B b[2] = { { 1, 2 }, { 2, 3 } };
+ constexpr auto c = reflect_constant_array (b);
+ // { dg-error "'reflect_constant_array' argument with 'std::ranges::range_value_t<const B \\\[2\\\]>' \\\{aka 'B'\\\} which is not copy constructible" "" { target *-*-* } .-1 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_array3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_array3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_array3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_array3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant_array.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ 
+ using namespace std::meta;
+ 
+ constexpr int arr[4]{1, 2, 3, 4};
+ constexpr info rarr = reflect_constant_array(std::span<const int, 4>(arr));
+ static_assert (constant_of(^^arr) == rarr);
+ 
+ constexpr int marr[2][2]{1, 2, 3, 4};
+ // LWG4483 multidimensional arrays
+ // constexpr info mrarr = reflect_constant_array(std::span<const int[2], 2>(marr));
+ // static_assert (constant_of(^^marr) == mrarr);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_array4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_array4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_array4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_array4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant_array.
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ constexpr int x[]{1,2,3,4,5};
+ constexpr int y[]{11,12,13,14,15};
+ constexpr auto as_pair = []<typename T1, typename T2>(const std::tuple<T1, T2>& t) static
+ { return std::pair<T1, T2>(t); };
+ 
+ constexpr info r = reflect_constant_array(std::views::zip (x, y) | std::views::transform (as_pair));
+ // FIXME this should be pass
+ // static_assert (type_of (^^r) == ^^const std::pair<int, int>[5]);
+ // static_assert ([: r :][2].first == 3);
+ // static_assert ([: r :][2].second == 13);
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_string1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_string1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_string1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_string1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,133 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant_string.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ 
+ using namespace std::meta;
+ 
+ constexpr auto a = reflect_constant_string ("abcd");
+ constexpr auto b = reflect_constant_string (u8"abcd\N{LATIN SMALL LETTER AE}");
+ constexpr auto c = reflect_constant_string (L"abcd");
+ constexpr auto d = reflect_constant_string (u"abcd\0ef");
+ constexpr auto e = reflect_constant_string (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}");
+ constexpr auto f = reflect_constant_string (std::string_view ("abcd", 5));
+ constexpr auto g = reflect_constant_string (std::string_view ("abcdefg", 4));
+ constexpr auto h = reflect_constant_string (std::u8string_view (u8"ab\0\N{LATIN SMALL LETTER AE}", 5));
+ constexpr auto i = reflect_constant_string (std::string_view ("abcdefgh", 9).substr (0, 5));
+ constexpr auto j = reflect_constant_string (std::string_view ("abcdefgh", 9).substr (4, 3));
+ constexpr auto k = reflect_constant_string (std::u32string_view (U"abcdefgh", 9).substr (3, 4));
+ constexpr char8_t la[] = { u8'h', u8'e', u8'l', u8'l', u8'o', u8'\0' };
+ constexpr auto l = reflect_constant_string (la);
+ constexpr std::span <const char8_t> ma (la);
+ constexpr auto m = reflect_constant_string (ma);
+ constexpr auto n = reflect_constant_string (ma.subspan (1, 4));
+ constexpr auto o = reflect_constant_string (ma.subspan (1, 4) | std::views::reverse);
+ constexpr auto p = reflect_constant_string (std::vector <wchar_t> { L'W', L'o', L'r', L'l', L'd' });
+ constexpr auto q = reflect_constant_string (std::vector <char16_t> { u'e', u'x', u't', u'r', u'e', u'm', u'e', u'l', u'y',
+ 								     u' ', u'l', u'o', u'n', u'g',
+ 								     u' ', u's', u't', u'r', u'i', u'n', u'g',
+ 								     u' ', u'w', u'i', u't', u'h',
+ 								     u' ', u'n', u'o', u'n', u'-', u'A', u'S', u'C', u'I', u'I',
+ 								     u' ', u'c', u'h', u'a', u'r', u'a', u'c', u't', u'e', u'r', u's',
+ 								     u' ', u'\N{LATIN SMALL LETTER A WITH ACUTE}' });
+ static_assert (a == reflect_constant_string ("abcd"));
+ static_assert (b == reflect_constant_string (u8"abcd\N{LATIN SMALL LETTER AE}"));
+ static_assert (c == reflect_constant_string (L"abcd"));
+ static_assert (d == reflect_constant_string (u"abcd\0ef"));
+ static_assert (e == reflect_constant_string (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}"));
+ static_assert (f == reflect_constant_string ("abcd\0"));
+ static_assert (a != f);
+ static_assert (g == a);
+ static_assert (h == reflect_constant_string (u8"ab\0\N{LATIN SMALL LETTER AE}"));
+ static_assert (i == reflect_constant_string ("abcde"));
+ static_assert (a != i);
+ static_assert (j == reflect_constant_string ("efg"));
+ static_assert (a != j);
+ static_assert (k == reflect_constant_string (U"defg"));
+ static_assert (l == reflect_constant_string (u8"hello\0"));
+ static_assert (m == l);
+ static_assert (n == reflect_constant_string (u8"ello"));
+ static_assert (o == reflect_constant_string (u8"olle"));
+ static_assert (p == reflect_constant_string (L"World"));
+ static_assert (q == reflect_constant_string (u"extremely long string with non-ASCII characters \N{LATIN SMALL LETTER A WITH ACUTE}"));
+ static_assert (reflect_constant_string ("bar") != reflect_constant_string ("baz"));
+ static_assert (is_variable (a));
+ static_assert (is_variable (b));
+ static_assert (is_variable (c));
+ static_assert (is_variable (d));
+ static_assert (is_variable (e));
+ static_assert (is_variable (f));
+ static_assert (is_variable (g));
+ static_assert (is_variable (h));
+ static_assert (type_of (a) == ^^const char [5]);
+ static_assert (type_of (b) == ^^const char8_t [sizeof u8"abcd\N{LATIN SMALL LETTER AE}"]);
+ static_assert (type_of (c) == ^^const wchar_t [5]);
+ static_assert (type_of (d) == ^^const char16_t [8]);
+ static_assert (type_of (e) == ^^const char32_t [9]);
+ static_assert (type_of (f) == ^^const char [6]);
+ static_assert (type_of (g) == ^^const char [5]);
+ static_assert (type_of (h) == ^^const char8_t [6]);
+ static_assert (type_of (q) == ^^const char16_t [50]);
+ auto as = &[: a :];
+ auto bs = &[: b :];
+ auto cs = &[: c :];
+ auto ds = &[: d :];
+ auto es = &[: e :];
+ auto fs = &[: f :];
+ auto gs = &[: g :];
+ auto hs = &[: h :];
+ auto is = &[: i :];
+ auto js = &[: j :];
+ auto ks = &[: k :];
+ auto ls = &[: l :];
+ auto ms = &[: m :];
+ auto ns = &[: n :];
+ auto os = &[: o :];
+ auto ps = &[: p :];
+ auto qs = &[: q :];
+ 
+ int
+ main ()
+ {
+   if (std::string_view (*as) != std::string_view ("abcd"))
+     __builtin_abort ();
+   if (std::u8string_view (*bs) != std::u8string_view (u8"abcd\N{LATIN SMALL LETTER AE}"))
+     __builtin_abort ();
+   if (std::wstring_view (*cs) != std::wstring_view (L"abcd"))
+     __builtin_abort ();
+   if (std::u16string_view (*ds) != std::u16string_view (u"abcd\0ef"))
+     __builtin_abort ();
+   if (std::u32string_view (*es) != std::u32string_view (U"abcd\0ef\N{LATIN CAPITAL LETTER AE}"))
+     __builtin_abort ();
+   if (std::string_view (*fs) != std::string_view ("abcd\0"))
+     __builtin_abort ();
+   if (gs != as)
+     __builtin_abort ();
+   if (std::u8string_view (*hs) != std::u8string_view (u8"ab\0\N{LATIN SMALL LETTER AE}"))
+     __builtin_abort ();
+   if (std::string_view (*is) != std::string_view ("abcde"))
+     __builtin_abort ();
+   if ((const char *) as == (const char *) is)
+     __builtin_abort ();
+   if (std::string_view (*js) != std::string_view ("efg"))
+     __builtin_abort ();
+   if ((const char *) as == (const char *) js)
+     __builtin_abort ();
+   if (std::u32string_view (*ks) != std::u32string_view (U"defg"))
+     __builtin_abort ();
+   if (std::u8string_view (*ls) != std::u8string_view (u8"hello\0"))
+     __builtin_abort ();
+   if (ms != ls)
+     __builtin_abort ();
+   if (std::u8string_view (*ns) != std::u8string_view (u8"ello"))
+     __builtin_abort ();
+   if (std::u8string_view (*os) != std::u8string_view (u8"olle"))
+     __builtin_abort ();
+   if (std::wstring_view (*ps) != std::wstring_view (L"World"))
+     __builtin_abort ();
+   if (std::u16string_view (*qs) != std::u16string_view (u"extremely long string with non-ASCII characters \N{LATIN SMALL LETTER A WITH ACUTE}"))
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_string2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_string2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_constant_string2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_constant_string2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,14 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_constant_string.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <span>
+ 
+ using namespace std::meta;
+ 
+ struct V { int a, b, c; };
+ constexpr auto a = reflect_constant_string (std::vector <int> { 42, 43, 44 });	// { dg-error "'reflect_constant_string' called with 'std::ranges::range_value_t<std::vector<int> >' \\\{aka 'int'\\\} rather than 'char', 'wchar_t', 'char8_t', 'char16_t' or 'char32_t'" }
+ constexpr auto b = reflect_constant_string (std::vector <float> {});		// { dg-error "'reflect_constant_string' called with 'std::ranges::range_value_t<std::vector<float> >' \\\{aka 'float'\\\} rather than 'char', 'wchar_t', 'char8_t', 'char16_t' or 'char32_t'" }
+ constexpr auto c = reflect_constant_string (std::vector <V> { V { 1, 2, 3 } });	// { dg-error "'reflect_constant_string' called with 'std::ranges::range_value_t<std::vector<V> >' \\\{aka 'V'\\\} rather than 'char', 'wchar_t', 'char8_t', 'char16_t' or 'char32_t'" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_function1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_function1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_function1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_function1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_function.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   void foo(this S) {}
+ };
+ 
+ int
+ main ()
+ {
+   [:reflect_function(*&S::foo):](S()); // { dg-error "cannot implicitly reference" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_function2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_function2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_function2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_function2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,74 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_function.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ using namespace std::literals;
+ 
+ void foo ();
+ static_assert (reflect_function (::foo) == ^^::foo);
+ static_assert (is_function (reflect_function (::foo)));
+ static_assert (!is_object (reflect_function (::foo)));
+ static_assert (!is_value (reflect_function (::foo)));
+ static_assert (type_of (reflect_function (::foo)) == ^^void ());
+ static_assert (identifier_of (reflect_function (::foo)) == "foo"sv);
+ 
+ const auto &ref = ::foo;
+ static_assert (reflect_function (ref) == ^^::foo);
+ static_assert (is_function (reflect_function (ref)));
+ static_assert (!is_object (reflect_function (ref)));
+ static_assert (!is_value (reflect_function (ref)));
+ static_assert (type_of (reflect_function (ref)) == ^^void());
+ static_assert (identifier_of (reflect_function (ref)) == "foo"sv);
+ 
+ constexpr void (*fp)() = ::foo;
+ static_assert (reflect_function (*fp) == ^^::foo);
+ static_assert (is_function (reflect_function (*fp)));
+ static_assert (!is_object (reflect_function (*fp)));
+ static_assert (!is_value (reflect_function (*fp)));
+ static_assert (type_of (reflect_function (*fp)) == ^^void());
+ static_assert (identifier_of (reflect_function (*fp)) == "foo"sv);
+ 
+ template <void(&P)()>
+ void
+ fn_fn_ref_param ()
+ {
+   static constexpr auto R = reflect_function (P);
+   static_assert (is_function (R));
+   static_assert (type_of (R) == ^^void ());
+   static_assert (identifier_of (R) == "doit"sv);
+ }
+ 
+ constexpr int bar (int i) { return i + 42; }
+ static_assert ([:reflect_function (bar):](0) == 42);
+ 
+ template<int N>
+ constexpr int
+ baz (int i)
+ {
+   return i + N;
+ }
+ static_assert ([:reflect_function (baz<1>):](1) == 2);
+ 
+ void
+ doit ()
+ {
+   fn_fn_ref_param<doit>();
+   [:reflect_function (::foo):]();
+   [:reflect_function (::ref):]();
+   [:reflect_function (*::fp):]();
+ }
+ 
+ extern int (&fref)();
+ 
+ consteval bool
+ can_reflect_extern_reference ()
+ {
+   try { reflect_function (fref); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert(!can_reflect_extern_reference());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_object1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_object1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_object1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_object1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,88 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_object.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S { int m; };
+ 
+ template <int &> void fn();
+ int p[2];
+ static_assert(template_arguments_of(^^fn<p[1]>)[0] == reflect_object(p[1]));
+ int pp[2][2];
+ static_assert(template_arguments_of(^^fn<pp[1][1]>)[0] == reflect_object(pp[1][1]));
+ 
+ template <const int &P>
+ void
+ fn_int_ref ()
+ {
+   static constexpr auto R = reflect_object(P);
+ 
+   static_assert(is_object(R));
+   static_assert(!is_value(R));
+   static_assert(!is_variable(R));
+   if constexpr (is_const(R)) {
+     static_assert(type_of(R) == ^^const int);
+     static_assert([:R:] == 2);
+   } else {
+     static_assert(type_of(R) == ^^int);
+   }
+ }
+ 
+ template <const int &P>
+ void
+ fn_int_subobject_ref ()
+ {
+   static constexpr auto R = reflect_object(P);
+ 
+   static_assert(is_object(R));
+   static_assert(!is_value(R));
+   static_assert(!is_variable(R));
+   static_assert(type_of(R) == ^^const int);
+   static_assert([:R:] == 3);
+ }
+ 
+ template <S P>
+ void
+ fn_cls_value ()
+ {
+   static constexpr auto R = reflect_object(P);
+ 
+   static_assert(is_object(R));
+   static_assert(!is_value(R));
+   static_assert(!is_variable(R));
+   static_assert(type_of(R) == ^^const S);
+   static_assert([:R:].m == 5);
+ }
+ 
+ template <S &P>
+ void
+ fn_cls_ref ()
+ {
+   static constexpr auto R = reflect_object(P);
+ 
+   static_assert(is_object(R));
+   static_assert(!is_value(R));
+   static_assert(!is_variable(R));
+   static_assert(type_of(R) == ^^S);
+ }
+ 
+ void
+ doit ()
+ {
+   static constexpr int k = 2;
+   fn_int_ref<k>();
+ 
+   static int k2;
+   fn_int_ref<k2>();
+ 
+   static constexpr std::pair<int, int> p {3, 4};
+   fn_int_subobject_ref<p.first>();
+ 
+   fn_cls_value<{5}>();
+ 
+   static S s;
+   fn_cls_ref<s>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_object2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_object2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_object2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_object2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,115 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_object.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ static int obj = 42;
+ constexpr auto robj = reflect_object (obj);
+ static const int cobj = 42;
+ constexpr auto rcobj = reflect_object (cobj);
+ static_assert ([:rcobj:] == 42);
+ static constexpr int ceobj = 42;
+ constexpr auto rceobj = reflect_object (ceobj);
+ static_assert ([:rceobj:] == 42);
+ 
+ static_assert (reflect_object (obj) != ^^obj);
+ static_assert (type_of (reflect_object (obj)) == ^^int);
+ static_assert (is_object (reflect_object (obj)));
+ static_assert (!is_value (reflect_object (obj)));
+ static_assert (!is_variable (reflect_object (obj)));
+ static_assert (reflect_object (cobj) != ^^cobj);
+ static_assert (type_of (reflect_object (cobj)) == ^^const int);
+ static_assert (is_object (reflect_object (cobj)));
+ static_assert (!is_value (reflect_object (cobj)));
+ static_assert (!is_variable (reflect_object (cobj)));
+ static_assert (reflect_object (ceobj) != ^^ceobj);
+ static_assert (type_of (reflect_object (ceobj)) == ^^const int);
+ static_assert (is_object (reflect_object (ceobj)));
+ static_assert (!is_value (reflect_object (ceobj)));
+ static_assert (!is_variable (reflect_object (ceobj)));
+ 
+ static_assert (!is_const (reflect_object (obj)));
+ static_assert (is_const (reflect_object (cobj)));
+ static_assert (is_const (reflect_object (ceobj)));
+ 
+ const int &ref = obj;
+ static_assert (reflect_object (ref) != ^^obj);
+ static_assert (type_of (reflect_object (ref)) == ^^int);
+ static_assert (is_object (reflect_object (ref)));
+ static_assert (!is_value (reflect_object (ref)));
+ static_assert (!is_variable (reflect_object (ref)));
+ static_assert (!is_const (reflect_object (ref)));
+ 
+ constexpr const int *pobj = &ceobj;
+ static_assert (reflect_object (pobj) != ^^pobj);
+ static_assert (type_of (reflect_object (pobj)) == ^^const int *const);
+ static_assert (is_object (reflect_object (pobj)));
+ static_assert (!is_value (reflect_object (pobj)));
+ static_assert (!is_variable (reflect_object (pobj)));
+ static_assert (is_const (reflect_object (pobj)));
+ 
+ static constexpr std::pair<int, short> p = {1, 2};
+ static_assert (reflect_object (p) != ^^p);
+ static_assert (reflect_object (p.first) != ^^p);
+ static_assert (type_of (reflect_object (p)) == ^^const std::pair<int, short>);
+ static_assert (&[:reflect_object (p.first):] == &p.first);
+ static_assert ([:reflect_object (p.first):] == 1);
+ static_assert (type_of (reflect_object (p.first)) == ^^const int);
+ static_assert (&[:reflect_object (p.second):] == &p.second);
+ static_assert ([:reflect_object (p.second):] == 2);
+ static_assert (type_of(reflect_object (p.second)) == ^^const short);
+ static_assert (is_object (reflect_object (p)));
+ static_assert (!is_value (reflect_object (p)));
+ static_assert (is_object (reflect_object (p.first)));
+ static_assert (!is_value (reflect_object (p.first)));
+ 
+ struct B {};
+ struct D : B {};
+ D d;
+ static_assert (type_of (reflect_object (d)) == ^^D);
+ // TODO
+ //static_assert (type_of (reflect_object (static_cast<B &>(d))) == ^^B);
+ 
+ template<typename T>
+ constexpr T
+ bar (T a)
+ {
+   return a + 42;
+ }
+ 
+ constexpr int (*barp)(int) = &bar<int>;
+ constexpr auto rbar = reflect_object (barp);
+ static_assert ([:rbar:](0) == 42);
+ 
+ unsigned long letter;
+ static_assert (size_of (reflect_object (letter)) == sizeof (unsigned long));
+ 
+ template<auto K> constexpr auto R = reflect_object (K);
+ B b = [:R<B{}>:];
+ 
+ struct S { int m; };
+ constexpr S s{42};
+ static_assert (reflect_object (s) != ^^s);
+ static_assert (type_of (reflect_object (s)) == ^^const S);
+ static_assert (is_object (reflect_object (s)));
+ static_assert (!is_variable (reflect_object (s)));
+ static_assert (is_const (reflect_object (s)));
+ 
+ template<auto V>
+   requires (is_class_type (^^decltype(V)))
+ consteval bool
+ fn ()
+ {
+   return reflect_constant (V) == reflect_object (V);
+ }
+ static_assert (fn<s>());
+ 
+ void
+ g ()
+ {
+   int i = [:robj:];
+   [:rbar:](42);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_object3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_object3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_object3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_object3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,61 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_object.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ const char *s = "foo";
+ constexpr auto r1 = reflect_object (s);
+ extern int x;
+ constexpr auto r2 = reflect_object (x);
+ int ai[10];
+ constexpr auto r3 = reflect_object (ai);
+ 
+ constexpr auto e1 = reflect_object (42); // { dg-error "cannot bind" }
+ 
+ struct J1 {
+   J1 *self = this;
+ };
+ constexpr auto e2 = reflect_object (J1{}); // { dg-error "cannot bind" }
+ 
+ struct J2 {
+   J2 *self = this;
+   constexpr J2() {}
+   constexpr J2(const J2&) {}
+ };
+ constexpr auto e3 = reflect_object (J2{}); // { dg-error "cannot bind" }
+ 
+ struct X { int n; };
+ struct Y { const int &r; };
+ constexpr auto e4 = reflect_object (Y{X{1}.n}); // { dg-error "cannot bind" }
+ 
+ void
+ f1 ()
+ {
+   constexpr int& ref = x;
+   constexpr auto rref = reflect_object (ref);
+ }
+ 
+ consteval bool
+ can_reflect_object_on_str ()
+ {
+   try { reflect_object ("foo"); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!can_reflect_object_on_str ());
+ 
+ extern int& vref;
+ 
+ consteval bool
+ can_reflect_extern_reference ()
+ {
+   try { reflect_object (vref); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert(!can_reflect_extern_reference());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_object4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_object4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/reflect_object4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/reflect_object4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,10 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::reflect_object.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void fn();
+ constexpr auto e = reflect_object (fn); // { dg-error "no matching function for call" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/return_type_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/return_type_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/return_type_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/return_type_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,99 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::return_type_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ int &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+ };
+ struct U {
+   int u;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ U fn3 (int);
+ using fn4 = unsigned long (int, long);
+ using fn5 = U (...);
+ auto fn6 (int);
+ auto &fn7 (long long);
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ consteval bool
+ has_return_type_of (info r)
+ {
+   try { return_type_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!has_return_type_of (std::meta::reflect_constant (42)));
+ static_assert (!has_return_type_of (std::meta::reflect_object (arr[1])));
+ static_assert (!has_return_type_of (^^arr));
+ static_assert (!has_return_type_of (^^a3));
+ static_assert (has_return_type_of (^^fn));
+ static_assert (has_return_type_of (^^fn2));
+ static_assert (has_return_type_of (^^fn3));
+ static_assert (has_return_type_of (^^fn4));
+ static_assert (has_return_type_of (^^fn5));
+ static_assert (!has_return_type_of (^^fn6));
+ static_assert (!has_return_type_of (^^fn7));
+ using intref = int &;
+ static_assert (return_type_of (^^fn) == ^^void);
+ static_assert (return_type_of (^^fn2) == dealias (^^intref));
+ using ulong = unsigned long;
+ static_assert (return_type_of (^^fn3) == ^^U);
+ static_assert (return_type_of (^^fn4) == dealias (^^ulong));
+ static_assert (return_type_of (^^fn5) == ^^U);
+ static_assert (!has_return_type_of (^^Enum::A));
+ static_assert (!has_return_type_of (^^Alias));
+ static_assert (!has_return_type_of (^^S));
+ static_assert (!has_return_type_of (^^S::mem));
+ static_assert (!has_return_type_of (members_of (^^S, ctx)[1]));
+ static_assert (!has_return_type_of (^^TCls));
+ static_assert (!has_return_type_of (^^TFn));
+ static_assert (!has_return_type_of (^^TVar));
+ static_assert (!has_return_type_of (^^Concept));
+ static_assert (!has_return_type_of (^^NSAlias));
+ static_assert (!has_return_type_of (^^NS));
+ static_assert (!has_return_type_of (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (!has_return_type_of (std::meta::data_member_spec (^^int, { .name = "member" })));
+ 
+ struct V
+ {
+   V ()
+   {
+     int i = 42;
+     static_assert (!has_return_type_of (parent_of (^^i)));
+   }
+   ~V ()
+   {
+     int i = 42;
+     static_assert (!has_return_type_of (parent_of (^^i)));
+   }
+   V (int, long)
+   {
+     int i = 42;
+     static_assert (!has_return_type_of (parent_of (^^i)));
+   }
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/return_type_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/return_type_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/return_type_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/return_type_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::return_type_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   S () {
+     int a;
+     constexpr auto r = return_type_of (type_of (parent_of (^^a))); // { dg-error "does not have a type" }
+     constexpr auto t = return_type_of (parent_of (^^a)); // { dg-error "function or function type with a return type" }
+   }
+   ~S () {
+     int a;
+     constexpr auto r = return_type_of (type_of (parent_of (^^a))); // { dg-error "does not have a type" }
+     constexpr auto t = return_type_of (parent_of (^^a)); // { dg-error "function or function type with a return type" }
+   }
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/serialize1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/serialize1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/serialize1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/serialize1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,151 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-freflection -O0" }
+ 
+ #include <meta>
+ #include <cstdlib>
+ 
+ namespace impl {
+   template <auto... vals>
+   struct replicator_type {
+     template <typename F>
+     constexpr void operator >> (F body) const
+     { (body.template operator()<vals>(), ...); }
+   };
+ 
+   template <auto... vals>
+   replicator_type <vals...> replicator = {};
+ }
+ 
+ template <typename R>
+ consteval auto
+ expand (R range)
+ {
+   std::vector <std::meta::info> args;
+   for (auto r : range)
+     args.push_back (std::meta::reflect_constant (r));
+   return substitute (^^impl::replicator, args);
+ }
+ 
+ struct Person1 {
+   std::string name;
+   int age;
+ };
+ 
+ constexpr std::string
+ serialize1 (Person1 s)
+ {
+   std::string result = " ";
+   impl::replicator <^^Person1::name, ^^Person1::age> >> [&] <auto m> {
+     result += identifier_of (m);
+     result += "=";
+     if constexpr (type_of (m) == ^^int)
+       result += std::string (s.[: m :] / 10, 'X');
+     else
+       result += s.[: m :];
+     result += " ";
+   };
+   return result;
+ }
+ 
+ struct Person2 {
+   int age;
+   std::string name;
+ };
+ 
+ constexpr std::string
+ serialize2 (Person2 s)
+ {
+   std::string result = " ";
+   constexpr auto ctx = std::meta::access_context::current ();
+   [: expand (nonstatic_data_members_of (^^Person2, ctx)) :] >> [&] <auto m> {
+     result += identifier_of (m);
+     result += "=";
+     if constexpr (type_of (m) == ^^int)
+       result += std::string (s.[: m :] / 10, 'X');
+     else
+       result += s.[: m :];
+     result += " ";
+   };
+   return result;
+ }
+ 
+ struct Person3 {
+   std::string name, surname;
+   int age;
+ };
+ 
+ template <typename S>
+ constexpr std::string
+ serialize3 (S s)
+ {
+   std::string result = " ";
+   constexpr auto ctx = std::meta::access_context::current ();
+   [: expand (nonstatic_data_members_of (^^S, ctx)) :] >> [&] <auto m> {
+     result += identifier_of (m);
+     result += "=";
+     if constexpr (type_of (m) == ^^int)
+       result += std::string (s.[: m :] / 10, 'X');
+     else
+       result += s.[: m :];
+     result += " ";
+   };
+   return result;
+ }
+ 
+ template <typename S>
+ constexpr std::string
+ serialize4 (S s)
+ {
+   std::string result = " ";
+   constexpr auto ctx = std::meta::access_context::current ();
+   template for (constexpr auto m : [: reflect_constant_array (nonstatic_data_members_of (^^S, ctx)) :]) {
+     result += identifier_of (m);
+     result += "=";
+     if constexpr (type_of (m) == ^^int)
+       result += std::string (s.[: m :] / 10, 'X');
+     else
+       result += s.[: m :];
+     result += " ";
+   };
+   return result;
+ }
+ 
+ constexpr Person1 john { "John", 42 };
+ constexpr Person2 joe { 37, "Joe" };
+ constexpr Person3 john_smith { "John", "Smith", 71 };
+ 
+ static_assert (serialize1 (john) == " name=John age=XXXX ");
+ static_assert (serialize2 (joe) == " age=XXX name=Joe ");
+ static_assert (serialize3 (john) == " name=John age=XXXX ");
+ static_assert (serialize3 (joe) == " age=XXX name=Joe ");
+ static_assert (serialize3 (john_smith) == " name=John surname=Smith age=XXXXXXX ");
+ static_assert (serialize4 (john) == " name=John age=XXXX ");
+ static_assert (serialize4 (joe) == " age=XXX name=Joe ");
+ static_assert (serialize4 (john_smith) == " name=John surname=Smith age=XXXXXXX ");
+ 
+ int
+ main ()
+ {
+   Person1 jack { "Jack", 53 };
+   std::string s1 = serialize1 (jack);
+   if (s1 != " name=Jack age=XXXXX ")
+     std::abort ();
+   Person2 harry { 28, "Harry" };
+   std::string s2 = serialize2 (harry);
+   if (s2 != " age=XX name=Harry ")
+     std::abort ();
+   if (serialize3 (jack) != s1)
+     std::abort ();
+   if (serialize3 (harry) != s2)
+     std::abort ();
+   Person3 jane_doe { "Jane", "Doe", 19 };
+   std::string s3 = serialize3 (jane_doe);
+   if (s3 != " name=Jane surname=Doe age=X ")
+     std::abort ();
+   if (serialize4 (jack) != s1)
+     std::abort ();
+   if (serialize4 (harry) != s2)
+     std::abort ();
+   if (serialize4 (jane_doe) != s3)
+     std::abort ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/serialize2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/serialize2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/serialize2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/serialize2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,67 ----
+ // { dg-do run { target c++26 } }
+ // { dg-additional-options "-freflection -O0" }
+ 
+ #include <meta>
+ #include <cstdlib>
+ 
+ namespace impl {
+   template <auto... vals>
+   struct replicator_type {
+     template <typename F>
+     constexpr void operator >> (F body) const
+     { (body.template operator()<vals>(), ...); }
+   };
+ 
+   template <auto... vals>
+   replicator_type <vals...> replicator = {};
+ }
+ 
+ template <typename R>
+ consteval auto
+ expand (R range)
+ {
+   std::vector <std::meta::info> args;
+   for (auto r : range)
+     args.push_back (std::meta::reflect_constant (r));
+   return substitute (^^impl::replicator, args);
+ }
+ 
+ struct Person {
+   std::string name;
+   int age;
+ };
+ 
+ template <typename S>
+ constexpr std::string
+ serialize (S s)
+ {
+   std::string result = " ";
+ #if 0
+   // TODO, this ICEs in tsubst_expr.
+   impl::replicator <^^S::age, ^^S::name> >> [&] <auto m> {
+ #else
+   impl::replicator <^^Person::age, ^^Person::name> >> [&] <auto m> {
+ #endif
+     result += identifier_of (m);
+     result += "=";
+     if constexpr (type_of (m) == ^^int)
+       result += std::string (s.[: m :] / 10, 'X');
+     else
+       result += s.[: m :];
+     result += " ";
+   };
+   return result;
+ }
+ 
+ constexpr Person john { "John", 42 };
+ 
+ static_assert (serialize (john) == " age=XXXX name=John ");
+ 
+ int
+ main ()
+ {
+   Person jack { "Jack", 53 };
+   std::string s = serialize (jack);
+   if (s != " age=XXXXX name=Jack ")
+     std::abort ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/size_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/size_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/size_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/size_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,122 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::size_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ extern int arr2[];
+ extern int arr3[2];
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+ };
+ struct U {
+   int u;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ int &ref = arr[0];
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ consteval bool
+ has_size_of (info r)
+ {
+   try { size_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (has_size_of (std::meta::reflect_constant (42)));
+ static_assert (has_size_of (std::meta::reflect_object (arr[1])));
+ static_assert (has_size_of (^^arr));
+ static_assert (!has_size_of (^^a3));
+ static_assert (!has_size_of (^^fn));
+ static_assert (!has_size_of (^^fn2));
+ static_assert (!has_size_of (^^Enum::A));
+ static_assert (has_size_of (^^Alias));
+ static_assert (has_size_of (^^S));
+ static_assert (has_size_of (^^S::mem));
+ static_assert (!has_size_of (members_of (^^S, access_context::current ())[1]));
+ static_assert (!has_size_of (^^TCls));
+ static_assert (!has_size_of (^^TFn));
+ static_assert (!has_size_of (^^TVar));
+ static_assert (!has_size_of (^^Concept));
+ static_assert (!has_size_of (^^NSAlias));
+ static_assert (!has_size_of (^^NS));
+ static_assert (has_size_of (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (has_size_of (std::meta::data_member_spec (^^int, { .name = "member" })));
+ static_assert (!has_size_of (std::meta::data_member_spec (^^int, { .name = "member", .bit_width = 6 })));
+ static_assert (!has_size_of (std::meta::data_member_spec (^^int, { .bit_width = 15 })));
+ static_assert (!has_size_of (^^arr2));
+ static_assert (has_size_of (^^arr3));
+ static_assert (!has_size_of (^^ref));
+ static_assert (size_of (^^arr) == sizeof (arr));
+ static_assert (size_of (std::meta::reflect_constant (42)) == sizeof (int));
+ static_assert (size_of (^^Alias) == sizeof (int));
+ static_assert (size_of (^^S) == sizeof (S));
+ static_assert (size_of (^^S::mem) == sizeof (S::mem));
+ static_assert (size_of (std::meta::bases_of (^^S, ctx)[0]) == sizeof (B));
+ static_assert (size_of (std::meta::data_member_spec (^^int, { .name = "member" })) == sizeof (int));
+ static_assert (size_of (^^arr3) == sizeof (arr3));
+ using fnt = int (int, int);
+ static_assert (!has_size_of (^^fnt));
+ void bar (long, const T f, int g[2], T &);
+ 
+ int
+ foo (int a, const long b, T c, int d[4], T &e, int f)
+ {
+   static_assert (has_size_of (^^a));
+   static_assert (has_size_of (^^b));
+   static_assert (has_size_of (^^c));
+   static_assert (has_size_of (^^d));
+   static_assert (!has_size_of (^^e));
+   static_assert (!has_size_of (parameters_of (^^foo)[0]));
+   static_assert (!has_size_of (parameters_of (^^foo)[5]));
+   static_assert (!has_size_of (parameters_of (^^bar)[0]));
+   static_assert (size_of (^^a) == sizeof (int));
+   static_assert (size_of (^^b) == sizeof (long));
+   static_assert (size_of (^^c) == sizeof (T));
+   static_assert (size_of (^^d) == sizeof (int *));
+   return 0;
+ }
+ 
+ struct V
+ {
+   char a;
+   long long f;
+   int : 2;
+   int g : 3;
+   int &h;
+ };
+ using CV = const V;
+ 
+ static_assert (size_of (^^int) == sizeof (int));
+ static_assert (size_of (^^char) == sizeof (char));
+ static_assert (size_of (^^V) == sizeof (V));
+ static_assert (size_of (^^CV) == sizeof (V));
+ static_assert (size_of (^^char *) == sizeof (char *));
+ static_assert (size_of (^^char &) == sizeof (char *));
+ static_assert (sizeof (char) == sizeof (char *) || size_of (^^char &) != sizeof (char &));
+ static_assert (size_of (^^V::a) == sizeof (char));
+ static_assert (size_of (^^V::f) == sizeof (long long));
+ static_assert (!has_size_of (^^V::g));
+ static_assert (size_of (^^V::h) == sizeof (int *));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/source_location_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/source_location_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/source_location_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/source_location_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,113 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::source_location_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ static_assert (source_location_of (^^::).line () == std::source_location ().line ());
+ static_assert (source_location_of (^^int).line () == std::source_location ().line ());
+ struct S {};
+ static_assert (source_location_of (^^S).line () == std::source_location::current ().line () - 1);
+ int x;
+ static_assert (source_location_of (^^x).line () == std::source_location::current ().line () - 1);
+ enum E {
+   E1,
+   E2
+ };
+ static_assert (source_location_of (^^E).line () == std::source_location::current ().line () - 4);
+ static_assert (source_location_of (^^E1).line () == std::source_location::current ().line () - 4);
+ static_assert (source_location_of (^^E2).line () == std::source_location::current ().line () - 4);
+ union U {};
+ static_assert (source_location_of (^^U).line () == std::source_location::current ().line () - 1);
+ void foo (int, int) {}
+ static_assert (source_location_of (^^foo).line () == std::source_location::current ().line () - 1);
+ namespace N { namespace O {} }
+ static_assert (source_location_of (^^N).line () == std::source_location::current ().line () - 1);
+ static_assert (source_location_of (^^N::O).line () == std::source_location::current ().line () - 2);
+ using I = int;
+ static_assert (source_location_of (^^I).line () == std::source_location::current ().line () - 1);
+ static_assert (source_location_of (dealias (^^I)).line () == std::source_location ().line ());
+ typedef S J;
+ static_assert (source_location_of (dealias (^^J)).line () == source_location_of (^^S).line ());
+ static_assert (source_location_of (data_member_spec (^^int, { .name = "_" })).line () == std::source_location ().line ());
+ constexpr auto ctx = access_context::current ();
+ struct V {};
+ struct Y { int a, b, c; };
+ struct W : [[=1]] public S, [[=2, =Y { 42, 42, 42 }]] virtual V {};
+ static_assert (source_location_of (bases_of (^^W, ctx)[0]).line () == std::source_location::current ().line () - 1);
+ static_assert (source_location_of (bases_of (^^W, ctx)[1]).line () == std::source_location::current ().line () - 2);
+ static_assert (source_location_of (annotations_of (bases_of (^^W, ctx)[0])[0]).line () == std::source_location::current ().line () - 3);
+ static_assert (source_location_of (annotations_of (bases_of (^^W, ctx)[1])[1]).line () == std::source_location::current ().line () - 4);
+ struct X : public S,
+ 	   [[=3]] public V
+ {
+ };
+ static_assert (source_location_of (bases_of (^^X, ctx)[0]).line () == std::source_location::current ().line () - 4);
+ // TODO: we don't track location of base specifiers, so just location of the derived class definition is used.
+ static_assert (source_location_of (bases_of (^^X, ctx)[1]).line () == std::source_location::current ().line () - 6);
+ static_assert (source_location_of (annotations_of (bases_of (^^X, ctx)[1])[0]).line () == std::source_location::current ().line () - 6);
+ [[=1]]
+ [[=2]] extern int an;
+ [[=Y { 1, 2, 3 }]] extern int an;
+ [[=3.0f + 4.0f]] int an;
+ static_assert (source_location_of (annotations_of (^^an)[0]).line () == std::source_location::current ().line () - 4);
+ static_assert (source_location_of (annotations_of (^^an)[1]).line () == std::source_location::current ().line () - 4);
+ static_assert (source_location_of (annotations_of (^^an)[2]).line () == std::source_location::current ().line () - 4);
+ static_assert (source_location_of (annotations_of (^^an)[3]).line () == std::source_location::current ().line () - 4);
+ 
+ #include <string_view>
+ 
+ int baz (int x, int y);
+ static_assert (source_location_of (parameters_of (^^baz)[0]).line () == std::source_location::current ().line () - 1);
+ 
+ void
+ bar (int a, int b)
+ {
+   static_assert (source_location_of (^^a).line ()
+ 		 == std::source_location::current ().line () - 3);
+   static_assert (source_location_of (^^b).line ()
+ 		 == source_location_of (^^a).line ());
+   static_assert (std::string_view (source_location_of (^^bar).file_name ())
+ 		 == std::string_view (std::source_location::current ().file_name ()));
+   static_assert (std::string_view (source_location_of (^^a).function_name ())
+ 		 == std::string_view (std::source_location::current ().function_name ()));
+   static_assert (std::string_view (source_location_of (^^b).function_name ())
+ 		 == std::string_view (std::source_location::current ().function_name ()));
+   int c;
+   static_assert (source_location_of (^^c).line ()
+ 		 == std::source_location::current ().line () - 2);
+   static_assert (std::string_view (source_location_of (^^c).file_name ())
+ 		 == std::string_view (std::source_location::current ().file_name ()));
+   static_assert (std::string_view (source_location_of (^^a).function_name ())
+ 		 == std::string_view (std::source_location::current ().function_name ()));
+   constexpr auto d = parameters_of (^^bar)[0];
+   static_assert (source_location_of (d).line ()
+ 		 == source_location_of (^^a).line ());
+   static_assert (std::string_view (source_location_of (d).file_name ())
+ 		 == std::string_view (source_location_of (^^a).file_name ()));
+   static_assert (std::string_view (source_location_of (d).function_name ())
+ 		 == std::string_view (source_location_of (^^a).function_name ()));
+ }
+ 
+ template <int N>
+ void
+ qux ()
+ {
+   [[=1]]
+   [[=N + 42]]
+   [[=Y { N, N + 1, N + 2 }]]
+   [[=Y { 1, 2, 3 }]] int an;
+   static_assert (N && source_location_of (annotations_of (^^an)[0]).line () == std::source_location::current ().line () - 4);
+   static_assert (N && source_location_of (annotations_of (^^an)[1]).line () == std::source_location::current ().line () - 4);
+ //  static_assert (N && source_location_of (annotations_of (^^an)[2]).line () == std::source_location::current ().line () - 4);
+ //  static_assert (N && source_location_of (annotations_of (^^an)[3]).line () == std::source_location::current ().line () - 4);
+ }
+ 
+ void
+ plugh ()
+ {
+   qux <1> ();
+   qux <2> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/source_location_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/source_location_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/source_location_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/source_location_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,44 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::source_location_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template <typename F>
+ consteval info
+ select_mem (info clazz, F f)
+ {
+   for (info x : members_of (clazz, access_context::unchecked ()))
+     if (f (x))
+       return x;
+ }
+ 
+ consteval auto is_operator (operators op)
+ {
+   return [op] (info mem) { return is_operator_function (mem) && operator_of (mem) == op; };
+ }
+ 
+ constexpr auto implicitDefLine = std::source_location::current ().line ()+2;
+ struct
+ ImplicitDef
+ {};
+ 
+ static_assert (source_location_of (select_mem (^^ImplicitDef, is_default_constructor)).line () == implicitDefLine);
+ static_assert (source_location_of (select_mem (^^ImplicitDef, is_copy_constructor)).line () == implicitDefLine);
+ static_assert (source_location_of (select_mem (^^ImplicitDef, is_move_constructor)).line () == implicitDefLine);
+ static_assert (source_location_of (select_mem (^^ImplicitDef, is_copy_assignment)).line () == implicitDefLine);
+ static_assert (source_location_of (select_mem (^^ImplicitDef, is_move_assignment)).line () == implicitDefLine);
+ static_assert (source_location_of (select_mem (^^ImplicitDef, is_destructor)).line () == implicitDefLine);
+ 
+ constexpr auto implicitEqLine = std::source_location::current ().line ()+3;
+ struct ImplicitEq
+ {
+   auto operator<=> (const ImplicitEq&) const = default;
+ };
+ 
+ // Would expect either class head, or operator<=> line
+ static_assert (source_location_of (^^ImplicitEq::operator==).line () == 0);
+ static_assert (source_location_of (select_mem (^^ImplicitEq, is_operator (op_equals_equals))).line () == implicitEqLine);
+ static_assert (source_location_of (select_mem (^^ImplicitEq, is_operator (op_spaceship))).line () == implicitEqLine);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,28 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ #include <ranges>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   int mem;
+   int : 5;
+ };
+ struct T : public S {
+ };
+ 
+ [[=1]] void
+ foo ()
+ {
+   S s = { 0 }, t = { 0 };
+   constexpr auto ctx = access_context::unchecked ();
+   s.[: members_of (^^S, ctx)[1] :] = 1;	// { dg-error "cannot use an unnamed bit-field .S::<anonymous>. in a splice expression" }
+   s.[: (members_of (^^S, ctx) | std::views::filter (is_default_constructor) | std::ranges::to <std::vector> ())[0] :] ();	// { dg-error "cannot use constructor or destructor .constexpr S::S\\(\\). in a splice expression" }
+   s.[: (members_of (^^S, ctx) | std::views::filter (is_copy_constructor) | std::ranges::to <std::vector> ())[0] :] (t);		// { dg-error "cannot use constructor or destructor .constexpr S::S\\(const S&\\). in a splice expression" }
+   s.[: (members_of (^^S, ctx) | std::views::filter (is_destructor) | std::ranges::to <std::vector> ())[0] :] ();		// { dg-error "cannot use constructor or destructor .constexpr S::~S\\(\\). in a splice expression" }
+   [: annotations_of (^^foo)[0] :]; // { dg-error "cannot use an annotation .1. in a splice expression" }
+   [: data_member_spec (^^S, { .name = "name" }) :]; // { dg-error "cannot use a data member specification in a splice expression" }
+   [: bases_of (^^T, ctx)[0] :];													// { dg-error "" "" { xfail *-*-* } }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ constexpr int foo (int) { return 42; };
+ constexpr auto bar = ^^foo;
+ constexpr int foo (long) { return 43; }
+ constexpr int foo (long long) { return 44; }
+ static_assert (foo (0) == 42);
+ static_assert (foo (0L) == 43);
+ static_assert (foo (0LL) == 44);
+ static_assert ([: bar :] (0) == 42);
+ static_assert ([: bar :] (0L) == 42);
+ static_assert ([: bar :] (0LL) == 42);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,5 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct A { static int x; };
+ int q = A ().[: ^^x :];  // { dg-error "'x' has not been declared" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,17 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ namespace M
+ {
+   template <int N>
+   constexpr int foo () { return N; }
+ }
+ 
+ static_assert (template [: ^^M::foo :] <42> () == 42);
+ static_assert (template [: members_of (^^M, std::meta::access_context::unchecked ())[0] :] <43> () == 43);
+ int a = [: ^^M::foo :] <44> ();
+ // { dg-error "reflection 'M::foo<44>' not usable in a splice expression with template arguments" "" { target *-*-* } .-1 }
+ int b = [: members_of (^^M, std::meta::access_context::unchecked ())[0] :] <45> ();
+ // { dg-error "reflection 'M::foo<45>' not usable in a splice expression with template arguments" "" { target *-*-* } .-1 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,37 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ void foo (int);
+ template <typename T>
+ void bar (T);
+ struct S {
+   void foo (int);
+   template <typename T>
+   void bar (T);
+ };
+ 
+ void
+ baz (S &s)
+ {
+   template [: ^^foo :] (0);			// { dg-error "reflection 'foo' not usable in a template splice" }
+   template [: ^^bar :] (0);			// { dg-message "only function templates are allowed here" "" { target *-*-* } .-1 }
+   s.template [: ^^S::foo :] (0);		// { dg-error "reflection 'S::foo' not usable in a template splice" }
+   s.template [: ^^S::bar :] (0);		// { dg-message "only function templates are allowed here" "" { target *-*-* } .-1 }
+ }
+ 
+ template <int N>
+ void
+ qux (S &s)
+ {
+   // TODO: We don't reject this one.
+   template [: N == 0 ? ^^foo : ^^:: :] (0);	// { dg-error "reflection 'foo' not usable in a template splice" "" { xfail *-*-* } }
+   template [: N == 0 ? ^^bar : ^^:: :] (0);	// { dg-message "only function templates are allowed here" "" { xfail *-*-* } .-1 }
+   s.template [: N == 0 ? ^^S::foo : ^^:: :] (0); // { dg-error "reflection 'foo' not usable in a template splice" "" { xfail *-*-* } }
+   s.template [: N == 0 ? ^^S::bar : ^^:: :] (0);
+ }
+ 
+ void
+ corge (S &s)
+ {
+   qux <0> (s);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,48 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ template <typename U>
+ constexpr int foo (int x, const U &) { return 41 + x; }
+ constexpr auto foo1 = ^^foo;
+ template <typename U>
+ constexpr int foo (long x, const U &) { return 42 + x; }
+ template <typename U>
+ constexpr int foo (long long x, const U &) { return 43 + x; }
+ 
+ static_assert (template [:foo1:] (1, 1.0f) == 42);
+ static_assert (template [:foo1:] (1L, 1.0) == 42);
+ static_assert (template [:foo1:] (1LL, 1.0L) == 42);
+ static_assert (template [:foo1:] <float> (1, 1.0f) == 42);
+ static_assert (template [:foo1:] <double> (1L, 1.0) == 42);
+ static_assert (template [:foo1:] <long double> (1LL, 1.0L) == 42);
+ 
+ template <int N>
+ void
+ bar ()
+ {
+   static_assert (template [:foo1:] (1, 1.0f) == N);
+   static_assert (template [:foo1:] (1L, 1.0) == N);
+   static_assert (template [:foo1:] (1LL, 1.0L) == N);
+   static_assert (template [:foo1:] <float> (1, 1.0f) == N);
+   static_assert (template [:foo1:] <double> (1L, 1.0) == N);
+   static_assert (template [:foo1:] <long double> (1LL, 1.0L) == N);
+ }
+ 
+ template <auto f>
+ void
+ baz ()
+ {
+   static_assert (template [:f:] (1, 1.0f) == 42);
+   static_assert (template [:f:] (1L, 1.0) == 42);
+   static_assert (template [:f:] (1LL, 1.0L) == 42);
+   static_assert (template [:f:] <float> (1, 1.0f) == 42);
+   static_assert (template [:f:] <double> (1L, 1.0) == 42);
+   static_assert (template [:f:] <long double> (1LL, 1.0L) == 42);
+ }
+ 
+ void
+ qux ()
+ {
+   bar <42> ();
+   baz <foo1> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splice7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splice7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ constexpr int x = 42;
+ struct S { static constexpr int x = 20; template <int N> static constexpr int a = N; };
+ static_assert (S {}.template [:^^S::a:]<x> == 42);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splicing-base1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splicing-base1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splicing-base1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splicing-base1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,24 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test from [expr.ref].
+ 
+ #include <meta>
+ 
+ struct B {
+   int b;
+ };
+ struct C : B {
+   constexpr int get() const { return b; }
+ };
+ struct D : B, C { }; // { dg-warning "inaccessible" }
+ 
+ constexpr int f() {
+   D d = {1, {}};
+ 
+   // b unambiguously refers to the direct base class of type B,
+   // not the indirect base class of type B
+   B& b = d.[: std::meta::bases_of(^^D, std::meta::access_context::current())[0] :];
+   b.b += 10;
+   return 10 * b.b + d.get();
+ }
+ static_assert(f() == 110);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splicing-base2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splicing-base2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splicing-base2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splicing-base2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct B {
+   int b;
+ };
+ struct D : B { };
+ 
+ template<info R>
+ constexpr int
+ f ()
+ {
+   D d = {42};
+   B& b = d.[:R:];
+   return b.b;
+ }
+ static_assert (f<bases_of(^^D, access_context::current ())[0]> () == 42);
+ 
+ template<info R>
+ constexpr int
+ g ()
+ {
+   D d = {42};
+   B *bp = &d.[:R:];
+   return bp->b;
+ }
+ static_assert (g<bases_of(^^D, access_context::current ())[0]> () == 42);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splicing-base3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splicing-base3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splicing-base3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splicing-base3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,112 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A { int a; };
+ struct B { int b; };
+ struct C { int c; };
+ struct D { int d; };
+ struct E { int e; };
+ struct F { int f; };
+ struct G { int g; };
+ struct H { int h; };
+ struct I : public A, protected B, private C { int i; };
+ struct J : protected D, private E, public F { int j; };
+ struct K : public G, protected I, private H, public J { int k; };
+ struct L : virtual A { int l; };
+ struct M : virtual A { int m; };
+ struct N : public L, protected M, public virtual A { int n; };
+ 
+ constexpr access_context gctx = access_context::current ();
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ void
+ g ()
+ {
+   I i;
+   A &a1 = i.[: bases_of(^^I, gctx)[0] :];
+   a1.a++;
+   A &a2 = i.[: bases_of(^^I, uctx)[0] :];
+   a2.a++;
+   B &b = i.[: bases_of(^^I, uctx)[1] :];
+   b.b++;
+   C &c = i.[: bases_of(^^I, uctx)[2] :];
+   c.c++;
+   A *ap1 = &i.[: bases_of(^^I, gctx)[0] :];
+   ap1->a++;
+   A *ap2 = &i.[: bases_of(^^I, uctx)[0] :];
+   ap2->a++;
+   B *bp = &i.[: bases_of(^^I, uctx)[1] :];
+   bp->b++;
+   C *cp = &i.[: bases_of(^^I, uctx)[2] :];
+   cp->c++;
+ 
+   J j;
+   F &f1 = j.[: bases_of(^^J, gctx)[0] :];
+   f1.f++;
+   D &d = j.[: bases_of(^^J, uctx)[0] :];
+   d.d++;
+   E &e = j.[: bases_of(^^J, uctx)[1] :];
+   e.e++;
+   F &f2 = j.[: bases_of(^^J, uctx)[2] :];
+   f2.f++;
+   F *fp1 = &j.[: bases_of(^^J, gctx)[0] :];
+   fp1->f++;
+   D *dp = &j.[: bases_of(^^J, uctx)[0] :];
+   dp->d++;
+   E *ep = &j.[: bases_of(^^J, uctx)[1] :];
+   ep->e++;
+   F *fp2 = &j.[: bases_of(^^J, uctx)[2] :];
+   fp2->f++;
+ 
+   K k;
+   G &g1 = k.[: bases_of(^^K, gctx)[0] :];
+   g1.g++;
+   J &j1 = k.[: bases_of(^^K, gctx)[1] :];
+   j1.j++;
+   G *gp = &k.[: bases_of(^^K, gctx)[0] :];
+   gp->g++;
+   J *jp1 = &k.[: bases_of(^^K, gctx)[1] :];
+   jp1->j++;
+   G &g2 = k.[: bases_of(^^K, uctx)[0] :];
+   g2.g++;
+   I &i2 = k.[: bases_of(^^K, uctx)[1] :];
+   i2.i++;
+   H &h = k.[: bases_of(^^K, uctx)[2] :];
+   h.h++;
+   J &j3 = k.[: bases_of(^^K, uctx)[3] :];
+   j3.j++;
+   G *gp2 = &k.[: bases_of(^^K, uctx)[0] :];
+   gp2->g++;
+   I *ip2 = &k.[: bases_of(^^K, uctx)[1] :];
+   ip2->i++;
+   H *hp = &k.[: bases_of(^^K, uctx)[2] :];
+   hp->h++;
+   J *jp3 = &k.[: bases_of(^^K, uctx)[3] :];
+   jp3->j++;
+ 
+   N n;
+   L &l = n.[: bases_of(^^N, gctx)[0] :];
+   l.l++;
+   A &a3 = n.[: bases_of(^^N, gctx)[1] :];
+   a3.a++;
+   L *lp = &n.[: bases_of(^^N, gctx)[0] :];
+   lp->l++;
+   A *ap3 = &n.[: bases_of(^^N, gctx)[1] :];
+   ap3->a++;
+   L &l2 = n.[: bases_of(^^N, uctx)[0] :];
+   l2.l++;
+   M &m = n.[: bases_of(^^N, uctx)[1] :];
+   m.m++;
+   A &a4 = n.[: bases_of(^^N, uctx)[2] :];
+   a4.a++;
+   L *lp2 = &n.[: bases_of(^^N, uctx)[0] :];
+   lp2->l++;
+   M *mp = &n.[: bases_of(^^N, uctx)[1] :];
+   mp->m++;
+   A *ap4 = &n.[: bases_of(^^N, uctx)[2] :];
+   ap4->a++;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splicing-base4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splicing-base4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/splicing-base4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/splicing-base4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,28 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A { int a; };
+ struct B { int b; };
+ struct C : A, B { };
+ struct D : A, B { };
+ 
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ void
+ g ()
+ {
+   A a{1};
+   A &ar = a.[: bases_of(^^A, uctx)[0] :];
+   C c;
+   A &a2 = c.[: bases_of(^^C, uctx)[0] :];
+   B &b = c.[: bases_of(^^C, uctx)[0] :]; // { dg-error "invalid initialization of reference" }
+   A *ap = &c.[: bases_of(^^C, uctx)[1] :];  // { dg-error "cannot convert" }
+   A &a3 = c.[: bases_of(^^D, uctx)[0] :]; // { dg-error "not a base type for type" }
+   B &b2 = c.[: bases_of(^^D, uctx)[1] :]; // { dg-error "not a base type for type" }
+ }
+ 
+ // { dg-error "call to non-.constexpr." "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/storage_duration1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/storage_duration1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/storage_duration1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/storage_duration1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,141 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_{static,thread,automatic}_storage_duration.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   int nsdm;
+   static_assert (!has_static_storage_duration (^^nsdm));
+   static_assert (!has_thread_storage_duration (^^nsdm));
+   static_assert (!has_automatic_storage_duration (^^nsdm));
+ 
+   static inline int sdm;
+   static_assert (has_static_storage_duration (^^sdm));
+   static_assert (!has_thread_storage_duration (^^sdm));
+   static_assert (!has_automatic_storage_duration (^^sdm));
+ 
+   static thread_local int stdm;
+   static_assert (!has_static_storage_duration (^^stdm));
+   static_assert (has_thread_storage_duration (^^stdm));
+   static_assert (!has_automatic_storage_duration (^^stdm));
+ 
+   static void smemfn ();
+   static_assert (!has_static_storage_duration (^^smemfn));
+   static_assert (!has_thread_storage_duration (^^smemfn));
+   static_assert (!has_automatic_storage_duration (^^smemfn));
+ 
+   void memfn ();
+   static_assert (!has_static_storage_duration (^^memfn));
+   static_assert (!has_thread_storage_duration (^^memfn));
+   static_assert (!has_automatic_storage_duration (^^memfn));
+ };
+ 
+ extern int i0;
+ static_assert (has_static_storage_duration (^^i0));
+ static_assert (!has_thread_storage_duration (^^i0));
+ static_assert (!has_automatic_storage_duration (^^i0));
+ 
+ int i1;
+ static_assert (has_static_storage_duration (^^i1));
+ static_assert (!has_thread_storage_duration (^^i1));
+ static_assert (!has_automatic_storage_duration (^^i1));
+ 
+ static int i2;
+ static_assert (has_static_storage_duration (^^i2));
+ static_assert (!has_thread_storage_duration (^^i2));
+ static_assert (!has_automatic_storage_duration (^^i2));
+ 
+ thread_local int i3;
+ static_assert (!has_static_storage_duration (^^i3));
+ static_assert (has_thread_storage_duration (^^i3));
+ static_assert (!has_automatic_storage_duration (^^i3));
+ 
+ static thread_local int i4;
+ static_assert (!has_static_storage_duration (^^i4));
+ static_assert (has_thread_storage_duration (^^i4));
+ static_assert (!has_automatic_storage_duration (^^i4));
+ 
+ void
+ foo (float parm)
+ {
+   static_assert (!has_static_storage_duration (^^foo));
+   static_assert (!has_thread_storage_duration (^^foo));
+   static_assert (!has_automatic_storage_duration (^^foo));
+ 
+   static_assert (!has_static_storage_duration (^^parm));
+   static_assert (!has_thread_storage_duration (^^parm));
+   static_assert (has_automatic_storage_duration (^^parm));
+ 
+   int nonstatic_var;
+   static_assert (!has_static_storage_duration (^^nonstatic_var));
+   static_assert (!has_thread_storage_duration (^^nonstatic_var));
+   static_assert (has_automatic_storage_duration (^^nonstatic_var));
+ 
+   int& ref_to_nonstatic_var = nonstatic_var;
+   static_assert (!has_static_storage_duration (^^ref_to_nonstatic_var));
+   static_assert (!has_thread_storage_duration (^^ref_to_nonstatic_var));
+   static_assert (has_automatic_storage_duration (^^ref_to_nonstatic_var));
+ 
+   static int& static_ref_to_var = nonstatic_var;
+   static_assert (has_static_storage_duration (^^static_ref_to_var));
+   static_assert (!has_thread_storage_duration (^^static_ref_to_var));
+   static_assert (!has_automatic_storage_duration (^^static_ref_to_var));
+ 
+   static int static_var;
+   static_assert (has_static_storage_duration (^^static_var));
+   static_assert (!has_thread_storage_duration (^^static_var));
+   static_assert (!has_automatic_storage_duration (^^static_var));
+ 
+   int& ref_to_static_var = static_var;
+   static_assert (!has_static_storage_duration (^^ref_to_static_var));
+   static_assert (!has_thread_storage_duration (^^ref_to_static_var));
+   static_assert (has_automatic_storage_duration (^^ref_to_static_var));
+ 
+   thread_local int tl_var;
+   static_assert (!has_static_storage_duration (^^tl_var));
+   static_assert (has_thread_storage_duration (^^tl_var));
+   static_assert (!has_automatic_storage_duration (^^tl_var));
+ 
+   std::pair<int, int> p;
+   auto [aa, ab] = p;
+   static_assert (!has_static_storage_duration (^^aa));
+   static_assert (!has_thread_storage_duration (^^aa));
+   static_assert (!has_automatic_storage_duration (^^aa));
+ 
+   static auto [sa, sb] = p;
+   static_assert (!has_static_storage_duration (^^sa));
+   static_assert (!has_thread_storage_duration (^^sa));
+   static_assert (!has_automatic_storage_duration (^^sa));
+ 
+   thread_local auto [ta, tb] = p;
+   static_assert (!has_static_storage_duration (^^ta));
+   static_assert (!has_thread_storage_duration (^^ta));
+   static_assert (!has_automatic_storage_duration (^^ta));
+ }
+ 
+ template<auto V> struct TCls {};
+ static_assert (!has_static_storage_duration (template_arguments_of (^^TCls<5>)[0]));
+ static_assert (!has_thread_storage_duration (template_arguments_of (^^TCls<5>)[0]));
+ static_assert (!has_automatic_storage_duration (template_arguments_of (^^TCls<5>)[0]));
+ 
+ static_assert (has_static_storage_duration (template_arguments_of (^^TCls<S{}>)[0]));
+ static_assert (!has_thread_storage_duration (template_arguments_of (^^TCls<S{}>)[0]));
+ static_assert (!has_automatic_storage_duration (template_arguments_of (^^TCls<S{}>)[0]));
+ 
+ template<auto K> constexpr auto R = reflect_object (K);
+ static_assert (has_static_storage_duration (R<S{}>));
+ static_assert (!has_thread_storage_duration (R<S{}>));
+ static_assert (!has_automatic_storage_duration (R<S{}>));
+ 
+ static std::pair<int, int> p;
+ constexpr auto first = reflect_object (p.first);
+ static_assert (has_static_storage_duration (first));
+ static_assert (!has_thread_storage_duration (first));
+ static_assert (!has_automatic_storage_duration (first));
+ 
+ static_assert (!has_static_storage_duration (reflect_constant(4)));
+ static_assert (!has_thread_storage_duration (reflect_constant(4)));
+ static_assert (!has_automatic_storage_duration (reflect_constant(4)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/storage_duration2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/storage_duration2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/storage_duration2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/storage_duration2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,218 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_{static,thread,automatic}_storage_duration.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ static_assert (!has_static_storage_duration (null_reflection));
+ static_assert (!has_thread_storage_duration (null_reflection));
+ static_assert (!has_automatic_storage_duration (null_reflection));
+ 
+ static_assert (!has_static_storage_duration (^^::));
+ static_assert (!has_thread_storage_duration (^^::));
+ static_assert (!has_automatic_storage_duration (^^::));
+ 
+ static_assert (!has_static_storage_duration (reflect_constant (3)));
+ static_assert (!has_thread_storage_duration (reflect_constant (3)));
+ static_assert (!has_automatic_storage_duration (reflect_constant (3)));
+ 
+ static_assert (!has_static_storage_duration (^^cls));
+ static_assert (!has_thread_storage_duration (^^cls));
+ static_assert (!has_automatic_storage_duration (^^cls));
+ 
+ static_assert (!has_static_storage_duration (^^cls::dm));
+ static_assert (!has_thread_storage_duration (^^cls::dm));
+ static_assert (!has_automatic_storage_duration (^^cls::dm));
+ 
+ static_assert (!has_static_storage_duration (^^cls::ref_dm));
+ static_assert (!has_thread_storage_duration (^^cls::ref_dm));
+ static_assert (!has_automatic_storage_duration (^^cls::ref_dm));
+ 
+ static_assert (has_static_storage_duration (^^cls::static_dm));
+ static_assert (!has_thread_storage_duration (^^cls::static_dm));
+ static_assert (!has_automatic_storage_duration (^^cls::static_dm));
+ 
+ 
+ static_assert (!has_static_storage_duration (^^cls::mem_fun));
+ static_assert (!has_thread_storage_duration (^^cls::mem_fun));
+ static_assert (!has_automatic_storage_duration (^^cls::mem_fun));
+ 
+ static_assert (!has_static_storage_duration (^^cls::static_mem_fun));
+ static_assert (!has_thread_storage_duration (^^cls::static_mem_fun));
+ static_assert (!has_automatic_storage_duration (^^cls::static_mem_fun));
+ 
+ static_assert (!has_static_storage_duration (^^cls::type));
+ static_assert (!has_thread_storage_duration (^^cls::type));
+ static_assert (!has_automatic_storage_duration (^^cls::type));
+ 
+ static_assert (has_static_storage_duration (^^cls_var));
+ static_assert (!has_thread_storage_duration (^^cls_var));
+ static_assert (!has_automatic_storage_duration (^^cls_var));
+ 
+ static_assert (!has_static_storage_duration (^^onion));
+ static_assert (!has_thread_storage_duration (^^onion));
+ static_assert (!has_automatic_storage_duration (^^onion));
+ 
+ static_assert (!has_static_storage_duration (^^anon));
+ static_assert (!has_thread_storage_duration (^^anon));
+ static_assert (!has_automatic_storage_duration (^^anon));
+ 
+ static_assert (!has_static_storage_duration (^^fun));
+ static_assert (!has_thread_storage_duration (^^fun));
+ static_assert (!has_automatic_storage_duration (^^fun));
+ 
+ static_assert (!has_static_storage_duration (^^alias));
+ static_assert (!has_thread_storage_duration (^^alias));
+ static_assert (!has_automatic_storage_duration (^^alias));
+ 
+ static_assert (has_static_storage_duration (^^var));
+ static_assert (!has_thread_storage_duration (^^var));
+ static_assert (!has_automatic_storage_duration (^^var));
+ 
+ static_assert (has_static_storage_duration (^^ref));
+ static_assert (!has_thread_storage_duration (^^ref));
+ static_assert (!has_automatic_storage_duration (^^ref));
+ 
+ static_assert (has_static_storage_duration (^^rref));
+ static_assert (!has_thread_storage_duration (^^rref));
+ static_assert (!has_automatic_storage_duration (^^rref));
+ 
+ static_assert (has_static_storage_duration (^^ptr));
+ static_assert (!has_thread_storage_duration (^^ptr));
+ static_assert (!has_automatic_storage_duration (^^ptr));
+ 
+ static_assert (!has_static_storage_duration (^^cls_tmpl));
+ static_assert (!has_thread_storage_duration (^^cls_tmpl));
+ static_assert (!has_automatic_storage_duration (^^cls_tmpl));
+ 
+ static_assert (!has_static_storage_duration (^^cls_tmpl<int>));
+ static_assert (!has_thread_storage_duration (^^cls_tmpl<int>));
+ static_assert (!has_automatic_storage_duration (^^cls_tmpl<int>));
+ 
+ static_assert (!has_static_storage_duration (^^incomplete_cls<int>));
+ static_assert (!has_thread_storage_duration (^^incomplete_cls<int>));
+ static_assert (!has_automatic_storage_duration (^^incomplete_cls<int>));
+ 
+ static_assert (!has_static_storage_duration (^^fun_tmpl));
+ static_assert (!has_thread_storage_duration (^^fun_tmpl));
+ static_assert (!has_automatic_storage_duration (^^fun_tmpl));
+ 
+ static_assert (!has_static_storage_duration (^^fun_tmpl<int>));
+ static_assert (!has_thread_storage_duration (^^fun_tmpl<int>));
+ static_assert (!has_automatic_storage_duration (^^fun_tmpl<int>));
+ 
+ static_assert (!has_static_storage_duration (^^conc));
+ static_assert (!has_thread_storage_duration (^^conc));
+ static_assert (!has_automatic_storage_duration (^^conc));
+ 
+ static_assert (!has_static_storage_duration (substitute (^^conc, {^^int})));
+ static_assert (!has_thread_storage_duration (substitute (^^conc, {^^int})));
+ static_assert (!has_automatic_storage_duration (substitute (^^conc, {^^int})));
+ 
+ static_assert (!has_static_storage_duration (^^var_tmpl));
+ static_assert (!has_thread_storage_duration (^^var_tmpl));
+ static_assert (!has_automatic_storage_duration (^^var_tmpl));
+ 
+ static_assert (has_static_storage_duration (^^var_tmpl<int>));
+ static_assert (!has_thread_storage_duration (^^var_tmpl<int>));
+ static_assert (!has_automatic_storage_duration (^^var_tmpl<int>));
+ 
+ static_assert (!has_static_storage_duration (^^cls_tmpl_alias));
+ static_assert (!has_thread_storage_duration (^^cls_tmpl_alias));
+ static_assert (!has_automatic_storage_duration (^^cls_tmpl_alias));
+ 
+ static_assert (!has_static_storage_duration (^^cls_tmpl_alias<int>));
+ static_assert (!has_thread_storage_duration (^^cls_tmpl_alias<int>));
+ static_assert (!has_automatic_storage_duration (^^cls_tmpl_alias<int>));
+ 
+ static_assert (!has_static_storage_duration (^^Enum));
+ static_assert (!has_thread_storage_duration (^^Enum));
+ static_assert (!has_automatic_storage_duration (^^Enum));
+ 
+ static_assert (!has_static_storage_duration (^^Enum::A));
+ static_assert (!has_thread_storage_duration (^^Enum::A));
+ static_assert (!has_automatic_storage_duration (^^Enum::A));
+ 
+ static_assert (!has_static_storage_duration (^^Enum_class));
+ static_assert (!has_thread_storage_duration (^^Enum_class));
+ static_assert (!has_automatic_storage_duration (^^Enum_class));
+ 
+ static_assert (!has_static_storage_duration (^^Enum_class::A));
+ static_assert (!has_thread_storage_duration (^^Enum_class::A));
+ static_assert (!has_automatic_storage_duration (^^Enum_class::A));
+ 
+ static_assert (!has_static_storage_duration (^^decomp));
+ static_assert (!has_thread_storage_duration (^^decomp));
+ static_assert (!has_automatic_storage_duration (^^decomp));
+ 
+ static_assert (!has_static_storage_duration (^^decomp_ref));
+ static_assert (!has_thread_storage_duration (^^decomp_ref));
+ static_assert (!has_automatic_storage_duration (^^decomp_ref));
+ 
+ static_assert (has_static_storage_duration (^^arr));
+ static_assert (!has_thread_storage_duration (^^arr));
+ static_assert (!has_automatic_storage_duration (^^arr));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!has_static_storage_duration (dms));
+ static_assert (!has_thread_storage_duration (dms));
+ static_assert (!has_automatic_storage_duration (dms));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!has_static_storage_duration (^^T));
+   static_assert (!has_thread_storage_duration (^^T));
+   static_assert (!has_automatic_storage_duration (^^T));
+   static_assert (has_static_storage_duration (R));
+   static_assert (!has_thread_storage_duration (R));
+   static_assert (!has_automatic_storage_duration (R));
+   static_assert (!has_static_storage_duration (R2));
+   static_assert (!has_thread_storage_duration (R2));
+   static_assert (!has_automatic_storage_duration (R2));
+   static_assert (!has_static_storage_duration (R3));
+   static_assert (!has_thread_storage_duration (R3));
+   static_assert (!has_automatic_storage_duration (R3));
+ }
+ 
+ void
+ g ()
+ {
+   f<int, ^^var, ^^ns, ^^cls>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/storage_duration3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/storage_duration3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/storage_duration3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/storage_duration3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::has_{static,thread,automatic}_storage_duration.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A { const int ci = 0; int nci; };
+ struct B : A { mutable int i; };
+ 
+ B arr[2];
+ const A &r = arr[1];
+ static_assert (has_static_storage_duration (^^arr));
+ static_assert (!has_thread_storage_duration (^^arr));
+ static_assert (!has_automatic_storage_duration (^^arr));
+ static_assert (has_static_storage_duration (^^r));
+ static_assert (!has_thread_storage_duration (^^r));
+ static_assert (!has_automatic_storage_duration (^^r));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/subobjects_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/subobjects_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/subobjects_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/subobjects_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,214 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::subobjects_of and has_inaccessible_subobjects.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A { int a; };
+ struct B { int b; };
+ struct C { int c; };
+ struct D { int d; };
+ struct E { int e; };
+ struct F { int f; };
+ struct G { int g; };
+ struct H { int h; };
+ struct I : public A, protected B, private C { int i; };
+ struct J : protected D, private E, public F { int j; };
+ struct K : public G, protected I, private H, public J {
+ public:
+   int Za;
+   static int Zb;
+   enum ZE { ZE0 };
+   using Zc = int;
+   typedef long Zd;
+   template <typename T>
+   struct ZA {};
+   template <typename T>
+   static consteval bool Zfoo (const T &) { return true; }
+   template <int N>
+   static constexpr int Ze = N;
+   template <typename T>
+   using Zf = const T &;
+   void Zbar () {}
+   auto Zbaz ();
+   int Zg : 5;
+   long : 4;
+   int : 0;
+   consteval {
+     ZA <int> z = {};
+     static_assert (Ze <42> == 42);
+     Zf <int> w = 42;
+   }
+ protected:
+   int Xa;
+   static int Xb;
+   enum XE { XE0 };
+   using Xc = int;
+   typedef long Xd;
+   template <typename T>
+   struct XA {};
+   template <typename T>
+   static consteval bool Xfoo (const T &) { return true; }
+   template <int N>
+   static constexpr int Xe = N;
+   template <typename T>
+   using Xf = const T &;
+   void Xbar () {}
+   auto Xbaz ();
+   int Xg : 5;
+   long : 4;
+   int : 0;
+ private:
+   int Ya;
+   static int Yb;
+   enum YE { YE0 };
+   using Yc = int;
+   typedef long Yd;
+   template <typename T>
+   struct YA {};
+   template <typename T>
+   static consteval bool Yfoo (const T &) { return true; }
+   template <int N>
+   static constexpr int Ye = N;
+   template <typename T>
+   using Yf = const T &;
+   void Ybar () {}
+   auto Ybaz ();
+   int Yg : 7;
+   long : 6;
+   int : 0;
+ };
+ struct L : virtual A { int l; };
+ struct M : virtual A { int m; };
+ struct N : public L, protected M, public virtual A { int n; };
+ struct O : public L, public M, public virtual A { int o; };
+ struct P : public L, public M, public virtual A { protected: int p; };
+ 
+ constexpr access_context gctx = access_context::current ();
+ constexpr access_context uctx = access_context::unchecked ();
+ 
+ static_assert (subobjects_of (^^A, uctx).size () == 1);
+ static_assert (subobjects_of (^^A, uctx)[0] == nonstatic_data_members_of (^^A, uctx)[0]);
+ static_assert (subobjects_of (^^B, uctx).size () == 1);
+ static_assert (subobjects_of (^^B, uctx)[0] == nonstatic_data_members_of (^^B, uctx)[0]);
+ static_assert (subobjects_of (^^C, uctx).size () == 1);
+ static_assert (subobjects_of (^^C, uctx)[0] == nonstatic_data_members_of (^^C, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^C, uctx));
+ static_assert (subobjects_of (^^D, uctx).size () == 1);
+ static_assert (subobjects_of (^^D, uctx)[0] == nonstatic_data_members_of (^^D, uctx)[0]);
+ static_assert (subobjects_of (^^E, uctx).size () == 1);
+ static_assert (subobjects_of (^^E, uctx)[0] == nonstatic_data_members_of (^^E, uctx)[0]);
+ static_assert (subobjects_of (^^F, uctx).size () == 1);
+ static_assert (subobjects_of (^^F, uctx)[0] == nonstatic_data_members_of (^^F, uctx)[0]);
+ static_assert (subobjects_of (^^G, uctx).size () == 1);
+ static_assert (subobjects_of (^^G, uctx)[0] == nonstatic_data_members_of (^^G, uctx)[0]);
+ static_assert (subobjects_of (^^H, uctx).size () == 1);
+ static_assert (subobjects_of (^^H, uctx)[0] == nonstatic_data_members_of (^^H, uctx)[0]);
+ static_assert (subobjects_of (^^I, uctx).size () == 4);
+ static_assert (subobjects_of (^^I, uctx)[0] == bases_of (^^I, uctx)[0]);
+ static_assert (subobjects_of (^^I, uctx)[1] == bases_of (^^I, uctx)[1]);
+ static_assert (subobjects_of (^^I, uctx)[2] == bases_of (^^I, uctx)[2]);
+ static_assert (subobjects_of (^^I, uctx)[3] == nonstatic_data_members_of (^^I, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^I, uctx));
+ static_assert (subobjects_of (^^J, uctx).size () == 4);
+ static_assert (subobjects_of (^^J, uctx)[0] == bases_of (^^J, uctx)[0]);
+ static_assert (subobjects_of (^^J, uctx)[1] == bases_of (^^J, uctx)[1]);
+ static_assert (subobjects_of (^^J, uctx)[2] == bases_of (^^J, uctx)[2]);
+ static_assert (subobjects_of (^^J, uctx)[3] == nonstatic_data_members_of (^^J, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^J, uctx));
+ static_assert (subobjects_of (^^K, uctx).size () == 10);
+ static_assert (subobjects_of (^^K, uctx)[0] == bases_of (^^K, uctx)[0]);
+ static_assert (subobjects_of (^^K, uctx)[1] == bases_of (^^K, uctx)[1]);
+ static_assert (subobjects_of (^^K, uctx)[2] == bases_of (^^K, uctx)[2]);
+ static_assert (subobjects_of (^^K, uctx)[3] == bases_of (^^K, uctx)[3]);
+ static_assert (subobjects_of (^^K, uctx)[4] == nonstatic_data_members_of (^^K, uctx)[0]);
+ static_assert (subobjects_of (^^K, uctx)[5] == nonstatic_data_members_of (^^K, uctx)[1]);
+ static_assert (subobjects_of (^^K, uctx)[6] == nonstatic_data_members_of (^^K, uctx)[2]);
+ static_assert (subobjects_of (^^K, uctx)[7] == nonstatic_data_members_of (^^K, uctx)[3]);
+ static_assert (subobjects_of (^^K, uctx)[8] == nonstatic_data_members_of (^^K, uctx)[4]);
+ static_assert (subobjects_of (^^K, uctx)[9] == nonstatic_data_members_of (^^K, uctx)[5]);
+ static_assert (!has_inaccessible_subobjects (^^K, uctx));
+ static_assert (subobjects_of (^^L, uctx).size () == 2);
+ static_assert (subobjects_of (^^L, uctx)[0] == bases_of (^^L, uctx)[0]);
+ static_assert (subobjects_of (^^L, uctx)[1] == nonstatic_data_members_of (^^L, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^L, uctx));
+ static_assert (subobjects_of (^^M, uctx).size () == 2);
+ static_assert (subobjects_of (^^M, uctx)[0] == bases_of (^^M, uctx)[0]);
+ static_assert (subobjects_of (^^M, uctx)[1] == nonstatic_data_members_of (^^M, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^M, uctx));
+ static_assert (subobjects_of (^^N, uctx).size () == 4);
+ static_assert (subobjects_of (^^N, uctx)[0] == bases_of (^^N, uctx)[0]);
+ static_assert (subobjects_of (^^N, uctx)[1] == bases_of (^^N, uctx)[1]);
+ static_assert (subobjects_of (^^N, uctx)[2] == bases_of (^^N, uctx)[2]);
+ static_assert (subobjects_of (^^N, uctx)[3] == nonstatic_data_members_of (^^N, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^N, uctx));
+ static_assert (subobjects_of (^^O, uctx).size () == 4);
+ static_assert (subobjects_of (^^O, uctx)[0] == bases_of (^^O, uctx)[0]);
+ static_assert (subobjects_of (^^O, uctx)[1] == bases_of (^^O, uctx)[1]);
+ static_assert (subobjects_of (^^O, uctx)[2] == bases_of (^^O, uctx)[2]);
+ static_assert (subobjects_of (^^O, uctx)[3] == nonstatic_data_members_of (^^O, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^O, uctx));
+ static_assert (subobjects_of (^^P, uctx).size () == 4);
+ static_assert (subobjects_of (^^P, uctx)[0] == bases_of (^^P, uctx)[0]);
+ static_assert (subobjects_of (^^P, uctx)[1] == bases_of (^^P, uctx)[1]);
+ static_assert (subobjects_of (^^P, uctx)[2] == bases_of (^^P, uctx)[2]);
+ static_assert (subobjects_of (^^P, uctx)[3] == nonstatic_data_members_of (^^P, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^P, uctx));
+ 
+ static_assert (subobjects_of (^^A, gctx).size () == 1);
+ static_assert (subobjects_of (^^A, gctx)[0] == nonstatic_data_members_of (^^A, uctx)[0]);
+ static_assert (subobjects_of (^^B, gctx).size () == 1);
+ static_assert (subobjects_of (^^B, gctx)[0] == nonstatic_data_members_of (^^B, uctx)[0]);
+ static_assert (subobjects_of (^^C, gctx).size () == 1);
+ static_assert (subobjects_of (^^C, gctx)[0] == nonstatic_data_members_of (^^C, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^C, gctx));
+ static_assert (subobjects_of (^^D, gctx).size () == 1);
+ static_assert (subobjects_of (^^D, gctx)[0] == nonstatic_data_members_of (^^D, uctx)[0]);
+ static_assert (subobjects_of (^^E, gctx).size () == 1);
+ static_assert (subobjects_of (^^E, gctx)[0] == nonstatic_data_members_of (^^E, uctx)[0]);
+ static_assert (subobjects_of (^^F, gctx).size () == 1);
+ static_assert (subobjects_of (^^F, gctx)[0] == nonstatic_data_members_of (^^F, uctx)[0]);
+ static_assert (subobjects_of (^^G, gctx).size () == 1);
+ static_assert (subobjects_of (^^G, gctx)[0] == nonstatic_data_members_of (^^G, uctx)[0]);
+ static_assert (subobjects_of (^^H, gctx).size () == 1);
+ static_assert (subobjects_of (^^H, gctx)[0] == nonstatic_data_members_of (^^H, uctx)[0]);
+ static_assert (subobjects_of (^^I, gctx).size () == 2);
+ static_assert (subobjects_of (^^I, gctx)[0] == bases_of (^^I, uctx)[0]);
+ static_assert (subobjects_of (^^I, gctx)[1] == nonstatic_data_members_of (^^I, uctx)[0]);
+ static_assert (has_inaccessible_subobjects (^^I, gctx));
+ static_assert (subobjects_of (^^J, gctx).size () == 2);
+ static_assert (subobjects_of (^^J, gctx)[0] == bases_of (^^J, uctx)[2]);
+ static_assert (subobjects_of (^^J, gctx)[1] == nonstatic_data_members_of (^^J, uctx)[0]);
+ static_assert (has_inaccessible_subobjects (^^J, gctx));
+ static_assert (subobjects_of (^^K, gctx).size () == 4);
+ static_assert (subobjects_of (^^K, gctx)[0] == bases_of (^^K, uctx)[0]);
+ static_assert (subobjects_of (^^K, gctx)[1] == bases_of (^^K, uctx)[3]);
+ static_assert (subobjects_of (^^K, gctx)[2] == ^^K::Za);
+ static_assert (subobjects_of (^^K, gctx)[3] == ^^K::Zg);
+ static_assert (has_inaccessible_subobjects (^^K, gctx));
+ static_assert (subobjects_of (^^L, gctx).size () == 2);
+ static_assert (subobjects_of (^^L, gctx)[0] == bases_of (^^L, uctx)[0]);
+ static_assert (subobjects_of (^^L, gctx)[1] == nonstatic_data_members_of (^^L, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^L, uctx));
+ static_assert (subobjects_of (^^M, gctx).size () == 2);
+ static_assert (subobjects_of (^^M, gctx)[0] == bases_of (^^M, uctx)[0]);
+ static_assert (subobjects_of (^^M, gctx)[1] == nonstatic_data_members_of (^^M, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^M, gctx));
+ static_assert (subobjects_of (^^N, gctx).size () == 3);
+ static_assert (subobjects_of (^^N, gctx)[0] == bases_of (^^N, uctx)[0]);
+ static_assert (subobjects_of (^^N, gctx)[1] == bases_of (^^N, uctx)[2]);
+ static_assert (subobjects_of (^^N, gctx)[2] == nonstatic_data_members_of (^^N, uctx)[0]);
+ static_assert (has_inaccessible_subobjects (^^N, gctx));
+ static_assert (subobjects_of (^^O, gctx).size () == 4);
+ static_assert (subobjects_of (^^O, gctx)[0] == bases_of (^^O, uctx)[0]);
+ static_assert (subobjects_of (^^O, gctx)[1] == bases_of (^^O, uctx)[1]);
+ static_assert (subobjects_of (^^O, gctx)[2] == bases_of (^^O, uctx)[2]);
+ static_assert (subobjects_of (^^O, gctx)[3] == nonstatic_data_members_of (^^O, uctx)[0]);
+ static_assert (!has_inaccessible_subobjects (^^O, gctx));
+ static_assert (subobjects_of (^^P, gctx).size () == 3);
+ static_assert (subobjects_of (^^P, gctx)[0] == bases_of (^^P, uctx)[0]);
+ static_assert (subobjects_of (^^P, gctx)[1] == bases_of (^^P, uctx)[1]);
+ static_assert (subobjects_of (^^P, gctx)[2] == bases_of (^^P, uctx)[2]);
+ static_assert (has_inaccessible_subobjects (^^P, gctx));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/substitute1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/substitute1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/substitute1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/substitute1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,238 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::substitute.
+ 
+ #include <meta>
+ #include <ranges>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ struct cls {
+   int dm;
+   static int static_dm;
+   void mem_fun ();
+   static void static_mem_fun ();
+   int &ref_dm = dm;
+   using type = int;
+ } cls_var;
+ union onion { };
+ static union { int anon; };
+ using alias = cls;
+ void fun ();
+ int var;
+ int &ref = var;
+ int &&rref = 42;
+ int *ptr = &var;
+ namespace ns {}
+ namespace ns_alias = ns;
+ enum Enum { A };
+ enum class Enum_class { A };
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {};
+ template<typename> void fun_tmpl ();
+ template<typename> concept conc = requires { true; };
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ 
+ int arr[] = { 42 };
+ auto [ decomp ] = arr;
+ auto &[ decomp_ref ] = arr;
+ 
+ template <reflection_range R = std::initializer_list <info>>
+ consteval bool
+ could_substitute (info r, R &&args)
+ {
+   try { substitute (r, args); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!could_substitute (null_reflection, {}));
+ static_assert (!could_substitute (^^::, {}));
+ static_assert (!could_substitute (^^ns, {}));
+ static_assert (!could_substitute (^^ns_alias, {}));
+ static_assert (!could_substitute (reflect_constant (3), {}));
+ static_assert (!could_substitute (^^cls, {}));
+ static_assert (!could_substitute (^^cls::dm, {}));
+ static_assert (!could_substitute (^^cls::ref_dm, {}));
+ static_assert (!could_substitute (^^cls::static_dm, {}));
+ static_assert (!could_substitute (^^cls::mem_fun, {}));
+ static_assert (!could_substitute (^^cls::static_mem_fun, {}));
+ static_assert (!could_substitute (^^cls::type, {}));
+ static_assert (!could_substitute (^^cls_var, {}));
+ static_assert (!could_substitute (^^onion, {}));
+ static_assert (!could_substitute (^^anon, {}));
+ static_assert (!could_substitute (^^fun, {}));
+ static_assert (!could_substitute (^^alias, {}));
+ static_assert (!could_substitute (^^var, {}));
+ static_assert (!could_substitute (^^ref, {}));
+ static_assert (!could_substitute (^^rref, {}));
+ static_assert (!could_substitute (^^ptr, {}));
+ static_assert (!could_substitute (^^cls_tmpl, {}));
+ static_assert (!could_substitute (^^cls_tmpl<int>, {}));
+ static_assert (!could_substitute (^^incomplete_cls<int>, {}));
+ static_assert (!could_substitute (^^fun_tmpl, {}));
+ static_assert (!could_substitute (^^fun_tmpl<int>, {}));
+ static_assert (!could_substitute (^^conc, {}));
+ static_assert (!could_substitute (substitute (^^conc, { ^^int }), {}));
+ static_assert (!could_substitute (^^var_tmpl, {}));
+ static_assert (!could_substitute (^^var_tmpl<int>, {}));
+ static_assert (!could_substitute (^^cls_tmpl_alias, {}));
+ static_assert (!could_substitute (^^cls_tmpl_alias<int>, {}));
+ static_assert (!could_substitute (^^Enum, {}));
+ static_assert (!could_substitute (^^Enum::A, {}));
+ static_assert (!could_substitute (^^Enum_class, {}));
+ static_assert (!could_substitute (^^Enum_class::A, {}));
+ static_assert (!could_substitute (^^decomp, {}));
+ static_assert (!could_substitute (^^decomp_ref, {}));
+ static_assert (!could_substitute (^^arr, {}));
+ 
+ constexpr auto dms = data_member_spec (^^int, { .name = "dms" });
+ static_assert (!could_substitute (dms, {}));
+ 
+ struct Base {};
+ struct Derived : Base {};
+ static_assert (!could_substitute (bases_of (^^Derived, access_context::current ())[0], {}));
+ 
+ template<typename T, info R, info R2, info R3>
+ void
+ f ()
+ {
+   static_assert (!could_substitute (^^T, {}));
+   static_assert (!could_substitute (R, {}));
+   static_assert (!could_substitute (R2, {}));
+   static_assert (!could_substitute (R3, {}));
+ }
+ 
+ void
+ g (int p, cls c)
+ {
+   f<int, ^^var, ^^ns, ^^cls_tmpl_alias>();
+   static_assert (!could_substitute (^^p, {}));
+   static_assert (!could_substitute (^^c, {}));
+ }
+ 
+ template <typename T>
+ struct S {};
+ 
+ template <float F, int N>
+ struct T {};
+ 
+ template <typename ...T>
+ struct U {};
+ 
+ template <typename T>
+ T foo (T x) { return x; }
+ 
+ template <int N>
+ constexpr int v = N;
+ 
+ template <typename T>
+ concept C = requires { T::s; };
+ 
+ struct V { int s; };
+ 
+ struct NS {
+   constexpr NS (int x) : ns (x) {}
+   constexpr NS (const NS &x) : ns (x.ns) {}
+   constexpr ~NS () {}
+ private:
+   int ns;
+ };
+ [[=1]] void bar (int x);
+ 
+ static_assert (!could_substitute (^^S, {}));
+ static_assert (!could_substitute (^^S, { null_reflection }));
+ static_assert (!could_substitute (^^S, { parameters_of (^^bar)[0] }));
+ static_assert (!could_substitute (^^S, { annotations_of (^^bar)[0] }));
+ static_assert (!could_substitute (^^S, { ^^:: }));
+ static_assert (!could_substitute (^^S, { ^^ns }));
+ static_assert (!could_substitute (^^S, { ^^ns_alias }));
+ static_assert (!could_substitute (^^S, { ^^NS::~NS }));
+ static_assert (!could_substitute (^^S, { reflect_constant (42) }));
+ constexpr int n = 42;
+ static_assert (!could_substitute (^^S, { ^^n }));
+ constexpr NS nsv (42);
+ static_assert (!could_substitute (^^S, { ^^nsv }));
+ 
+ static_assert (!could_substitute (^^S, {}));
+ static_assert (substitute (^^S, { ^^int }) == ^^S <int>);
+ static_assert (substitute (^^S, { ^^V }) == ^^S <V>);
+ static_assert (substitute (^^S, { ^^NS }) == ^^S <NS>);
+ static_assert (!is_value (substitute (^^S, { ^^int })));
+ static_assert (!is_object (substitute (^^S, { ^^int })));
+ static_assert (!could_substitute (^^S, { ^^int, ^^long }));
+ static_assert (!could_substitute (^^S, { reflect_constant (42) }));
+ static_assert (!could_substitute (^^S, { ^^n }));
+ static_assert (!could_substitute (^^T, {}));
+ static_assert (!could_substitute (^^T, { ^^float, ^^int }));
+ constexpr float fv = 42.0f;
+ static_assert (substitute (^^T, { ^^fv, reflect_constant (42) }) == ^^T <42.0f, 42>);
+ static_assert (!is_value (substitute (^^T, { ^^fv, reflect_constant (42) })));
+ static_assert (!is_object (substitute (^^T, { ^^fv, reflect_constant (42) })));
+ static_assert (substitute (^^T, { ^^fv, reflect_constant (0) }) == ^^T <42.0f, 0>);
+ static_assert (!is_value (substitute (^^T, { ^^fv, reflect_constant (0) })));
+ static_assert (!is_object (substitute (^^T, { ^^fv, reflect_constant (0) })));
+ static_assert (substitute (^^T, { ^^fv, ^^n }) == ^^T <42.0f, 42>);
+ static_assert (!is_value (substitute (^^T, { ^^fv, ^^n })));
+ static_assert (!is_object (substitute (^^T, { ^^fv, ^^n })));
+ static_assert (!could_substitute (^^T, { ^^n, ^^fv }));
+ static_assert (!could_substitute (^^T, { ^^fv, ^^n, ^^fv }));
+ 
+ static_assert (substitute (^^U, {}) == ^^U <>);
+ static_assert (!is_value (substitute (^^U, {})));
+ static_assert (!is_object (substitute (^^U, {})));
+ static_assert (substitute (^^U, { ^^int }) == ^^U <int>);
+ static_assert (substitute (^^U, { ^^int, ^^long, ^^const int &, ^^float, ^^double }) == ^^U <int, long, const int &, float, double>);
+ static_assert (substitute (^^U, std::vector <info> { ^^int, ^^long, ^^const int &, ^^float, ^^double } | std::views::reverse) == ^^U <double, float, const int &, long, int>);
+ static_assert (!could_substitute (^^U, { ^^int, ^^long, ^^const int &, ^^n, ^^float }));
+ 
+ static_assert (!could_substitute (^^v, {}));
+ static_assert (substitute (^^v, { reflect_constant (15) }) == ^^v <15>);
+ static_assert (!is_value (substitute (^^v, { reflect_constant (15) })));
+ static_assert (!is_object (substitute (^^v, { reflect_constant (15) })));
+ static_assert (substitute (^^v, { ^^n }) == ^^v <42>);
+ static_assert (!is_value (substitute (^^v, { ^^n })));
+ static_assert (!is_object (substitute (^^v, { ^^n })));
+ static_assert (!could_substitute (^^v, { ^^n, ^^n }));
+ static_assert (!could_substitute (^^v, { ^^int }));
+ 
+ static_assert (!could_substitute (^^C, {}));
+ static_assert (substitute (^^C, { ^^int }) == reflect_constant (false));
+ static_assert (is_value (substitute (^^C, { ^^int })));
+ static_assert (!is_object (substitute (^^C, { ^^int })));
+ static_assert (substitute (^^C, { ^^V }) == reflect_constant (true));
+ static_assert (is_value (substitute (^^C, { ^^V })));
+ static_assert (!is_object (substitute (^^C, { ^^V })));
+ static_assert (!could_substitute (^^C, { ^^int, ^^int }));
+ static_assert (!could_substitute (^^C, { reflect_constant (42) }));
+ static_assert (!could_substitute (^^C, { ^^n }));
+ 
+ static_assert (!could_substitute (^^foo, {}));
+ static_assert (substitute (^^foo, { ^^int }) == ^^foo <int>);
+ static_assert (!is_value (substitute (^^foo, { ^^int })));
+ static_assert (!is_object (substitute (^^foo, { ^^int })));
+ static_assert (substitute (^^foo, { ^^int }) == ^^foo <int>);
+ static_assert (substitute (^^foo, { ^^V }) == ^^foo <V>);
+ static_assert (substitute (^^foo, { ^^NS }) == ^^foo <NS>);
+ static_assert (!could_substitute (^^foo, { ^^int, ^^long }));
+ static_assert (!could_substitute (^^foo, { reflect_constant (42) }));
+ static_assert (!could_substitute (^^foo, { ^^n }));
+ 
+ template <class T, class U>
+ struct TU1 {};
+ template <class T, class U>
+ struct TU2 {};
+ 
+ template <template <class, class> class T, class U, class V>
+ T <U, V> baz () { return T <U, V> {}; }
+ 
+ static_assert (return_type_of (^^baz <TU1, int, long>) == ^^TU1 <int, long>);
+ static_assert (return_type_of (^^baz <TU2, double, int>) == ^^TU2 <double, int>);
+ static_assert (substitute (^^baz, { ^^TU1, ^^int, ^^long }) == ^^baz <TU1, int, long>);
+ static_assert (!is_value (substitute (^^baz, { ^^TU1, ^^int, ^^long })));
+ static_assert (!is_object (substitute (^^baz, { ^^TU1, ^^int, ^^long })));
+ static_assert (substitute (^^baz, { ^^TU2, ^^double, ^^int }) == ^^baz <TU2, double, int>);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/substitute2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/substitute2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/substitute2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/substitute2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template <info R>
+ struct A {
+   static constexpr auto value = R;
+ };
+ 
+ template <class... R>
+ struct B { };
+ 
+ template <size_t I, typename J>
+ using C = [: template_arguments_of (^^J)[I] :];
+ 
+ template <class T>
+ using D = [: [] {
+   std::vector<info> args;
+   for (info b : bases_of (T::value, access_context::unchecked ()))
+     args.push_back (substitute (^^A, { reflect_constant (b) }));
+   return substitute (^^B, args); } () :];
+ 
+ struct E { };
+ struct F : E { };
+ 
+ constexpr auto b = bases_of (^^F, access_context::unchecked ())[0];
+ static_assert (std::same_as <C <0, D <A <^^F>>>, A <b>>);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/symbol_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/symbol_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/symbol_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/symbol_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,61 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::symbol_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval bool
+ has_symbol_of (operators op)
+ {
+   try { symbol_of (op); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!has_symbol_of (static_cast <operators> (4242)));
+ static_assert (symbol_of (op_new) == std::string_view ("new"));
+ static_assert (symbol_of (op_delete) == std::string_view ("delete"));
+ static_assert (symbol_of (op_array_new) == std::string_view ("new[]"));
+ static_assert (symbol_of (op_array_delete) == std::string_view ("delete[]"));
+ static_assert (symbol_of (op_co_await) == std::string_view ("co_await"));
+ static_assert (symbol_of (op_parentheses) == std::string_view ("()"));
+ static_assert (symbol_of (op_square_brackets) == std::string_view ("[]"));
+ static_assert (symbol_of (op_arrow) == std::string_view ("->"));
+ static_assert (symbol_of (op_arrow_star) == std::string_view ("->*"));
+ static_assert (symbol_of (op_tilde) == std::string_view ("~"));
+ static_assert (symbol_of (op_exclamation) == std::string_view ("!"));
+ static_assert (symbol_of (op_plus) == std::string_view ("+"));
+ static_assert (symbol_of (op_minus) == std::string_view ("-"));
+ static_assert (symbol_of (op_star) == std::string_view ("*"));
+ static_assert (symbol_of (op_slash) == std::string_view ("/"));
+ static_assert (symbol_of (op_percent) == std::string_view ("%"));
+ static_assert (symbol_of (op_caret) == std::string_view ("^"));
+ static_assert (symbol_of (op_ampersand) == std::string_view ("&"));
+ static_assert (symbol_of (op_equals) == std::string_view ("="));
+ static_assert (symbol_of (op_pipe) == std::string_view ("|"));
+ static_assert (symbol_of (op_plus_equals) == std::string_view ("+="));
+ static_assert (symbol_of (op_minus_equals) == std::string_view ("-="));
+ static_assert (symbol_of (op_star_equals) == std::string_view ("*="));
+ static_assert (symbol_of (op_slash_equals) == std::string_view ("/="));
+ static_assert (symbol_of (op_percent_equals) == std::string_view ("%="));
+ static_assert (symbol_of (op_caret_equals) == std::string_view ("^="));
+ static_assert (symbol_of (op_ampersand_equals) == std::string_view ("&="));
+ static_assert (symbol_of (op_pipe_equals) == std::string_view ("|="));
+ static_assert (symbol_of (op_equals_equals) == std::string_view ("=="));
+ static_assert (symbol_of (op_exclamation_equals) == std::string_view ("!="));
+ static_assert (symbol_of (op_less) == std::string_view ("<"));
+ static_assert (symbol_of (op_greater) == std::string_view (">"));
+ static_assert (symbol_of (op_less_equals) == std::string_view ("<="));
+ static_assert (symbol_of (op_greater_equals) == std::string_view (">="));
+ static_assert (symbol_of (op_spaceship) == std::string_view ("<=>"));
+ static_assert (symbol_of (op_ampersand_ampersand) == std::string_view ("&&"));
+ static_assert (symbol_of (op_pipe_pipe) == std::string_view ("||"));
+ static_assert (symbol_of (op_less_less) == std::string_view ("<<"));
+ static_assert (symbol_of (op_greater_greater) == std::string_view (">>"));
+ static_assert (symbol_of (op_less_less_equals) == std::string_view ("<<="));
+ static_assert (symbol_of (op_greater_greater_equals) == std::string_view (">>="));
+ static_assert (symbol_of (op_plus_plus) == std::string_view ("++"));
+ static_assert (symbol_of (op_minus_minus) == std::string_view ("--"));
+ static_assert (symbol_of (op_comma) == std::string_view (","));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/symbol_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/symbol_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/symbol_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/symbol_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,6 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-require-iconv "IBM1047" }
+ // { dg-additional-options "-freflection -fexec-charset=IBM1047" }
+ // Test std::meta::symbol_of.
+ 
+ #include "symbol_of1.C"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_arguments_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_arguments_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_arguments_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_arguments_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,36 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::template_arguments_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template<class T, class U = T> struct Pair { };
+ template<class T> struct Pair<char, T> { };
+ template<class T> using PairPtr = Pair<T*>;
+ 
+ static_assert(template_of(^^Pair<int>) == ^^Pair);
+ static_assert(template_of(^^Pair<char, char>) == ^^Pair);
+ static_assert(template_arguments_of(^^Pair<int>).size() == 2);
+ static_assert(template_arguments_of(^^Pair<int>)[0] == ^^int);
+ static_assert(template_arguments_of(^^Pair<int>)[1] == ^^int);
+ 
+ static_assert(template_of(^^PairPtr<int>) == ^^PairPtr);
+ static_assert(template_arguments_of(^^PairPtr<int>).size() == 1);
+ static_assert(template_arguments_of(^^PairPtr<int>)[0] == ^^int);
+ 
+ struct S { };
+ int i;
+ template<int, int&, S, template<class> class>
+   struct X { };
+ constexpr auto T = ^^X<1, i, S{}, PairPtr>;
+ static_assert(is_value(template_arguments_of(T)[0]));
+ static_assert(!is_object(template_arguments_of(T)[0]));
+ static_assert(!is_value(template_arguments_of(T)[1]));
+ static_assert(is_object(template_arguments_of(T)[1]));
+ static_assert(is_object(template_arguments_of(T)[2]));
+ static_assert(!is_value(template_arguments_of(T)[2]));
+ static_assert(!is_value(template_arguments_of(T)[3]));
+ static_assert(!is_object(template_arguments_of(T)[3]));
+ static_assert(template_arguments_of(T)[3] == ^^PairPtr);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_arguments_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_arguments_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_arguments_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_arguments_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,107 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::template_arguments_of.
+ // Taken from test/std/experimental/reflection/template-arguments.pass.cpp
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ struct TCls {
+   template <typename> struct TInnerCls {};
+ };
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ void TFn();
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ int TVar = 0;
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ using TAlias = int;
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ concept Concept = requires { true; };
+ 
+ 
+ static_assert(template_arguments_of(^^TCls<int, 9, std::vector>).size() == 3);
+ static_assert(template_arguments_of(^^TCls<int, 9, std::vector>)[0] == ^^int);
+ static_assert([:template_arguments_of(^^TCls<int, 9, std::vector>)[1]:] == 9);
+ static_assert(template_arguments_of(^^TCls<int, 9, std::vector>)[2] == ^^std::vector);
+ 
+ static_assert(template_arguments_of(^^TFn<int, 9, std::vector>).size() == 3);
+ static_assert(template_arguments_of(^^TFn<int, 9, std::vector>)[0] == ^^int);
+ static_assert([:template_arguments_of(^^TFn<int, 9, std::vector>)[1]:] == 9);
+ static_assert(template_arguments_of(^^TFn<int, 9, std::vector>)[2] == ^^std::vector);
+ 
+ static_assert(template_arguments_of(^^TVar<int, 9, std::vector>).size() == 3);
+ static_assert(template_arguments_of(^^TVar<int, 9, std::vector>)[0] == ^^int);
+ static_assert([:template_arguments_of(^^TVar<int, 9, std::vector>)[1]:] == 9);
+ static_assert(template_arguments_of(^^TVar<int, 9, std::vector>)[2] == ^^std::vector);
+ 
+ static_assert(template_arguments_of(^^TAlias<int, 9, std::vector>).size() == 3);
+ static_assert(template_arguments_of(^^TAlias<int, 9, std::vector>)[0] == ^^int);
+ static_assert([:template_arguments_of(^^TAlias<int, 9, std::vector>)[1]:] == 9);
+ static_assert(template_arguments_of(^^TAlias<int, 9, std::vector>)[2] == ^^std::vector);
+ 
+ template <typename T>
+ using DependentAlias = TCls<int, 9, std::vector>::template TInnerCls<T>;
+ static_assert(template_arguments_of(^^DependentAlias<int>).size() == 1);
+ static_assert(template_arguments_of(^^DependentAlias<int>)[0] == ^^int);
+ 
+ template <typename T, T Val> struct WithDependentArgument {};
+ static_assert(template_arguments_of(^^WithDependentArgument<int, 5>).size() == 2);
+ static_assert(template_arguments_of(^^WithDependentArgument<int, 5>)[0] == ^^int);
+ 
+ template <typename... Ts> struct WithTypeParamPack {};
+ static_assert(template_arguments_of(^^WithTypeParamPack<int, bool>).size() == 2);
+ static_assert(template_arguments_of(^^WithTypeParamPack<int, bool>)[0] == ^^int);
+ static_assert(template_arguments_of(^^WithTypeParamPack<int, bool>)[1] == ^^bool);
+ static_assert(template_arguments_of(^^WithTypeParamPack<>).size() == 0);
+ 
+ struct S {
+   int mem;
+   bool operator==(const S&) const = default;
+ };
+ template <auto... Vs> struct WithAutoParamPack {};
+ 
+ static_assert(template_arguments_of(^^WithAutoParamPack<4, S{3}>).size() == 2);
+ static_assert([:template_arguments_of(^^WithAutoParamPack<4, S{3}>)[0]:] == 4);
+ static_assert([:template_arguments_of(^^WithAutoParamPack<4, S{3}>)[1]:] == S{3});
+ static_assert(template_arguments_of(^^WithAutoParamPack<>).size() == 0);
+ 
+ template <float> struct WithFloat {};
+ template <const float *> struct WithPtr {};
+ template <const int &> struct WithRef {};
+ template <info> struct WithReflection {};
+ 
+ constexpr float F = 4.5f;
+ static_assert(template_arguments_of(^^WithFloat<F>).size() == 1);
+ static_assert([:template_arguments_of(^^WithFloat<F>)[0]:] == F);
+ 
+ constexpr float Fs[] = {4.5, 5.5, 6.5};
+ static_assert(template_arguments_of(^^WithPtr<Fs>).size() == 1);
+ static_assert([:template_arguments_of(^^WithPtr<Fs>)[0]:] == +Fs);
+ 
+ static_assert(template_arguments_of(^^WithPtr<nullptr>).size() == 1);
+ static_assert([:template_arguments_of(^^WithPtr<nullptr>)[0]:] == nullptr);
+ 
+ const int I = 5;
+ using T = WithRef<I>;
+ static_assert(template_arguments_of(dealias(^^T)).size() == 1);
+ static_assert([:template_arguments_of(^^WithRef<I>)[0]:] == I);
+ 
+ static_assert(template_arguments_of(^^WithReflection<^^int>).size() == 1);
+ static_assert(template_arguments_of(^^WithReflection<^^int>)[0] == reflect_constant(^^int));
+ 
+ template <int &> void fn();
+ int p[2];
+ static_assert(template_arguments_of(^^fn<p[1]>)[0] == reflect_object(p[1]));
+ 
+ template<class T> struct X {};
+ X<int> obj1;
+ X<decltype(obj1)> obj2;
+ 
+ static_assert(has_template_arguments(template_arguments_of(^^decltype(obj2))[0])
+ 	      == has_template_arguments(^^X<int>));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_arguments_of3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_arguments_of3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_arguments_of3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_arguments_of3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,18 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::template_arguments_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ using U = int;
+ typedef double V;
+ 
+ template<typename T, typename U>
+ struct S {};
+ 
+ static_assert (template_arguments_of (^^S<int, double>)[0] == ^^int);
+ static_assert (template_arguments_of (^^S<int, double>)[1] == ^^double);
+ static_assert (template_arguments_of (^^S<U, V>)[0] == ^^int);
+ static_assert (template_arguments_of (^^S<U, V>)[1] == ^^double);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,119 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::template_of.
+ 
+ #include <meta>
+ #include <vector>
+ 
+ using namespace std::meta;
+ 
+ template<typename> struct incomplete_cls;
+ template<typename> struct cls_tmpl {
+   template <typename T> struct inner {};
+ };
+ template<typename> void fun_tmpl ();
+ template<typename> int var_tmpl;
+ template<typename T> using cls_tmpl_alias = cls_tmpl<T>;
+ template<typename> using int_alias = int;
+ template<typename U> using dep_alias = cls_tmpl<int>::template inner<U>;
+ 
+ static_assert (template_of (^^cls_tmpl<int>) == ^^cls_tmpl);
+ static_assert (template_of (^^incomplete_cls<int>) == ^^incomplete_cls);
+ static_assert (template_of (^^int_alias<int>) == ^^int_alias);
+ static_assert (template_of (^^dep_alias<bool>) == ^^dep_alias);
+ static_assert (template_of (^^fun_tmpl<int>) == ^^fun_tmpl);
+ static_assert (template_of (^^var_tmpl<int>) == ^^var_tmpl);
+ static_assert (template_of (^^cls_tmpl_alias<int>) == ^^cls_tmpl_alias);
+ 
+ struct W {
+   using U = cls_tmpl<int>;
+ };
+ static_assert (template_of (dealias (^^W::U)) == ^^cls_tmpl);
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ struct class_tmpl {
+   template <typename> struct inner {};
+ };
+ static_assert (template_of (^^class_tmpl<int, 9, std::vector>) == ^^class_tmpl);
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ void fn_tmpl ();
+ static_assert (template_of (^^fn_tmpl<int, 9, std::vector>) == ^^fn_tmpl);
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ int var_tmpl2 = 0;
+ static_assert (template_of (^^var_tmpl2<int, 9, std::vector>) == ^^var_tmpl2);
+ 
+ template <typename P1, auto P2, template <typename...> class P3>
+ using alias = int;
+ static_assert (template_of (^^alias<int, 9, std::vector>) == ^^alias);
+ 
+ template <typename T>
+ using dep_alias2 = class_tmpl<int, 9, std::vector>::template inner<T>;
+ static_assert (template_of (^^dep_alias2<int>) == ^^dep_alias2);
+ 
+ template <typename T, T> struct A {};
+ static_assert (template_of (^^A<int, 5>) == ^^A);
+ 
+ template <typename... Ts> struct B {};
+ static_assert (template_of (^^B<int, bool>) == ^^B);
+ 
+ struct S {
+   int mem;
+   bool operator==(const S&) const = default;
+ };
+ template <auto... Vs> struct auto_pack {};
+ static_assert (template_of (^^auto_pack<4, S{3}>) == ^^auto_pack);
+ 
+ template <float> struct float_targ {};
+ constexpr float F = 4.5f;
+ static_assert (template_of (^^float_targ<F>) == ^^float_targ);
+ 
+ template <const float *> struct ptr_targ {};
+ constexpr float Fs[] = {4.5, 5.5, 6.5};
+ static_assert (template_of (^^ptr_targ<Fs>) == ^^ptr_targ);
+ static_assert (template_of (^^ptr_targ<nullptr>) == ^^ptr_targ);
+ 
+ template <const int &> struct ref_targ {};
+ const int I = 5;
+ using T = ref_targ<I>;
+ static_assert (template_of (dealias(^^T)) == ^^ref_targ);
+ 
+ template <std::meta::info> struct refl_targ {};
+ static_assert (template_of (^^refl_targ<^^int>) == ^^refl_targ);
+ 
+ struct M {
+   template<typename T>
+   struct N { };
+ };
+ 
+ template<typename T>
+ struct TS {
+   template<typename U>
+   struct N { };
+ };
+ 
+ static_assert (template_of (^^M::N<int>) == ^^M::N);
+ static_assert (template_of (^^TS<int>::N<int>) == ^^TS<int>::N);
+ 
+ template<typename T>
+ struct X { };
+ 
+ template<typename T>
+ struct X<T*> { };
+ 
+ template<>
+ struct X<int> { };
+ 
+ static_assert (template_of (^^X<int>) == ^^X);
+ static_assert (template_of (^^X<int *>) == ^^X);
+ 
+ template<typename = int>
+ struct Y { };
+ static_assert (template_of (^^Y<>) == ^^Y);
+ 
+ struct Z {
+   using Alias = X<int>;
+ };
+ 
+ static_assert (template_of (dealias (^^Z::Alias)) == ^^X);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,32 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::template_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct S {
+   template<typename T>
+   void fn (T) { }
+ 
+   template<typename T>
+   using U = int;
+ };
+ 
+ template<typename T>
+ struct TS {
+   template<typename U>
+   void fn (T) { }
+ 
+   template<typename TT>
+   using U = int;
+ };
+ 
+ static_assert (template_of (^^S::fn<int>) == ^^S::fn);
+ static_assert (template_of (^^TS<int>::fn<int>) == ^^TS<int>::fn);
+ static_assert (template_of (^^S::U<int>) == ^^S::U);
+ // FIXME
+ // template<class T> template<class U> using TS<T>::W = int
+ //                   template<class U> using TS<int>::W = int
+ //static_assert (template_of (^^TS<int>::U<int>) == ^^TS<int>::U);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_of3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_of3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/template_of3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/template_of3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::template_of.
+ 
+ #include <meta>
+ 
+ consteval void
+ foo ()
+ {
+   template_of (^^int);
+ }
+ 
+ consteval bool
+ test ()
+ {
+   try { foo (); }
+   catch (std::meta::exception &) { return true; }
+   catch (...) { return false; }
+   return false;
+ }
+ 
+ static_assert (test ());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/tuple1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/tuple1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/tuple1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/tuple1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,86 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::tuple_{size,element}.
+ 
+ #include <array>
+ #include <complex>
+ #include <meta>
+ #include <ranges>
+ #include <tuple>
+ 
+ using namespace std::meta;
+ 
+ struct E {};
+ 
+ using Tup0 = std::tuple<>;
+ static_assert (tuple_size (^^Tup0) == 0);
+ 
+ using Tup1 = std::tuple<int>;
+ static_assert (tuple_size (^^Tup1) == 1);
+ static_assert (tuple_element (0, ^^Tup1) == ^^int);
+ 
+ using Tup2 = std::tuple<int, bool>;
+ static_assert (tuple_size (^^Tup2) == 2);
+ static_assert (tuple_element (0, ^^Tup2) == ^^int);
+ static_assert (tuple_element (1, ^^Tup2) == ^^bool);
+ 
+ using Tup3 = std::tuple<int, bool, char>;
+ static_assert (tuple_size (^^Tup3) == 3);
+ static_assert (tuple_element (0, ^^Tup3) == ^^int);
+ static_assert (tuple_element (1, ^^Tup3) == ^^bool);
+ static_assert (tuple_element (2, ^^Tup3) == ^^char);
+ 
+ using Tup10 = std::tuple<int, int, int, int, int, int, int, int, int, int>;
+ static_assert (tuple_size (^^Tup10) == 10);
+ static_assert (tuple_element (0, ^^Tup10) == ^^int);
+ static_assert (tuple_element (9, ^^Tup10) == ^^int);
+ 
+ using mytype1 = float;
+ using mytype2 = mytype1 *;
+ static_assert (tuple_size (^^std::tuple<mytype1, mytype2>) == 2);
+ static_assert (tuple_element (0, ^^std::tuple<mytype1>) == ^^float);
+ static_assert (tuple_element (1, ^^std::tuple<mytype1, mytype2>) == ^^float *);
+ 
+ static_assert (tuple_size (^^std::tuple<>) == 0);
+ static_assert (tuple_size (^^std::tuple<int>) == 1);
+ static_assert (tuple_size (^^std::tuple<void>) == 1);
+ static_assert (tuple_size (^^std::tuple<std::tuple<void>>) == 1);
+ static_assert (tuple_size (^^const std::tuple<>) == 0);
+ static_assert (tuple_size (^^const std::tuple<int>) == 1);
+ static_assert (tuple_size (^^const std::tuple<void>) == 1);
+ static_assert (tuple_size (^^const std::tuple<std::tuple<void>>) == 1);
+ 
+ using Arr5 = std::array<int, 5>;
+ static_assert (tuple_size (^^Arr5) == 5);
+ static_assert (tuple_size (^^const Arr5) == 5);
+ static_assert (tuple_element (0, ^^Arr5) == ^^int);
+ static_assert (tuple_element (1, ^^Arr5) == ^^int);
+ static_assert (tuple_element (2, ^^Arr5) == ^^int);
+ static_assert (tuple_element (3, ^^Arr5) == ^^int);
+ static_assert (tuple_element (4, ^^Arr5) == ^^int);
+ using Arr0 = std::array<int, 0>;
+ static_assert (tuple_size (^^Arr0) == 0);
+ 
+ using Pair = std::pair<E, int>;
+ // Always 2.
+ static_assert (tuple_size (^^Pair) == 2);
+ static_assert (tuple_element (0, ^^Pair) == ^^E);
+ static_assert (tuple_element (1, ^^Pair) == ^^int);
+ 
+ using C = std::complex<double>;
+ static_assert (tuple_size (^^C) == 2);
+ static_assert (tuple_element (0, ^^C) == ^^double);
+ static_assert (tuple_element (1, ^^C) == ^^double);
+ 
+ using S1 = std::ranges::subrange<int *>;
+ using S2 = std::ranges::subrange<long *, void *>;
+ static_assert (tuple_size (^^S1) == 2);
+ static_assert (tuple_size (^^S2) == 2);
+ static_assert (tuple_element (0, ^^S1) == ^^int *);
+ static_assert (tuple_element (1, ^^S1) == ^^int *);
+ static_assert (tuple_element (0, ^^const S1) == ^^int *);
+ static_assert (tuple_element (1, ^^const S1) == ^^int *);
+ static_assert (tuple_element (0, ^^S2) == ^^long *);
+ static_assert (tuple_element (1, ^^S2) == ^^void *);
+ static_assert (tuple_element (0, ^^const S2) == ^^long *);
+ static_assert (tuple_element (1, ^^const S2) == ^^void *);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/tuple2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/tuple2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/tuple2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/tuple2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::tuple_{size,element}.
+ 
+ #include <array>
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr auto s1 = tuple_size (^^int); // { dg-error "couldn't instantiate 'std::tuple_size<int>'" }
+ int x;
+ constexpr auto s2 = tuple_size (^^x); // { dg-error "uncaught exception" }
+ 
+ constexpr auto r1 = tuple_element (666, ^^std::tuple<int>); // { dg-error "uncaught exception" }
+ 
+ using Arr0 = std::array<int, 0>;
+ constexpr auto r2 = tuple_element (1, ^^Arr0);
+ 
+ // { dg-error "tuple index must be in range" "" { target *-*-* } 0 }
+ // { dg-error "array index is in range" "" { target *-*-* } 0 }
+ // { dg-error "pack index .666." "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,190 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on types.
+ 
+ template<class, class> struct same_type;
+ template<class T> struct same_type<T, T> {};
+ 
+ using size_t = decltype(sizeof(int));
+ using info = decltype(^^void);
+ using T = int;
+ 
+ struct S { int i; };
+ 
+ constexpr auto g1 = ^^unsigned;
+ constexpr auto g2 = ^^S;
+ constexpr static auto g3 = ^^unsigned;
+ constexpr static auto g4 = ^^S;
+ constexpr info g5 = ^^void;
+ constexpr info g6 = ^^decltype(42);
+ constexpr info g7 = ^^T;
+ constexpr info g8 = ^^decltype(^^int);
+ constexpr info g9 = ^^void() const & noexcept;
+ 
+ [: g1 :] u1;  // { dg-error "expected unqualified-id" }
+ typename [: g1 :] u2;
+ 
+ namespace N {
+   [: g1 :] nu1;  // { dg-error "expected unqualified-id" }
+   typename [: g1 :] nu2;
+ }
+ 
+ void
+ f1 ()
+ {
+   constexpr auto r1 = ^^int;
+   [: r1 :] v1 = 42;  // { dg-error "expected a reflection of an expression" }
+   typename [: r1 :] v1t = 42;
+   same_type<decltype(v1t), int>();
+ 
+   const typename [: r1 :] v2 = 42;
+   same_type<decltype(v2), const int>();
+ 
+   const volatile typename [: r1 :] v3 = 42;
+   same_type<decltype(v3), const volatile int>();
+   const typename [: r1 :] *v4 = &v1t;
+   same_type<decltype(v4), const int *>();
+ 
+   constexpr auto r2 = ^^double;
+   [: r2 :] v5 = 42.2;  // { dg-error "expected a reflection of an expression" }
+   typename [: r2 :] v5t = 42.2;
+   same_type<decltype(v5t), double>();
+ 
+   [: r2 :] &v6 = v5t;  // { dg-error "expected a reflection of an expression|.v6. was not declared" }
+   typename [: r2 :] &v6t = v5t;
+   same_type<decltype(v6t), double &>();
+ 
+   constexpr auto r3 = ^^S;
+   [: r3 :] v7 = { 42 };  // { dg-error "expected a reflection of an expression" }
+   typename [: r3 :] v7t = { 42 };
+   same_type<decltype(v7t), S>();
+   const typename [: r3 :] v8 = { 42 };
+   same_type<decltype(v8), const S>();
+ 
+   constexpr auto r4 = ^^long long int;
+   [: r4 :] v9 = 0ll;  // { dg-error "expected a reflection of an expression" }
+   typename [: r4 :] v9t = 0ll;
+   same_type<decltype(v9t), long long int>();
+ 
+   constexpr auto r5 = ^^const int;
+   [: r5 :] v10 = 0;  // { dg-error "expected a reflection of an expression" }
+   typename [: r5 :] v10t = 0;
+   same_type<decltype(v10t), const int>();
+ 
+   constexpr auto r6 = ^^volatile short;
+   [: r6 :] v11 = 0;  // { dg-error "expected a reflection of an expression" }
+   typename [: r6 :] v11t = 0;
+   same_type<decltype(v11t), volatile short>();
+ 
+   constexpr auto r7 = ^^bool;
+   [: r7 :] v12 = 0;  // { dg-error "expected a reflection of an expression" }
+   typename [: r7 :] v12t = 0;
+   same_type<decltype(v12t), bool>();
+ 
+   constexpr auto r8 = ^^wchar_t;
+   [: r8 :] v13 = 0;  // { dg-error "expected a reflection of an expression" }
+   typename [: r8 :] v13t = 0;
+   same_type<decltype(v13t), wchar_t>();
+ 
+   constexpr auto r9 = ^^decltype(sizeof 0);
+   [: r9 :] v14 = 0;  // { dg-error "expected a reflection of an expression" }
+   typename [: r9 :] v14t = 0;
+   same_type<decltype(v14t), size_t>();
+ 
+   constexpr auto r10 = ^^signed;
+   [: r10 :] v15 = 0;  // { dg-error "expected a reflection of an expression" }
+   typename [: r10 :] v15t = 0;
+   same_type<decltype(v15t), int>();
+ 
+ }
+ 
+ void
+ f2 ()
+ {
+   typename [:^^char:] c1 = '*';
+   same_type<decltype(c1), char>();
+ 
+   const typename [:^^char:] c2 = '*';
+   same_type<decltype(c2), const char>();
+ 
+   typename [:^^int:]* c3 = nullptr;
+   same_type<decltype(c3), int *>();
+ 
+   typename [:^^int:] c4 = 42;
+   same_type<decltype(c4), int>();
+ 
+   typename [:^^int:] &c5 = c4;
+   same_type<decltype(c5), int &>();
+ 
+   typename [:^^int:] arr1[10];
+   same_type<decltype(arr1), int[10]>();
+ }
+ 
+ void
+ f3 ()
+ {
+   typename [: g1 :] v1 = 42;
+   same_type<decltype(v1), unsigned>();
+   typename [: g3 :] v2 = 42;
+   same_type<decltype(v2), unsigned>();
+   typename [: g2 :] v3 = { 42 };
+   same_type<decltype(v3), S>();
+   typename [: g4 :] v4 = { 42 };
+   same_type<decltype(v4), S>();
+ }
+ 
+ void
+ f4 ()
+ {
+   static constexpr auto r = ^^unsigned;
+   constexpr auto p = &r;
+   [: *p :] i1 = 0u;  // { dg-error "expected a reflection of an expression" }
+   typename [: *p :] i2 = 0u;
+ }
+ 
+ constexpr void
+ f5 ()
+ {
+   static constexpr auto r = ^^unsigned;
+   constexpr auto p = &r;
+   [: *p :] i1 = 0u;  // { dg-error "expected a reflection of an expression" }
+   typename [: *p :] i2 = 0u;
+ }
+ 
+ consteval void
+ f6 ()
+ {
+   static constexpr auto r = ^^unsigned;
+   constexpr auto p = &r;
+   [: *p :] i1 = 0u;  // { dg-error "expected a reflection of an expression" }
+   typename [: *p :] i2 = 0u;
+   auto t = r;
+   ^^int;
+ }
+ 
+ void
+ f7 ()
+ {
+   {
+     {
+       constexpr auto r = ^^int;
+       typename [: r :] v = 42;
+       same_type<decltype(v), int>();
+     }
+   }
+ }
+ 
+ enum E { X, Y };
+ enum class SE { yay, nay };
+ 
+ void
+ f8 ()
+ {
+   constexpr auto r = ^^E;
+   [: r :] e = Y;  // { dg-error "expected a reflection of an expression" }
+   typename [: r :] et;
+ 
+   constexpr auto r2 = ^^SE;
+   [: r2 :] e2 = SE::yay;  // { dg-error "expected a reflection of an expression" }
+   typename [: r2 :] et2;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,31 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ void fn1 ([: ^^int :]);  // { dg-error "declared void|expected a reflection of an expression" }
+ void fn2 ([: ^^int :][]);  // { dg-error "declared void|expected a reflection of an expression" }
+ void fn3 (typename [: ^^int :]);
+ void fn4 (typename [: ^^int :] *);
+ 
+ constexpr auto r = ^^fn3;
+ void fn3 ([: r :]); // { dg-error "declared void|expected a reflection of an expression" }
+ 
+ template<info R, info T>
+ void
+ g ()
+ {
+   void foo(typename [:R:]);
+   foo (nullptr);
+ 
+   int bar(typename [:T:]);
+   bar ({});
+ }
+ 
+ struct X { };
+ 
+ void
+ f ()
+ {
+   g<^^int*, ^^X>();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,58 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on types.  Invalid cases.
+ 
+ struct A;
+ 
+ void
+ f1 ()
+ {
+   const auto r = ^^double; // { dg-error "consteval-only variable" }
+   constexpr auto r2 = ^^int;
+   r2; // { dg-error "consteval-only expressions" }
+   ^^void; // { dg-error "consteval-only expressions" }
+   ^^int == ^^int; // { dg-error "consteval-only expressions" }
+   (void) ^^float; // { dg-error "consteval-only expressions" }
+   auto rr = r; // { dg-error "consteval-only variable" }
+ 
+   constexpr auto x = &(^^int); // { dg-error "lvalue required" }
+ 
+   // These are verboten.
+   constexpr auto a = ^^auto;  // { dg-error "cannot be applied to" }
+   constexpr auto d = ^^decltype(auto);  // { dg-error "cannot be applied to" }
+ 
+   constexpr auto r3 = ^^A;
+   [: r3 :] inc;	// { dg-error "expected a reflection of an expression" }
+ }
+ 
+ constexpr void
+ f2 ()
+ {
+   auto r = ^^int; // { dg-error "consteval-only variable" }
+ }
+ 
+ void
+ f3 ()
+ {
+   [: ^^:: :] i; // { dg-error "expected" }
+   typename [: ^^:: :] i2;  // { dg-error "expected" }
+ }
+ 
+ void
+ f4 ()
+ {
+   using T1 = ^^int;  // { dg-error "expected type-specifier" }
+ }
+ 
+ template<typename... T>
+ void
+ f5 ()
+ {
+   constexpr auto r = ^^T; // { dg-error "parameter packs not expanded with" }
+ }
+ 
+ void
+ g ()
+ {
+   f2 ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,37 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflections on types.
+ 
+ struct S { int i; };
+ 
+ constexpr auto g1 = ^^int;
+ constexpr auto g2 = ^^S;
+ 
+ // Create int foo (int, S *);
+ typename [: g1 :] foo (typename [: g1 :], typename [: g2 :] *);
+ 
+ void
+ bar (S *s)
+ {
+   foo (42, s);
+ }
+ 
+ template<typename T>
+ constexpr int bar (T t) { return t; }
+ 
+ void
+ g ()
+ {
+   constexpr auto r = [: ^^bar<typename [: ^^int :]> :](42);
+   static_assert (r == 42);
+ }
+ 
+ struct A {
+   int a;
+   consteval A(int p) : a(p) {}
+ };
+ constexpr auto r = ^^A;
+ struct B : A {
+   using [: r :]::A;
+   consteval B([: ^^int :] p, [: ^^int :] q) : A(p * q) {}
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,136 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflect-expression -> ^^ type-id.
+ // type-id:
+ //   type-specifier-seq abstract-declarator(opt)
+ 
+ enum E { E1 };
+ struct S { };
+ using T = int;
+ template<typename T>
+ class C {
+   using type = T;
+ };
+ union U { int i; };
+ 
+ template<typename T>
+ using AT = C<T>;
+ 
+ void
+ f1 ()
+ {
+   // type-specifier -> simple-type-specifier
+   constexpr auto r1 = ^^void;
+   constexpr auto r2 = ^^void*;
+   constexpr auto r3 = ^^int&;
+   constexpr auto r4 = ^^int&&;
+   constexpr auto r5 = ^^decltype(sizeof(0));
+   constexpr auto r6 = ^^E*;
+   constexpr auto r7 = ^^S*;
+   constexpr auto r8 = ^^T*;
+   constexpr auto r9 = ^^const void*;
+   constexpr auto r10 = ^^const int&;
+   constexpr auto r11 = ^^E const*;
+   constexpr auto r12 = ^^S const*const;
+   constexpr auto r13 = ^^const T *;
+   constexpr auto r14 = ^^E;
+   constexpr auto r15 = ^^S;
+   constexpr auto r16 = ^^T;
+   constexpr auto r17 = ^^T&&;
+   constexpr auto r18 = ^^int*[3];
+   constexpr auto r19 = ^^int (*)[3];
+   constexpr auto r20 = ^^int *();
+   constexpr auto r21 = ^^int (*)(double);
+ 
+   int i = 42;
+   E e;
+   S s;
+   typename [: r1 :] fn1 ();
+   typename [: r16 :] fn2 (typename [: r1 :]);
+   typename [: r2 :] v1 = nullptr;
+   typename [: r3 :] v2 = i;
+   typename [: r4 :] v3 = 42;
+   typename [: r5 :] v4 = 0U;
+   typename [: r6 :] v5 = &e;
+   typename [: r7 :] v6 = &s;
+   typename [: r8 :] v7 = &i;
+   typename [: r9 :] v8 = nullptr;
+   typename [: r10 :] v9 = 42;
+   typename [: r11 :] v10 = &e;
+   typename [: r12 :] v11 = &s;
+   typename [: r13 :] v12 = &i;
+   typename [: r14 :] v13;
+   typename [: r15 :] v14;
+   typename [: r16 :] v15;
+   typename [: r17 :] v16 = 42;
+   typename [: r18 :] v17 = {nullptr};
+   typename [: r19 :] v18;
+   typename [: r20 :] v19;
+   typename [: r21 :] v20;
+ 
+   // type-specifier -> elaborated-type-specifier
+   constexpr auto r22 = ^^struct S;
+   constexpr auto r23 = ^^struct ::S;
+   constexpr auto r24 = ^^struct C<int>;
+   constexpr auto r25 = ^^struct ::C<int>;
+   constexpr auto r26 = ^^struct ::template C<int>;
+   constexpr auto r27 = ^^union U;
+   constexpr auto r28 = ^^union ::U;
+   constexpr auto r29 = ^^enum E;
+   constexpr auto r30 = ^^enum ::E;
+   constexpr auto r31 = ^^const struct S;
+   constexpr auto r32 = ^^const struct ::S;
+   constexpr auto r33 = ^^const struct C<int>;
+   constexpr auto r34 = ^^const struct ::C<int>;
+   constexpr auto r35 = ^^const struct ::template C<int>;
+   constexpr auto r36 = ^^const union U;
+   constexpr auto r37 = ^^const union ::U;
+   constexpr auto r38 = ^^const enum E;
+   constexpr auto r39 = ^^const enum ::E;
+ 
+   typename [: r22 :] s1;
+   typename [: r23 :] s2;
+   typename [: r31 :] s3;
+   typename [: r32 :] s4;
+   typename [: r24 :] c1;
+   typename [: r25 :] c2;
+   typename [: r26 :] c3;
+   typename [: r33 :] c4;
+   typename [: r34 :] c5;
+   typename [: r35 :] c6;
+   typename [: r27 :] u1;
+   typename [: r28 :] u2;
+   typename [: r36 :] u3{1};
+   typename [: r37 :] u4{1};
+   typename [: r29 :] e1;
+   typename [: r30 :] e2;
+   typename [: r38 :] e3 = E1;
+   typename [: r39 :] e4 = E1;
+ 
+   // type-specifier -> typename-specifier
+   constexpr auto r40 = ^^typename ::E;
+   constexpr auto r41 = ^^typename ::C<int>;
+   constexpr auto r42 = ^^typename ::template C<int>;
+   constexpr auto r43 = ^^typename ::S;
+   constexpr auto r44 = ^^typename ::T;
+   constexpr auto r45 = ^^typename ::U;
+ 
+   typename [: r40 :] e5;
+   typename [: r41 :] c7;
+   typename [: r42 :] c8;
+   typename [: r43 :] s5;
+   typename [: r44 :] i1;
+   typename [: r45 :] u5;
+ 
+   constexpr auto r46 = ^^AT<int>;
+   constexpr auto r47 = ^^::AT<int>;
+   constexpr auto r48 = ^^::template AT<int>;
+   constexpr auto r49 = ^^typename ::AT<int>;
+   constexpr auto r50 = ^^typename ::template AT<int>;
+ 
+   typename [: r46 :] c9;
+   typename [: r47 :] c10;
+   typename [: r48 :] c11;
+   typename [: r49 :] c12;
+   typename [: r50 :] c13;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,10 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Distilled from [temp.res.general].
+ 
+ enum class Enum { A, B, C };
+ template<class T> struct S {
+   using Alias = [:^^int:];
+   auto h() -> [:^^S:]<T*>;
+   using enum [:^^Enum:];
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^int);
+ 
+ template<typename T> concept C = requires {
+   typename [:T::r1:];
+   typename [:T::r2:]<int>;
+ };
+ 
+ template<typename T>
+ struct Z { };
+ 
+ struct S {
+   static constexpr info r1 = ^^int;
+   static constexpr info r2 = ^^Z;
+ };
+ 
+ void
+ g (S s)
+ {
+   typename [: S::r1 :] i = 42;
+   typename [: S::r2 :]<int> z;
+   C auto a = s;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type7.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type7.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type7.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type7.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection -fconcepts-diagnostics-depth=2" }
+ 
+ using info = decltype(^^int);
+ 
+ template<typename T> concept C = requires {
+   typename [:T::r1:]; // { dg-error ".r1. is not a member of .int." }
+   typename [:T::r2:]<int>;  // { dg-error ".r2. is not a member of .int." }
+ };
+ 
+ void
+ g ()
+ {
+   C auto a = 42;  // { dg-error "does not satisfy placeholder constraints" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,76 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test splice-expressions in decltype.
+ 
+ template<class, class> struct same_type;
+ template<class T> struct same_type<T, T> {};
+ 
+ struct S {
+   static const int &&mem();
+   static int i;
+   int j;
+ } s;
+ 
+ const int && foo();
+ decltype(foo()) x1 = 17;       // type is const int&&
+ same_type<decltype(x1), const int &&> s1;
+ decltype([: ^^x1 :]) x5 = 18;    // type is const int&&
+ same_type<decltype(x5), const int &&> s2;
+ decltype(([: ^^x1 :])) x6 = 19;  // type is const int&
+ same_type<decltype(x6), const int &> s3;
+ same_type<decltype(foo), const int&&()> s4a;
+ same_type<decltype([: ^^foo :]), const int&&()> s4b;
+ same_type<decltype(S::i), int> s5a;
+ same_type<decltype([: ^^S::i :]), int> s5b;
+ same_type<decltype((S::i)), int&> s6a;
+ same_type<decltype(([: ^^S::i :])), int&> s6b;
+ same_type<decltype(S::mem), const int&&()> s7a;
+ same_type<decltype([: ^^S::mem :]), const int&&()> s7b;
+ same_type<decltype((S::mem)), const int&& (&)()> s8a;
+ same_type<decltype(([: ^^S::mem :])), const int&& (&)()> s8b;
+ same_type<decltype(s.j), int> s9a;
+ same_type<decltype([: ^^s :].j), int> s9b;
+ same_type<decltype((s.j)), int&> s10a;
+ same_type<decltype(([: ^^s :].j)), int&> s10b;
+ 
+ namespace N {
+   struct A { } a;
+ }
+ 
+ same_type<decltype(N::a), N::A> s11a;
+ same_type<decltype([: ^^N :]::a), N::A> s11b;
+ same_type<decltype([: ^^N::a :]), N::A> s11c;
+ 
+ struct B {
+   int i : 31;
+ } b;
+ 
+ same_type<decltype(b.i), int> s12a;
+ same_type<decltype([: ^^b :].i), int> s12b;
+ same_type<decltype((b.i)), int&> s13a;
+ same_type<decltype(([: ^^b :].i)), int&> s13b;
+ 
+ template<typename T>
+ struct C {
+   static constexpr T t{};
+ };
+ 
+ template<typename T>
+ void
+ g ()
+ {
+   same_type<decltype(C<T>::t), const int>();
+   same_type<decltype((C<T>::t)), const int&>();
+   same_type<decltype([: ^^C<T>::t :]), const int>();
+   same_type<decltype(([: ^^C<T>::t :])), const int&>();
+   same_type<decltype([: ^^C<T> :]::t), const int>();
+   same_type<decltype(([: ^^C<T> :]::t)), const int&>();
+   same_type<decltype(template [: ^^C :]<T>::t), const int>();
+   same_type<decltype((template [: ^^C :]<T>::t)), const int&>();
+ }
+ 
+ void
+ doit ()
+ {
+   g<int> ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,49 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ using info = decltype(^^void);
+ 
+ template<typename>
+ void foo () { }
+ void bar () { }
+ namespace N { }
+ namespace M = N;
+ template<typename T>
+ T vt{};
+ template<typename T>
+ concept C = true;
+ static int i;
+ enum E { X };
+ struct S { static int si; };
+ template<typename T>
+ struct D { static T di; };
+ template<typename T>
+ using Z = D<T>;
+ 
+ template<info R> void fn1 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn2 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn3 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn4 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn5 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn6 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn7 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn8 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn9 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn10 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn11 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn12 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ template<info R> void fn13 () { int n = typename [:R:](42); } // { dg-error "not usable in a splice type" }
+ 
+ template void fn1<^^foo<int>>();  // { dg-message "required from here" }
+ template void fn2<^^foo>();	  // { dg-message "required from here" }
+ template void fn3<^^N>();	  // { dg-message "required from here" }
+ template void fn4<^^M>();	  // { dg-message "required from here" }
+ template void fn5<^^bar>();	  // { dg-message "required from here" }
+ template void fn6<^^vt<int>>();	  // { dg-message "required from here" }
+ template void fn7<^^vt>();	  // { dg-message "required from here" }
+ template void fn8<^^C>();	  // { dg-message "required from here" }
+ template void fn9<^^i>();	  // { dg-message "required from here" }
+ template void fn10<^^X>();	  // { dg-message "required from here" }
+ template void fn11<^^S::si>();	  // { dg-message "required from here" }
+ template void fn12<^^D<int>::di>(); // { dg-message "required from here" }
+ template void fn13<^^Z>();	  // { dg-message "required from here" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,190 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::type_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+ };
+ struct U {
+   int u;
+   int v : 5;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ consteval bool
+ has_type (info r)
+ {
+   try { type_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (has_type (std::meta::reflect_constant (42)));
+ static_assert (has_type (std::meta::reflect_object (arr[1])));
+ static_assert (has_type (^^arr));
+ static_assert (!has_type (^^a3));
+ static_assert (has_type (^^fn));
+ static_assert (!has_type (^^fn2));
+ static_assert (has_type (^^Enum::A));
+ static_assert (!has_type (^^Alias));
+ static_assert (!has_type (^^S));
+ static_assert (has_type (^^S::mem));
+ static_assert (has_type (std::meta::members_of (^^S, ctx)[1]));
+ static_assert (!has_type (^^TCls));
+ static_assert (!has_type (^^TFn));
+ static_assert (!has_type (^^TVar));
+ static_assert (!has_type (^^Concept));
+ static_assert (!has_type (^^NSAlias));
+ static_assert (!has_type (^^NS));
+ static_assert (has_type (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (has_type (std::meta::data_member_spec (^^int, { .name = "member" })));
+ static_assert (has_type (std::meta::data_member_spec (^^int, { .name = "member", .bit_width = 6 })));
+ static_assert (has_type (std::meta::data_member_spec (^^int, { .bit_width = 0 })));
+ static_assert (has_type (std::meta::data_member_spec (^^int, { .bit_width = 5 })));
+ void bar (long, const T f, int g[2], T &);
+ 
+ int
+ foo (int a, const long b, T c, int d[4], T &e)
+ {
+   static_assert (has_type (^^a));
+   static_assert (has_type (^^b));
+   static_assert (has_type (^^c));
+   static_assert (has_type (^^d));
+   static_assert (has_type (^^e));
+   static_assert (has_type (parameters_of (^^foo)[0]));
+   static_assert (has_type (parameters_of (^^foo)[1]));
+   static_assert (has_type (parameters_of (^^foo)[2]));
+   static_assert (has_type (parameters_of (^^foo)[3]));
+   static_assert (has_type (parameters_of (^^foo)[4]));
+   static_assert (has_type (parameters_of (^^bar)[0]));
+   static_assert (has_type (parameters_of (^^bar)[1]));
+   static_assert (has_type (parameters_of (^^bar)[2]));
+   static_assert (has_type (parameters_of (^^bar)[3]));
+   static_assert (type_of (^^a) == ^^int);
+   using clong = const long;
+   static_assert (type_of (^^b) == dealias(^^clong));
+   static_assert (type_of (^^c) == ^^T);
+   using ptr = int *;
+   static_assert (type_of (^^d) == dealias (^^ptr));
+   using ref = T &;
+   static_assert (type_of (^^e) == dealias (^^ref));
+   static_assert (type_of (parameters_of (^^foo)[0]) == ^^int);
+   static_assert (type_of (parameters_of (^^foo)[1]) == ^^long);
+   static_assert (type_of (parameters_of (^^foo)[2]) == ^^T);
+   static_assert (type_of (parameters_of (^^foo)[3]) == dealias (^^ptr));
+   static_assert (type_of (parameters_of (^^foo)[4]) == dealias (^^ref));
+   static_assert (type_of (parameters_of (^^bar)[0]) == ^^long);
+   static_assert (type_of (parameters_of (^^bar)[1]) == ^^T);
+   static_assert (type_of (parameters_of (^^bar)[2]) == dealias (^^ptr));
+   static_assert (type_of (parameters_of (^^bar)[3]) == dealias (^^ref));
+   return 0;
+ }
+ 
+ static_assert (type_of (std::meta::reflect_constant (42)) == ^^int);
+ static_assert (type_of (std::meta::reflect_constant (42.0)) == ^^double);
+ static_assert (type_of (std::meta::reflect_constant (U { 42 })) == ^^const U);
+ static_assert (type_of (std::meta::reflect_object (arr[1])) == ^^int);
+ using int3 = int[3];
+ static_assert (type_of (^^arr) == dealias (^^int3));
+ static_assert (type_of (^^fn) == ^^void ());
+ static_assert (type_of (^^Enum::A) == ^^Enum);
+ static_assert (type_of (^^A) == ^^Enum);
+ static_assert (type_of (^^S::mem) == ^^int);
+ static_assert (type_of (^^U::v) == ^^int);
+ static_assert (type_of (std::meta::members_of (^^S, ctx)[1]) == ^^int);
+ static_assert (type_of (std::meta::bases_of (^^S, ctx)[0]) == ^^B);
+ static_assert (type_of (std::meta::data_member_spec (^^int, { .name = "member" })) == ^^int);
+ static_assert (type_of (std::meta::data_member_spec (^^const long, { .name = "member", .bit_width = 8 })) == ^^const long);
+ static_assert (type_of (std::meta::data_member_spec (^^int3, { .name = "member" })) == ^^int[3]);
+ static_assert (type_of (std::meta::data_member_spec (^^int, { .bit_width = 7 })) == ^^int);
+ static_assert (type_of (std::meta::data_member_spec (^^int, { .bit_width = 0 })) == ^^int);
+ 
+ consteval int
+ test (info x, info y)
+ {
+   if (x == y)
+     return 0;
+   throw 1;
+ }
+ 
+ static_assert (type_of (^^test) == ^^int (info, info));
+ 
+ using ull = unsigned long long;
+ 
+ enum Enum2 {
+   E21,
+   E22,
+   E23 = 3L,
+   E24,
+   E25 = 5ULL,
+   E26,
+   E27 = 7 + test (type_of (^^E21), ^^int)
+ 	  + test (type_of (^^E22), ^^int)
+ 	  + test (type_of (^^E23), ^^long)
+ 	  + test (type_of (^^E24), ^^long)
+ 	  + test (type_of (^^E25), dealias (^^ull))
+ 	  + test (type_of (^^E26), dealias (^^ull))
+ };
+ 
+ static_assert (type_of (^^E21) == ^^Enum2);
+ static_assert (type_of (^^E22) == ^^Enum2);
+ static_assert (type_of (^^E23) == ^^Enum2);
+ static_assert (type_of (^^E24) == ^^Enum2);
+ static_assert (type_of (^^E25) == ^^Enum2);
+ static_assert (type_of (^^E26) == ^^Enum2);
+ static_assert (type_of (^^E27) == ^^Enum2);
+ 
+ enum Enum3 : long {
+   E31,
+   E32,
+   E33 = 3L,
+   E34,
+   E35 = 5ULL,
+   E36,
+   E37 = 7 + test (type_of (^^E31), ^^long)
+ 	  + test (type_of (^^E32), ^^long)
+ 	  + test (type_of (^^E33), ^^long)
+ 	  + test (type_of (^^E34), ^^long)
+ 	  + test (type_of (^^E35), ^^long)
+ 	  + test (type_of (^^E36), ^^long)
+ };
+ 
+ static_assert (type_of (^^E31) == ^^Enum3);
+ static_assert (type_of (^^E32) == ^^Enum3);
+ static_assert (type_of (^^E33) == ^^Enum3);
+ static_assert (type_of (^^E34) == ^^Enum3);
+ static_assert (type_of (^^E35) == ^^Enum3);
+ static_assert (type_of (^^E36) == ^^Enum3);
+ static_assert (type_of (^^E37) == ^^Enum3);
+ 
+ constexpr auto a = reflect_constant_string ("abcd");
+ static_assert (type_of (a) == ^^const char [5]);
+ auto as = &[: a :];
+ static_assert (type_of (^^as) == ^^const char (*) [5]);
+ struct V { int a, b, c; };
+ auto bs = &[: reflect_constant (V { 2, 3, 4 }) :];
+ static_assert (type_of (^^bs) == ^^const V *);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,31 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::type_of.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ template<typename T>
+ consteval auto
+ foo ()
+ {
+   auto Functions = std::vector<info>{};
+   for (auto Info : members_of (^^T, access_context::current ()))
+     if (!is_special_member_function (Info) && is_function (Info))
+       Functions.push_back(Info);
+   return Functions;
+ }
+ 
+ struct F {
+   auto f(int)->void;
+ };
+ 
+ void
+ g ()
+ {
+   constexpr auto fInfo = foo<F>()[0];
+   using fType = [:type_of(fInfo):];
+   // TODO Should work: non-const non-volatile member functions have ordinary
+   // function types.
+   //static_assert (std::same_as<fType, auto(int)->void>);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_rels1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_rels1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_rels1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_rels1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,141 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_same_type.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ using U = int;
+ using UU = U;
+ 
+ static_assert (is_same_type (^^int, ^^int));
+ static_assert (is_same_type (^^int, ^^U));
+ static_assert (is_same_type (^^int, ^^UU));
+ static_assert (!is_same_type (^^int, ^^const int));
+ static_assert (!is_same_type (^^int, ^^const UU));
+ static_assert (!is_same_type (^^int *, ^^int[]));
+ static_assert (!is_same_type (^^int&, ^^int&&));
+ 
+ struct incomplete;
+ struct B {};
+ struct D : B {};
+ struct E1 : D {};
+ struct E2 : D {};
+ static_assert (is_base_of_type (^^B, ^^D));
+ static_assert (is_base_of_type (^^D, ^^E1));
+ static_assert (is_base_of_type (^^B, ^^E1));
+ static_assert (is_base_of_type (^^B, ^^B));
+ static_assert (!is_base_of_type (^^D, ^^B));
+ static_assert (!is_base_of_type (^^E1, ^^D));
+ static_assert (!is_base_of_type (^^E1, ^^B));
+ static_assert (!is_base_of_type (^^B, ^^int));
+ static_assert (!is_base_of_type (^^incomplete, ^^D));
+ 
+ struct V : virtual E1, virtual E2 {};
+ static_assert (!is_virtual_base_of_type (^^B, ^^D));
+ static_assert (!is_virtual_base_of_type (^^const B, ^^D));
+ static_assert (!is_virtual_base_of_type (^^D, ^^B));
+ static_assert (!is_virtual_base_of_type (^^D, ^^int));
+ static_assert (!is_virtual_base_of_type (^^B, ^^B));
+ static_assert (is_virtual_base_of_type (^^B, ^^V));
+ static_assert (is_virtual_base_of_type (^^D, ^^V));
+ static_assert (is_virtual_base_of_type (^^E1, ^^V));
+ static_assert (is_virtual_base_of_type (^^E2, ^^V));
+ 
+ struct D1 : private virtual B {};
+ struct D2 : protected virtual B {};
+ struct D3 : private D1 {};
+ struct D4 : private D2 {};
+ struct D5 : protected D2 {};
+ struct D6 : protected D2 {};
+ static_assert (is_virtual_base_of_type (^^B, ^^D1));
+ static_assert (is_virtual_base_of_type (^^B, ^^D2));
+ static_assert (is_virtual_base_of_type (^^B, ^^D3));
+ static_assert (is_virtual_base_of_type (^^B, ^^D4));
+ static_assert (is_virtual_base_of_type (^^B, ^^D5));
+ static_assert (is_virtual_base_of_type (^^B, ^^D6));
+ 
+ struct W : V {};
+ struct Y : virtual V {};
+ static_assert (is_virtual_base_of_type (^^E1, ^^W));
+ static_assert (is_virtual_base_of_type (^^E2, ^^W));
+ static_assert (is_virtual_base_of_type (^^E1, ^^Y));
+ static_assert (is_virtual_base_of_type (^^E2, ^^Y));
+ 
+ struct X {};
+ struct Z { Z(int); };
+ struct Z2 { Z2(int) noexcept; };
+ static_assert (is_convertible_type (^^bool, ^^int));
+ static_assert (is_convertible_type (^^int, ^^double));
+ static_assert (!is_convertible_type (^^int, ^^X));
+ static_assert (is_convertible_type (^^int, ^^Z));
+ static_assert (!is_convertible_type (^^Z, ^^int));
+ 
+ static_assert (is_nothrow_convertible_type (^^bool, ^^int));
+ static_assert (is_nothrow_convertible_type (^^int, ^^double));
+ static_assert (!is_nothrow_convertible_type (^^int, ^^X));
+ static_assert (!is_nothrow_convertible_type (^^int, ^^Z));
+ static_assert (!is_nothrow_convertible_type (^^Z, ^^int));
+ static_assert (is_nothrow_convertible_type (^^int, ^^Z2));
+ static_assert (!is_nothrow_convertible_type (^^Z2, ^^int));
+ 
+ static_assert (is_layout_compatible_type (^^void, ^^void));
+ static_assert (is_layout_compatible_type (^^int, ^^int));
+ static_assert (!is_layout_compatible_type (^^int, ^^int[]));
+ static_assert (!is_layout_compatible_type (^^int, ^^int[1]));
+ static_assert (is_layout_compatible_type (^^int[], ^^int[]));
+ static_assert (is_layout_compatible_type (^^int[1], ^^int[1]));
+ static_assert (!is_layout_compatible_type (^^int[1], ^^int[]));
+ static_assert (!is_layout_compatible_type (^^int[1], ^^int[2]));
+ static_assert (is_layout_compatible_type (^^incomplete[], ^^incomplete[]));
+ 
+ namespace LC {
+   enum E1 : int { };
+   enum E2 : int;
+   static_assert (is_layout_compatible_type (^^E1, ^^E2));
+   enum E3 : unsigned int;
+   static_assert (!is_layout_compatible_type (^^E1, ^^E3));
+   enum E4 : char { };
+   enum E5 : signed char { };
+   enum E6 : unsigned char { };
+   static_assert (!is_layout_compatible_type (^^E4, ^^E5));
+   static_assert (!is_layout_compatible_type (^^E4, ^^E6));
+   static_assert (!is_layout_compatible_type (^^E5, ^^E6));
+   struct A { int a; };
+   struct B { const int b; };
+   static_assert (is_layout_compatible_type (^^A, ^^B));
+   static_assert (is_layout_compatible_type (^^B, ^^A));
+   struct C : A { };
+   struct D : B { };
+   static_assert (is_layout_compatible_type (^^C, ^^D));
+   struct E : A { int i; };
+   static_assert (!is_layout_compatible_type (^^E, ^^A));
+ }
+ 
+ namespace PI {
+   struct B { };
+   static_assert (is_pointer_interconvertible_base_of_type (^^B, ^^B));
+   static_assert (is_pointer_interconvertible_base_of_type (^^B, ^^const B));
+   static_assert (is_pointer_interconvertible_base_of_type (^^const B, ^^B));
+   static_assert (is_pointer_interconvertible_base_of_type (^^const B, ^^const B));
+   struct D : B { int i; };
+   static_assert (is_pointer_interconvertible_base_of_type (^^D, ^^D));
+   static_assert (is_pointer_interconvertible_base_of_type (^^B, ^^D));
+   static_assert (is_pointer_interconvertible_base_of_type (^^const B, ^^D));
+   static_assert (is_pointer_interconvertible_base_of_type (^^B, ^^const D));
+   static_assert (is_pointer_interconvertible_base_of_type (^^const B, ^^const D));
+   static_assert (!is_pointer_interconvertible_base_of_type (^^D, ^^B));
+   struct E : D { };
+   static_assert (!is_pointer_interconvertible_base_of_type (^^E, ^^B));
+   struct D1 : B { };
+   struct D2 : B { };
+   struct D3 : D1, D2 { };
+   static_assert (!is_pointer_interconvertible_base_of_type (^^B, ^^D3));
+   union U;
+   static_assert (!is_pointer_interconvertible_base_of_type (^^U, ^^U));
+   static_assert (!is_pointer_interconvertible_base_of_type (^^U, ^^D));
+   struct I;
+   static_assert (is_pointer_interconvertible_base_of_type (^^I, ^^I));
+   static_assert (is_pointer_interconvertible_base_of_type (^^I, ^^const I));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,654 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits].
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct cls {
+   using type = int;
+   void mem_fun ();
+   static void static_mem_fun ();
+ };
+ struct empty { };
+ using alias = cls;
+ struct derived : cls { };
+ union onion {
+   onion &operator=(const cls&);
+   onion &operator=(cls&&);
+ };
+ enum class Enum : short {};
+ enum class Enum_class { A };
+ class abstract_cls { virtual void fn() = 0; };
+ class final_cls final {};
+ struct ctor_cls {
+   ctor_cls (int, bool) noexcept {}
+ };
+ struct trivial_cls {
+   int i;
+   bool b;
+ };
+ class virtual_dtor_cls {
+   virtual ~virtual_dtor_cls () {}
+ };
+ int fun (bool, char) noexcept { return 0; }
+ 
+ static_assert (!is_function_type (^^void));
+ static_assert (!is_function_type (^^int));
+ static_assert (!is_function_type (^^const int));
+ static_assert (!is_function_type (^^volatile int));
+ static_assert (!is_function_type (^^unsigned));
+ static_assert (!is_function_type (^^float));
+ static_assert (!is_function_type (^^int&));
+ static_assert (!is_function_type (^^int&&));
+ static_assert (!is_function_type (^^int *));
+ static_assert (!is_function_type (^^int[1]));
+ static_assert (!is_function_type (^^int[]));
+ static_assert (!is_function_type (^^nullptr_t));
+ static_assert (!is_function_type (^^std::meta::info));
+ static_assert (!is_function_type (^^int (cls::*)));
+ static_assert (!is_function_type (^^int (cls::*)()));
+ static_assert (!is_function_type (^^cls));
+ static_assert (is_function_type (type_of (^^cls::mem_fun)));
+ static_assert (is_function_type (type_of (^^cls::static_mem_fun)));
+ static_assert (!is_function_type (^^empty));
+ static_assert (!is_function_type (^^abstract_cls));
+ static_assert (!is_function_type (^^final_cls));
+ static_assert (!is_function_type (^^ctor_cls));
+ static_assert (!is_function_type (^^trivial_cls));
+ static_assert (!is_function_type (^^virtual_dtor_cls));
+ static_assert (!is_function_type (^^onion));
+ static_assert (!is_function_type (^^Enum));
+ static_assert (!is_function_type (^^Enum_class));
+ static_assert (is_function_type (^^void ()));
+ 
+ static_assert (is_void_type (^^void));
+ static_assert (is_void_type (^^const void));
+ static_assert (is_void_type (^^volatile void));
+ static_assert (!is_void_type (^^void *));
+ static_assert (!is_void_type (^^int));
+ static_assert (!is_void_type (^^const int));
+ static_assert (!is_void_type (^^volatile int));
+ static_assert (!is_void_type (^^unsigned));
+ static_assert (!is_void_type (^^float));
+ static_assert (!is_void_type (^^int&));
+ static_assert (!is_void_type (^^int&&));
+ static_assert (!is_void_type (^^int *));
+ static_assert (!is_void_type (^^int[1]));
+ static_assert (!is_void_type (^^int[]));
+ static_assert (!is_void_type (^^nullptr_t));
+ static_assert (!is_void_type (^^std::meta::info));
+ static_assert (!is_void_type (^^int (cls::*)));
+ static_assert (!is_void_type (^^int (cls::*)()));
+ static_assert (!is_void_type (^^cls));
+ static_assert (!is_void_type (^^empty));
+ static_assert (!is_void_type (^^abstract_cls));
+ static_assert (!is_void_type (^^final_cls));
+ static_assert (!is_void_type (^^ctor_cls));
+ static_assert (!is_void_type (^^trivial_cls));
+ static_assert (!is_void_type (^^virtual_dtor_cls));
+ static_assert (!is_void_type (^^onion));
+ static_assert (!is_void_type (^^Enum));
+ static_assert (!is_void_type (^^Enum_class));
+ static_assert (!is_void_type (^^void ()));
+ 
+ static_assert (!is_null_pointer_type (^^void));
+ static_assert (!is_null_pointer_type (^^int));
+ static_assert (!is_null_pointer_type (^^const int));
+ static_assert (!is_null_pointer_type (^^volatile int));
+ static_assert (!is_null_pointer_type (^^unsigned));
+ static_assert (!is_null_pointer_type (^^float));
+ static_assert (!is_null_pointer_type (^^int&));
+ static_assert (!is_null_pointer_type (^^int&&));
+ static_assert (!is_null_pointer_type (^^int *));
+ static_assert (!is_null_pointer_type (^^int[1]));
+ static_assert (!is_null_pointer_type (^^int[]));
+ static_assert (is_null_pointer_type (^^nullptr_t));
+ static_assert (!is_null_pointer_type (^^std::meta::info));
+ static_assert (!is_null_pointer_type (^^int (cls::*)));
+ static_assert (!is_null_pointer_type (^^int (cls::*)()));
+ static_assert (!is_null_pointer_type (^^cls));
+ static_assert (!is_null_pointer_type (^^empty));
+ static_assert (!is_null_pointer_type (^^abstract_cls));
+ static_assert (!is_null_pointer_type (^^final_cls));
+ static_assert (!is_null_pointer_type (^^ctor_cls));
+ static_assert (!is_null_pointer_type (^^trivial_cls));
+ static_assert (!is_null_pointer_type (^^virtual_dtor_cls));
+ static_assert (!is_null_pointer_type (^^onion));
+ static_assert (!is_null_pointer_type (^^Enum));
+ static_assert (!is_null_pointer_type (^^Enum_class));
+ static_assert (!is_null_pointer_type (^^void ()));
+ 
+ static_assert (!is_integral_type (^^void));
+ static_assert (is_integral_type (^^bool));
+ static_assert (is_integral_type (^^wchar_t));
+ static_assert (is_integral_type (^^char8_t));
+ static_assert (is_integral_type (^^char16_t));
+ static_assert (is_integral_type (^^char32_t));
+ static_assert (is_integral_type (^^int));
+ static_assert (is_integral_type (^^const int));
+ static_assert (is_integral_type (^^volatile int));
+ static_assert (is_integral_type (^^unsigned));
+ static_assert (!is_integral_type (^^float));
+ static_assert (!is_integral_type (^^int&));
+ static_assert (!is_integral_type (^^int&&));
+ static_assert (!is_integral_type (^^int *));
+ static_assert (!is_integral_type (^^int[1]));
+ static_assert (!is_integral_type (^^int[]));
+ static_assert (!is_integral_type (^^nullptr_t));
+ static_assert (!is_integral_type (^^std::meta::info));
+ static_assert (!is_integral_type (^^int (cls::*)));
+ static_assert (!is_integral_type (^^int (cls::*)()));
+ static_assert (!is_integral_type (^^cls));
+ static_assert (!is_integral_type (^^empty));
+ static_assert (!is_integral_type (^^abstract_cls));
+ static_assert (!is_integral_type (^^final_cls));
+ static_assert (!is_integral_type (^^ctor_cls));
+ static_assert (!is_integral_type (^^trivial_cls));
+ static_assert (!is_integral_type (^^virtual_dtor_cls));
+ static_assert (!is_integral_type (^^onion));
+ static_assert (!is_integral_type (^^Enum));
+ static_assert (!is_integral_type (^^Enum_class));
+ static_assert (!is_integral_type (^^void ()));
+ 
+ static_assert (!is_floating_point_type (^^void));
+ static_assert (!is_floating_point_type (^^int));
+ static_assert (!is_floating_point_type (^^const int));
+ static_assert (!is_floating_point_type (^^volatile int));
+ static_assert (!is_floating_point_type (^^unsigned));
+ static_assert (is_floating_point_type (^^float));
+ static_assert (is_floating_point_type (^^double));
+ static_assert (is_floating_point_type (^^const double));
+ static_assert (!is_floating_point_type (^^int&));
+ static_assert (!is_floating_point_type (^^int&&));
+ static_assert (!is_floating_point_type (^^int *));
+ static_assert (!is_floating_point_type (^^int[1]));
+ static_assert (!is_floating_point_type (^^int[]));
+ static_assert (!is_floating_point_type (^^nullptr_t));
+ static_assert (!is_floating_point_type (^^std::meta::info));
+ static_assert (!is_floating_point_type (^^int (cls::*)));
+ static_assert (!is_floating_point_type (^^int (cls::*)()));
+ static_assert (!is_floating_point_type (^^cls));
+ static_assert (!is_floating_point_type (^^empty));
+ static_assert (!is_floating_point_type (^^abstract_cls));
+ static_assert (!is_floating_point_type (^^final_cls));
+ static_assert (!is_floating_point_type (^^ctor_cls));
+ static_assert (!is_floating_point_type (^^trivial_cls));
+ static_assert (!is_floating_point_type (^^virtual_dtor_cls));
+ static_assert (!is_floating_point_type (^^onion));
+ static_assert (!is_floating_point_type (^^Enum));
+ static_assert (!is_floating_point_type (^^Enum_class));
+ static_assert (!is_floating_point_type (^^void ()));
+ 
+ static_assert (!is_array_type (^^void));
+ static_assert (!is_array_type (^^int));
+ static_assert (!is_array_type (^^const int));
+ static_assert (!is_array_type (^^volatile int));
+ static_assert (!is_array_type (^^unsigned));
+ static_assert (!is_array_type (^^float));
+ static_assert (!is_array_type (^^int&));
+ static_assert (!is_array_type (^^int&&));
+ static_assert (!is_array_type (^^int *));
+ static_assert (is_array_type (^^int[1]));
+ static_assert (is_array_type (^^int[]));
+ static_assert (!is_array_type (^^nullptr_t));
+ static_assert (!is_array_type (^^std::meta::info));
+ static_assert (!is_array_type (^^int (cls::*)));
+ static_assert (!is_array_type (^^int (cls::*)()));
+ static_assert (!is_array_type (^^cls));
+ static_assert (!is_array_type (^^empty));
+ static_assert (!is_array_type (^^abstract_cls));
+ static_assert (!is_array_type (^^final_cls));
+ static_assert (!is_array_type (^^ctor_cls));
+ static_assert (!is_array_type (^^trivial_cls));
+ static_assert (!is_array_type (^^virtual_dtor_cls));
+ static_assert (!is_array_type (^^onion));
+ static_assert (!is_array_type (^^Enum));
+ static_assert (!is_array_type (^^Enum_class));
+ static_assert (!is_array_type (^^void ()));
+ 
+ static_assert (!is_pointer_type (^^void));
+ static_assert (!is_pointer_type (^^int));
+ static_assert (!is_pointer_type (^^const int));
+ static_assert (!is_pointer_type (^^volatile int));
+ static_assert (!is_pointer_type (^^unsigned));
+ static_assert (!is_pointer_type (^^float));
+ static_assert (!is_pointer_type (^^int&));
+ static_assert (!is_pointer_type (^^int&&));
+ static_assert (is_pointer_type (^^int *));
+ static_assert (is_pointer_type (^^int **));
+ static_assert (is_pointer_type (^^int *const *const));
+ static_assert (!is_pointer_type (^^int[1]));
+ static_assert (!is_pointer_type (^^int[]));
+ static_assert (!is_pointer_type (^^nullptr_t));
+ static_assert (!is_pointer_type (^^std::meta::info));
+ static_assert (!is_pointer_type (^^int (cls::*)));
+ static_assert (!is_pointer_type (^^int (cls::*)()));
+ static_assert (!is_pointer_type (^^cls));
+ static_assert (!is_pointer_type (^^empty));
+ static_assert (!is_pointer_type (^^abstract_cls));
+ static_assert (!is_pointer_type (^^final_cls));
+ static_assert (!is_pointer_type (^^ctor_cls));
+ static_assert (!is_pointer_type (^^trivial_cls));
+ static_assert (!is_pointer_type (^^virtual_dtor_cls));
+ static_assert (!is_pointer_type (^^onion));
+ static_assert (!is_pointer_type (^^Enum));
+ static_assert (!is_pointer_type (^^Enum_class));
+ static_assert (!is_pointer_type (^^void ()));
+ 
+ static_assert (!is_lvalue_reference_type (^^void));
+ static_assert (!is_lvalue_reference_type (^^int));
+ static_assert (!is_lvalue_reference_type (^^const int));
+ static_assert (!is_lvalue_reference_type (^^volatile int));
+ static_assert (!is_lvalue_reference_type (^^unsigned));
+ static_assert (!is_lvalue_reference_type (^^float));
+ static_assert (is_lvalue_reference_type (^^int&));
+ static_assert (!is_lvalue_reference_type (^^int&&));
+ static_assert (!is_lvalue_reference_type (^^int *));
+ static_assert (!is_lvalue_reference_type (^^int[1]));
+ static_assert (!is_lvalue_reference_type (^^int[]));
+ static_assert (!is_lvalue_reference_type (^^nullptr_t));
+ static_assert (!is_lvalue_reference_type (^^std::meta::info));
+ static_assert (!is_lvalue_reference_type (^^int (cls::*)));
+ static_assert (!is_lvalue_reference_type (^^int (cls::*)()));
+ static_assert (!is_lvalue_reference_type (^^cls));
+ static_assert (!is_lvalue_reference_type (^^empty));
+ static_assert (!is_lvalue_reference_type (^^abstract_cls));
+ static_assert (!is_lvalue_reference_type (^^final_cls));
+ static_assert (!is_lvalue_reference_type (^^ctor_cls));
+ static_assert (!is_lvalue_reference_type (^^trivial_cls));
+ static_assert (!is_lvalue_reference_type (^^virtual_dtor_cls));
+ static_assert (!is_lvalue_reference_type (^^onion));
+ static_assert (!is_lvalue_reference_type (^^Enum));
+ static_assert (!is_lvalue_reference_type (^^Enum_class));
+ static_assert (!is_lvalue_reference_type (^^void ()));
+ 
+ static_assert (!is_rvalue_reference_type (^^void));
+ static_assert (!is_rvalue_reference_type (^^int));
+ static_assert (!is_rvalue_reference_type (^^const int));
+ static_assert (!is_rvalue_reference_type (^^volatile int));
+ static_assert (!is_rvalue_reference_type (^^unsigned));
+ static_assert (!is_rvalue_reference_type (^^float));
+ static_assert (!is_rvalue_reference_type (^^int&));
+ static_assert (is_rvalue_reference_type (^^int&&));
+ static_assert (!is_rvalue_reference_type (^^int *));
+ static_assert (!is_rvalue_reference_type (^^int[1]));
+ static_assert (!is_rvalue_reference_type (^^int[]));
+ static_assert (!is_rvalue_reference_type (^^nullptr_t));
+ static_assert (!is_rvalue_reference_type (^^std::meta::info));
+ static_assert (!is_rvalue_reference_type (^^int (cls::*)));
+ static_assert (!is_rvalue_reference_type (^^int (cls::*)()));
+ static_assert (!is_rvalue_reference_type (^^cls));
+ static_assert (!is_rvalue_reference_type (^^empty));
+ static_assert (!is_rvalue_reference_type (^^abstract_cls));
+ static_assert (!is_rvalue_reference_type (^^final_cls));
+ static_assert (!is_rvalue_reference_type (^^ctor_cls));
+ static_assert (!is_rvalue_reference_type (^^trivial_cls));
+ static_assert (!is_rvalue_reference_type (^^virtual_dtor_cls));
+ static_assert (!is_rvalue_reference_type (^^onion));
+ static_assert (!is_rvalue_reference_type (^^Enum));
+ static_assert (!is_rvalue_reference_type (^^Enum_class));
+ static_assert (!is_rvalue_reference_type (^^void ()));
+ 
+ static_assert (!is_member_object_pointer_type (^^void));
+ static_assert (!is_member_object_pointer_type (^^int));
+ static_assert (!is_member_object_pointer_type (^^const int));
+ static_assert (!is_member_object_pointer_type (^^volatile int));
+ static_assert (!is_member_object_pointer_type (^^unsigned));
+ static_assert (!is_member_object_pointer_type (^^float));
+ static_assert (!is_member_object_pointer_type (^^int&));
+ static_assert (!is_member_object_pointer_type (^^int&&));
+ static_assert (!is_member_object_pointer_type (^^int *));
+ static_assert (!is_member_object_pointer_type (^^int[1]));
+ static_assert (!is_member_object_pointer_type (^^int[]));
+ static_assert (!is_member_object_pointer_type (^^nullptr_t));
+ static_assert (!is_member_object_pointer_type (^^std::meta::info));
+ static_assert (is_member_object_pointer_type (^^int (cls::*)));
+ static_assert (!is_member_object_pointer_type (^^int (cls::*)()));
+ static_assert (!is_member_object_pointer_type (^^cls));
+ static_assert (!is_member_object_pointer_type (^^empty));
+ static_assert (!is_member_object_pointer_type (^^abstract_cls));
+ static_assert (!is_member_object_pointer_type (^^final_cls));
+ static_assert (!is_member_object_pointer_type (^^ctor_cls));
+ static_assert (!is_member_object_pointer_type (^^trivial_cls));
+ static_assert (!is_member_object_pointer_type (^^virtual_dtor_cls));
+ static_assert (!is_member_object_pointer_type (^^onion));
+ static_assert (!is_member_object_pointer_type (^^Enum));
+ static_assert (!is_member_object_pointer_type (^^Enum_class));
+ static_assert (!is_member_object_pointer_type (^^void ()));
+ 
+ static_assert (!is_member_function_pointer_type (^^void));
+ static_assert (!is_member_function_pointer_type (^^int));
+ static_assert (!is_member_function_pointer_type (^^const int));
+ static_assert (!is_member_function_pointer_type (^^volatile int));
+ static_assert (!is_member_function_pointer_type (^^unsigned));
+ static_assert (!is_member_function_pointer_type (^^float));
+ static_assert (!is_member_function_pointer_type (^^int&));
+ static_assert (!is_member_function_pointer_type (^^int&&));
+ static_assert (!is_member_function_pointer_type (^^int *));
+ static_assert (!is_member_function_pointer_type (^^int[1]));
+ static_assert (!is_member_function_pointer_type (^^int[]));
+ static_assert (!is_member_function_pointer_type (^^nullptr_t));
+ static_assert (!is_member_function_pointer_type (^^std::meta::info));
+ static_assert (!is_member_function_pointer_type (^^int (cls::*)));
+ static_assert (is_member_function_pointer_type (^^int (cls::*)()));
+ static_assert (!is_member_function_pointer_type (^^cls));
+ static_assert (!is_member_function_pointer_type (^^empty));
+ static_assert (!is_member_function_pointer_type (^^abstract_cls));
+ static_assert (!is_member_function_pointer_type (^^final_cls));
+ static_assert (!is_member_function_pointer_type (^^ctor_cls));
+ static_assert (!is_member_function_pointer_type (^^trivial_cls));
+ static_assert (!is_member_function_pointer_type (^^virtual_dtor_cls));
+ static_assert (!is_member_function_pointer_type (^^onion));
+ static_assert (!is_member_function_pointer_type (^^Enum));
+ static_assert (!is_member_function_pointer_type (^^Enum_class));
+ static_assert (!is_member_function_pointer_type (^^void ()));
+ 
+ static_assert (!is_enum_type (^^void));
+ static_assert (!is_enum_type (^^int));
+ static_assert (!is_enum_type (^^const int));
+ static_assert (!is_enum_type (^^volatile int));
+ static_assert (!is_enum_type (^^unsigned));
+ static_assert (!is_enum_type (^^float));
+ static_assert (!is_enum_type (^^int&));
+ static_assert (!is_enum_type (^^int&&));
+ static_assert (!is_enum_type (^^int *));
+ static_assert (!is_enum_type (^^int[1]));
+ static_assert (!is_enum_type (^^int[]));
+ static_assert (!is_enum_type (^^nullptr_t));
+ static_assert (!is_enum_type (^^std::meta::info));
+ static_assert (!is_enum_type (^^int (cls::*)));
+ static_assert (!is_enum_type (^^int (cls::*)()));
+ static_assert (!is_enum_type (^^cls));
+ static_assert (!is_enum_type (^^empty));
+ static_assert (!is_enum_type (^^abstract_cls));
+ static_assert (!is_enum_type (^^final_cls));
+ static_assert (!is_enum_type (^^ctor_cls));
+ static_assert (!is_enum_type (^^trivial_cls));
+ static_assert (!is_enum_type (^^virtual_dtor_cls));
+ static_assert (!is_enum_type (^^onion));
+ static_assert (is_enum_type (^^Enum));
+ static_assert (is_enum_type (^^Enum_class));
+ static_assert (!is_enum_type (^^void ()));
+ 
+ static_assert (!is_union_type (^^void));
+ static_assert (!is_union_type (^^int));
+ static_assert (!is_union_type (^^const int));
+ static_assert (!is_union_type (^^volatile int));
+ static_assert (!is_union_type (^^unsigned));
+ static_assert (!is_union_type (^^float));
+ static_assert (!is_union_type (^^int&));
+ static_assert (!is_union_type (^^int&&));
+ static_assert (!is_union_type (^^int *));
+ static_assert (!is_union_type (^^int[1]));
+ static_assert (!is_union_type (^^int[]));
+ static_assert (!is_union_type (^^nullptr_t));
+ static_assert (!is_union_type (^^std::meta::info));
+ static_assert (!is_union_type (^^int (cls::*)));
+ static_assert (!is_union_type (^^int (cls::*)()));
+ static_assert (!is_union_type (^^cls));
+ static_assert (!is_union_type (^^empty));
+ static_assert (!is_union_type (^^abstract_cls));
+ static_assert (!is_union_type (^^final_cls));
+ static_assert (!is_union_type (^^ctor_cls));
+ static_assert (!is_union_type (^^trivial_cls));
+ static_assert (!is_union_type (^^virtual_dtor_cls));
+ static_assert (is_union_type (^^onion));
+ static_assert (!is_union_type (^^Enum));
+ static_assert (!is_union_type (^^Enum_class));
+ static_assert (!is_union_type (^^void ()));
+ 
+ static_assert (!is_class_type (^^void));
+ static_assert (!is_class_type (^^int));
+ static_assert (!is_class_type (^^const int));
+ static_assert (!is_class_type (^^volatile int));
+ static_assert (!is_class_type (^^unsigned));
+ static_assert (!is_class_type (^^float));
+ static_assert (!is_class_type (^^int&));
+ static_assert (!is_class_type (^^int&&));
+ static_assert (!is_class_type (^^int *));
+ static_assert (!is_class_type (^^int[1]));
+ static_assert (!is_class_type (^^int[]));
+ static_assert (!is_class_type (^^nullptr_t));
+ static_assert (!is_class_type (^^std::meta::info));
+ static_assert (!is_class_type (^^int (cls::*)));
+ static_assert (!is_class_type (^^int (cls::*)()));
+ static_assert (is_class_type (^^cls));
+ static_assert (is_class_type (^^empty));
+ static_assert (is_class_type (^^abstract_cls));
+ static_assert (is_class_type (^^final_cls));
+ static_assert (is_class_type (^^ctor_cls));
+ static_assert (is_class_type (^^trivial_cls));
+ static_assert (is_class_type (^^virtual_dtor_cls));
+ static_assert (!is_class_type (^^onion));
+ static_assert (!is_class_type (^^Enum));
+ static_assert (!is_class_type (^^Enum_class));
+ static_assert (!is_class_type (^^void ()));
+ 
+ static_assert (!is_reflection_type (^^void));
+ static_assert (!is_reflection_type (^^int));
+ static_assert (!is_reflection_type (^^const int));
+ static_assert (!is_reflection_type (^^volatile int));
+ static_assert (!is_reflection_type (^^unsigned));
+ static_assert (!is_reflection_type (^^float));
+ static_assert (!is_reflection_type (^^int&));
+ static_assert (!is_reflection_type (^^int&&));
+ static_assert (!is_reflection_type (^^int *));
+ static_assert (!is_reflection_type (^^int[1]));
+ static_assert (!is_reflection_type (^^int[]));
+ static_assert (!is_reflection_type (^^nullptr_t));
+ static_assert (is_reflection_type (^^std::meta::info));
+ static_assert (!is_reflection_type (^^int (cls::*)));
+ static_assert (!is_reflection_type (^^int (cls::*)()));
+ static_assert (!is_reflection_type (^^cls));
+ static_assert (!is_reflection_type (^^empty));
+ static_assert (!is_reflection_type (^^abstract_cls));
+ static_assert (!is_reflection_type (^^final_cls));
+ static_assert (!is_reflection_type (^^ctor_cls));
+ static_assert (!is_reflection_type (^^trivial_cls));
+ static_assert (!is_reflection_type (^^virtual_dtor_cls));
+ static_assert (!is_reflection_type (^^onion));
+ static_assert (!is_reflection_type (^^Enum));
+ static_assert (!is_reflection_type (^^Enum_class));
+ static_assert (!is_reflection_type (^^void ()));
+ 
+ static_assert (!is_reference_type (^^void));
+ static_assert (!is_reference_type (^^int));
+ static_assert (!is_reference_type (^^const int));
+ static_assert (!is_reference_type (^^volatile int));
+ static_assert (!is_reference_type (^^unsigned));
+ static_assert (!is_reference_type (^^float));
+ static_assert (is_reference_type (^^int&));
+ static_assert (is_reference_type (^^int&&));
+ static_assert (!is_reference_type (^^int *));
+ static_assert (!is_reference_type (^^int[1]));
+ static_assert (!is_reference_type (^^int[]));
+ static_assert (!is_reference_type (^^nullptr_t));
+ static_assert (!is_reference_type (^^std::meta::info));
+ static_assert (!is_reference_type (^^int (cls::*)));
+ static_assert (!is_reference_type (^^int (cls::*)()));
+ static_assert (!is_reference_type (^^cls));
+ static_assert (!is_reference_type (^^empty));
+ static_assert (!is_reference_type (^^abstract_cls));
+ static_assert (!is_reference_type (^^final_cls));
+ static_assert (!is_reference_type (^^ctor_cls));
+ static_assert (!is_reference_type (^^trivial_cls));
+ static_assert (!is_reference_type (^^virtual_dtor_cls));
+ static_assert (!is_reference_type (^^onion));
+ static_assert (!is_reference_type (^^Enum));
+ static_assert (!is_reference_type (^^Enum_class));
+ static_assert (!is_reference_type (^^void ()));
+ 
+ static_assert (!is_arithmetic_type (^^void));
+ static_assert (is_arithmetic_type (^^bool));
+ static_assert (is_arithmetic_type (^^char));
+ static_assert (is_arithmetic_type (^^int));
+ static_assert (is_arithmetic_type (^^const int));
+ static_assert (is_arithmetic_type (^^volatile int));
+ static_assert (is_arithmetic_type (^^float));
+ static_assert (!is_arithmetic_type (^^cls));
+ static_assert (!is_arithmetic_type (^^int&));
+ static_assert (!is_arithmetic_type (^^int&&));
+ static_assert (!is_arithmetic_type (^^int *));
+ static_assert (!is_arithmetic_type (^^int [1]));
+ static_assert (!is_arithmetic_type (^^int []));
+ static_assert (!is_arithmetic_type (^^nullptr_t));
+ static_assert (!is_arithmetic_type (^^std::meta::info));
+ static_assert (!is_arithmetic_type (^^int (cls::*)));
+ static_assert (!is_arithmetic_type (^^int (cls::*)()));
+ static_assert (!is_arithmetic_type (^^cls));
+ static_assert (!is_arithmetic_type (^^empty));
+ static_assert (!is_arithmetic_type (^^abstract_cls));
+ static_assert (!is_arithmetic_type (^^final_cls));
+ static_assert (!is_arithmetic_type (^^ctor_cls));
+ static_assert (!is_arithmetic_type (^^trivial_cls));
+ static_assert (!is_arithmetic_type (^^virtual_dtor_cls));
+ static_assert (!is_arithmetic_type (^^onion));
+ static_assert (!is_arithmetic_type (^^Enum));
+ static_assert (!is_arithmetic_type (^^Enum_class));
+ static_assert (!is_arithmetic_type (^^void ()));
+ 
+ static_assert (!is_object_type (^^void));
+ static_assert (is_object_type (^^bool));
+ static_assert (is_object_type (^^char));
+ static_assert (is_object_type (^^int));
+ static_assert (is_object_type (^^const int));
+ static_assert (is_object_type (^^volatile int));
+ static_assert (is_object_type (^^float));
+ static_assert (is_object_type (^^cls));
+ static_assert (!is_object_type (^^int&));
+ static_assert (!is_object_type (^^int&&));
+ static_assert (is_object_type (^^int *));
+ static_assert (is_object_type (^^int [1]));
+ static_assert (is_object_type (^^int []));
+ static_assert (is_object_type (^^nullptr_t));
+ static_assert (is_object_type (^^std::meta::info));
+ static_assert (is_object_type (^^int (cls::*)));
+ static_assert (is_object_type (^^int (cls::*)()));
+ static_assert (is_object_type (^^cls));
+ static_assert (is_object_type (^^empty));
+ static_assert (is_object_type (^^abstract_cls));
+ static_assert (is_object_type (^^final_cls));
+ static_assert (is_object_type (^^ctor_cls));
+ static_assert (is_object_type (^^trivial_cls));
+ static_assert (is_object_type (^^virtual_dtor_cls));
+ static_assert (is_object_type (^^onion));
+ static_assert (is_object_type (^^Enum));
+ static_assert (is_object_type (^^Enum_class));
+ static_assert (!is_object_type (^^void ()));
+ 
+ static_assert (!is_member_pointer_type (^^void));
+ static_assert (!is_member_pointer_type (^^bool));
+ static_assert (!is_member_pointer_type (^^char));
+ static_assert (!is_member_pointer_type (^^int));
+ static_assert (!is_member_pointer_type (^^const int));
+ static_assert (!is_member_pointer_type (^^volatile int));
+ static_assert (!is_member_pointer_type (^^float));
+ static_assert (!is_member_pointer_type (^^cls));
+ static_assert (!is_member_pointer_type (^^int&));
+ static_assert (!is_member_pointer_type (^^int&&));
+ static_assert (!is_member_pointer_type (^^int *));
+ static_assert (!is_member_pointer_type (^^int [1]));
+ static_assert (!is_member_pointer_type (^^int []));
+ static_assert (!is_member_pointer_type (^^nullptr_t));
+ static_assert (!is_member_pointer_type (^^std::meta::info));
+ static_assert (is_member_pointer_type (^^int (cls::*)));
+ static_assert (is_member_pointer_type (^^int (cls::*)()));
+ static_assert (!is_member_pointer_type (^^cls));
+ static_assert (!is_member_pointer_type (^^empty));
+ static_assert (!is_member_pointer_type (^^abstract_cls));
+ static_assert (!is_member_pointer_type (^^final_cls));
+ static_assert (!is_member_pointer_type (^^ctor_cls));
+ static_assert (!is_member_pointer_type (^^trivial_cls));
+ static_assert (!is_member_pointer_type (^^virtual_dtor_cls));
+ static_assert (!is_member_pointer_type (^^onion));
+ static_assert (!is_member_pointer_type (^^Enum));
+ static_assert (!is_member_pointer_type (^^Enum_class));
+ static_assert (!is_member_pointer_type (^^void ()));
+ 
+ static_assert (!is_scalar_type (^^void));
+ static_assert (is_scalar_type (^^bool));
+ static_assert (is_scalar_type (^^char));
+ static_assert (is_scalar_type (^^int));
+ static_assert (is_scalar_type (^^const int));
+ static_assert (is_scalar_type (^^volatile int));
+ static_assert (is_scalar_type (^^float));
+ static_assert (!is_scalar_type (^^cls));
+ static_assert (!is_scalar_type (^^int&));
+ static_assert (!is_scalar_type (^^int&&));
+ static_assert (is_scalar_type (^^int *));
+ static_assert (!is_scalar_type (^^int [1]));
+ static_assert (!is_scalar_type (^^int []));
+ static_assert (is_scalar_type (^^nullptr_t));
+ static_assert (is_scalar_type (^^std::meta::info));
+ static_assert (is_scalar_type (^^int (cls::*)));
+ static_assert (is_scalar_type (^^int (cls::*)()));
+ static_assert (!is_scalar_type (^^cls));
+ static_assert (!is_scalar_type (^^empty));
+ static_assert (!is_scalar_type (^^abstract_cls));
+ static_assert (!is_scalar_type (^^final_cls));
+ static_assert (!is_scalar_type (^^ctor_cls));
+ static_assert (!is_scalar_type (^^trivial_cls));
+ static_assert (!is_scalar_type (^^virtual_dtor_cls));
+ static_assert (!is_scalar_type (^^onion));
+ static_assert (is_scalar_type (^^Enum));
+ static_assert (is_scalar_type (^^Enum_class));
+ static_assert (!is_scalar_type (^^void ()));
+ 
+ static_assert (is_fundamental_type (^^void));
+ static_assert (is_fundamental_type (^^bool));
+ static_assert (is_fundamental_type (^^char));
+ static_assert (is_fundamental_type (^^int));
+ static_assert (is_fundamental_type (^^const int));
+ static_assert (is_fundamental_type (^^volatile int));
+ static_assert (is_fundamental_type (^^float));
+ static_assert (!is_fundamental_type (^^cls));
+ static_assert (!is_fundamental_type (^^int&));
+ static_assert (!is_fundamental_type (^^int&&));
+ static_assert (!is_fundamental_type (^^int *));
+ static_assert (!is_fundamental_type (^^int [1]));
+ static_assert (!is_fundamental_type (^^int []));
+ static_assert (is_fundamental_type (^^nullptr_t));
+ static_assert (is_fundamental_type (^^std::meta::info));
+ static_assert (!is_fundamental_type (^^int (cls::*)));
+ static_assert (!is_fundamental_type (^^int (cls::*)()));
+ static_assert (!is_fundamental_type (^^cls));
+ static_assert (!is_fundamental_type (^^empty));
+ static_assert (!is_fundamental_type (^^abstract_cls));
+ static_assert (!is_fundamental_type (^^final_cls));
+ static_assert (!is_fundamental_type (^^ctor_cls));
+ static_assert (!is_fundamental_type (^^trivial_cls));
+ static_assert (!is_fundamental_type (^^virtual_dtor_cls));
+ static_assert (!is_fundamental_type (^^onion));
+ static_assert (!is_fundamental_type (^^Enum));
+ static_assert (!is_fundamental_type (^^Enum_class));
+ static_assert (!is_fundamental_type (^^void ()));
+ 
+ static_assert (!is_compound_type (^^void));
+ static_assert (!is_compound_type (^^bool));
+ static_assert (!is_compound_type (^^char));
+ static_assert (!is_compound_type (^^int));
+ static_assert (!is_compound_type (^^const int));
+ static_assert (!is_compound_type (^^volatile int));
+ static_assert (!is_compound_type (^^float));
+ static_assert (is_compound_type (^^cls));
+ static_assert (is_compound_type (^^int&));
+ static_assert (is_compound_type (^^int&&));
+ static_assert (is_compound_type (^^int *));
+ static_assert (is_compound_type (^^int [1]));
+ static_assert (is_compound_type (^^int []));
+ static_assert (!is_compound_type (^^nullptr_t));
+ static_assert (!is_compound_type (^^std::meta::info));
+ static_assert (is_compound_type (^^int (cls::*)));
+ static_assert (is_compound_type (^^int (cls::*)()));
+ static_assert (is_compound_type (^^cls));
+ static_assert (is_compound_type (^^empty));
+ static_assert (is_compound_type (^^abstract_cls));
+ static_assert (is_compound_type (^^final_cls));
+ static_assert (is_compound_type (^^ctor_cls));
+ static_assert (is_compound_type (^^trivial_cls));
+ static_assert (is_compound_type (^^virtual_dtor_cls));
+ static_assert (is_compound_type (^^onion));
+ static_assert (is_compound_type (^^Enum));
+ static_assert (is_compound_type (^^Enum_class));
+ static_assert (is_compound_type (^^void ()));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait10.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,116 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], other
+ // transformations.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ class ClassType { };
+ using CT = ClassType;
+ 
+ static_assert (remove_cvref (^^const volatile int) == ^^int);
+ static_assert (remove_cvref (^^const volatile int *) == ^^const volatile int *);
+ static_assert (remove_cvref (^^const volatile int &) == ^^int);
+ static_assert (remove_cvref (^^const volatile int &&) == ^^int);
+ static_assert (remove_cvref (^^const volatile ClassType) == ^^ClassType);
+ static_assert (remove_cvref (^^const volatile ClassType *) == ^^const volatile ClassType *);
+ static_assert (remove_cvref (^^const volatile ClassType &) == ^^ClassType);
+ static_assert (remove_cvref (^^const volatile ClassType &&) == ^^ClassType);
+ static_assert (remove_cvref (^^CT) == ^^ClassType);
+ static_assert (remove_cvref (^^CT &) == ^^ClassType);
+ static_assert (remove_cvref (^^const CT &) == ^^ClassType);
+ static_assert (remove_cvref (^^const int (&) [3]) == ^^int [3]);
+ static_assert (remove_cvref (^^const int (&) ()) == ^^const int ());
+ 
+ static_assert (decay (^^bool) == ^^bool);
+ static_assert (decay (^^int) == ^^int);
+ static_assert (decay (^^ClassType) == ^^ClassType);
+ static_assert (decay (^^CT) == ^^ClassType);
+ static_assert (decay (^^const int) == ^^int);
+ static_assert (decay (^^volatile const long) == ^^long);
+ static_assert (decay (^^int &) == ^^int);
+ static_assert (decay (^^int &&) == ^^int);
+ static_assert (decay (^^CT &) == ^^ClassType);
+ static_assert (decay (^^volatile const int &) == ^^int);
+ static_assert (decay (^^const int &&) == ^^int);
+ static_assert (decay (^^int [4]) == ^^int *);
+ static_assert (decay (^^const int []) == ^^const int *);
+ static_assert (decay (^^int [5][2][1]) == ^^int (*)[2][1]);
+ static_assert (decay (^^const int [][5][1]) == ^^const int (*)[5][1]);
+ static_assert (decay (^^int (int)) == ^^int (*) (int));
+ 
+ enum E1 : unsigned { };
+ enum E2 : char { };
+ enum class E3 { };
+ enum class E4 : unsigned char { c = 1 };
+ enum class E5 : int { a = -1, b = 1 };
+ enum class E6 : long { c = __LONG_MAX__ };
+ enum E7 { E70 = 0 };
+ enum E8 { E80 = ~0UL };
+ 
+ static_assert (underlying_type (^^E1) == ^^unsigned);
+ static_assert (underlying_type (^^E2) == ^^char);
+ static_assert (underlying_type (^^E3) == ^^int);
+ static_assert (underlying_type (^^E4) == ^^unsigned char);
+ static_assert (underlying_type (^^E5) == ^^int);
+ static_assert (underlying_type (^^E6) == ^^long);
+ static_assert (is_integral_type (underlying_type (^^E7)));
+ static_assert (is_integral_type (underlying_type (^^E8)));
+ 
+ struct S;
+ struct T;
+ template <typename T>
+ struct U
+ {
+ };
+ typedef int int2;
+ struct V {};
+ namespace
+ {
+   struct W {};
+ }
+ 
+ template <typename T, typename U>
+ struct eq
+ {
+   constexpr eq ()
+   {
+     static_assert (type_order (^^T, ^^U) == std::strong_ordering::equal);
+     static_assert (type_order (^^U, ^^T) == std::strong_ordering::equal);
+   }
+ };
+ template <typename T, typename U>
+ struct ne
+ {
+   constexpr ne ()
+   {
+     static_assert (type_order (^^T, ^^U) != std::strong_ordering::equal);
+     static_assert (type_order (^^U, ^^T) != std::strong_ordering::equal);
+     static_assert (type_order (^^T, ^^U) == std::strong_ordering::greater
+                    ? type_order (^^U, ^^T) == std::strong_ordering::less
+                    : type_order (^^U, ^^T) == std::strong_ordering::greater);
+   }
+ };
+ 
+ constexpr eq <void, void> a;
+ constexpr eq <const void, const void> b;
+ constexpr eq <int, int> c;
+ constexpr eq <long int, long int> d;
+ constexpr eq <const volatile unsigned, const volatile unsigned> e;
+ constexpr eq <S, S> f;
+ constexpr eq <U <int>, U <int>> g;
+ constexpr eq <unsigned[2], unsigned[2]> h;
+ constexpr eq <int, int2> i;
+ constexpr eq <int (*) (int, long), int (*) (int, long)> j;
+ constexpr ne <int, long> k;
+ constexpr ne <const int, int> l;
+ constexpr ne <S, T> m;
+ constexpr ne <int &, int &&> n;
+ constexpr ne <U <S>, U <T>> o;
+ constexpr ne <U <short>, U <char>> p;
+ constexpr ne <int (*) (int, long), int (*) (int, int)> q;
+ constexpr eq <W, W> r;
+ constexpr ne <V, W> s;
+ constexpr eq <U <W>, U <W>> t;
+ constexpr ne <U <V>, U <W>> u;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait11.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait11.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait11.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait11.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,447 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], type properties.
+ 
+ #include <functional>
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ class ClassType { };
+ class DerivedType : public ClassType { };
+ enum EnumType { e0 };
+ struct ThrowDefaultClass { ThrowDefaultClass () noexcept (false); };
+ struct ThrowCopyConsClass { ThrowCopyConsClass (const ThrowCopyConsClass &) noexcept (false); };
+ struct ThrowMoveConsClass { ThrowMoveConsClass (ThrowMoveConsClass &&) noexcept (false); };
+ struct NoexceptDefaultClass { NoexceptDefaultClass () noexcept (true); };
+ struct ExceptDefaultClass { ExceptDefaultClass () noexcept (false); };
+ struct NoexceptCopyConsClass { NoexceptCopyConsClass (const NoexceptCopyConsClass &) noexcept (true); };
+ struct ExceptCopyConsClass { ExceptCopyConsClass (const ExceptCopyConsClass &) noexcept (false); };
+ struct NoexceptMoveConsClass { NoexceptMoveConsClass (NoexceptMoveConsClass &&) noexcept (true); NoexceptMoveConsClass &operator= (NoexceptMoveConsClass &&) = default; };
+ struct ExceptMoveConsClass { ExceptMoveConsClass (ExceptMoveConsClass &&) noexcept (false); };
+ struct NoexceptCopyAssignClass { NoexceptCopyAssignClass &operator= (const NoexceptCopyAssignClass &) noexcept (true); };
+ struct ExceptCopyAssignClass { ExceptCopyAssignClass &operator= (const ExceptCopyAssignClass &) noexcept (false); };
+ struct NoexceptMoveAssignClass { NoexceptMoveAssignClass (NoexceptMoveAssignClass &&) = default; NoexceptMoveAssignClass &operator= (NoexceptMoveAssignClass &&) noexcept (true); };
+ struct ExceptMoveAssignClass { ExceptMoveAssignClass &operator= (ExceptMoveAssignClass &&) noexcept (false); };
+ struct DeletedCopyAssignClass { DeletedCopyAssignClass & operator= (const DeletedCopyAssignClass &) = delete; };
+ struct DeletedMoveAssignClass { DeletedMoveAssignClass &operator= (DeletedMoveAssignClass &&) = delete; };
+ struct NType { int i; int j; virtual ~NType (); };
+ struct TType { int i; private: int j; };
+ struct SLType { int i; int j; ~SLType (); };
+ struct PODType { int i; int j; };
+ struct LType { int i; constexpr LType (int j) : i(j) {} };
+ struct HasTemplateCCtor { HasTemplateCCtor (const HasTemplateCCtor &) = default; template <class T> HasTemplateCCtor (T &&); };
+ struct MoveOnly { MoveOnly (MoveOnly &&) = default; };
+ struct MoveOnly2 { MoveOnly2 (MoveOnly2 &&) = delete; };
+ class PolymorphicClass { virtual void rotate (int); };
+ struct CopyConsOnlyType {
+   CopyConsOnlyType (int) { }
+   CopyConsOnlyType (CopyConsOnlyType &&) = delete;
+   CopyConsOnlyType (const CopyConsOnlyType &) = default;
+   CopyConsOnlyType &operator= (const CopyConsOnlyType &) = delete;
+   CopyConsOnlyType &operator= (CopyConsOnlyType &&) = delete;
+ };
+ struct MoveConsOnlyType {
+   MoveConsOnlyType (int) { }
+   MoveConsOnlyType (const MoveConsOnlyType &) = delete;
+   MoveConsOnlyType (MoveConsOnlyType &&) = default;
+   MoveConsOnlyType &operator= (const MoveConsOnlyType &) = delete;
+   MoveConsOnlyType &operator= (MoveConsOnlyType &&) = delete;
+ };
+ struct NoexceptExplicitClass {
+   NoexceptExplicitClass (double &) noexcept (true);
+   explicit NoexceptExplicitClass (int &) noexcept (true);
+   NoexceptExplicitClass (double &, int &, double &) noexcept (true);
+ };
+ struct ExceptExplicitClass {
+   ExceptExplicitClass (double &) noexcept (false);
+   explicit ExceptExplicitClass (int &) noexcept (false);
+   ExceptExplicitClass (double &, int &, double &) noexcept (false);
+ };
+ struct NothrowExplicitClass {
+   NothrowExplicitClass (double &) throw ();
+   explicit NothrowExplicitClass (int &) throw ();
+   NothrowExplicitClass (double &, int &, double &) throw ();
+ };
+ 
+ namespace N1
+ {
+   struct Empty {};
+   struct B { int i; B () {} };
+   struct D : B {};
+   enum E { ee1 };
+   enum E2 { ee2 };
+   enum class SE { e1 };
+   enum class SE2 { e2 };
+   enum OpE : int;
+   enum class OpSE : bool;
+   union U { int i; Empty b; };
+   struct Abstract { virtual ~Abstract () = 0; };
+   struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };
+   struct Ukn;
+   template <class To>
+   struct ImplicitTo { operator To (); };
+   template <class To>
+   struct DelImplicitTo { operator To () = delete; };
+   template <class To>
+   struct ExplicitTo { explicit operator To (); };
+   struct Ellipsis { Ellipsis (...) {} };
+   struct DelEllipsis { DelEllipsis (...) = delete; };
+   struct Any { template <class T> Any (T &&) {} };
+   struct nAny { template <class... T> nAny (T &&...) {} };
+   struct DelnAny { template <class... T> DelnAny (T &&...) = delete; };
+   template <class... Args>
+   struct FromArgs { FromArgs (Args...); };
+   struct DelDef { DelDef () = delete; };
+   struct DelCopy { DelCopy (const DelCopy &) = delete; };
+   struct DelDtor {
+     DelDtor () = default;
+     DelDtor (const DelDtor &) = default;
+     DelDtor (DelDtor &&) = default;
+     DelDtor (int);
+     DelDtor (int, B, U);
+     ~DelDtor () = delete;
+   };
+   struct Nontrivial {
+     Nontrivial ();
+     Nontrivial (const Nontrivial &);
+     Nontrivial &operator= (const Nontrivial &);
+     ~Nontrivial ();
+   };
+   union NontrivialUnion { int i; Nontrivial n; };
+   struct UnusualCopy { UnusualCopy (UnusualCopy &); };
+ }
+ struct X { X () = default; X (int) noexcept {} X (double) {} };
+ struct Y { int i; X x; };
+ struct Z : Y { };
+ 
+ static_assert (is_trivially_constructible_type (^^int, {}));
+ static_assert (is_trivially_constructible_type (^^int, { ^^int }));
+ static_assert (is_trivially_constructible_type (^^int, { ^^int & }));
+ static_assert (is_trivially_constructible_type (^^int, { ^^int && }));
+ static_assert (is_trivially_constructible_type (^^int, { ^^const int & }));
+ static_assert (!is_trivially_constructible_type (^^int, { ^^void * }));
+ static_assert (!is_trivially_constructible_type (^^int, { ^^int * }));
+ static_assert (!is_trivially_constructible_type (^^int, { ^^const int * }));
+ static_assert (!is_trivially_constructible_type (^^int *, { ^^void * }));
+ static_assert (!is_trivially_constructible_type (^^int *, { ^^const int * }));
+ static_assert (!is_trivially_constructible_type (^^int &, { ^^const int }));
+ static_assert (is_trivially_constructible_type (^^const int &, { ^^int }));
+ static_assert (is_trivially_constructible_type (^^const int &, { ^^int & }));
+ static_assert (is_trivially_constructible_type (^^const int *, { ^^int * }));
+ static_assert (!is_trivially_constructible_type (^^PolymorphicClass, {}));
+ static_assert (!is_trivially_constructible_type (^^PolymorphicClass, { ^^PolymorphicClass }));
+ static_assert (!is_trivially_constructible_type (^^PolymorphicClass, { ^^PolymorphicClass & }));
+ static_assert (!is_trivially_constructible_type (^^PolymorphicClass, { ^^PolymorphicClass && }));
+ static_assert (!is_trivially_constructible_type (^^PolymorphicClass, { ^^const PolymorphicClass & }));
+ static_assert (is_trivially_constructible_type (^^TType, {}));
+ static_assert (is_trivially_constructible_type (^^TType, { ^^TType }));
+ static_assert (is_trivially_constructible_type (^^TType, { ^^TType & }));
+ static_assert (is_trivially_constructible_type (^^TType, { ^^TType && }));
+ static_assert (is_trivially_constructible_type (^^TType, { ^^const TType & }));
+ static_assert (!is_trivially_constructible_type (^^TType, { ^^int, ^^int }));
+ static_assert (is_trivially_constructible_type (^^PODType, {}));
+ static_assert (is_trivially_constructible_type (^^PODType, { ^^PODType }));
+ static_assert (is_trivially_constructible_type (^^PODType, { ^^PODType & }));
+ static_assert (is_trivially_constructible_type (^^PODType, { ^^PODType && }));
+ static_assert (is_trivially_constructible_type (^^PODType, { ^^const PODType & }));
+ static_assert (is_trivially_constructible_type (^^PODType, { ^^int, ^^int }));
+ static_assert (!is_trivially_constructible_type (^^NType, {}));
+ static_assert (!is_trivially_constructible_type (^^SLType, {}));
+ static_assert (!is_trivially_constructible_type (^^LType, {}));
+ static_assert (!is_trivially_constructible_type (^^LType, { ^^int }));
+ static_assert (!is_trivially_constructible_type (^^N1::DelDef, {}));
+ static_assert (!is_trivially_constructible_type (^^N1::Abstract, {}));
+ static_assert (!is_trivially_constructible_type (^^N1::Ellipsis, {}));
+ static_assert (!is_trivially_constructible_type (^^N1::DelEllipsis, {}));
+ static_assert (!is_trivially_constructible_type (^^N1::Any, {}));
+ static_assert (!is_trivially_constructible_type (^^N1::DelCopy, {}));
+ static_assert (!is_trivially_constructible_type (^^N1::DelCopy, { ^^const N1::DelCopy & }));
+ static_assert (!is_trivially_constructible_type (^^N1::DelDtor, {}));
+ static_assert (!is_trivially_constructible_type (^^N1::Nontrivial, {}));
+ static_assert (!is_trivially_constructible_type (^^N1::UnusualCopy, {}));
+ static_assert (!is_trivially_constructible_type (^^CopyConsOnlyType, {}));
+ static_assert (!is_trivially_constructible_type (^^CopyConsOnlyType, { ^^CopyConsOnlyType }));
+ static_assert (is_trivially_constructible_type (^^CopyConsOnlyType, { ^^CopyConsOnlyType & }));
+ static_assert (!is_trivially_constructible_type (^^CopyConsOnlyType, { ^^CopyConsOnlyType && }));
+ static_assert (is_trivially_constructible_type (^^CopyConsOnlyType, { ^^const CopyConsOnlyType & }));
+ static_assert (!is_trivially_constructible_type (^^MoveConsOnlyType, {}));
+ static_assert (is_trivially_constructible_type (^^MoveConsOnlyType, { ^^MoveConsOnlyType }));
+ static_assert (!is_trivially_constructible_type (^^MoveConsOnlyType, { ^^MoveConsOnlyType & }));
+ static_assert (is_trivially_constructible_type (^^MoveConsOnlyType, { ^^MoveConsOnlyType && }));
+ static_assert (!is_trivially_constructible_type (^^MoveConsOnlyType, { ^^const MoveConsOnlyType & }));
+ static_assert (is_trivially_constructible_type (^^ClassType, { ^^DerivedType }));
+ static_assert (is_trivially_constructible_type (^^ClassType, { ^^DerivedType & }));
+ static_assert (is_trivially_constructible_type (^^ClassType, { ^^DerivedType && }));
+ static_assert (is_trivially_constructible_type (^^ClassType, { ^^const DerivedType & }));
+ static_assert (!is_trivially_constructible_type (^^HasTemplateCCtor, {}));
+ static_assert (!is_trivially_constructible_type (^^HasTemplateCCtor, { ^^HasTemplateCCtor }));
+ static_assert (is_trivially_constructible_type (^^HasTemplateCCtor, { ^^const HasTemplateCCtor & }));
+ static_assert (!is_trivially_constructible_type (^^MoveOnly, {}));
+ static_assert (is_trivially_constructible_type (^^MoveOnly, { ^^MoveOnly }));
+ static_assert (!is_trivially_constructible_type (^^MoveOnly, { ^^MoveOnly & }));
+ static_assert (is_trivially_constructible_type (^^MoveOnly, { ^^MoveOnly && }));
+ static_assert (!is_trivially_constructible_type (^^MoveOnly, { ^^const MoveOnly & }));
+ static_assert (!is_trivially_constructible_type (^^MoveOnly2, {}));
+ static_assert (!is_trivially_constructible_type (^^int [], {}));
+ 
+ static_assert (is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^double & }));
+ static_assert (is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^int & }));
+ static_assert (is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^double &, ^^int &, ^^double & }));
+ static_assert (is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^double & }));
+ static_assert (is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^int & }));
+ static_assert (is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^double &, ^^int &, ^^double & }));
+ static_assert (is_nothrow_constructible_type (^^int [1], {}));
+ static_assert (!is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^void * }));
+ static_assert (!is_nothrow_constructible_type (^^NoexceptExplicitClass, {}));
+ static_assert (!is_nothrow_constructible_type (^^NoexceptExplicitClass, { ^^int, ^^double }));
+ static_assert (!is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^void * }));
+ static_assert (!is_nothrow_constructible_type (^^NothrowExplicitClass, {}));
+ static_assert (!is_nothrow_constructible_type (^^NothrowExplicitClass, { ^^int, ^^double }));
+ static_assert (!is_nothrow_constructible_type (^^ExceptExplicitClass, { ^^double & }));
+ static_assert (!is_nothrow_constructible_type (^^ExceptExplicitClass, { ^^int & }));
+ static_assert (!is_nothrow_constructible_type (^^ExceptExplicitClass, { ^^double &, ^^int &, ^^double & }));
+ static_assert (!is_nothrow_constructible_type (^^int [], {}));
+ static_assert (is_nothrow_constructible_type (^^int [1], {}));
+ static_assert (is_nothrow_constructible_type (^^int [1], { ^^int }));
+ static_assert (is_nothrow_constructible_type (^^int [2], { ^^int }));
+ static_assert (is_nothrow_constructible_type (^^int [2], { ^^int, ^^int }));
+ static_assert (!is_nothrow_constructible_type (^^int [1], { ^^int, ^^int }));
+ static_assert (!is_nothrow_constructible_type (^^int [], {}));
+ static_assert (!is_nothrow_constructible_type (^^int [], { ^^int }));
+ static_assert (!is_nothrow_constructible_type (^^int [], { ^^int, ^^int }));
+ static_assert (is_nothrow_constructible_type (^^X [2], {}));
+ static_assert (is_nothrow_constructible_type (^^X [1], { ^^X }));
+ static_assert (is_nothrow_constructible_type (^^X [1], { ^^int }));
+ static_assert (!is_nothrow_constructible_type (^^X [1], { ^^double }));
+ static_assert (!is_nothrow_constructible_type (^^X [2], { ^^int, ^^double }));
+ static_assert (is_nothrow_constructible_type (^^Y, {}));
+ static_assert (is_nothrow_constructible_type (^^Y, { ^^Y }));
+ static_assert (is_nothrow_constructible_type (^^Y, { ^^int }));
+ static_assert (!is_nothrow_constructible_type (^^Y, { ^^X }));
+ static_assert (is_nothrow_constructible_type (^^Y, { ^^int, ^^X }));
+ static_assert (is_nothrow_constructible_type (^^Y, { ^^int, ^^int }));
+ static_assert (!is_nothrow_constructible_type (^^Y, { ^^int, ^^double }));
+ static_assert (is_nothrow_constructible_type (^^Z, {}));
+ static_assert (is_nothrow_constructible_type (^^Z, { ^^Z }));
+ static_assert (is_nothrow_constructible_type (^^Z, { ^^Y }));
+ static_assert (!is_nothrow_constructible_type (^^Z, { ^^int }));
+ static_assert (!is_nothrow_constructible_type (^^Z, { ^^int, ^^X }));
+ static_assert (!is_nothrow_constructible_type (^^Z, { ^^int, ^^int }));
+ static_assert (!is_nothrow_constructible_type (^^Z, { ^^Y, ^^double }));
+ static_assert (!is_nothrow_constructible_type (^^Z, { ^^int, ^^double }));
+ static_assert (!is_nothrow_constructible_type (^^Z, { ^^X }));
+ 
+ using func_type_v0 = void (*) ();
+ using func_type_i0 = int (*) ();
+ using func_type_l0 = int &(*) ();
+ using func_type_ii = int (*) (int);
+ using func_type_il = int (*) (int &);
+ using func_type_ir = int (*) (int &&);
+ struct W { };
+ 
+ using mem_type_i = int W::*;
+ using memfun_type_i = int (W::*) ();
+ using memfun_type_iic = int &(W::*) (int &) const;
+ struct F {
+   int &operator () ();
+   long &operator () () const;
+   short &operator () (int) &&;
+   char &operator () (int) const &;
+ private:
+   void operator () (int, int);
+ };
+ using CF = const F;
+ struct T { T (int) { } };
+ struct NT { NT (int) noexcept { } };
+ struct Ex { explicit Ex (int) noexcept { } };
+ using func_type = void (*) ();
+ using func_type_nt = void (*) () noexcept;
+ using mem_type = int W::*;
+ using memfun_type = int (W::*) ();
+ using memfun_type_nt = int (W::*) () noexcept;
+ struct F2 {
+   int &operator () ();
+   long &operator () () const noexcept;
+   short &operator () (int) &&;
+   char &operator () (int) const & noexcept;
+ private:
+   void operator () (int, int) noexcept;
+ };
+ using CF2 = const F2;
+ struct FW { W operator () () const noexcept { return {}; } };
+ struct V { explicit V (W) noexcept; V (...); };
+ 
+ static_assert (is_invocable_type (^^func_type_v0, {}));
+ static_assert (!is_invocable_type (^^func_type_v0, { ^^int }));
+ static_assert (is_invocable_type (^^func_type_i0, {}));
+ static_assert (!is_invocable_type (^^func_type_i0, { ^^int }));
+ static_assert (is_invocable_type (^^func_type_l0, {}));
+ static_assert (!is_invocable_type (^^func_type_l0 (int), {}));
+ static_assert (!is_invocable_type (^^func_type_ii, {}));
+ static_assert (is_invocable_type (^^func_type_ii, { ^^int }));
+ static_assert (!is_invocable_type (^^func_type_il, {}));
+ static_assert (!is_invocable_type (^^func_type_il, { ^^int }));
+ static_assert (is_invocable_type (^^func_type_il, { ^^int & }));
+ static_assert (!is_invocable_type (^^func_type_ir, {}));
+ static_assert (is_invocable_type (^^func_type_ir, { ^^int }));
+ static_assert (!is_invocable_type (^^func_type_ir, { ^^int & }));
+ static_assert (!is_invocable_type (^^mem_type_i, {}));
+ static_assert (!is_invocable_type (^^mem_type_i, { ^^int }));
+ static_assert (!is_invocable_type (^^mem_type_i, { ^^int & }));
+ static_assert (is_invocable_type (^^mem_type_i, { ^^W & }));
+ static_assert (!is_invocable_type (^^memfun_type_i, {}));
+ static_assert (!is_invocable_type (^^memfun_type_i, { ^^int }));
+ static_assert (!is_invocable_type (^^memfun_type_i, { ^^int & }));
+ static_assert (is_invocable_type (^^memfun_type_i, { ^^W & }));
+ static_assert (is_invocable_type (^^memfun_type_i, { ^^W * }));
+ static_assert (!is_invocable_type (^^memfun_type_i, { ^^const W & }));
+ static_assert (!is_invocable_type (^^memfun_type_i, { ^^W &, ^^int }));
+ static_assert (!is_invocable_type (^^memfun_type_iic, {}));
+ static_assert (!is_invocable_type (^^memfun_type_iic, { ^^int }));
+ static_assert (!is_invocable_type (^^memfun_type_iic, { ^^int & }));
+ static_assert (!is_invocable_type (^^memfun_type_iic, { ^^W &, ^^int }));
+ static_assert (!is_invocable_type (^^memfun_type_iic, { ^^const W &, ^^int }));
+ static_assert (!is_invocable_type (^^memfun_type_iic, { ^^const W &, ^^int &, ^^int }));
+ static_assert (is_invocable_type (^^memfun_type_iic, { ^^const W &, ^^int & }));
+ static_assert (is_invocable_type (^^memfun_type_iic, { ^^const W *, ^^int & }));
+ static_assert (!is_invocable_type (^^F, { ^^int, ^^int }));
+ 
+ static_assert (!is_nothrow_invocable_type (^^func_type, {}));
+ static_assert (is_nothrow_invocable_type (^^func_type_nt, {}));
+ static_assert (!is_nothrow_invocable_type (^^mem_type, {}));
+ static_assert (!is_nothrow_invocable_type (^^mem_type, { ^^int }));
+ static_assert (!is_nothrow_invocable_type (^^mem_type, { ^^int & }));
+ static_assert (is_nothrow_invocable_type (^^mem_type, { ^^W & }));
+ static_assert (!is_nothrow_invocable_type (^^memfun_type, {}));
+ static_assert (!is_nothrow_invocable_type (^^memfun_type, { ^^int }));
+ static_assert (!is_nothrow_invocable_type (^^memfun_type, { ^^int & }));
+ static_assert (!is_nothrow_invocable_type (^^memfun_type, { ^^W & }));
+ static_assert (!is_nothrow_invocable_type (^^memfun_type, { ^^W * }));
+ static_assert (!is_nothrow_invocable_type (^^memfun_type_nt, {}));
+ static_assert (!is_nothrow_invocable_type (^^memfun_type_nt, { ^^int }));
+ static_assert (!is_nothrow_invocable_type (^^memfun_type_nt, { ^^int & }));
+ static_assert (is_nothrow_invocable_type (^^memfun_type_nt, { ^^W & }));
+ static_assert (is_nothrow_invocable_type (^^memfun_type_nt, { ^^W * }));
+ static_assert (!is_nothrow_invocable_type (^^F2, {}));
+ static_assert (is_nothrow_invocable_type (^^CF2, {}));
+ static_assert (!is_nothrow_invocable_type (^^F2, { ^^int }));
+ static_assert (is_nothrow_invocable_type (^^F2 &, { ^^int }));
+ static_assert (is_nothrow_invocable_type (^^CF2, { ^^int }));
+ static_assert (is_nothrow_invocable_type (^^CF2 &, { ^^int }));
+ static_assert (!is_nothrow_invocable_type (^^F2, { ^^int, ^^int }));
+ static_assert (is_nothrow_invocable_type (^^FW, {}));
+ 
+ static_assert (is_invocable_r_type (^^void, ^^func_type_v0, {}));
+ static_assert (!is_invocable_r_type (^^void *, ^^func_type_v0, {}));
+ static_assert (!is_invocable_r_type (^^int, ^^func_type_v0, {}));
+ static_assert (!is_invocable_r_type (^^void, ^^func_type_v0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^void *, ^^func_type_v0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int, ^^func_type_v0, { ^^int }));
+ static_assert (is_invocable_r_type (^^void, ^^func_type_i0, {}));
+ static_assert (is_invocable_r_type (^^int, ^^func_type_i0, {}));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_i0, {}));
+ static_assert (is_invocable_r_type (^^long, ^^func_type_i0, {}));
+ static_assert (!is_invocable_r_type (^^void, ^^func_type_i0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int, ^^func_type_i0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_i0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^long, ^^func_type_i0, { ^^int }));
+ static_assert (is_invocable_r_type (^^void, ^^func_type_l0, {}));
+ static_assert (is_invocable_r_type (^^int, ^^func_type_l0, {}));
+ static_assert (is_invocable_r_type (^^int &, ^^func_type_l0, {}));
+ static_assert (!is_invocable_r_type (^^int &&, ^^func_type_l0, {}));
+ static_assert (is_invocable_r_type (^^long, ^^func_type_l0, {}));
+ static_assert (!is_invocable_r_type (^^long &, ^^func_type_l0, {}));
+ static_assert (!is_invocable_r_type (^^void, ^^func_type_l0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int, ^^func_type_l0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_l0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^long, ^^func_type_l0, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int, ^^func_type_ii, {}));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_ii, {}));
+ static_assert (!is_invocable_r_type (^^long, ^^func_type_ii, {}));
+ static_assert (is_invocable_r_type (^^int, ^^func_type_ii, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_ii, { ^^int }));
+ static_assert (is_invocable_r_type (^^long, ^^func_type_ii, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int, ^^func_type_il, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_il, { ^^int }));
+ static_assert (!is_invocable_r_type (^^long, ^^func_type_il, { ^^int }));
+ static_assert (is_invocable_r_type (^^int, ^^func_type_il, { ^^int & }));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_il, { ^^int & }));
+ static_assert (is_invocable_r_type (^^long, ^^func_type_il, { ^^int & }));
+ static_assert (is_invocable_r_type (^^int, ^^func_type_ir, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_ir, { ^^int }));
+ static_assert (is_invocable_r_type (^^long, ^^func_type_ir, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int, ^^func_type_ir, { ^^int & }));
+ static_assert (!is_invocable_r_type (^^int &, ^^func_type_ir, { ^^int & }));
+ static_assert (!is_invocable_r_type (^^long, ^^func_type_ir, { ^^int & }));
+ static_assert (!is_invocable_r_type (^^int, ^^mem_type_i, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int &, ^^mem_type_i, { ^^int }));
+ static_assert (!is_invocable_r_type (^^long, ^^mem_type_i, { ^^int }));
+ static_assert (!is_invocable_r_type (^^int, ^^mem_type_i, { ^^int & }));
+ static_assert (!is_invocable_r_type (^^int &, ^^mem_type_i, { ^^int & }));
+ static_assert (!is_invocable_r_type (^^long, ^^mem_type_i, { ^^int & }));
+ static_assert (is_invocable_r_type (^^int, ^^mem_type_i, { ^^W & }));
+ static_assert (is_invocable_r_type (^^int &, ^^mem_type_i, { ^^W & }));
+ static_assert (is_invocable_r_type (^^long, ^^mem_type_i, { ^^W & }));
+ static_assert (is_invocable_r_type (^^int, ^^memfun_type_i, { ^^W & }));
+ static_assert (!is_invocable_r_type (^^int &, ^^memfun_type_i, { ^^W & }));
+ static_assert (is_invocable_r_type (^^long, ^^memfun_type_i, { ^^W & }));
+ static_assert (!is_invocable_r_type (^^int, ^^memfun_type_i, { ^^const W & }));
+ static_assert (is_invocable_r_type (^^int, ^^memfun_type_iic, { ^^const W &, ^^int & }));
+ static_assert (is_invocable_r_type (^^int &, ^^memfun_type_iic, { ^^const W &, ^^int & }));
+ static_assert (is_invocable_r_type (^^long, ^^memfun_type_iic, { ^^const W &, ^^int & }));
+ static_assert (!is_invocable_r_type (^^long &, ^^memfun_type_iic, { ^^const W &, ^^int & }));
+ static_assert (is_invocable_r_type (^^int &, ^^F, {}));
+ static_assert (is_invocable_r_type (^^int &, ^^F &, {}));
+ static_assert (is_invocable_r_type (^^long &, ^^CF, {}));
+ static_assert (is_invocable_r_type (^^long &, ^^CF &, {}));
+ static_assert (is_invocable_r_type (^^short &, ^^F, { ^^int }));
+ static_assert (is_invocable_r_type (^^char &, ^^F &, { ^^int }));
+ static_assert (is_invocable_r_type (^^char &, ^^CF, { ^^int }));
+ static_assert (is_invocable_r_type (^^char &, ^^CF &, { ^^int }));
+ 
+ static_assert (is_nothrow_invocable_r_type (^^int, ^^mem_type, { ^^W & }));
+ static_assert (is_nothrow_invocable_r_type (^^int &, ^^mem_type, { ^^W & }));
+ static_assert (is_nothrow_invocable_r_type (^^long, ^^mem_type, { ^^W & }));
+ static_assert (!is_nothrow_invocable_r_type (^^long &, ^^mem_type, { ^^W & }));
+ static_assert (is_nothrow_invocable_r_type (^^int &, ^^mem_type, { ^^W * }));
+ static_assert (!is_nothrow_invocable_r_type (^^T, ^^mem_type, { ^^W & }));
+ static_assert (is_nothrow_invocable_r_type (^^NT, ^^mem_type, { ^^W & }));
+ static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^mem_type, { ^^W & }));
+ static_assert (!is_nothrow_invocable_r_type (^^T, ^^memfun_type, { ^^W & }));
+ static_assert (!is_nothrow_invocable_r_type (^^NT, ^^memfun_type, { ^^W & }));
+ static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^memfun_type, { ^^W & }));
+ static_assert (!is_nothrow_invocable_r_type (^^T, ^^memfun_type_nt, { ^^W & }));
+ static_assert (is_nothrow_invocable_r_type (^^NT, ^^memfun_type_nt, { ^^W & }));
+ static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^memfun_type_nt, { ^^W & }));
+ static_assert (!is_nothrow_invocable_r_type (^^int &, ^^F2, {}));
+ static_assert (is_nothrow_invocable_r_type (^^long &, ^^CF2, {}));
+ static_assert (!is_nothrow_invocable_r_type (^^T, ^^F2, {}));
+ static_assert (!is_nothrow_invocable_r_type (^^NT, ^^F2, {}));
+ static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^F2, {}));
+ static_assert (!is_nothrow_invocable_r_type (^^void, ^^F2, {}));
+ static_assert (!is_nothrow_invocable_r_type (^^T, ^^CF2, {}));
+ static_assert (is_nothrow_invocable_r_type (^^NT, ^^CF2, {}));
+ static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^CF2, {}));
+ static_assert (is_nothrow_invocable_r_type (^^void, ^^CF2, {}));
+ static_assert (!is_nothrow_invocable_r_type (^^short &, ^^F2, { ^^int }));
+ static_assert (is_nothrow_invocable_r_type (^^char &, ^^F2 &, { ^^int }));
+ static_assert (!is_nothrow_invocable_r_type (^^T, ^^F2 &, { ^^int }));
+ static_assert (is_nothrow_invocable_r_type (^^NT, ^^F2 &, { ^^int }));
+ static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^F2 &, { ^^int }));
+ static_assert (is_nothrow_invocable_r_type (^^char &, ^^CF2, { ^^int }));
+ static_assert (is_nothrow_invocable_r_type (^^char &, ^^CF2 &, { ^^int }));
+ static_assert (is_nothrow_invocable_r_type (^^void, ^^CF2 &, { ^^int }));
+ static_assert (!is_nothrow_invocable_r_type (^^T, ^^CF2 &, { ^^int }));
+ static_assert (is_nothrow_invocable_r_type (^^NT, ^^CF2 &, { ^^int }));
+ static_assert (!is_nothrow_invocable_r_type (^^Ex, ^^CF2 &, { ^^int }));
+ static_assert (is_nothrow_invocable_r_type (^^void, ^^CF2 &, { ^^int }));
+ static_assert (!is_nothrow_invocable_r_type (^^void, ^^F2, { ^^int, ^^int }));
+ static_assert (!is_nothrow_invocable_r_type (^^V, ^^FW, {}));
+ 
+ static_assert (invoke_result (^^std::copyable_function <void ()>, {}) == ^^void);
+ static_assert (invoke_result (^^std::copyable_function <int ()>, {}) == ^^int);
+ static_assert (invoke_result (^^std::copyable_function <int & ()>, {}) == ^^int &);
+ static_assert (invoke_result (^^std::copyable_function <void (long, int)>, { ^^long, ^^int }) == ^^void);
+ static_assert (invoke_result (^^std::copyable_function <int (double, unsigned)>, { ^^double, ^^unsigned }) == ^^int);
+ static_assert (invoke_result (^^std::copyable_function <int & (int &)>, { ^^int & }) == ^^int &);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait12.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait12.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait12.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait12.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,137 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // { dg-add-options float16 }
+ // { dg-add-options float32 }
+ // { dg-add-options float64 }
+ // { dg-add-options float128 }
+ // Test reflection type traits [meta.reflection.traits], type properties.
+ 
+ #include <functional>
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct A { int a, b, c; };
+ class B { static int a; private: static int b; public: int c; };
+ struct C { C () {} int a, b, c; };
+ struct D { explicit D (int) {} int a, b, c; };
+ struct E : public A { int d, e, f; };
+ struct F : public C { using C::C; int d, e, f; };
+ class G { int a, b; };
+ struct H { private: int a, b; };
+ struct I { protected: int a, b; };
+ struct J { int a, b; void foo (); };
+ struct K { int a, b; virtual void foo (); };
+ struct L : virtual public A { int d, e; };
+ struct M : protected A { int d, e; };
+ struct N : private A { int d, e; };
+ struct O { O () = delete; int a, b, c; };
+ struct P { P () = default; int a, b, c; };
+ struct Q { Q (); Q (const Q &); int a, b, c; };
+ struct R { R (); R (const R &); R (R &&) = default; int a, b, c; };
+ struct S { S (); ~S (); int a, b, c; };
+ struct T { T (); ~T () = default; int a, b, c; };
+ struct U { U (); U (const U &) = default; int a, b, c; };
+ struct V { V () = default; V (const V &); int a, b, c; };
+ enum W { W1 };
+ enum class X : int { X1 };
+ struct Y { int g; int foo (int); };
+ struct Z;
+ struct AA { Q a; Q b; };
+ struct AB { Q a; Q b; ~AB () = default; };
+ struct AC { Q a; Q b; ~AC () {} };
+ struct AD : public Q {};
+ struct AE : public Q { ~AE () = default; };
+ struct AF : public Q { ~AF () {} };
+ 
+ static_assert (!is_implicit_lifetime_type (^^void));
+ static_assert (!is_implicit_lifetime_type (^^const void));
+ static_assert (!is_implicit_lifetime_type (^^volatile void));
+ static_assert (is_implicit_lifetime_type (^^char));
+ static_assert (is_implicit_lifetime_type (^^signed char));
+ static_assert (is_implicit_lifetime_type (^^const unsigned char));
+ static_assert (is_implicit_lifetime_type (^^short));
+ static_assert (is_implicit_lifetime_type (^^volatile unsigned short));
+ static_assert (is_implicit_lifetime_type (^^int));
+ static_assert (is_implicit_lifetime_type (^^unsigned int));
+ static_assert (is_implicit_lifetime_type (^^const volatile long));
+ static_assert (is_implicit_lifetime_type (^^unsigned long));
+ static_assert (is_implicit_lifetime_type (^^long long));
+ static_assert (is_implicit_lifetime_type (^^unsigned long long));
+ #ifdef __SIZEOF_INT128__
+ __extension__ static_assert (is_implicit_lifetime_type (^^__int128));
+ __extension__ static_assert (is_implicit_lifetime_type (^^unsigned __int128));
+ #endif
+ static_assert (is_implicit_lifetime_type (^^float));
+ static_assert (is_implicit_lifetime_type (^^double));
+ static_assert (is_implicit_lifetime_type (^^long double volatile));
+ #ifdef __STDCPP_FLOAT16_T__
+ static_assert (is_implicit_lifetime_type (^^_Float16));
+ #endif
+ #ifdef __STDCPP_FLOAT32_T__
+ static_assert (is_implicit_lifetime_type (^^_Float32));
+ #endif
+ #ifdef __STDCPP_FLOAT64_T__
+ static_assert (is_implicit_lifetime_type (^^const _Float64));
+ #endif
+ #ifdef __STDCPP_FLOAT128_T__
+ static_assert (is_implicit_lifetime_type (^^_Float128));
+ #endif
+ #ifdef __STDCPP_BFLOAT16_T__
+ static_assert (is_implicit_lifetime_type (^^decltype(0.bf16)));
+ #endif
+ static_assert (is_implicit_lifetime_type (^^W));
+ static_assert (is_implicit_lifetime_type (^^const volatile X));
+ static_assert (is_implicit_lifetime_type (^^int *));
+ static_assert (is_implicit_lifetime_type (^^int (*) (int)));
+ static_assert (is_implicit_lifetime_type (^^int (Y::*)));
+ static_assert (is_implicit_lifetime_type (^^int (Y::*) (int)));
+ static_assert (!is_implicit_lifetime_type (^^int &));
+ static_assert (!is_implicit_lifetime_type (^^char &&));
+ static_assert (is_implicit_lifetime_type (^^int []));
+ __extension__ static_assert (!is_implicit_lifetime_type (^^int [0]));
+ static_assert (is_implicit_lifetime_type (^^int [1]));
+ static_assert (is_implicit_lifetime_type (^^const Y [42]));
+ static_assert (!is_implicit_lifetime_type (^^int ()));
+ static_assert (!is_implicit_lifetime_type (^^int () &));
+ static_assert (!is_implicit_lifetime_type (^^int () const));
+ static_assert (!is_implicit_lifetime_type (^^int (&) ()));
+ static_assert (is_implicit_lifetime_type (^^Z []));
+ static_assert (is_implicit_lifetime_type (^^Z [5]));
+ static_assert (is_implicit_lifetime_type (^^A));
+ static_assert (is_implicit_lifetime_type (^^B));
+ static_assert (is_implicit_lifetime_type (^^C));
+ static_assert (is_implicit_lifetime_type (^^D));
+ static_assert (is_implicit_lifetime_type (^^E));
+ static_assert (is_implicit_lifetime_type (^^F));
+ static_assert (is_implicit_lifetime_type (^^G));
+ static_assert (is_implicit_lifetime_type (^^H));
+ static_assert (is_implicit_lifetime_type (^^I));
+ static_assert (is_implicit_lifetime_type (^^J));
+ static_assert (!is_implicit_lifetime_type (^^K));
+ static_assert (!is_implicit_lifetime_type (^^L));
+ static_assert (is_implicit_lifetime_type (^^M));
+ static_assert (is_implicit_lifetime_type (^^N));
+ static_assert (is_implicit_lifetime_type (^^O));
+ static_assert (is_implicit_lifetime_type (^^P));
+ static_assert (!is_implicit_lifetime_type (^^Q));
+ static_assert (is_implicit_lifetime_type (^^R));
+ static_assert (!is_implicit_lifetime_type (^^S));
+ static_assert (is_implicit_lifetime_type (^^S [3]));
+ static_assert (is_implicit_lifetime_type (^^T));
+ static_assert (is_implicit_lifetime_type (^^U));
+ static_assert (is_implicit_lifetime_type (^^V));
+ static_assert (is_implicit_lifetime_type (^^_Complex double));
+ static_assert (is_implicit_lifetime_type (^^int [[gnu::vector_size (4 * sizeof (int))]]));
+ static_assert (is_implicit_lifetime_type (^^AA));
+ static_assert (is_implicit_lifetime_type (^^AB));
+ static_assert (!is_implicit_lifetime_type (^^AC));
+ static_assert (is_implicit_lifetime_type (^^AD));
+ static_assert (is_implicit_lifetime_type (^^AE));
+ static_assert (!is_implicit_lifetime_type (^^AF));
+ 
+ void
+ foo (int n)
+ {
+   __extension__ static_assert (is_implicit_lifetime_type (^^char [n]));
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait13.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait13.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait13.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait13.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,425 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], type properties.
+ 
+ #include <meta>
+ #include <utility>
+ #include <array>
+ #include <tuple>
+ #include <queue>
+ #include <stack>
+ 
+ using namespace std::meta;
+ 
+ class ClassType { };
+ enum EnumType { e0 };
+ struct ThrowCopyConsClass { ThrowCopyConsClass (const ThrowCopyConsClass &) noexcept (false); };
+ struct DeletedCopyAssignClass { DeletedCopyAssignClass & operator= (const DeletedCopyAssignClass &) = delete; };
+ struct DeletedMoveAssignClass { DeletedMoveAssignClass &operator= (DeletedMoveAssignClass &&) = delete; };
+ struct PODType { int i; int j; };
+ union UnionType { };
+ 
+ namespace N1
+ {
+   struct Empty {};
+   enum class SE { e1 };
+   struct Abstract { virtual ~Abstract () = 0; };
+   struct Any { template <class T> Any (T &&) {} };
+   struct nAny { template <class... T> nAny (T &&...) {} };
+   struct DelCopy { DelCopy (const DelCopy &) = delete; };
+   struct Nontrivial {
+     Nontrivial ();
+     Nontrivial (const Nontrivial &);
+     Nontrivial &operator= (const Nontrivial &);
+     ~Nontrivial ();
+   };
+   union NontrivialUnion { int i; Nontrivial n; };
+ }
+ 
+ namespace funny1 {
+   struct F {};
+   void swap (F &, F &) = delete;
+   void swap (F (&) [5], F (&) [5]);
+   struct F2 { friend void swap (F2 &, F2 &) = delete; };
+   struct F3 { friend void swap (F3 &, F3) {} };
+   struct DummyCmp { template <class T> bool operator () (const T &, const T &) const { return false; } };
+ }
+ 
+ namespace funny2 {
+   struct T0 {};
+   void swap (T0, T0);
+   struct T1 {};
+   struct T2 {};
+   void swap (T1, T2);
+   void swap (T2, T1);
+   struct BoolLike {};
+   void swap (BoolLike, bool &);
+   void swap (bool &, BoolLike);
+   struct F0 {};
+   void swap (F0, F0) = delete;
+   struct F1 {};
+   void swap (F0, F1) = delete;
+   void swap (F1, F0) = delete;
+   struct F2 {};
+   struct F3 {};
+   void swap (F2, F3);
+   void swap (F3, F2) = delete;
+   struct F4 { friend void swap (F4, F4) = delete; };
+ }
+ 
+ namespace funny3 {
+   struct F {};
+   void swap (F &, F &) = delete;
+   void swap (F (&) [5], F (&) [5]) noexcept;
+   void swap (F (&) [6], F (&) [6]);
+   struct A {};
+   void swap (A &, A &) noexcept (false);
+ }
+ namespace std {
+   template <>
+   void swap <funny3::A> (funny3::A &, funny3::A &) noexcept {}
+   template <>
+   void swap <funny3::A> (funny3::A (&) [3], funny3::A (&) [3]) noexcept (false) {}
+ }
+ namespace ns1 {
+   struct SwapThrow {};
+   void swap (SwapThrow &, SwapThrow &);
+   void swap (SwapThrow (&) [3], SwapThrow (&) [3]) noexcept;
+ }
+ namespace ns2 {
+   struct SwapThrow {
+     SwapThrow () noexcept = default;
+     SwapThrow (const SwapThrow &) noexcept (false);
+     SwapThrow &operator = (const SwapThrow &) noexcept (false);
+   };
+ }
+ namespace ns3 {
+   struct SwapNoThrow {
+     SwapNoThrow () noexcept = default;
+     SwapNoThrow (const SwapNoThrow &) noexcept (false);
+     SwapNoThrow &operator = (const SwapNoThrow &) noexcept (false);
+   };
+   void swap (SwapNoThrow &, SwapNoThrow &) noexcept;
+ }
+ namespace ns4 {
+   struct SwapNoThrow {};
+ }
+ namespace ns5 {
+   struct SwapThrow {
+     SwapThrow () noexcept = default;
+     SwapThrow (SwapThrow &&) noexcept;
+     SwapThrow & operator = (const SwapThrow &) noexcept (false);
+   };
+ }
+ namespace comps {
+   struct CompareNoThrowCopyable {
+     template <class T>
+     bool operator () (const T &, const T &) const { return false; }
+   };
+   struct CompareNonCopyable {
+     CompareNonCopyable () = default;
+     CompareNonCopyable (const CompareNonCopyable &) = delete;
+     CompareNonCopyable &operator= (const CompareNonCopyable &) noexcept;
+     template <class T>
+     bool operator () (const T &, const T &) const { return false; }
+   };
+   struct CompareThrowCopyable {
+     CompareThrowCopyable () = default;
+     CompareThrowCopyable (const CompareThrowCopyable &) noexcept (false);
+     CompareThrowCopyable &operator = (const CompareThrowCopyable &);
+     template <class T>
+     bool operator () (const T &, const T &) const { return false; }
+   };
+ }
+ 
+ namespace funny4 {
+   struct T0 {};
+   void swap (T0, T0) noexcept;
+   struct T1 { friend void swap (T1, T1) noexcept; };
+   struct T2 {};
+   struct T3 {};
+   void swap (T2, T3) noexcept;
+   void swap (T3, T2) noexcept;
+   struct T4 { operator T0 () const noexcept; };
+   struct F0 {};
+   void swap (F0, F0) = delete;
+   struct F1 {};
+   void swap (F1, F1);
+   struct F2 {};
+   void swap (F0, F2) noexcept;
+   void swap (F2, F0);
+   struct F3 { friend void swap (F3, F3) = delete; };
+   struct F4 { friend void swap (F4, F4); };
+   struct F5 { operator T0 () const; };
+   struct BoolLike {};
+   void swap (BoolLike, bool &) noexcept;
+   void swap (bool &, BoolLike) noexcept;
+   struct BoolLikeErr {};
+   void swap (BoolLikeErr, bool &);
+   void swap (bool &, BoolLikeErr) noexcept;
+ }
+ 
+ static_assert (is_swappable_type (^^int));
+ static_assert (is_swappable_type (^^bool));
+ static_assert (is_swappable_type (^^decltype (nullptr)));
+ static_assert (is_swappable_type (^^int &));
+ static_assert (is_swappable_type (^^int &&));
+ static_assert (is_swappable_type (^^int [1]));
+ static_assert (is_swappable_type (^^int [1][2]));
+ static_assert (is_swappable_type (^^int [1][2][3]));
+ static_assert (is_swappable_type (^^int (&) [1]));
+ static_assert (is_swappable_type (^^funny1::F [5]));
+ static_assert (is_swappable_type (^^funny1::F3));
+ static_assert (is_swappable_type (^^funny1::F3 [1]));
+ static_assert (is_swappable_type (^^funny1::F3 [1][2]));
+ static_assert (is_swappable_type (^^funny1::F3 [1][2][3]));
+ static_assert (is_swappable_type (^^ThrowCopyConsClass));
+ static_assert (is_swappable_type (^^EnumType));
+ static_assert (is_swappable_type (^^PODType));
+ static_assert (is_swappable_type (^^UnionType));
+ static_assert (is_swappable_type (^^N1::SE));
+ static_assert (is_swappable_type (^^N1::Empty));
+ static_assert (is_swappable_type (^^void *));
+ static_assert (is_swappable_type (^^int const *));
+ static_assert (is_swappable_type (^^ClassType *));
+ static_assert (is_swappable_type (^^int ClassType::*));
+ static_assert (is_swappable_type (^^void (ClassType::*) ()));
+ static_assert (is_swappable_type (^^N1::Nontrivial));
+ static_assert (is_swappable_type (^^N1::Any));
+ static_assert (is_swappable_type (^^N1::nAny));
+ static_assert (is_swappable_type (^^std::pair <int, int>));
+ static_assert (is_swappable_type (^^std::pair <int, int> [1]));
+ static_assert (is_swappable_type (^^std::pair <int, int> [1][2]));
+ static_assert (is_swappable_type (^^std::pair <int, int> [1][2][3]));
+ static_assert (is_swappable_type (^^std::pair <N1::Nontrivial, N1::Nontrivial>));
+ static_assert (is_swappable_type (^^std::tuple <int>));
+ static_assert (is_swappable_type (^^std::tuple <int> [1]));
+ static_assert (is_swappable_type (^^std::tuple <int> [1][2]));
+ static_assert (is_swappable_type (^^std::tuple <int> [1][2][3]));
+ static_assert (is_swappable_type (^^std::tuple <>));
+ static_assert (is_swappable_type (^^std::tuple <> [1]));
+ static_assert (is_swappable_type (^^std::tuple <> [1][2]));
+ static_assert (is_swappable_type (^^std::tuple <> [1][2][3]));
+ static_assert (is_swappable_type (^^std::tuple <N1::Nontrivial>));
+ static_assert (is_swappable_type (^^std::array <int, 1>));
+ static_assert (is_swappable_type (^^std::array <int, 1> [1]));
+ static_assert (is_swappable_type (^^std::array <int, 1> [1][2]));
+ static_assert (is_swappable_type (^^std::array <int, 1> [1][2][3]));
+ static_assert (is_swappable_type (^^std::array <N1::Nontrivial, 1>));
+ static_assert (is_swappable_type (^^std::array <int, 0>));
+ static_assert (is_swappable_type (^^std::array <N1::DelCopy, 0>));
+ static_assert (is_swappable_type (^^std::queue <int>));
+ static_assert (is_swappable_type (^^std::queue <int> [1]));
+ static_assert (is_swappable_type (^^std::queue <int> [1][2]));
+ static_assert (is_swappable_type (^^std::queue <int> [1][2][3]));
+ static_assert (is_swappable_type (^^std::queue <N1::Nontrivial>));
+ //static_assert (is_swappable_type (^^std::priority_queue <int>));
+ //static_assert (is_swappable_type (^^std::priority_queue <int> [1]));
+ //static_assert (is_swappable_type (^^std::priority_queue <int> [1][2]));
+ //static_assert (is_swappable_type (^^std::priority_queue <int> [1][2][3]));
+ //static_assert (is_swappable_type (^^std::priority_queue <N1::Nontrivial, std::vector <N1::Nontrivial>, funny1::DummyCmp>));
+ static_assert (is_swappable_type (^^std::stack <int>));
+ static_assert (is_swappable_type (^^std::stack <int> [1]));
+ static_assert (is_swappable_type (^^std::stack <int> [1][2]));
+ static_assert (is_swappable_type (^^std::stack <int> [1][2][3]));
+ static_assert (is_swappable_type (^^std::stack <N1::Nontrivial>));
+ static_assert (!is_swappable_type (^^void));
+ static_assert (!is_swappable_type (^^const void));
+ static_assert (!is_swappable_type (^^void ()));
+ static_assert (!is_swappable_type (^^void () const));
+ static_assert (!is_swappable_type (^^void () volatile));
+ static_assert (!is_swappable_type (^^void () const volatile));
+ static_assert (!is_swappable_type (^^const int));
+ static_assert (!is_swappable_type (^^const bool));
+ static_assert (!is_swappable_type (^^int []));
+ static_assert (!is_swappable_type (^^const int []));
+ static_assert (!is_swappable_type (^^int [][1]));
+ static_assert (!is_swappable_type (^^const int [1]));
+ static_assert (!is_swappable_type (^^const int [1][2]));
+ static_assert (!is_swappable_type (^^const int [1][2][3]));
+ static_assert (!is_swappable_type (^^N1::DelCopy));
+ static_assert (!is_swappable_type (^^N1::Abstract));
+ static_assert (!is_swappable_type (^^N1::NontrivialUnion));
+ static_assert (!is_swappable_type (^^funny1::F));
+ static_assert (!is_swappable_type (^^funny1::F [1]));
+ static_assert (!is_swappable_type (^^funny1::F [1][2]));
+ static_assert (!is_swappable_type (^^funny1::F [1][2][3]));
+ static_assert (!is_swappable_type (^^funny1::F [4]));
+ static_assert (!is_swappable_type (^^N1::DelCopy));
+ static_assert (!is_swappable_type (^^DeletedCopyAssignClass));
+ static_assert (!is_swappable_type (^^DeletedMoveAssignClass));
+ static_assert (!is_swappable_type (^^funny1::F2));
+ static_assert (!is_swappable_type (^^funny1::F2 [1]));
+ static_assert (!is_swappable_type (^^funny1::F2 [1][2]));
+ static_assert (!is_swappable_type (^^funny1::F2 [1][2][3]));
+ static_assert (!is_swappable_type (^^funny1::F2 [4]));
+ static_assert (!is_swappable_type (^^funny1::F2 [5]));
+ 
+ static_assert (is_swappable_with_type (^^int &, ^^int &));
+ static_assert (is_swappable_with_type (^^funny2::T0, ^^funny2::T0));
+ static_assert (is_swappable_with_type (^^funny2::T0, ^^const funny2::T0));
+ static_assert (is_swappable_with_type (^^funny2::T1, ^^funny2::T2));
+ static_assert (is_swappable_with_type (^^funny2::T2, ^^funny2::T1));
+ static_assert (is_swappable_with_type (^^funny2::BoolLike, ^^bool &));
+ static_assert (is_swappable_with_type (^^const funny2::BoolLike, ^^bool &));
+ static_assert (!is_swappable_with_type (^^int, ^^int));
+ static_assert (!is_swappable_with_type (^^int &, ^^unsigned &));
+ static_assert (!is_swappable_with_type (^^const int &, ^^const int &));
+ static_assert (!is_swappable_with_type (^^funny2::F0, ^^funny2::F0));
+ static_assert (!is_swappable_with_type (^^funny2::F0, ^^const funny2::F0));
+ static_assert (!is_swappable_with_type (^^funny2::T0, ^^funny2::T1));
+ static_assert (!is_swappable_with_type (^^funny2::F0, ^^funny2::F1));
+ static_assert (!is_swappable_with_type (^^funny2::F0, ^^const funny2::F1));
+ static_assert (!is_swappable_with_type (^^const funny2::F0, ^^funny2::F1));
+ static_assert (!is_swappable_with_type (^^funny2::F2, ^^funny2::F3));
+ static_assert (!is_swappable_with_type (^^funny2::F2, ^^const funny2::F3));
+ static_assert (!is_swappable_with_type (^^const funny2::F2, ^^funny2::F3));
+ static_assert (!is_swappable_with_type (^^funny2::F4, ^^funny2::F4));
+ static_assert (!is_swappable_with_type (^^funny2::BoolLike, ^^funny2::BoolLike));
+ 
+ static_assert (is_nothrow_swappable_type (^^int));
+ static_assert (is_nothrow_swappable_type (^^bool));
+ static_assert (is_nothrow_swappable_type (^^decltype (nullptr)));
+ static_assert (is_nothrow_swappable_type (^^int &));
+ static_assert (is_nothrow_swappable_type (^^int &&));
+ static_assert (is_nothrow_swappable_type (^^int [1]));
+ static_assert (is_nothrow_swappable_type (^^int [1][2]));
+ static_assert (is_nothrow_swappable_type (^^int [1][2][3]));
+ static_assert (is_nothrow_swappable_type (^^funny3::F [5]));
+ static_assert (is_nothrow_swappable_type (^^EnumType));
+ static_assert (is_nothrow_swappable_type (^^PODType));
+ static_assert (is_nothrow_swappable_type (^^UnionType));
+ static_assert (is_nothrow_swappable_type (^^N1::SE));
+ static_assert (is_nothrow_swappable_type (^^N1::Empty));
+ static_assert (is_nothrow_swappable_type (^^void *));
+ static_assert (is_nothrow_swappable_type (^^void (*) ()));
+ static_assert (is_nothrow_swappable_type (^^int const *));
+ static_assert (is_nothrow_swappable_type (^^ClassType *));
+ static_assert (is_nothrow_swappable_type (^^int ClassType::*));
+ static_assert (is_nothrow_swappable_type (^^void (ClassType::*) ()));
+ static_assert (is_nothrow_swappable_type (^^int (ClassType::*) () const volatile));
+ static_assert (is_nothrow_swappable_type (^^ns1::SwapThrow [3]));
+ static_assert (is_nothrow_swappable_type (^^ns3::SwapNoThrow));
+ static_assert (is_nothrow_swappable_type (^^ns3::SwapNoThrow [1]));
+ static_assert (is_nothrow_swappable_type (^^ns3::SwapNoThrow [3]));
+ static_assert (is_nothrow_swappable_type (^^ns3::SwapNoThrow [2][3][4]));
+ static_assert (is_nothrow_swappable_type (^^ns4::SwapNoThrow));
+ static_assert (is_nothrow_swappable_type (^^ns4::SwapNoThrow [1]));
+ static_assert (is_nothrow_swappable_type (^^ns4::SwapNoThrow [3]));
+ static_assert (is_nothrow_swappable_type (^^ns4::SwapNoThrow [2][3][4]));
+ static_assert (is_nothrow_swappable_type (^^std::pair <int, int>));
+ static_assert (is_nothrow_swappable_type (^^std::pair <int, int> [1]));
+ static_assert (is_nothrow_swappable_type (^^std::pair <int, int> [1][2]));
+ static_assert (is_nothrow_swappable_type (^^std::tuple <int>));
+ static_assert (is_nothrow_swappable_type (^^std::tuple <int> [1]));
+ static_assert (is_nothrow_swappable_type (^^std::tuple <int> [1][2]));
+ static_assert (is_nothrow_swappable_type (^^std::tuple <>));
+ static_assert (is_nothrow_swappable_type (^^std::tuple <> [1]));
+ static_assert (is_nothrow_swappable_type (^^std::tuple <> [1][2]));
+ static_assert (is_nothrow_swappable_type (^^std::array <int, 1>));
+ static_assert (is_nothrow_swappable_type (^^std::array <int, 0>));
+ static_assert (is_nothrow_swappable_type (^^std::array <N1::DelCopy, 0>));
+ static_assert (is_nothrow_swappable_type (^^std::array <ns1::SwapThrow, 0>));
+ static_assert (is_nothrow_swappable_type (^^std::queue <int>));
+ //static_assert (is_nothrow_swappable_type (^^std::priority_queue <int>));
+ static_assert (is_nothrow_swappable_type (^^std::stack <int>));
+ //static_assert (is_nothrow_swappable_type (^^std::priority_queue <int, std::vector <int>, comps::CompareNoThrowCopyable>));
+ static_assert (!is_nothrow_swappable_type (^^void));
+ static_assert (!is_nothrow_swappable_type (^^const void));
+ static_assert (!is_nothrow_swappable_type (^^void ()));
+ static_assert (!is_nothrow_swappable_type (^^void () const));
+ static_assert (!is_nothrow_swappable_type (^^void () volatile));
+ static_assert (!is_nothrow_swappable_type (^^void () const volatile));
+ static_assert (!is_nothrow_swappable_type (^^const int));
+ static_assert (!is_nothrow_swappable_type (^^const bool));
+ static_assert (!is_nothrow_swappable_type (^^const int [1]));
+ static_assert (!is_nothrow_swappable_type (^^const int [1][2]));
+ static_assert (!is_nothrow_swappable_type (^^const int [1][2][3]));
+ static_assert (!is_nothrow_swappable_type (^^int []));
+ static_assert (!is_nothrow_swappable_type (^^const int []));
+ static_assert (!is_nothrow_swappable_type (^^int [][1]));
+ static_assert (!is_nothrow_swappable_type (^^const funny3::F [5]));
+ static_assert (!is_nothrow_swappable_type (^^N1::Abstract));
+ static_assert (!is_nothrow_swappable_type (^^N1::DelCopy));
+ static_assert (!is_nothrow_swappable_type (^^funny3::F));
+ static_assert (!is_nothrow_swappable_type (^^funny3::F [1]));
+ static_assert (!is_nothrow_swappable_type (^^funny3::F [1][2]));
+ static_assert (!is_nothrow_swappable_type (^^funny3::F [1][2][3]));
+ static_assert (!is_nothrow_swappable_type (^^funny3::F [6]));
+ static_assert (!is_nothrow_swappable_type (^^funny3::A));
+ static_assert (!is_nothrow_swappable_type (^^funny3::A [3]));
+ static_assert (!is_nothrow_swappable_type (^^ns1::SwapThrow));
+ static_assert (!is_nothrow_swappable_type (^^ns1::SwapThrow [1]));
+ static_assert (!is_nothrow_swappable_type (^^ns1::SwapThrow [3][2]));
+ static_assert (!is_nothrow_swappable_type (^^ns1::SwapThrow [2][3][4]));
+ static_assert (!is_nothrow_swappable_type (^^ns2::SwapThrow));
+ static_assert (!is_nothrow_swappable_type (^^ns2::SwapThrow [1]));
+ static_assert (!is_nothrow_swappable_type (^^ns2::SwapThrow [2][3][4]));
+ static_assert (!is_nothrow_swappable_type (^^ns5::SwapThrow));
+ static_assert (!is_nothrow_swappable_type (^^ns5::SwapThrow [1]));
+ static_assert (!is_nothrow_swappable_type (^^ns5::SwapThrow [2][3][4]));
+ static_assert (!is_nothrow_swappable_type (^^ThrowCopyConsClass));
+ static_assert (!is_nothrow_swappable_type (^^std::pair <ThrowCopyConsClass, ThrowCopyConsClass>));
+ static_assert (!is_nothrow_swappable_type (^^std::tuple <ThrowCopyConsClass>));
+ static_assert (!is_nothrow_swappable_type (^^std::array <ThrowCopyConsClass, 1>));
+ static_assert (is_nothrow_swappable_type (^^std::queue <ThrowCopyConsClass>));
+ static_assert (is_nothrow_swappable_type (^^std::priority_queue <ThrowCopyConsClass, std::vector <ThrowCopyConsClass>, comps::CompareNoThrowCopyable>));
+ static_assert (is_nothrow_swappable_type (^^std::stack <ThrowCopyConsClass>));
+ static_assert (!is_nothrow_swappable_type (^^std::priority_queue <int, std::vector <int>, comps::CompareNonCopyable>));
+ static_assert (!is_nothrow_swappable_type (^^std::priority_queue <int, std::vector <int>, comps::CompareThrowCopyable>));
+ 
+ static_assert (is_nothrow_swappable_with_type (^^int &, ^^int &));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::T0, ^^funny4::T0));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::T0, ^^const funny4::T0));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::T1, ^^funny4::T1));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::T1, ^^const funny4::T1));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::T2, ^^funny4::T3));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::T3, ^^funny4::T2));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::T0, ^^funny4::T4));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::T4, ^^funny4::T0));
+ static_assert (is_nothrow_swappable_with_type (^^funny4::BoolLike, ^^bool &));
+ static_assert (is_nothrow_swappable_with_type (^^const funny4::BoolLike, ^^bool &));
+ static_assert (!is_nothrow_swappable_with_type (^^const int &, ^^const int &));
+ static_assert (!is_nothrow_swappable_with_type (^^int &, ^^unsigned &));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F0, ^^funny4::F0));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F0, ^^const funny4::F0));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F1, ^^funny4::F1));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F1, ^^const funny4::F1));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F0, ^^funny4::F2));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F2, ^^funny4::F0));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F3, ^^funny4::F3));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F3, ^^const funny4::F3));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F4, ^^funny4::F4));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F4, ^^const funny4::F4));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::T0, ^^funny4::F5));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::F5, ^^funny4::T0));
+ static_assert (!is_nothrow_swappable_with_type (^^funny4::BoolLikeErr, ^^bool &));
+ static_assert (!is_nothrow_swappable_with_type (^^const funny4::BoolLikeErr, ^^bool &));
+ 
+ static_assert (unwrap_reference (^^int) == ^^int);
+ static_assert (unwrap_reference (^^const int) == ^^const int);
+ static_assert (unwrap_reference (^^const int &) == ^^const int &);
+ static_assert (unwrap_reference (^^const int *) == ^^const int *);
+ static_assert (unwrap_reference (^^const int *&) == ^^const int *&);
+ static_assert (unwrap_reference (^^std::reference_wrapper <int>) == ^^int &);
+ static_assert (unwrap_reference (^^std::reference_wrapper <const int>) == ^^const int &);
+ static_assert (unwrap_reference (^^std::reference_wrapper <long>) == ^^long &);
+ static_assert (unwrap_reference (^^const std::reference_wrapper <int>) == ^^const std::reference_wrapper <int>);
+ static_assert (unwrap_reference (^^volatile std::reference_wrapper <int>) == ^^volatile std::reference_wrapper <int>);
+ static_assert (unwrap_reference (^^const volatile std::reference_wrapper <int>) == ^^const volatile std::reference_wrapper <int>);
+ static_assert (unwrap_reference (^^std::reference_wrapper <int> &) == ^^std::reference_wrapper <int> &);
+ static_assert (unwrap_reference (^^std::reference_wrapper <int> &&) == ^^std::reference_wrapper <int> &&);
+ static_assert (unwrap_reference (^^const std::reference_wrapper <int> &) == ^^const std::reference_wrapper <int> &);
+ 
+ static_assert (unwrap_ref_decay (^^int) == decay (^^int));
+ static_assert (unwrap_ref_decay (^^const int) == decay (^^const int));
+ static_assert (unwrap_ref_decay (^^const int &) == decay (^^const int &));
+ static_assert (unwrap_ref_decay (^^const int *) == decay (^^const int *));
+ static_assert (unwrap_ref_decay (^^const int *&) == decay (^^const int *&));
+ static_assert (unwrap_ref_decay (^^std::reference_wrapper <int>) == ^^int &);
+ static_assert (unwrap_ref_decay (^^std::reference_wrapper <int> &) == ^^int &);
+ static_assert (unwrap_ref_decay (^^const std::reference_wrapper <int>) == ^^int &);
+ static_assert (unwrap_ref_decay (^^const std::reference_wrapper <int> &) == ^^int &);
+ static_assert (unwrap_ref_decay (^^std::reference_wrapper <const int>) == ^^const int &);
+ static_assert (unwrap_ref_decay (^^std::reference_wrapper <const int> &) == ^^const int &);
+ static_assert (unwrap_ref_decay (^^std::reference_wrapper <long>) == ^^long &);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,92 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], const-volatile
+ // modifications.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct C { };
+ 
+ static_assert (remove_const (^^const int) == ^^int);
+ static_assert (remove_const (^^volatile int) == ^^volatile int);
+ static_assert (remove_const (^^const volatile int) == ^^volatile int);
+ static_assert (remove_const (^^const volatile int *) == ^^const volatile int *);
+ static_assert (remove_const (^^const volatile int &) == ^^const volatile int &);
+ static_assert (remove_const (^^const volatile int []) == ^^volatile int []);
+ static_assert (remove_const (^^volatile int *const) == ^^volatile int *);
+ static_assert (remove_const (^^const volatile C) == ^^volatile C);
+ static_assert (remove_const (^^void (C::* const volatile)(int) const) == ^^void (C::* volatile)(int) const);
+ static_assert (remove_const (^^int (int)) == ^^int (int));
+ using T1 = int;
+ static_assert (remove_const (^^T1) == dealias (^^T1));
+ 
+ static_assert (remove_volatile (^^const int) == ^^const int);
+ static_assert (remove_volatile (^^volatile int) == ^^int);
+ static_assert (remove_volatile (^^const volatile int) == ^^const int);
+ static_assert (remove_volatile (^^const volatile int *) == ^^const volatile int *);
+ static_assert (remove_volatile (^^const volatile int &) == ^^const volatile int &);
+ static_assert (remove_volatile (^^const volatile int []) == ^^const int []);
+ static_assert (remove_volatile (^^volatile int *const) == ^^volatile int *const);
+ static_assert (remove_volatile (^^volatile int *volatile) == ^^volatile int *);
+ static_assert (remove_volatile (^^const volatile C) == ^^const C);
+ static_assert (remove_volatile (^^void (C::* const volatile)(int) const) == ^^void (C::* const)(int) const);
+ static_assert (remove_volatile (^^int (int)) == ^^int (int));
+ static_assert (remove_volatile (^^T1) == dealias (^^T1));
+ 
+ static_assert (remove_cv (^^const int) == ^^int);
+ static_assert (remove_cv (^^volatile int) == ^^int);
+ static_assert (remove_cv (^^const volatile int) == ^^int);
+ static_assert (remove_cv (^^const volatile int *) == ^^const volatile int *);
+ static_assert (remove_cv (^^const volatile int &) == ^^const volatile int &);
+ static_assert (remove_cv (^^const volatile int []) == ^^int []);
+ static_assert (remove_cv (^^volatile int *const) == ^^volatile int *);
+ static_assert (remove_cv (^^const volatile C) == ^^C);
+ static_assert (remove_cv (^^void (C::* const volatile)(int) const) == ^^void (C::*)(int) const);
+ static_assert (remove_cv (^^int (int)) == ^^int (int));
+ static_assert (remove_cv (^^T1) == dealias (^^T1));
+ 
+ static_assert (add_const (^^int) == ^^const int);
+ static_assert (add_const (^^const int) == ^^const int);
+ static_assert (add_const (^^volatile int) == ^^const volatile int);
+ static_assert (add_const (^^const volatile int) == ^^const volatile int);
+ static_assert (add_const (^^const volatile int *) == ^^const volatile int *const);
+ static_assert (add_const (^^int []) == ^^const int[]);
+ static_assert (add_const (^^int *) == ^^int *const);
+ static_assert (add_const (^^C) == ^^const C);
+ static_assert (add_const (^^void (C::*)(int) const) == ^^void (C::* const)(int) const);
+ static_assert (add_const (^^int (int)) == ^^int (int));
+ static_assert (add_const (^^int &) == ^^int &);
+ static_assert (add_const (^^const int &&) == ^^const int &&);
+ using T2 = const int;
+ static_assert (add_const (^^T2) == dealias (^^T2));
+ 
+ static_assert (add_volatile (^^int) == ^^volatile int);
+ static_assert (add_volatile (^^const int) == ^^const volatile int);
+ static_assert (add_volatile (^^volatile int) == ^^volatile int);
+ static_assert (add_volatile (^^const volatile int) == ^^const volatile int);
+ static_assert (add_volatile (^^const volatile int *) == ^^const volatile int *volatile);
+ static_assert (add_volatile (^^int []) == ^^volatile int[]);
+ static_assert (add_volatile (^^int *) == ^^int *volatile);
+ static_assert (add_volatile (^^C) == ^^volatile C);
+ static_assert (add_volatile (^^void (C::*)(int) const) == ^^void (C::* volatile)(int) const);
+ static_assert (add_volatile (^^int (int)) == ^^int (int));
+ static_assert (add_volatile (^^int &) == ^^int &);
+ static_assert (add_volatile (^^const int &&) == ^^const int &&);
+ using T3 = volatile int;
+ static_assert (add_volatile (^^T3) == dealias (^^T3));
+ 
+ static_assert (add_cv (^^int) == ^^const volatile int);
+ static_assert (add_cv (^^const int) == ^^const volatile int);
+ static_assert (add_cv (^^volatile int) == ^^const volatile int);
+ static_assert (add_cv (^^const volatile int) == ^^const volatile int);
+ static_assert (add_cv (^^const volatile int *) == ^^const volatile int *const volatile);
+ static_assert (add_cv (^^int []) == ^^const volatile int[]);
+ static_assert (add_cv (^^int *) == ^^int *const volatile);
+ static_assert (add_cv (^^C) == ^^const volatile C);
+ static_assert (add_cv (^^void (C::*)(int) const) == ^^void (C::* const volatile)(int) const);
+ static_assert (add_cv (^^int (int)) == ^^int (int));
+ static_assert (add_cv (^^int &) == ^^int &);
+ static_assert (add_cv (^^const int &&) == ^^const int &&);
+ using T4 = const volatile int;
+ static_assert (add_cv (^^T4) == dealias (^^T4));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,218 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], reference, sign,
+ // array and pointer modifications.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct C { };
+ enum E1 : int { E10, E11 };
+ enum E2 : unsigned char { E20, E21 };
+ enum E3 : short int { E30, E31 };
+ enum E4 : long long { E40, E41 };
+ 
+ static_assert (remove_reference (^^int) == ^^int);
+ static_assert (remove_reference (^^const int *) == ^^const int *);
+ static_assert (remove_reference (^^unsigned long &) == ^^unsigned long);
+ static_assert (remove_reference (^^const short &) == ^^const short);
+ static_assert (remove_reference (^^long long &&) == ^^long long);
+ static_assert (remove_reference (^^volatile char &&) == ^^volatile char);
+ static_assert (remove_reference (^^int *&) == ^^int *);
+ static_assert (remove_reference (^^C &) == ^^C);
+ static_assert (remove_reference (^^C &&) == ^^C);
+ static_assert (remove_reference (^^C) == ^^C);
+ static_assert (remove_reference (^^int (&) (int)) == ^^int (int));
+ static_assert (remove_reference (^^int (&&) (int)) == ^^int (int));
+ static_assert (remove_reference (^^int (int)) == ^^int (int));
+ using T1 = int;
+ static_assert (remove_reference (^^T1) == dealias (^^T1));
+ 
+ static_assert (add_lvalue_reference (^^int) == ^^int &);
+ static_assert (add_lvalue_reference (^^int &) == ^^int &);
+ static_assert (add_lvalue_reference (^^const int) == ^^const int &);
+ static_assert (add_lvalue_reference (^^int *) == ^^int *&);
+ static_assert (add_lvalue_reference (^^C &) == ^^C &);
+ static_assert (add_lvalue_reference (^^C) == ^^C &);
+ static_assert (add_lvalue_reference (^^int (int)) == ^^int (&) (int));
+ static_assert (add_lvalue_reference (^^int &&) == ^^int &);
+ static_assert (add_lvalue_reference (^^C &&) == ^^C &);
+ static_assert (add_lvalue_reference (^^void) == ^^void);
+ static_assert (add_lvalue_reference (^^const void) == ^^const void);
+ static_assert (add_lvalue_reference (^^bool (int) const) == ^^bool (int) const);
+ static_assert (add_lvalue_reference (^^bool (int) &) == ^^bool (int) &);
+ static_assert (add_lvalue_reference (^^bool (int) const &&) == ^^bool (int) const &&);
+ static_assert (add_lvalue_reference (^^bool (int)) == ^^bool (&) (int));
+ using T2 = int &;
+ static_assert (add_lvalue_reference (^^T2) == dealias (^^T2));
+ 
+ static_assert (add_rvalue_reference (^^int) == ^^int &&);
+ static_assert (add_rvalue_reference (^^int &&) == ^^int &&);
+ static_assert (add_rvalue_reference (^^int &) == ^^int &);
+ static_assert (add_rvalue_reference (^^const int) == ^^const int &&);
+ static_assert (add_rvalue_reference (^^int *) == ^^int *&&);
+ static_assert (add_rvalue_reference (^^C &&) == ^^C &&);
+ static_assert (add_rvalue_reference (^^C) == ^^C &&);
+ static_assert (add_rvalue_reference (^^int (int)) == ^^int (&&) (int));
+ static_assert (add_rvalue_reference (^^void) == ^^void);
+ static_assert (add_rvalue_reference (^^const void) == ^^const void);
+ static_assert (add_rvalue_reference (^^bool (int) const) == ^^bool (int) const);
+ static_assert (add_rvalue_reference (^^bool (int) &) == ^^bool (int) &);
+ static_assert (add_rvalue_reference (^^bool (int) const &&) == ^^bool (int) const &&);
+ static_assert (add_rvalue_reference (^^bool (int)) == ^^bool (&&) (int));
+ using T3 = int &&;
+ static_assert (add_rvalue_reference (^^T3) == dealias (^^T3));
+ 
+ static_assert (make_signed (^^const char) == ^^const signed char);
+ static_assert (make_signed (^^volatile signed char) == ^^volatile signed char);
+ static_assert (make_signed (^^unsigned char) == ^^signed char);
+ static_assert (make_signed (^^const signed short) == ^^const short);
+ static_assert (make_signed (^^volatile unsigned short) == ^^volatile signed short);
+ static_assert (make_signed (^^int) == ^^signed int);
+ static_assert (make_signed (^^const unsigned int) == ^^const int);
+ static_assert (make_signed (^^volatile long) == ^^volatile signed long);
+ static_assert (make_signed (^^unsigned long) == ^^long);
+ static_assert (make_signed (^^const signed long long) == ^^const long long);
+ static_assert (make_signed (^^volatile long long unsigned) == ^^volatile long long);
+ #if __SIZEOF_SHORT__ > 1 && __SIZEOF_SHORT__ < __SIZEOF_INT__ \
+     && __SIZEOF_INT__ < __SIZEOF_LONG_LONG__
+ static_assert (make_signed (^^const E1) == ^^const int);
+ static_assert (make_signed (^^volatile E2) == ^^volatile signed char);
+ static_assert (make_signed (^^E3) == ^^short);
+ #if __SIZEOF_LONG__ < __SIZEOF_LONG_LONG__
+ static_assert (make_signed (^^const volatile E4) == ^^const volatile long long);
+ #else
+ static_assert (make_signed (^^const volatile E4) == ^^const volatile long);
+ #endif
+ static_assert (make_signed (^^volatile char8_t) == ^^volatile signed char);
+ static_assert (sizeof (char16_t) != sizeof (short) || make_signed (^^char16_t) == ^^signed short);
+ static_assert (sizeof (char32_t) != sizeof (int) || make_signed (^^const volatile char32_t) == ^^const volatile int);
+ static_assert (sizeof (wchar_t) != sizeof (short) || make_signed (^^wchar_t) == ^^short);
+ static_assert (sizeof (wchar_t) != sizeof (int) || make_signed (^^wchar_t) == ^^signed int);
+ #endif
+ static_assert (make_signed (^^T1) == ^^int);
+ 
+ static_assert (make_unsigned (^^const char) == ^^const unsigned char);
+ static_assert (make_unsigned (^^volatile signed char) == ^^volatile unsigned char);
+ static_assert (make_unsigned (^^unsigned char) == ^^unsigned char);
+ static_assert (make_unsigned (^^const signed short) == ^^const unsigned short);
+ static_assert (make_unsigned (^^volatile unsigned short) == ^^volatile unsigned short);
+ static_assert (make_unsigned (^^int) == ^^unsigned int);
+ static_assert (make_unsigned (^^const unsigned int) == ^^const unsigned);
+ static_assert (make_unsigned (^^volatile long) == ^^volatile unsigned long);
+ static_assert (make_unsigned (^^unsigned long) == ^^unsigned long);
+ static_assert (make_unsigned (^^const signed long long) == ^^const unsigned long long);
+ static_assert (make_unsigned (^^volatile long long unsigned) == ^^volatile unsigned long long);
+ #if __SIZEOF_SHORT__ > 1 && __SIZEOF_SHORT__ < __SIZEOF_INT__ \
+     && __SIZEOF_INT__ < __SIZEOF_LONG_LONG__
+ static_assert (make_unsigned (^^const E1) == ^^const unsigned int);
+ static_assert (make_unsigned (^^volatile E2) == ^^volatile unsigned char);
+ static_assert (make_unsigned (^^E3) == ^^unsigned short);
+ #if __SIZEOF_LONG__ < __SIZEOF_LONG_LONG__
+ static_assert (make_unsigned (^^const volatile E4) == ^^const volatile unsigned long long);
+ #else
+ static_assert (make_unsigned (^^const volatile E4) == ^^const volatile long unsigned);
+ #endif
+ static_assert (make_unsigned (^^volatile char8_t) == ^^volatile unsigned char);
+ static_assert (sizeof (char16_t) != sizeof (short) || make_unsigned (^^char16_t) == ^^unsigned short);
+ static_assert (sizeof (char32_t) != sizeof (int) || make_unsigned (^^const volatile char32_t) == ^^const volatile unsigned);
+ static_assert (sizeof (wchar_t) != sizeof (short) || make_unsigned (^^wchar_t) == ^^unsigned short);
+ static_assert (sizeof (wchar_t) != sizeof (int) || make_unsigned (^^wchar_t) == ^^unsigned int);
+ #endif
+ using T4 = unsigned;
+ static_assert (make_unsigned (^^T4) == ^^unsigned);
+ 
+ static_assert (remove_extent (^^int) == ^^int);
+ static_assert (remove_extent (^^int[2]) == ^^int);
+ static_assert (remove_extent (^^int[2][3]) == ^^int[3]);
+ static_assert (remove_extent (^^int[][3]) == ^^int[3]);
+ static_assert (remove_extent (^^const int[2]) == ^^const int);
+ static_assert (remove_extent (^^C) == ^^C);
+ static_assert (remove_extent (^^C[2]) == ^^C);
+ static_assert (remove_extent (^^C[2][3]) == ^^C[3]);
+ static_assert (remove_extent (^^C[][3]) == ^^C[3]);
+ static_assert (remove_extent (^^const C[2]) == ^^const C);
+ static_assert (remove_extent (^^T1) == ^^int);
+ 
+ static_assert (remove_all_extents (^^int) == ^^int);
+ static_assert (remove_all_extents (^^int[2]) == ^^int);
+ static_assert (remove_all_extents (^^int[2][3]) == ^^int);
+ static_assert (remove_all_extents (^^int[][3]) == ^^int);
+ static_assert (remove_all_extents (^^const int[2][3]) == ^^const int);
+ static_assert (remove_all_extents (^^C) == ^^C);
+ static_assert (remove_all_extents (^^C[2]) == ^^C);
+ static_assert (remove_all_extents (^^C[2][3]) == ^^C);
+ static_assert (remove_all_extents (^^C[][3]) == ^^C);
+ static_assert (remove_all_extents (^^const C[2][3]) == ^^const C);
+ static_assert (remove_all_extents (^^T1) == ^^int);
+ 
+ static_assert (remove_pointer (^^int *) == ^^int);
+ static_assert (remove_pointer (^^int) == ^^int);
+ static_assert (remove_pointer (^^const int *) == ^^const int);
+ static_assert (remove_pointer (^^int **) == ^^int *);
+ static_assert (remove_pointer (^^C *) == ^^C);
+ static_assert (remove_pointer (^^C) == ^^C);
+ static_assert (remove_pointer (^^T1) == ^^int);
+ 
+ static_assert (add_pointer (^^int) == ^^int *);
+ static_assert (add_pointer (^^int *) == ^^int **);
+ static_assert (add_pointer (^^const int) == ^^const int *);
+ static_assert (add_pointer (^^int &) == ^^int *);
+ static_assert (add_pointer (^^C *) == ^^C **);
+ static_assert (add_pointer (^^C) == ^^C *);
+ static_assert (add_pointer (^^void) == ^^void *);
+ static_assert (add_pointer (^^const void) == ^^const void *);
+ static_assert (add_pointer (^^volatile void) == ^^volatile void *);
+ static_assert (add_pointer (^^const volatile void) == ^^const volatile void *);
+ 
+ consteval
+ {
+   try
+     {
+       make_signed (^^bool);
+       throw 1;
+     }
+   catch (std::meta::exception &)
+     {
+     }
+   try
+     {
+       make_unsigned (^^bool);
+       throw 1;
+     }
+   catch (std::meta::exception &)
+     {
+     }
+   try
+     {
+       make_signed (^^float);
+       throw 1;
+     }
+   catch (std::meta::exception &)
+     {
+     }
+   try
+     {
+       make_unsigned (^^double);
+       throw 1;
+     }
+   catch (std::meta::exception &)
+     {
+     }
+   try
+     {
+       make_signed (^^C);
+       throw 1;
+     }
+   catch (std::meta::exception &)
+     {
+     }
+   try
+     {
+       make_unsigned (^^C);
+       throw 1;
+     }
+   catch (std::meta::exception &)
+     {
+     }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait4.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait4.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait4.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait4.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile { target { c++26 && int128 } } }
+ // { dg-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], sign modifications.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ static_assert (make_signed (^^const signed __int128) == ^^const __int128);
+ static_assert (make_signed (^^volatile __int128 unsigned) == ^^volatile __int128);
+ 
+ static_assert (make_unsigned (^^const volatile signed __int128) == ^^const volatile unsigned __int128);
+ static_assert (make_unsigned (^^__int128 unsigned) == ^^unsigned __int128);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait5.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait5.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait5.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait5.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,453 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], type properties.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ struct C { };
+ 
+ struct HasTemplateCCtor
+ {
+   HasTemplateCCtor (const HasTemplateCCtor &) = default;
+   template <class T>
+   HasTemplateCCtor (T &&);
+ };
+                 
+ struct MoveOnly
+ {
+   MoveOnly (MoveOnly &&) = default;
+ };
+   
+ struct MoveOnly2
+ {
+   MoveOnly2 (MoveOnly2 &&) = delete;
+ };
+ 
+ class EmptyClassOne
+ { typedef int type; };
+ 
+ class EmptyClassTwo
+ { static int data; };
+ 
+ class EmptyClassThree
+ { int f(); };
+ 
+ class NonEmptyClassOne
+ { int data; };
+ 
+ class NonEmptyClassTwo
+ {
+   virtual int f();
+   virtual ~NonEmptyClassTwo();
+ };
+ 
+ class ClassType { };
+ typedef const ClassType cClassType;
+ typedef volatile ClassType vClassType;
+ typedef const volatile ClassType cvClassType;
+ 
+ class DerivedType : public ClassType { };
+ 
+ class FinalType final : public DerivedType { };
+ 
+ enum EnumType { e0 };
+ 
+ struct ConvType
+ { operator int () const; };
+ 
+ class AbstractClass
+ {
+   virtual void rotate (int) = 0;
+ };
+ 
+ class PolymorphicClass
+ {
+   virtual void rotate (int);
+ };
+ 
+ class DerivedPolymorphic : public PolymorphicClass { };
+ 
+ class VirtualDestructorClass
+ {
+   virtual ~VirtualDestructorClass();
+ };
+ 
+ union UnionType { };
+ 
+ union IncompleteUnion;
+ 
+ class IncompleteClass;
+ 
+ struct ExplicitClass
+ {
+   ExplicitClass (double &);
+   explicit ExplicitClass (int &);
+   ExplicitClass (double &, int &, double &);
+ };
+ 
+ struct NoexceptMoveAssignClass
+ {
+   NoexceptMoveAssignClass (NoexceptMoveAssignClass &&) = default;
+   NoexceptMoveAssignClass &operator= (NoexceptMoveAssignClass &&) noexcept (true);
+ };
+ 
+ struct NType
+ {
+   int i;
+   int j;
+   virtual ~NType ();
+ };
+ 
+ struct TType
+ {
+   int i;
+ private:
+   int j;
+ };
+ 
+ struct SLType
+ {
+   int i;
+   int j;
+   ~SLType ();
+ };
+ 
+ struct PODType
+ {
+   int i;
+   int j;
+ };
+ 
+ struct CopyConsOnlyType
+ {
+   CopyConsOnlyType (int) { }
+   CopyConsOnlyType (CopyConsOnlyType &&) = delete;
+   CopyConsOnlyType (const CopyConsOnlyType &) = default;
+   CopyConsOnlyType &operator= (const CopyConsOnlyType &) = delete;
+   CopyConsOnlyType &operator= (CopyConsOnlyType &&) = delete;
+ };
+ 
+ struct MoveConsOnlyType
+ {
+   MoveConsOnlyType (int) { }
+   MoveConsOnlyType (const MoveConsOnlyType &) = delete;
+   MoveConsOnlyType (MoveConsOnlyType &&) = default;
+   MoveConsOnlyType& operator= (const MoveConsOnlyType &) = delete;
+   MoveConsOnlyType& operator= (MoveConsOnlyType &&) = delete;
+ };
+ 
+ struct Incomplete_struct;
+ 
+ namespace construct
+ {
+   struct Empty {};
+ 
+   struct B { int i; B () {} };
+ 
+   union U { int i; Empty b; };
+ 
+   struct Abstract
+   {
+     virtual ~Abstract () = 0;
+   };
+ 
+   struct Any
+   {
+     template <class T>
+     Any (T &&) {}
+   };
+ 
+   struct DelDef
+   {
+     DelDef () = delete;
+   };
+ 
+   struct DelCopy
+   {
+     DelCopy (const DelCopy &) = delete;
+   };
+ 
+   struct DelDtor
+   {
+     DelDtor () = default;
+     DelDtor (const DelDtor &) = default;
+     DelDtor (DelDtor &&) = default;
+     DelDtor (int);
+     DelDtor (int, B, U);
+     ~DelDtor () = delete;
+   };
+ 
+   struct Ellipsis
+   {
+     Ellipsis (...) {}
+   };
+ 
+   struct DelEllipsis
+   {
+     DelEllipsis (...) = delete;
+   };
+ 
+   struct Nontrivial
+   {
+     Nontrivial ();
+     Nontrivial (const Nontrivial &);
+     Nontrivial &operator= (const Nontrivial &);
+     ~Nontrivial ();
+   };
+ 
+   struct UnusualCopy
+   {
+     UnusualCopy (UnusualCopy &);
+   };
+ }
+ 
+ namespace N
+ {
+   void foo ();
+ }
+ 
+ int v = 1;
+ struct S1 { decltype (^^long) a; };
+ union U2 { int a; decltype (^^N::foo) b; };
+ struct S3 { const decltype (^^N) *c; };
+ struct S4 : public S3 {};
+ struct S5 { int a; long *b; };
+ 
+ static_assert (is_const_type (^^const int));
+ static_assert (is_const_type (^^const volatile int));
+ static_assert (is_const_type (^^cClassType));
+ static_assert (is_const_type (^^cvClassType));
+ static_assert (!is_const_type (^^int));
+ static_assert (!is_const_type (^^volatile int));
+ static_assert (!is_const_type (^^ClassType));
+ static_assert (!is_const_type (^^vClassType));
+ 
+ static_assert (is_volatile_type (^^volatile int));
+ static_assert (is_volatile_type (^^const volatile int));
+ static_assert (is_volatile_type (^^vClassType));
+ static_assert (is_volatile_type (^^cvClassType));
+ static_assert (!is_volatile_type (^^int));
+ static_assert (!is_volatile_type (^^const int));
+ static_assert (!is_volatile_type (^^ClassType));
+ static_assert (!is_volatile_type (^^cClassType));
+ 
+ static_assert (is_trivially_copyable_type (^^int));
+ static_assert (is_trivially_copyable_type (^^volatile int));
+ static_assert (is_trivially_copyable_type (^^TType));
+ static_assert (is_trivially_copyable_type (^^PODType));
+ static_assert (!is_trivially_copyable_type (^^NType));
+ static_assert (!is_trivially_copyable_type (^^SLType));
+ static_assert (is_trivially_copyable_type (^^construct::DelDef));
+ static_assert (!is_trivially_copyable_type (^^construct::Abstract));
+ static_assert (is_trivially_copyable_type (^^construct::Ellipsis));
+ static_assert (is_trivially_copyable_type (^^construct::DelEllipsis));
+ static_assert (is_trivially_copyable_type (^^construct::Any));
+ static_assert (is_trivially_copyable_type (^^construct::DelCopy));
+ static_assert (is_trivially_copyable_type (^^construct::DelDtor));
+ static_assert (!is_trivially_copyable_type (^^construct::Nontrivial));
+ static_assert (!is_trivially_copyable_type (^^construct::UnusualCopy));
+ static_assert (is_trivially_copyable_type (^^CopyConsOnlyType));
+ static_assert (is_trivially_copyable_type (^^MoveConsOnlyType));
+ static_assert (is_trivially_copyable_type (^^HasTemplateCCtor));
+ static_assert (is_trivially_copyable_type (^^MoveOnly));
+ static_assert (is_trivially_copyable_type (^^MoveOnly2));
+ static_assert (is_trivially_copyable_type (^^volatile int));
+ static_assert (is_trivially_copyable_type (^^TType));
+ static_assert (is_trivially_copyable_type (^^PODType));
+ static_assert (!is_trivially_copyable_type (^^NType));
+ static_assert (!is_trivially_copyable_type (^^SLType));
+ static_assert (is_trivially_copyable_type (^^construct::DelDef));
+ static_assert (!is_trivially_copyable_type (^^construct::Abstract));
+ static_assert (is_trivially_copyable_type (^^construct::Ellipsis));
+ static_assert (is_trivially_copyable_type (^^construct::DelEllipsis));
+ static_assert (is_trivially_copyable_type (^^construct::Any));
+ static_assert (is_trivially_copyable_type (^^construct::DelCopy));
+ static_assert (is_trivially_copyable_type (^^construct::DelDtor));
+ static_assert (!is_trivially_copyable_type (^^construct::Nontrivial));
+ static_assert (!is_trivially_copyable_type (^^construct::UnusualCopy));
+ static_assert (is_trivially_copyable_type (^^CopyConsOnlyType));
+ static_assert (is_trivially_copyable_type (^^MoveConsOnlyType));
+ static_assert (is_trivially_copyable_type (^^HasTemplateCCtor));
+ static_assert (is_trivially_copyable_type (^^MoveOnly));
+ static_assert (is_trivially_copyable_type (^^MoveOnly2));
+ 
+ static_assert (is_standard_layout_type (^^SLType));
+ static_assert (is_standard_layout_type (^^PODType));
+ static_assert (!is_standard_layout_type (^^NType));
+ static_assert (!is_standard_layout_type (^^TType));
+ 
+ static_assert (is_empty_type (^^ClassType));
+ static_assert (is_empty_type (^^EmptyClassOne));
+ static_assert (is_empty_type (^^EmptyClassTwo));
+ static_assert (is_empty_type (^^EmptyClassThree));
+ static_assert (!is_empty_type (^^void));
+ static_assert (!is_empty_type (^^float));
+ static_assert (!is_empty_type (^^int[4]));
+ static_assert (!is_empty_type (^^int *));
+ static_assert (!is_empty_type (^^int &));
+ static_assert (!is_empty_type (^^int (ClassType::*)));
+ static_assert (!is_empty_type (^^EnumType));
+ static_assert (!is_empty_type (^^int (int)));
+ static_assert (!is_empty_type (^^AbstractClass));
+ static_assert (!is_empty_type (^^NonEmptyClassOne));
+ static_assert (!is_empty_type (^^NonEmptyClassTwo));
+ 
+ static_assert (is_polymorphic_type (^^PolymorphicClass));
+ static_assert (is_polymorphic_type (^^DerivedPolymorphic));
+ static_assert (is_polymorphic_type (^^AbstractClass));
+ static_assert (is_polymorphic_type (^^VirtualDestructorClass));
+ static_assert (!is_polymorphic_type (^^void));
+ static_assert (!is_polymorphic_type (^^int (int)));
+ static_assert (!is_polymorphic_type (^^int &));
+ static_assert (!is_polymorphic_type (^^EnumType));
+ static_assert (!is_polymorphic_type (^^ClassType));
+ static_assert (!is_polymorphic_type (^^DerivedType));
+ 
+ static_assert (is_abstract_type (^^AbstractClass));
+ static_assert (!is_abstract_type (^^void));
+ static_assert (!is_abstract_type (^^int (int)));
+ static_assert (!is_abstract_type (^^int &));
+ static_assert (!is_abstract_type (^^ClassType));
+ 
+ static_assert (is_final_type (^^FinalType));
+ static_assert (!is_final_type (^^ClassType));
+ static_assert (!is_final_type (^^DerivedType));
+ 
+ static_assert (is_aggregate_type (^^ClassType));
+ static_assert (is_aggregate_type (^^UnionType));
+ static_assert (is_aggregate_type (^^SLType));
+ static_assert (is_aggregate_type (^^unsigned[3]));
+ static_assert (is_aggregate_type (^^unsigned[3][2]));
+ static_assert (is_aggregate_type (^^unsigned[]));
+ static_assert (is_aggregate_type (^^unsigned[][2]));
+ static_assert (is_aggregate_type (^^EnumType[3]));
+ static_assert (is_aggregate_type (^^EnumType[3][2]));
+ static_assert (is_aggregate_type (^^EnumType[]));
+ static_assert (is_aggregate_type (^^EnumType[][2]));
+ static_assert (!is_aggregate_type (^^AbstractClass));
+ static_assert (!is_aggregate_type (^^PolymorphicClass));
+ static_assert (!is_aggregate_type (^^ExplicitClass));
+ static_assert (!is_aggregate_type (^^char));
+ static_assert (!is_aggregate_type (^^unsigned char));
+ static_assert (!is_aggregate_type (^^signed char));
+ static_assert (!is_aggregate_type (^^unsigned));
+ static_assert (!is_aggregate_type (^^bool));
+ static_assert (!is_aggregate_type (^^float));
+ static_assert (!is_aggregate_type (^^double));
+ static_assert (!is_aggregate_type (^^EnumType));
+ static_assert (!is_aggregate_type (^^void));
+ static_assert (!is_aggregate_type (^^NoexceptMoveAssignClass));
+ 
+ static_assert (is_consteval_only_type (^^decltype (^^long)));
+ static_assert (is_consteval_only_type (^^const decltype (^^N::foo)));
+ static_assert (is_consteval_only_type (^^volatile decltype (^^N)));
+ static_assert (is_consteval_only_type (^^const volatile decltype (^^v)));
+ static_assert (is_consteval_only_type (^^const S1));
+ static_assert (is_consteval_only_type (^^U2));
+ static_assert (is_consteval_only_type (^^S3));
+ static_assert (is_consteval_only_type (^^S4));
+ static_assert (!is_consteval_only_type (^^int));
+ static_assert (!is_consteval_only_type (^^S5));
+ 
+ static_assert (!is_signed_type (^^void));
+ static_assert (char (-1) < char (0) ? is_signed_type (^^char) : !is_signed_type (^^char));
+ static_assert (is_signed_type (^^signed char));
+ static_assert (!is_signed_type (^^unsigned char));
+ static_assert (wchar_t (-1) < wchar_t (0) ? is_signed_type (^^wchar_t) : !is_signed_type (^^wchar_t));
+ static_assert (is_signed_type (^^short));
+ static_assert (!is_signed_type (^^unsigned short));
+ static_assert (is_signed_type (^^int));
+ static_assert (!is_signed_type (^^unsigned int));
+ static_assert (is_signed_type (^^long));
+ static_assert (!is_signed_type (^^unsigned long));
+ static_assert (is_signed_type (^^long long));
+ static_assert (!is_signed_type (^^unsigned long long));
+ static_assert (is_signed_type (^^float));
+ static_assert (is_signed_type (^^double));
+ static_assert (is_signed_type (^^long double));
+ static_assert (!is_signed_type (^^ClassType));
+ 
+ static_assert (!is_unsigned_type (^^void));
+ static_assert (char (-1) < char (0) ? !is_unsigned_type (^^char) : is_unsigned_type (^^char));
+ static_assert (!is_unsigned_type (^^signed char));
+ static_assert (is_unsigned_type (^^unsigned char));
+ static_assert (wchar_t (-1) < wchar_t (0) ? !is_unsigned_type (^^wchar_t) : is_unsigned_type (^^wchar_t));
+ static_assert (!is_unsigned_type (^^short));
+ static_assert (is_unsigned_type (^^unsigned short));
+ static_assert (!is_unsigned_type (^^int));
+ static_assert (is_unsigned_type (^^unsigned int));
+ static_assert (!is_unsigned_type (^^long));
+ static_assert (is_unsigned_type (^^unsigned long));
+ static_assert (!is_unsigned_type (^^long long));
+ static_assert (is_unsigned_type (^^unsigned long long));
+ static_assert (!is_unsigned_type (^^float));
+ static_assert (!is_unsigned_type (^^double));
+ static_assert (!is_unsigned_type (^^long double));
+ static_assert (!is_unsigned_type (^^ClassType));
+ 
+ static_assert (is_bounded_array_type (^^int[2]));
+ static_assert (!is_bounded_array_type (^^int[]));
+ static_assert (is_bounded_array_type (^^int[2][3]));
+ static_assert (!is_bounded_array_type (^^int[][3]));
+ static_assert (is_bounded_array_type (^^float *[2]));
+ static_assert (!is_bounded_array_type (^^float *[]));
+ static_assert (is_bounded_array_type (^^float *[2][3]));
+ static_assert (!is_bounded_array_type (^^float *[][3]));
+ static_assert (is_bounded_array_type (^^ClassType[2]));
+ static_assert (!is_bounded_array_type (^^ClassType[]));
+ static_assert (is_bounded_array_type (^^ClassType[2][3]));
+ static_assert (!is_bounded_array_type (^^ClassType[][3]));
+ static_assert (!is_bounded_array_type (^^int (*)[2]));
+ static_assert (!is_bounded_array_type (^^int (*)[]));
+ static_assert (!is_bounded_array_type (^^int (&)[2]));
+ static_assert (!is_bounded_array_type (^^int (&)[]));
+ static_assert (!is_bounded_array_type (^^ClassType));
+ static_assert (!is_bounded_array_type (^^void ()));
+ 
+ static_assert (!is_unbounded_array_type (^^int[2]));
+ static_assert (is_unbounded_array_type (^^int[]));
+ static_assert (!is_unbounded_array_type (^^int[2][3]));
+ static_assert (is_unbounded_array_type (^^int[][3]));
+ static_assert (!is_unbounded_array_type (^^float *[2]));
+ static_assert (is_unbounded_array_type (^^float *[]));
+ static_assert (!is_unbounded_array_type (^^float *[2][3]));
+ static_assert (is_unbounded_array_type (^^float *[][3]));
+ static_assert (!is_unbounded_array_type (^^ClassType[2]));
+ static_assert (is_unbounded_array_type (^^ClassType[]));
+ static_assert (!is_unbounded_array_type (^^ClassType[2][3]));
+ static_assert (is_unbounded_array_type (^^ClassType[][3]));
+ static_assert (!is_unbounded_array_type (^^IncompleteClass[2][3]));
+ static_assert (is_unbounded_array_type (^^IncompleteClass[][3]));
+ static_assert (!is_unbounded_array_type (^^int (*)[2]));
+ static_assert (!is_unbounded_array_type (^^int (*)[]));
+ static_assert (!is_unbounded_array_type (^^int (&)[2]));
+ static_assert (!is_unbounded_array_type (^^int (&)[]));
+ static_assert (!is_unbounded_array_type (^^ClassType));
+ static_assert (!is_unbounded_array_type (^^IncompleteClass));
+ static_assert (!is_unbounded_array_type (^^IncompleteUnion));
+ 
+ enum class E { e1, e2 };
+ static_assert (is_scoped_enum_type (^^E));
+ enum class Ec : char { e1, e2 };
+ static_assert (is_scoped_enum_type (^^Ec));
+ enum U { u1, u2 };
+ static_assert (!is_scoped_enum_type (^^U));
+ enum F : int { f1, f2 };
+ static_assert (!is_scoped_enum_type (^^F));
+ static_assert (!is_scoped_enum_type (^^Incomplete_struct));
+ struct S;
+ static_assert (!is_scoped_enum_type (^^S));
+ struct S { };
+ static_assert (!is_scoped_enum_type (^^S));
+ static_assert (!is_scoped_enum_type (^^int));
+ static_assert (!is_scoped_enum_type (^^int[]));
+ static_assert (!is_scoped_enum_type (^^int[2]));
+ static_assert (!is_scoped_enum_type (^^int[][2]));
+ static_assert (!is_scoped_enum_type (^^int[2][3]));
+ static_assert (!is_scoped_enum_type (^^int *));
+ static_assert (!is_scoped_enum_type (^^int &));
+ static_assert (!is_scoped_enum_type (^^int *&));
+ static_assert (!is_scoped_enum_type (^^int ()));
+ static_assert (!is_scoped_enum_type (^^int (*) ()));
+ static_assert (!is_scoped_enum_type (^^int (&) ()));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait6.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait6.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait6.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait6.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,1381 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], type properties.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ class ClassType { };
+ class DerivedType : public ClassType { };
+ enum EnumType { e0 };
+ struct ThrowDefaultClass { ThrowDefaultClass () noexcept (false); };
+ struct ThrowCopyConsClass { ThrowCopyConsClass (const ThrowCopyConsClass &) noexcept (false); };
+ struct ThrowMoveConsClass { ThrowMoveConsClass (ThrowMoveConsClass &&) noexcept (false); };
+ struct NoexceptDefaultClass { NoexceptDefaultClass () noexcept (true); };
+ struct ExceptDefaultClass { ExceptDefaultClass () noexcept (false); };
+ struct NoexceptCopyConsClass { NoexceptCopyConsClass (const NoexceptCopyConsClass &) noexcept (true); };
+ struct ExceptCopyConsClass { ExceptCopyConsClass (const ExceptCopyConsClass &) noexcept (false); };
+ struct NoexceptMoveConsClass { NoexceptMoveConsClass (NoexceptMoveConsClass &&) noexcept (true); NoexceptMoveConsClass &operator= (NoexceptMoveConsClass &&) = default; };
+ struct ExceptMoveConsClass { ExceptMoveConsClass (ExceptMoveConsClass &&) noexcept (false); };
+ struct NoexceptCopyAssignClass { NoexceptCopyAssignClass &operator= (const NoexceptCopyAssignClass &) noexcept (true); };
+ struct ExceptCopyAssignClass { ExceptCopyAssignClass &operator= (const ExceptCopyAssignClass &) noexcept (false); };
+ struct NoexceptMoveAssignClass { NoexceptMoveAssignClass (NoexceptMoveAssignClass &&) = default; NoexceptMoveAssignClass &operator= (NoexceptMoveAssignClass &&) noexcept (true); };
+ struct ExceptMoveAssignClass { ExceptMoveAssignClass &operator= (ExceptMoveAssignClass &&) noexcept (false); };
+ struct DeletedCopyAssignClass { DeletedCopyAssignClass & operator= (const DeletedCopyAssignClass &) = delete; };
+ struct DeletedMoveAssignClass { DeletedMoveAssignClass &operator= (DeletedMoveAssignClass &&) = delete; };
+ struct NType { int i; int j; virtual ~NType (); };
+ struct TType { int i; private: int j; };
+ struct SLType { int i; int j; ~SLType (); };
+ struct PODType { int i; int j; };
+ 
+ namespace N1
+ {
+   struct Empty {};
+   struct B { int i; B () {} };
+   struct D : B {};
+   enum E { ee1 };
+   enum E2 { ee2 };
+   enum class SE { e1 };
+   enum class SE2 { e2 };
+   enum OpE : int;
+   enum class OpSE : bool;
+   union U { int i; Empty b; };
+   struct Abstract { virtual ~Abstract () = 0; };
+   struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };
+   struct Ukn;
+   template <class To>
+   struct ImplicitTo { operator To (); };
+   template <class To>
+   struct DelImplicitTo { operator To () = delete; };
+   template <class To>
+   struct ExplicitTo { explicit operator To (); };
+   struct Ellipsis { Ellipsis (...) {} };
+   struct DelEllipsis { DelEllipsis (...) = delete; };
+   struct Any { template <class T> Any (T &&) {} };
+   struct nAny { template <class... T> nAny (T &&...) {} };
+   struct DelnAny { template <class... T> DelnAny (T &&...) = delete; };
+   template <class... Args>
+   struct FromArgs { FromArgs (Args...); };
+   struct DelDef { DelDef () = delete; };
+   struct DelCopy { DelCopy (const DelCopy &) = delete; };
+   struct DelDtor {
+     DelDtor () = default;
+     DelDtor (const DelDtor &) = default;
+     DelDtor (DelDtor &&) = default;
+     DelDtor (int);
+     DelDtor (int, B, U);
+     ~DelDtor () = delete;
+   };
+   struct Nontrivial {
+     Nontrivial ();
+     Nontrivial (const Nontrivial &);
+     Nontrivial &operator= (const Nontrivial &);
+     ~Nontrivial ();
+   };
+   union NontrivialUnion { int i; Nontrivial n; };
+   struct UnusualCopy { UnusualCopy (UnusualCopy &); };
+ }
+ 
+ namespace N2
+ {
+   struct E {};
+   struct NTD1 { ~NTD1 () = default; };
+   struct NTD2 { ~NTD2 (); };
+   struct NTD3 { ~NTD3 () noexcept (true); };
+   struct TD1 { ~TD1 () noexcept (false); };
+   struct TD2 { ~TD2 () noexcept (false); };
+   struct Aggr { int i; bool b; E e; };
+   struct Aggr2 { int i; bool b; TD1 r; };
+   struct Del { ~Del () = delete; };
+   struct Del2 { ~Del2 () noexcept = delete; };
+   struct Del3 { ~Del3 () noexcept (false) = delete; };
+   struct Der : Aggr {};
+   struct Der2 : Aggr2 {};
+   union U1 { int i; double d; void *p; TD1 *pt; };
+   union Ut { int i; double d; void *p; TD1 pt; };
+   enum class En { a, b, c, d };
+   enum En2 { En2a, En2b, En2c, En2d };
+   enum OpE : int;
+   enum class OpSE : bool;
+   struct Abstract1 { virtual ~Abstract1 () = 0; };
+   struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };
+   struct Abstract2 { virtual ~Abstract2 () noexcept (false) = 0; };
+   struct Abstract3 { ~Abstract3 () noexcept (false); virtual void foo () noexcept = 0; };
+   struct Nontrivial {
+     Nontrivial ();
+     Nontrivial (const Nontrivial &);
+     Nontrivial &operator= (const Nontrivial &);
+     ~Nontrivial ();
+   };
+   union NontrivialUnion { int i; Nontrivial n; };
+   struct UnusualCopy { UnusualCopy (UnusualCopy &); };
+   struct Ellipsis { Ellipsis (...) {} };
+   struct DelEllipsis { DelEllipsis (...) = delete; };
+   struct DelDef { DelDef () = delete; };
+   struct DelCopy { DelCopy (const DelCopy &) = delete; };
+ }
+ 
+ namespace N3
+ {
+   struct Empty {};
+   struct B { int i; B (){} };
+   struct D : B {};
+   enum E { ee1 };
+   enum E2 { ee2 };
+   enum class SE { e1 };
+   enum class SE2 { e2 };
+   enum OpE : int;
+   enum class OpSE : bool;
+   union U { int i; Empty b; };
+   union UAssignAll { bool b; char c; template <class T> void operator= (T &&); };
+   union UDelAssignAll { bool b; char c; template <class T> void operator= (T &&) = delete; };
+   struct Abstract { virtual ~Abstract () = 0; };
+   struct AbstractDelDtor { ~AbstractDelDtor () = delete; virtual void foo () = 0; };
+   struct Ukn;
+   template <class To>
+   struct ImplicitTo { operator To (); };
+   template <class To>
+   struct ExplicitTo { explicit operator To (); };
+   template <class To>
+   struct DelImplicitTo { operator To () = delete; };
+   template<class To> struct DelExplicitTo { explicit operator To () = delete; };
+   struct Ellipsis { Ellipsis (...) {} };
+   struct DelEllipsis { DelEllipsis (...) = delete; };
+   struct Any { template <class T> Any (T &&) {} };
+   struct nAny { template <class... T> nAny (T &&...) {} };
+   struct DelnAny { template <class... T> DelnAny (T &&...) = delete; };
+   template<class... Args>
+   struct FromArgs { FromArgs (Args...); };
+   template<class... Args>
+   struct DelFromArgs { DelFromArgs (Args...) = delete; };
+   struct DelDef { DelDef () = delete; };
+   struct DelCopy { DelCopy (const DelCopy &) = delete; };
+   struct DelDtor {
+     DelDtor () = default;
+     DelDtor (const DelDtor &) = default;
+     DelDtor (DelDtor &&) = default;
+     DelDtor (int);
+     DelDtor (int, B, U);
+     ~DelDtor () = delete;
+   };
+   struct Nontrivial {
+     Nontrivial ();
+     Nontrivial (const Nontrivial &);
+     Nontrivial &operator= (const Nontrivial &);
+     ~Nontrivial ();
+   };
+   union NontrivialUnion { int i; Nontrivial n; };
+   struct UnusualCopy { UnusualCopy (UnusualCopy &); };
+   struct AnyAssign { template <class T> void operator= (T &&); };
+   struct DelAnyAssign { template <class T> void operator= (T &&) = delete; };
+   struct DelCopyAssign {
+     DelCopyAssign &operator= (const DelCopyAssign &) = delete;
+     DelCopyAssign &operator= (DelCopyAssign &&) = default;
+   };
+   struct MO { MO (MO &&) = default; MO &operator= (MO &&) = default; };
+ }
+ 
+ struct CopyConsOnlyType {
+   CopyConsOnlyType (int) { }
+   CopyConsOnlyType (CopyConsOnlyType &&) = delete;
+   CopyConsOnlyType (const CopyConsOnlyType &) = default;
+   CopyConsOnlyType &operator= (const CopyConsOnlyType &) = delete;
+   CopyConsOnlyType &operator= (CopyConsOnlyType &&) = delete;
+ };
+ 
+ struct MoveConsOnlyType {
+   MoveConsOnlyType (int) { }
+   MoveConsOnlyType (const MoveConsOnlyType &) = delete;
+   MoveConsOnlyType (MoveConsOnlyType &&) = default;
+   MoveConsOnlyType &operator= (const MoveConsOnlyType &) = delete;
+   MoveConsOnlyType &operator= (MoveConsOnlyType &&) = delete;
+ };
+ 
+ struct HasTemplateCtor { HasTemplateCtor () = default; template <class T> HasTemplateCtor (); };
+ struct HasTemplateCCtor {
+   HasTemplateCCtor (const HasTemplateCCtor &) = default;
+   template <class T>
+   HasTemplateCCtor (T &&);
+ };
+ struct MoveOnly { MoveOnly (MoveOnly &&) = default; };
+ struct MoveOnly2 { MoveOnly2 (MoveOnly2 &&) = delete; };
+ struct HasTemplateCAssign
+ {
+   HasTemplateCAssign &operator= (const HasTemplateCAssign &) = default;
+   template <class T>
+   HasTemplateCAssign &operator= (T &&);
+ };
+ struct MoveOnly3 { MoveOnly3 &operator= (MoveOnly3 &&) = default; };
+ struct MoveOnly4 { MoveOnly4 &operator= (MoveOnly4 &&) = delete; };
+ 
+ static_assert (is_default_constructible_type (^^int));
+ static_assert (is_default_constructible_type (^^int const));
+ static_assert (is_default_constructible_type (^^int const volatile));
+ static_assert (is_default_constructible_type (^^int *));
+ static_assert (is_default_constructible_type (^^void *));
+ static_assert (is_default_constructible_type (^^void *const));
+ static_assert (is_default_constructible_type (^^int N1::B::*));
+ static_assert (is_default_constructible_type (^^void (*) ()));
+ static_assert (is_default_constructible_type (^^std::nullptr_t));
+ static_assert (is_default_constructible_type (^^std::nullptr_t const));
+ static_assert (is_default_constructible_type (^^N1::Empty));
+ static_assert (is_default_constructible_type (^^N1::Empty const));
+ static_assert (is_default_constructible_type (^^N1::FromArgs <>));
+ static_assert (is_default_constructible_type (^^N1::FromArgs <> const));
+ static_assert (is_default_constructible_type (^^N1::nAny));
+ static_assert (is_default_constructible_type (^^N1::nAny const));
+ static_assert (is_default_constructible_type (^^N1::Ellipsis));
+ static_assert (is_default_constructible_type (^^N1::Ellipsis const));
+ static_assert (is_default_constructible_type (^^N1::U));
+ static_assert (is_default_constructible_type (^^N1::U const));
+ static_assert (is_default_constructible_type (^^N1::E));
+ static_assert (is_default_constructible_type (^^N1::E const));
+ static_assert (is_default_constructible_type (^^N1::SE));
+ static_assert (is_default_constructible_type (^^N1::SE const));
+ static_assert (is_default_constructible_type (^^N1::OpE));
+ static_assert (is_default_constructible_type (^^N1::OpE const));
+ static_assert (is_default_constructible_type (^^N1::OpSE));
+ static_assert (is_default_constructible_type (^^N1::OpSE const));
+ static_assert (is_default_constructible_type (^^int [1]));
+ static_assert (is_default_constructible_type (^^const int [1]));
+ static_assert (is_default_constructible_type (^^int [1][2]));
+ static_assert (is_default_constructible_type (^^const int [1][2]));
+ static_assert (is_default_constructible_type (^^N1::FromArgs <> [1]));
+ static_assert (is_default_constructible_type (^^const N1::FromArgs <> [1]));
+ static_assert (is_default_constructible_type (^^N1::U [1]));
+ static_assert (is_default_constructible_type (^^const N1::U [1]));
+ static_assert (is_default_constructible_type (^^N1::Empty [1]));
+ static_assert (is_default_constructible_type (^^const N1::Empty [1]));
+ static_assert (is_default_constructible_type (^^N1::Ellipsis [1]));
+ static_assert (is_default_constructible_type (^^const N1::Ellipsis [1]));
+ static_assert (is_default_constructible_type (^^std::nullptr_t [1]));
+ static_assert (is_default_constructible_type (^^const std::nullptr_t [1]));
+ static_assert (is_default_constructible_type (^^N1::nAny [1]));
+ static_assert (is_default_constructible_type (^^const N1::nAny [1]));
+ static_assert (is_default_constructible_type (^^N1::E [1]));
+ static_assert (is_default_constructible_type (^^const N1::E [1]));
+ static_assert (is_default_constructible_type (^^N1::SE [1]));
+ static_assert (is_default_constructible_type (^^const N1::SE [1]));
+ static_assert (is_default_constructible_type (^^N1::OpE [1]));
+ static_assert (is_default_constructible_type (^^const N1::OpE [1]));
+ static_assert (is_default_constructible_type (^^N1::OpSE [1]));
+ static_assert (is_default_constructible_type (^^const N1::OpSE [1]));
+ static_assert (is_default_constructible_type (^^int * [1]));
+ static_assert (is_default_constructible_type (^^int * const [1]));
+ static_assert (is_default_constructible_type (^^int N1::B::* [1]));
+ static_assert (is_default_constructible_type (^^int N1::B::* const [1]));
+ static_assert (is_default_constructible_type (^^std::initializer_list <int>));
+ static_assert (is_default_constructible_type (^^const std::initializer_list <int>));
+ static_assert (is_default_constructible_type (^^std::initializer_list <int> [1]));
+ static_assert (is_default_constructible_type (^^const std::initializer_list <int> [1]));
+ static_assert (is_default_constructible_type (^^NoexceptDefaultClass));
+ static_assert (is_default_constructible_type (^^ThrowDefaultClass));
+ static_assert (is_default_constructible_type (^^ExceptDefaultClass));
+ static_assert (!is_default_constructible_type (^^void));
+ static_assert (!is_default_constructible_type (^^const void));
+ static_assert (!is_default_constructible_type (^^N1::Abstract));
+ static_assert (!is_default_constructible_type (^^const N1::Abstract));
+ static_assert (!is_default_constructible_type (^^N1::Any));
+ static_assert (!is_default_constructible_type (^^const N1::Any));
+ static_assert (!is_default_constructible_type (^^N1::FromArgs <int>));
+ static_assert (!is_default_constructible_type (^^const N1::FromArgs <int>));
+ static_assert (!is_default_constructible_type (^^int &));
+ static_assert (!is_default_constructible_type (^^int &&));
+ static_assert (!is_default_constructible_type (^^void ()));
+ static_assert (!is_default_constructible_type (^^void () const volatile));
+ static_assert (!is_default_constructible_type (^^void (&) ()));
+ static_assert (!is_default_constructible_type (^^int (&) [1]));
+ static_assert (!is_default_constructible_type (^^int (&) []));
+ static_assert (!is_default_constructible_type (^^int []));
+ static_assert (!is_default_constructible_type (^^const int []));
+ static_assert (!is_default_constructible_type (^^int [][1][2]));
+ static_assert (!is_default_constructible_type (^^const int [][1][2]));
+ static_assert (!is_default_constructible_type (^^N1::Any [1]));
+ static_assert (!is_default_constructible_type (^^const N1::Any [1]));
+ static_assert (!is_default_constructible_type (^^N1::FromArgs <int> [1]));
+ static_assert (!is_default_constructible_type (^^const N1::FromArgs <int> [1]));
+ static_assert (!is_default_constructible_type (^^N1::FromArgs <std::initializer_list <int>>));
+ static_assert (!is_default_constructible_type (^^const N1::FromArgs <std::initializer_list <int>>));
+ static_assert (!is_default_constructible_type (^^const N1::FromArgs <const std::initializer_list <int>>));
+ static_assert (!is_default_constructible_type (^^N1::DelDef));
+ static_assert (!is_default_constructible_type (^^const N1::DelDef));
+ static_assert (!is_default_constructible_type (^^N1::DelCopy));
+ static_assert (!is_default_constructible_type (^^const N1::DelCopy));
+ static_assert (!is_default_constructible_type (^^N1::DelDtor));
+ static_assert (!is_default_constructible_type (^^const N1::DelDtor));
+ static_assert (!is_default_constructible_type (^^int []));
+ static_assert (!is_default_constructible_type (^^N1::Empty []));
+ static_assert (!is_default_constructible_type (^^N1::B []));
+ static_assert (!is_default_constructible_type (^^N1::D []));
+ static_assert (!is_default_constructible_type (^^N1::U []));
+ static_assert (!is_default_constructible_type (^^N1::Ukn []));
+ static_assert (!is_default_constructible_type (^^N1::Ellipsis []));
+ static_assert (!is_default_constructible_type (^^N1::Any []));
+ static_assert (!is_default_constructible_type (^^N1::nAny []));
+ 
+ static_assert (is_copy_constructible_type (^^int));
+ static_assert (is_copy_constructible_type (^^float));
+ static_assert (is_copy_constructible_type (^^EnumType));
+ static_assert (is_copy_constructible_type (^^int *));
+ static_assert (is_copy_constructible_type (^^int (*) (int)));
+ static_assert (is_copy_constructible_type (^^int (ClassType::*)));
+ static_assert (is_copy_constructible_type (^^int (ClassType::*) (int)));
+ static_assert (is_copy_constructible_type (^^NoexceptCopyConsClass));
+ static_assert (is_copy_constructible_type (^^const NoexceptCopyConsClass));
+ static_assert (is_copy_constructible_type (^^ThrowCopyConsClass));
+ static_assert (is_copy_constructible_type (^^ExceptCopyConsClass));
+ static_assert (!is_copy_constructible_type (^^void));
+ static_assert (!is_copy_constructible_type (^^int [2]));
+ static_assert (!is_copy_constructible_type (^^int []));
+ static_assert (!is_copy_constructible_type (^^float [][3]));
+ static_assert (!is_copy_constructible_type (^^EnumType [2][3][4]));
+ static_assert (!is_copy_constructible_type (^^int * [3]));
+ static_assert (!is_copy_constructible_type (^^int (* [][2]) (int)));
+ static_assert (!is_copy_constructible_type (^^int (ClassType::* [2][3])));
+ static_assert (!is_copy_constructible_type (^^int (ClassType::* [][2][3]) (int)));
+ static_assert (!is_copy_constructible_type (^^ClassType (unsigned) const &));
+ static_assert (!is_copy_constructible_type (^^bool (ClassType) const));
+ static_assert (!is_copy_constructible_type (^^bool (...) &&));
+ static_assert (!is_copy_constructible_type (^^EnumType (int, ...)));
+ static_assert (!is_copy_constructible_type (^^volatile NoexceptCopyConsClass));
+ 
+ static_assert (is_move_constructible_type (^^int));
+ static_assert (is_move_constructible_type (^^float));
+ static_assert (is_move_constructible_type (^^EnumType));
+ static_assert (is_move_constructible_type (^^int *));
+ static_assert (is_move_constructible_type (^^int (*) (int)));
+ static_assert (is_move_constructible_type (^^int (ClassType::*)));
+ static_assert (is_move_constructible_type (^^int (ClassType::*) (int)));
+ static_assert (is_move_constructible_type (^^NoexceptMoveConsClass));
+ static_assert (is_move_constructible_type (^^ThrowMoveConsClass));
+ static_assert (is_move_constructible_type (^^ExceptMoveConsClass));
+ static_assert (!is_move_constructible_type (^^void));
+ static_assert (!is_move_constructible_type (^^int [2]));
+ static_assert (!is_move_constructible_type (^^int []));
+ static_assert (!is_move_constructible_type (^^float [][3]));
+ static_assert (!is_move_constructible_type (^^EnumType [2][3][4]));
+ static_assert (!is_move_constructible_type (^^int * [3]));
+ static_assert (!is_move_constructible_type (^^int (* [][2]) (int)));
+ static_assert (!is_move_constructible_type (^^int (ClassType::* [2][3])));
+ static_assert (!is_move_constructible_type (^^int (ClassType::* [][2][3]) (int)));
+ static_assert (!is_move_constructible_type (^^ClassType (unsigned) const &));
+ static_assert (!is_move_constructible_type (^^bool (ClassType) const));
+ static_assert (!is_move_constructible_type (^^bool (...) &&));
+ static_assert (!is_move_constructible_type (^^EnumType (int, ...)));
+ static_assert (!is_move_constructible_type (^^const NoexceptMoveConsClass));
+ static_assert (!is_move_constructible_type (^^volatile NoexceptMoveConsClass));
+ 
+ static_assert (is_assignable_type (^^int &, ^^int));
+ static_assert (is_assignable_type (^^int &, ^^const int));
+ static_assert (is_assignable_type (^^int &, ^^int &));
+ static_assert (is_assignable_type (^^int &, ^^const int &));
+ static_assert (!is_assignable_type (^^int, ^^int));
+ static_assert (!is_assignable_type (^^int, ^^const int));
+ static_assert (!is_assignable_type (^^int, ^^int &));
+ static_assert (!is_assignable_type (^^int, ^^const int &));
+ static_assert (!is_assignable_type (^^const int, ^^int));
+ static_assert (!is_assignable_type (^^const int, ^^const int));
+ static_assert (!is_assignable_type (^^const int, ^^int &));
+ static_assert (!is_assignable_type (^^const int, ^^const int &));
+ static_assert (!is_assignable_type (^^const int &, ^^int));
+ static_assert (!is_assignable_type (^^const int &, ^^const int));
+ static_assert (!is_assignable_type (^^const int &, ^^int &));
+ static_assert (!is_assignable_type (^^const int &, ^^const int &));
+ static_assert (is_assignable_type (^^N3::Empty &, ^^N3::Empty));
+ static_assert (is_assignable_type (^^N3::Empty &, ^^const N3::Empty));
+ static_assert (is_assignable_type (^^N3::Empty &, ^^N3::Empty &));
+ static_assert (is_assignable_type (^^N3::Empty &, ^^const N3::Empty &));
+ static_assert (is_assignable_type (^^N3::Empty, ^^N3::Empty));
+ static_assert (is_assignable_type (^^N3::Empty, ^^const N3::Empty));
+ static_assert (is_assignable_type (^^N3::Empty, ^^N3::Empty &));
+ static_assert (is_assignable_type (^^N3::Empty, ^^const N3::Empty &));
+ static_assert (is_assignable_type (^^N3::B &, ^^N3::B));
+ static_assert (is_assignable_type (^^N3::B &, ^^const N3::B));
+ static_assert (is_assignable_type (^^N3::B &, ^^N3::B &));
+ static_assert (is_assignable_type (^^N3::B &, ^^const N3::B &));
+ static_assert (is_assignable_type (^^N3::B, ^^N3::B));
+ static_assert (is_assignable_type (^^N3::B, ^^const N3::B));
+ static_assert (is_assignable_type (^^N3::B, ^^N3::B &));
+ static_assert (is_assignable_type (^^N3::B, ^^const N3::B &));
+ static_assert (is_assignable_type (^^bool &, ^^bool));
+ static_assert (is_assignable_type (^^bool &, ^^const bool));
+ static_assert (is_assignable_type (^^bool &, ^^bool &));
+ static_assert (is_assignable_type (^^bool &, ^^const bool &));
+ static_assert (!is_assignable_type (^^bool, ^^bool));
+ static_assert (!is_assignable_type (^^bool, ^^const bool));
+ static_assert (!is_assignable_type (^^bool, ^^bool &));
+ static_assert (!is_assignable_type (^^bool, ^^const bool &));
+ static_assert (is_assignable_type (^^std::nullptr_t &, ^^std::nullptr_t));
+ static_assert (is_assignable_type (^^std::nullptr_t &, ^^const std::nullptr_t));
+ static_assert (is_assignable_type (^^std::nullptr_t &, ^^std::nullptr_t &));
+ static_assert (is_assignable_type (^^std::nullptr_t &, ^^const std::nullptr_t &));
+ static_assert (!is_assignable_type (^^std::nullptr_t, ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^std::nullptr_t, ^^const std::nullptr_t));
+ static_assert (!is_assignable_type (^^std::nullptr_t, ^^std::nullptr_t &));
+ static_assert (!is_assignable_type (^^std::nullptr_t, ^^const std::nullptr_t &));
+ static_assert (is_assignable_type (^^N3::E &, ^^N3::E));
+ static_assert (is_assignable_type (^^N3::E &, ^^const N3::E));
+ static_assert (is_assignable_type (^^N3::E &, ^^N3::E &));
+ static_assert (is_assignable_type (^^N3::E &, ^^const N3::E &));
+ static_assert (is_assignable_type (^^int &, ^^N3::E));
+ static_assert (is_assignable_type (^^int &, ^^const N3::E));
+ static_assert (is_assignable_type (^^int &, ^^N3::E &));
+ static_assert (is_assignable_type (^^int &, ^^const N3::E &));
+ static_assert (!is_assignable_type (^^N3::E &, ^^int));
+ static_assert (!is_assignable_type (^^N3::E &, ^^const int));
+ static_assert (!is_assignable_type (^^N3::E &, ^^int &));
+ static_assert (!is_assignable_type (^^N3::E &, ^^const int &));
+ static_assert (!is_assignable_type (^^N3::E &, ^^N3::E2));
+ static_assert (!is_assignable_type (^^N3::E &, ^^const N3::E2));
+ static_assert (!is_assignable_type (^^N3::E &, ^^N3::E2 &));
+ static_assert (!is_assignable_type (^^N3::E &, ^^const N3::E2 &));
+ static_assert (!is_assignable_type (^^N3::E, ^^N3::E));
+ static_assert (!is_assignable_type (^^N3::E, ^^const N3::E));
+ static_assert (!is_assignable_type (^^N3::E, ^^N3::E &));
+ static_assert (!is_assignable_type (^^N3::E, ^^const N3::E &));
+ static_assert (is_assignable_type (^^N3::SE &, ^^N3::SE));
+ static_assert (is_assignable_type (^^N3::SE &, ^^const N3::SE));
+ static_assert (is_assignable_type (^^N3::SE &, ^^N3::SE &));
+ static_assert (is_assignable_type (^^N3::SE &, ^^const N3::SE &));
+ static_assert (!is_assignable_type (^^int &, ^^N3::SE));
+ static_assert (!is_assignable_type (^^int &, ^^const N3::SE));
+ static_assert (!is_assignable_type (^^int &, ^^N3::SE &));
+ static_assert (!is_assignable_type (^^int &, ^^const N3::SE &));
+ static_assert (!is_assignable_type (^^N3::SE &, ^^int));
+ static_assert (!is_assignable_type (^^N3::SE &, ^^const int));
+ static_assert (!is_assignable_type (^^N3::SE &, ^^int &));
+ static_assert (!is_assignable_type (^^N3::SE &, ^^const int &));
+ static_assert (!is_assignable_type (^^N3::SE, ^^N3::SE));
+ static_assert (!is_assignable_type (^^N3::SE, ^^const N3::SE));
+ static_assert (!is_assignable_type (^^N3::SE, ^^N3::SE &));
+ static_assert (!is_assignable_type (^^N3::SE, ^^const N3::SE &));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^int));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::nullptr_t));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::E));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::SE));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::Empty));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::U));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^int &));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::nullptr_t &));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::E &));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::SE &));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::Empty &));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::U &));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::AnyAssign));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::initializer_list <int>));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^int [1]));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::nullptr_t [1]));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::E [1]));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::SE [1]));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^int (&) [1]));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^std::nullptr_t (&) [1]));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::E (&) [1]));
+ static_assert (is_assignable_type (^^N3::AnyAssign &, ^^N3::SE (&) [1]));
+ static_assert (is_assignable_type (^^int &, ^^N3::E));
+ static_assert (!is_assignable_type (^^int &, ^^N3::SE));
+ static_assert (is_assignable_type (^^bool &, ^^N3::E));
+ static_assert (!is_assignable_type (^^bool &, ^^N3::SE));
+ static_assert (is_assignable_type (^^bool &, ^^void *));
+ static_assert (is_assignable_type (^^bool &, ^^int N3::B::*));
+ static_assert (is_assignable_type (^^bool &, ^^void *));
+ static_assert (!is_assignable_type (^^bool &, ^^std::nullptr_t));
+ static_assert (is_assignable_type (^^std::nullptr_t &, ^^std::nullptr_t));
+ static_assert (is_assignable_type (^^void *&, ^^std::nullptr_t));
+ static_assert (is_assignable_type (^^int *&, ^^std::nullptr_t));
+ static_assert (is_assignable_type (^^int N3::B::*&, ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^std::nullptr_t &, ^^bool));
+ static_assert (!is_assignable_type (^^void *&, ^^bool));
+ static_assert (!is_assignable_type (^^N3::E &, ^^bool));
+ static_assert (!is_assignable_type (^^N3::SE &, ^^bool));
+ static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^std::initializer_list <int>));
+ static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^std::initializer_list <int> &&));
+ static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^const std::initializer_list <int> &&));
+ static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^std::initializer_list <int> &));
+ static_assert (is_assignable_type (^^std::initializer_list <int> &, ^^const std::initializer_list <int> &));
+ static_assert (!is_assignable_type (^^const std::initializer_list <int> &, ^^std::initializer_list <int>));
+ static_assert (!is_assignable_type (^^const N3::AnyAssign &, ^^int));
+ static_assert (!is_assignable_type (^^N3::AnyAssign &, ^^void));
+ static_assert (!is_assignable_type (^^void, ^^int));
+ static_assert (!is_assignable_type (^^const void, ^^int));
+ static_assert (!is_assignable_type (^^int, ^^void));
+ static_assert (!is_assignable_type (^^int, ^^const void));
+ static_assert (!is_assignable_type (^^const int, ^^void));
+ static_assert (!is_assignable_type (^^const int, ^^const void));
+ static_assert (!is_assignable_type (^^int &, ^^void));
+ static_assert (!is_assignable_type (^^int &, ^^const void));
+ static_assert (!is_assignable_type (^^const int &, ^^void));
+ static_assert (!is_assignable_type (^^const int &, ^^const void));
+ static_assert (!is_assignable_type (^^void, ^^void));
+ static_assert (!is_assignable_type (^^const void, ^^void));
+ static_assert (!is_assignable_type (^^const void, ^^const void));
+ static_assert (!is_assignable_type (^^int [1], ^^int [1]));
+ static_assert (!is_assignable_type (^^int (&) [1], ^^int [1]));
+ static_assert (!is_assignable_type (^^int (&) [1], ^^int (&) [1]));
+ static_assert (!is_assignable_type (^^int [2], ^^int [1]));
+ static_assert (!is_assignable_type (^^int (&) [2], ^^int [1]));
+ static_assert (!is_assignable_type (^^int (&) [2], ^^int (&) [1]));
+ static_assert (!is_assignable_type (^^int [1], ^^void));
+ static_assert (!is_assignable_type (^^int (&) [1], ^^void));
+ static_assert (!is_assignable_type (^^void, ^^int [1]));
+ static_assert (!is_assignable_type (^^void, ^^int (&) [1]));
+ static_assert (!is_assignable_type (^^int [], ^^int []));
+ static_assert (!is_assignable_type (^^int (&) [], ^^int []));
+ static_assert (!is_assignable_type (^^int (&) [], ^^int (&) []));
+ static_assert (!is_assignable_type (^^int [1], ^^int []));
+ static_assert (!is_assignable_type (^^int (&) [1], ^^int []));
+ static_assert (!is_assignable_type (^^int (&) [1], ^^int (&) []));
+ static_assert (!is_assignable_type (^^int [], ^^int [1]));
+ static_assert (!is_assignable_type (^^int (&) [], ^^int [1]));
+ static_assert (!is_assignable_type (^^int (&) [], ^^int (&) [1]));
+ static_assert (!is_assignable_type (^^int [], ^^void));
+ static_assert (!is_assignable_type (^^int (&) [], ^^void));
+ static_assert (!is_assignable_type (^^void, ^^int []));
+ static_assert (!is_assignable_type (^^void, ^^int (&) []));
+ static_assert (is_assignable_type (^^N3::DelCopyAssign &, ^^N3::DelCopyAssign));
+ static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^const N3::DelCopyAssign));
+ static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^N3::DelCopyAssign &));
+ static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^const N3::DelCopyAssign &));
+ static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^void));
+ static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^void ()));
+ static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^void (&) ()));
+ static_assert (!is_assignable_type (^^N3::DelCopyAssign &, ^^int));
+ static_assert (is_assignable_type (^^N3::DelAnyAssign &, ^^N3::DelAnyAssign &&));
+ static_assert (is_assignable_type (^^N3::DelAnyAssign &, ^^const N3::DelAnyAssign &));
+ static_assert (is_assignable_type (^^N3::DelAnyAssign, ^^N3::DelAnyAssign &&));
+ static_assert (is_assignable_type (^^N3::DelAnyAssign, ^^const N3::DelAnyAssign &));
+ static_assert (!is_assignable_type (^^const N3::DelAnyAssign &, ^^N3::DelAnyAssign &&));
+ static_assert (!is_assignable_type (^^const N3::DelAnyAssign &, ^^const N3::DelAnyAssign &));
+ static_assert (!is_assignable_type (^^const N3::DelAnyAssign, ^^N3::DelAnyAssign &&));
+ static_assert (!is_assignable_type (^^const N3::DelAnyAssign, ^^const N3::DelAnyAssign &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^const int &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void ()));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void () const));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void (&) ()));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void (&&) ()));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^std::nullptr_t &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^std::initializer_list <int>));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^std::initializer_list <int> &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^bool));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^bool &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::E));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::E &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::SE));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::SE &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::Empty));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::Empty &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::B));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::B &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::U));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::U &));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^void *));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int *));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::B *));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^N3::D *));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int N3::B::*));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int N3::D::*));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int []));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int [1]));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int (&) []));
+ static_assert (!is_assignable_type (^^N3::DelAnyAssign &, ^^int (&) [1]));
+ static_assert (!is_assignable_type (^^void (), ^^void));
+ static_assert (!is_assignable_type (^^void, ^^void ()));
+ static_assert (!is_assignable_type (^^void (), ^^void ()));
+ static_assert (!is_assignable_type (^^void (&) (), ^^void));
+ static_assert (!is_assignable_type (^^void, ^^void (&) ()));
+ static_assert (!is_assignable_type (^^void (&) (), ^^void (&) ()));
+ static_assert (!is_assignable_type (^^void (&) (), ^^void ()));
+ static_assert (!is_assignable_type (^^void (), ^^void (&) ()));
+ static_assert (is_assignable_type (^^int &, ^^N3::ImplicitTo <int>));
+ static_assert (!is_assignable_type (^^int &, ^^N3::ExplicitTo <int>));
+ static_assert (!is_assignable_type (^^int, ^^N3::ImplicitTo <int>));
+ static_assert (!is_assignable_type (^^int, ^^N3::ExplicitTo <int>));
+ static_assert (!is_assignable_type (^^const int, ^^N3::ImplicitTo <int>));
+ static_assert (!is_assignable_type (^^const int, ^^N3::ExplicitTo <int>));
+ static_assert (!is_assignable_type (^^const int &, ^^N3::ImplicitTo <int>));
+ static_assert (!is_assignable_type (^^const int &, ^^N3::ExplicitTo <int>));
+ static_assert (is_assignable_type (^^N3::DelImplicitTo <int> &, ^^N3::DelImplicitTo <int>));
+ static_assert (is_assignable_type (^^N3::DelImplicitTo <int>, ^^N3::DelImplicitTo <int>));
+ static_assert (!is_assignable_type (^^int &, ^^N3::DelImplicitTo <int>));
+ static_assert (!is_assignable_type (^^int, ^^N3::DelImplicitTo <int>));
+ static_assert (!is_assignable_type (^^const int &, ^^N3::DelImplicitTo <int>));
+ static_assert (!is_assignable_type (^^const int, ^^N3::DelImplicitTo <int>));
+ static_assert (!is_assignable_type (^^int &, ^^N3::DelExplicitTo <int>));
+ static_assert (!is_assignable_type (^^int, ^^N3::DelExplicitTo <int>));
+ static_assert (!is_assignable_type (^^const int &, ^^N3::DelExplicitTo <int>));
+ static_assert (!is_assignable_type (^^const int, ^^N3::DelExplicitTo <int>));
+ static_assert (is_assignable_type (^^N3::B &, ^^N3::B));
+ static_assert (is_assignable_type (^^N3::B &, ^^N3::D));
+ static_assert (is_assignable_type (^^N3::B &, ^^N3::B &));
+ static_assert (is_assignable_type (^^N3::B &, ^^N3::D &));
+ static_assert (!is_assignable_type (^^const N3::B &, ^^N3::B &));
+ static_assert (!is_assignable_type (^^const N3::B &, ^^N3::D &));
+ static_assert (!is_assignable_type (^^N3::D &, ^^N3::B));
+ static_assert (!is_assignable_type (^^N3::D &, ^^N3::B &));
+ static_assert (is_assignable_type (^^N3::B *&, ^^N3::B *));
+ static_assert (is_assignable_type (^^N3::B *&, ^^N3::D *));
+ static_assert (is_assignable_type (^^const N3::B *&, ^^N3::D *));
+ static_assert (is_assignable_type (^^const N3::B *&, ^^const N3::D *));
+ static_assert (is_assignable_type (^^N3::B *&, ^^N3::B *&));
+ static_assert (is_assignable_type (^^N3::B *&, ^^N3::D *&));
+ static_assert (is_assignable_type (^^const N3::B *&, ^^N3::B *&));
+ static_assert (is_assignable_type (^^const N3::B *&, ^^N3::D *&));
+ static_assert (!is_assignable_type (^^N3::B * const &, ^^N3::B *&));
+ static_assert (!is_assignable_type (^^N3::B * const &, ^^N3::D *&));
+ static_assert (!is_assignable_type (^^N3::D *&, ^^N3::B *));
+ static_assert (!is_assignable_type (^^N3::D *&, ^^N3::B *&));
+ static_assert (is_assignable_type (^^N3::MO &, ^^N3::MO));
+ static_assert (is_assignable_type (^^N3::MO &, ^^N3::MO &&));
+ static_assert (is_assignable_type (^^N3::MO, ^^N3::MO));
+ static_assert (is_assignable_type (^^N3::MO, ^^N3::MO &&));
+ static_assert (!is_assignable_type (^^const N3::MO &, ^^N3::MO));
+ static_assert (!is_assignable_type (^^const N3::MO &, ^^N3::MO &&));
+ static_assert (!is_assignable_type (^^N3::MO &, ^^const N3::MO &&));
+ static_assert (!is_assignable_type (^^N3::MO &, ^^N3::MO &));
+ static_assert (!is_assignable_type (^^N3::MO &, ^^const N3::MO &));
+ static_assert (!is_assignable_type (^^const N3::MO, ^^N3::MO));
+ static_assert (!is_assignable_type (^^const N3::MO, ^^N3::MO &&));
+ static_assert (!is_assignable_type (^^N3::MO, ^^const N3::MO &&));
+ static_assert (!is_assignable_type (^^N3::MO, ^^N3::MO &));
+ static_assert (!is_assignable_type (^^N3::MO, ^^const N3::MO &));
+ static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^N3::NontrivialUnion));
+ static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^N3::NontrivialUnion &&));
+ static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^N3::NontrivialUnion &));
+ static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^const N3::NontrivialUnion &));
+ static_assert (!is_assignable_type (^^N3::NontrivialUnion &, ^^const N3::NontrivialUnion &&));
+ static_assert (is_assignable_type (^^N3::Abstract &, ^^N3::Abstract));
+ static_assert (is_assignable_type (^^N3::Abstract &, ^^N3::Abstract &&));
+ static_assert (is_assignable_type (^^N3::Abstract &, ^^N3::Abstract &));
+ static_assert (is_assignable_type (^^N3::Abstract &, ^^const N3::Abstract &));
+ static_assert (is_assignable_type (^^N3::Abstract &, ^^const N3::Abstract &&));
+ static_assert (is_assignable_type (^^N3::Abstract &&, ^^N3::Abstract));
+ static_assert (is_assignable_type (^^N3::Abstract &&, ^^N3::Abstract &&));
+ static_assert (is_assignable_type (^^N3::Abstract &&, ^^N3::Abstract &));
+ static_assert (is_assignable_type (^^N3::Abstract &&, ^^const N3::Abstract &));
+ static_assert (is_assignable_type (^^N3::Abstract &&, ^^const N3::Abstract &&));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^N3::AbstractDelDtor));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^N3::AbstractDelDtor &&));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^N3::AbstractDelDtor &));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^const N3::AbstractDelDtor &));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &, ^^const N3::AbstractDelDtor &&));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^N3::AbstractDelDtor));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^N3::AbstractDelDtor &&));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^N3::AbstractDelDtor &));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^const N3::AbstractDelDtor &));
+ static_assert (is_assignable_type (^^N3::AbstractDelDtor &&, ^^const N3::AbstractDelDtor &&));
+ static_assert (is_assignable_type (^^N3::DelDef &, ^^N3::DelDef));
+ static_assert (is_assignable_type (^^N3::DelDef &, ^^N3::DelDef &&));
+ static_assert (is_assignable_type (^^N3::DelDef &, ^^N3::DelDef &));
+ static_assert (is_assignable_type (^^N3::DelDef &, ^^const N3::DelDef &));
+ static_assert (is_assignable_type (^^N3::DelDef &, ^^const N3::DelDef &&));
+ static_assert (is_assignable_type (^^N3::DelDef &&, ^^N3::DelDef));
+ static_assert (is_assignable_type (^^N3::DelDef &&, ^^N3::DelDef &&));
+ static_assert (is_assignable_type (^^N3::DelDef &&, ^^N3::DelDef &));
+ static_assert (is_assignable_type (^^N3::DelDef &&, ^^const N3::DelDef &));
+ static_assert (is_assignable_type (^^N3::DelDef &&, ^^const N3::DelDef &&));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::Ellipsis));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::Ellipsis));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::Ellipsis &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::Ellipsis &));
+ static_assert (is_assignable_type (^^N3::Ellipsis, ^^N3::Ellipsis));
+ static_assert (is_assignable_type (^^N3::Ellipsis, ^^const N3::Ellipsis));
+ static_assert (is_assignable_type (^^N3::Ellipsis, ^^N3::Ellipsis &));
+ static_assert (is_assignable_type (^^N3::Ellipsis, ^^const N3::Ellipsis &));
+ static_assert (!is_assignable_type (^^N3::Ellipsis &, ^^void));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^int));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const int));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^int &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const int &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::Empty));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::Empty));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::Empty &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::Empty &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::E));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::E));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::E &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::E &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::SE));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::SE));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^N3::SE &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const N3::SE &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^bool));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const bool));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^bool &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const bool &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^std::nullptr_t));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const std::nullptr_t));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^std::nullptr_t &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const std::nullptr_t &));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^void *));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const void *));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^void *&));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^const void *&));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^void ()));
+ static_assert (is_assignable_type (^^N3::Ellipsis &, ^^void (&) ()));
+ static_assert (is_assignable_type (^^N3::DelEllipsis &, ^^N3::DelEllipsis));
+ static_assert (is_assignable_type (^^N3::DelEllipsis &, ^^const N3::DelEllipsis));
+ static_assert (is_assignable_type (^^N3::DelEllipsis &, ^^N3::DelEllipsis &));
+ static_assert (is_assignable_type (^^N3::DelEllipsis &, ^^const N3::DelEllipsis &));
+ static_assert (is_assignable_type (^^N3::DelEllipsis, ^^N3::DelEllipsis));
+ static_assert (is_assignable_type (^^N3::DelEllipsis, ^^const N3::DelEllipsis));
+ static_assert (is_assignable_type (^^N3::DelEllipsis, ^^N3::DelEllipsis &));
+ static_assert (is_assignable_type (^^N3::DelEllipsis, ^^const N3::DelEllipsis &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^int));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const int));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^int &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const int &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::Empty));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::Empty));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::Empty &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::Empty &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::E));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::E));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::E &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::E &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::SE));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::SE));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^N3::SE &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const N3::SE &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^bool));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const bool));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^bool &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const bool &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const std::nullptr_t));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^std::nullptr_t &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const std::nullptr_t &));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void *));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const void *));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void *&));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^const void *&));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void ()));
+ static_assert (!is_assignable_type (^^N3::DelEllipsis &, ^^void (&) ()));
+ static_assert (is_assignable_type (^^N3::FromArgs <int> &, ^^int));
+ static_assert (is_assignable_type (^^N3::FromArgs <int> &, ^^const int));
+ static_assert (!is_assignable_type (^^N3::FromArgs <int> &, ^^N3::ImplicitTo <int>));
+ static_assert (!is_assignable_type (^^N3::FromArgs <int> &, ^^N3::ImplicitTo <const int>));
+ static_assert (!is_assignable_type (^^N3::FromArgs <int> &, ^^N3::ExplicitTo <int>));
+ static_assert (!is_assignable_type (^^N3::FromArgs <int> &, ^^N3::ExplicitTo <const int>));
+ static_assert (!is_assignable_type (^^N3::DelFromArgs <int> &, ^^int));
+ static_assert (!is_assignable_type (^^N3::DelFromArgs <int> &, ^^const int));
+ static_assert (is_assignable_type (^^void (*&) (), ^^N3::ImplicitTo <void (*) ()>));
+ static_assert (!is_assignable_type (^^void (*&) (), ^^N3::ExplicitTo <void (*) ()>));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::UAssignAll));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const N3::UAssignAll));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::UAssignAll &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const N3::UAssignAll &));
+ static_assert (is_assignable_type (^^N3::UAssignAll, ^^N3::UAssignAll));
+ static_assert (is_assignable_type (^^N3::UAssignAll, ^^const N3::UAssignAll));
+ static_assert (is_assignable_type (^^N3::UAssignAll, ^^N3::UAssignAll &));
+ static_assert (is_assignable_type (^^N3::UAssignAll, ^^const N3::UAssignAll &));
+ static_assert (!is_assignable_type (^^N3::UAssignAll &, ^^void));
+ static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^void));
+ static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^N3::UAssignAll));
+ static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^const N3::UAssignAll));
+ static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^N3::UAssignAll &));
+ static_assert (!is_assignable_type (^^const N3::UAssignAll &, ^^const N3::UAssignAll &));
+ static_assert (!is_assignable_type (^^N3::UAssignAll &, ^^void () const));
+ static_assert (!is_assignable_type (^^N3::UAssignAll &, ^^void () &));
+ static_assert (!is_assignable_type (^^N3::UAssignAll &, ^^void () const volatile &&));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::E));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::E &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::SE));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::SE &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^double));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^double &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::Empty));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::Empty &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::B));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::B &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::U));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^N3::U &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^std::nullptr_t));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^std::nullptr_t &));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void ()));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void (&) ()));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void (*) ()));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void (*&) ()));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int *));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int *&));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void *));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^void *&));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const int *));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const int *&));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const void *));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^const void *&));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int [1]));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int (&) [1]));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int []));
+ static_assert (is_assignable_type (^^N3::UAssignAll &, ^^int (&) []));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int &));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::E));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::E &));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::SE));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::SE &));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^double));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^double &));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::Empty));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::Empty &));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::B));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::B &));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::U));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^N3::U &));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^std::nullptr_t &));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void ()));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void (&) ()));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void () const));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void (*) ()));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void (*&) ()));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int *));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int *&));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void *));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^void *&));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^const int *));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^const int *&));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^const void *));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^const void *&));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int [1]));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int (&) [1]));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int []));
+ static_assert (!is_assignable_type (^^N3::UDelAssignAll &, ^^int (&) []));
+ static_assert (!is_assignable_type (^^void (&) (), ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^std::nullptr_t, ^^void (&) ()));
+ static_assert (!is_assignable_type (^^void (&) (), ^^int []));
+ static_assert (!is_assignable_type (^^int [], ^^void (&) ()));
+ static_assert (!is_assignable_type (^^int [], ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^std::nullptr_t, ^^int []));
+ static_assert (!is_assignable_type (^^int [1], ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^std::nullptr_t, ^^int [1]));
+ static_assert (!is_assignable_type (^^void, ^^std::nullptr_t));
+ static_assert (!is_assignable_type (^^std::nullptr_t, ^^void));
+ static_assert (!is_assignable_type (^^const N3::D &, ^^N3::B &));
+ static_assert (!is_assignable_type (^^const N3::B &, ^^N3::B &));
+ static_assert (is_assignable_type (^^N3::B &, ^^const N3::D &));
+ static_assert (is_assignable_type (^^N3::B &, ^^const N3::B &));
+ static_assert (is_assignable_type (^^int &, ^^const int &));
+ static_assert (is_assignable_type (^^int &, ^^const double &));
+ 
+ static_assert (is_copy_assignable_type (^^int));
+ static_assert (is_copy_assignable_type (^^float));
+ static_assert (is_copy_assignable_type (^^EnumType));
+ static_assert (is_copy_assignable_type (^^int *));
+ static_assert (is_copy_assignable_type (^^int (*) (int)));
+ static_assert (is_copy_assignable_type (^^int (ClassType::*)));
+ static_assert (is_copy_assignable_type (^^int (ClassType::*) (int)));
+ static_assert (is_copy_assignable_type (^^NoexceptCopyAssignClass));
+ static_assert (is_copy_assignable_type (^^ExceptCopyAssignClass));
+ static_assert (!is_copy_assignable_type (^^void));
+ static_assert (!is_copy_assignable_type (^^int [2]));
+ static_assert (!is_copy_assignable_type (^^float [][3]));
+ static_assert (!is_copy_assignable_type (^^EnumType [2][3][4]));
+ static_assert (!is_copy_assignable_type (^^int * [3]));
+ static_assert (!is_copy_assignable_type (^^int (* [][2]) (int)));
+ static_assert (!is_copy_assignable_type (^^int (ClassType::* [2][3])));
+ static_assert (!is_copy_assignable_type (^^int (ClassType::* [][2][3]) (int)));
+ static_assert (!is_copy_assignable_type (^^ClassType (unsigned) const &));
+ static_assert (!is_copy_assignable_type (^^bool (ClassType) const));
+ static_assert (!is_copy_assignable_type (^^bool (...) &&));
+ static_assert (!is_copy_assignable_type (^^EnumType (int, ...)));
+ static_assert (!is_copy_assignable_type (^^NoexceptMoveAssignClass));
+ static_assert (!is_copy_assignable_type (^^ExceptMoveAssignClass));
+ static_assert (!is_copy_assignable_type (^^DeletedCopyAssignClass));
+ static_assert (!is_copy_assignable_type (^^DeletedMoveAssignClass));
+ 
+ static_assert (is_move_assignable_type (^^int));
+ static_assert (is_move_assignable_type (^^float));
+ static_assert (is_move_assignable_type (^^EnumType));
+ static_assert (is_move_assignable_type (^^int *));
+ static_assert (is_move_assignable_type (^^int (*) (int)));
+ static_assert (is_move_assignable_type (^^int (ClassType::*)));
+ static_assert (is_move_assignable_type (^^int (ClassType::*) (int)));
+ static_assert (is_move_assignable_type (^^NoexceptMoveAssignClass));
+ static_assert (is_move_assignable_type (^^ExceptMoveAssignClass));
+ static_assert (is_move_assignable_type (^^NoexceptCopyAssignClass));
+ static_assert (is_move_assignable_type (^^ExceptCopyAssignClass));
+ static_assert (!is_move_assignable_type (^^void));
+ static_assert (!is_move_assignable_type (^^int [2]));
+ static_assert (!is_move_assignable_type (^^float [][3]));
+ static_assert (!is_move_assignable_type (^^EnumType [2][3][4]));
+ static_assert (!is_move_assignable_type (^^int * [3]));
+ static_assert (!is_move_assignable_type (^^int (* [][2]) (int)));
+ static_assert (!is_move_assignable_type (^^int (ClassType::* [2][3])));
+ static_assert (!is_move_assignable_type (^^int (ClassType::* [][2][3]) (int)));
+ static_assert (!is_move_assignable_type (^^ClassType (unsigned) const &));
+ static_assert (!is_move_assignable_type (^^bool (ClassType) const));
+ static_assert (!is_move_assignable_type (^^bool (...) &&));
+ static_assert (!is_move_assignable_type (^^EnumType (int, ...)));
+ static_assert (!is_move_assignable_type (^^DeletedCopyAssignClass));
+ static_assert (!is_move_assignable_type (^^DeletedMoveAssignClass));
+ 
+ static_assert (is_destructible_type (^^int));
+ static_assert (is_destructible_type (^^const int));
+ static_assert (is_destructible_type (^^bool));
+ static_assert (is_destructible_type (^^const bool));
+ static_assert (is_destructible_type (^^int *));
+ static_assert (is_destructible_type (^^void *));
+ static_assert (is_destructible_type (^^int N2::Der::*));
+ static_assert (is_destructible_type (^^const int N2::Der::*));
+ static_assert (is_destructible_type (^^void (N2::Der::*) () const));
+ static_assert (is_destructible_type (^^void (*) ()));
+ static_assert (is_destructible_type (^^N2::En));
+ static_assert (is_destructible_type (^^const N2::En));
+ static_assert (is_destructible_type (^^N2::En2));
+ static_assert (is_destructible_type (^^const N2::En2));
+ static_assert (is_destructible_type (^^N2::OpE));
+ static_assert (is_destructible_type (^^const N2::OpE));
+ static_assert (is_destructible_type (^^N2::OpSE));
+ static_assert (is_destructible_type (^^const N2::OpSE));
+ static_assert (is_destructible_type (^^std::nullptr_t));
+ static_assert (is_destructible_type (^^const std::nullptr_t));
+ static_assert (is_destructible_type (^^N2::Der));
+ static_assert (is_destructible_type (^^const N2::Der));
+ static_assert (is_destructible_type (^^N2::Aggr));
+ static_assert (is_destructible_type (^^const N2::Aggr));
+ static_assert (is_destructible_type (^^N2::E));
+ static_assert (is_destructible_type (^^const N2::E));
+ static_assert (is_destructible_type (^^N2::U1));
+ static_assert (is_destructible_type (^^const N2::U1));
+ static_assert (is_destructible_type (^^N2::Abstract1));
+ static_assert (is_destructible_type (^^const N2::Abstract1));
+ static_assert (is_destructible_type (^^int [1]));
+ static_assert (is_destructible_type (^^const int [1]));
+ static_assert (is_destructible_type (^^int [1][2]));
+ static_assert (is_destructible_type (^^const int [1][2]));
+ static_assert (is_destructible_type (^^int &));
+ static_assert (is_destructible_type (^^int &&));
+ static_assert (is_destructible_type (^^int (&) [1]));
+ static_assert (is_destructible_type (^^const int (&) [1]));
+ static_assert (is_destructible_type (^^void (&) ()));
+ static_assert (is_destructible_type (^^N2::Ellipsis));
+ static_assert (is_destructible_type (^^const N2::Ellipsis));
+ static_assert (is_destructible_type (^^N2::Abstract2));
+ static_assert (is_destructible_type (^^const N2::Abstract2));
+ static_assert (is_destructible_type (^^N2::Aggr2));
+ static_assert (is_destructible_type (^^const N2::Aggr2));
+ static_assert (is_destructible_type (^^N2::DelDef));
+ static_assert (is_destructible_type (^^const N2::DelDef));
+ static_assert (is_destructible_type (^^N2::DelCopy));
+ static_assert (is_destructible_type (^^const N2::DelCopy));
+ static_assert (is_destructible_type (^^N2::DelEllipsis));
+ static_assert (is_destructible_type (^^const N2::DelEllipsis));
+ static_assert (is_destructible_type (^^std::initializer_list <int>));
+ static_assert (is_destructible_type (^^const std::initializer_list <int>));
+ static_assert (is_destructible_type (^^std::initializer_list <N2::Del>));
+ static_assert (!is_destructible_type (^^void));
+ static_assert (!is_destructible_type (^^const void));
+ static_assert (!is_destructible_type (^^void ()));
+ static_assert (!is_destructible_type (^^void () const));
+ static_assert (!is_destructible_type (^^int []));
+ static_assert (!is_destructible_type (^^const int []));
+ static_assert (!is_destructible_type (^^N2::Del));
+ static_assert (!is_destructible_type (^^const N2::Del));
+ static_assert (!is_destructible_type (^^N2::AbstractDelDtor));
+ static_assert (!is_destructible_type (^^const N2::AbstractDelDtor));
+ static_assert (!is_destructible_type (^^int [][1]));
+ static_assert (!is_destructible_type (^^const int [][1]));
+ static_assert (!is_destructible_type (^^N2::Del [1]));
+ static_assert (!is_destructible_type (^^const N2::Del [1]));
+ static_assert (!is_destructible_type (^^N2::Del []));
+ static_assert (!is_destructible_type (^^const N2::Del []));
+ static_assert (!is_destructible_type (^^N2::NontrivialUnion));
+ static_assert (is_destructible_type (^^N2::UnusualCopy));
+ 
+ static_assert (is_trivially_default_constructible_type (^^int));
+ static_assert (is_trivially_default_constructible_type (^^TType));
+ static_assert (is_trivially_default_constructible_type (^^PODType));
+ static_assert (!is_trivially_default_constructible_type (^^NType));
+ static_assert (!is_trivially_default_constructible_type (^^SLType));
+ static_assert (!is_trivially_default_constructible_type (^^N1::DelDef));
+ static_assert (!is_trivially_default_constructible_type (^^N1::Abstract));
+ static_assert (!is_trivially_default_constructible_type (^^N1::Ellipsis));
+ static_assert (!is_trivially_default_constructible_type (^^N1::DelEllipsis));
+ static_assert (!is_trivially_default_constructible_type (^^N1::Any));
+ static_assert (!is_trivially_default_constructible_type (^^N1::DelCopy));
+ static_assert (!is_trivially_default_constructible_type (^^N1::DelDtor));
+ static_assert (!is_trivially_default_constructible_type (^^N1::Nontrivial));
+ static_assert (is_trivially_default_constructible_type (^^HasTemplateCtor));
+ 
+ static_assert (!is_trivially_default_constructible_type (^^int []));
+ struct A { };
+ static_assert (!is_trivially_default_constructible_type (^^A []));
+ struct B { B () { } };
+ static_assert (!is_trivially_default_constructible_type (^^B []));
+ 
+ static_assert (is_trivially_copy_constructible_type (^^int));
+ static_assert (is_trivially_copy_constructible_type (^^TType));
+ static_assert (is_trivially_copy_constructible_type (^^PODType));
+ static_assert (!is_trivially_copy_constructible_type (^^NType));
+ static_assert (!is_trivially_copy_constructible_type (^^SLType));
+ static_assert (is_trivially_copy_constructible_type (^^N1::DelDef));
+ static_assert (!is_trivially_copy_constructible_type (^^N1::Abstract));
+ static_assert (is_trivially_copy_constructible_type (^^N1::Ellipsis));
+ static_assert (is_trivially_copy_constructible_type (^^N1::DelEllipsis));
+ static_assert (is_trivially_copy_constructible_type (^^N1::Any));
+ static_assert (!is_trivially_copy_constructible_type (^^N1::DelCopy));
+ static_assert (!is_trivially_copy_constructible_type (^^N1::DelDtor));
+ static_assert (!is_trivially_copy_constructible_type (^^N1::Nontrivial));
+ static_assert (!is_trivially_copy_constructible_type (^^N1::UnusualCopy));
+ static_assert (is_trivially_copy_constructible_type (^^CopyConsOnlyType));
+ static_assert (!is_trivially_copy_constructible_type (^^MoveConsOnlyType));
+ static_assert (is_trivially_copy_constructible_type (^^HasTemplateCCtor));
+ static_assert (!is_trivially_copy_constructible_type (^^MoveOnly));
+ static_assert (!is_trivially_copy_constructible_type (^^MoveOnly2));
+ static_assert (!is_trivially_copy_constructible_type (^^void));
+ 
+ static_assert (is_trivially_move_constructible_type (^^int));
+ static_assert (is_trivially_move_constructible_type (^^TType));
+ static_assert (is_trivially_move_constructible_type (^^PODType));
+ static_assert (!is_trivially_move_constructible_type (^^NType));
+ static_assert (!is_trivially_move_constructible_type (^^SLType));
+ static_assert (is_trivially_move_constructible_type (^^N1::DelDef));
+ static_assert (!is_trivially_move_constructible_type (^^N1::Abstract));
+ static_assert (is_trivially_move_constructible_type (^^N1::Ellipsis));
+ static_assert (is_trivially_move_constructible_type (^^N1::DelEllipsis));
+ static_assert (is_trivially_move_constructible_type (^^N1::Any));
+ static_assert (!is_trivially_move_constructible_type (^^N1::DelCopy));
+ static_assert (!is_trivially_move_constructible_type (^^N1::DelDtor));
+ static_assert (!is_trivially_move_constructible_type (^^N1::Nontrivial));
+ static_assert (!is_trivially_move_constructible_type (^^N1::UnusualCopy));
+ static_assert (!is_trivially_move_constructible_type (^^CopyConsOnlyType));
+ static_assert (is_trivially_move_constructible_type (^^MoveConsOnlyType));
+ static_assert (!is_trivially_move_constructible_type (^^HasTemplateCCtor));
+ static_assert (is_trivially_move_constructible_type (^^MoveOnly));
+ static_assert (!is_trivially_move_constructible_type (^^MoveOnly2));
+ static_assert (!is_trivially_move_constructible_type (^^void));
+ 
+ static_assert (!is_trivially_assignable_type (^^int, ^^int));
+ static_assert (is_trivially_assignable_type (^^int &, ^^int));
+ static_assert (is_trivially_assignable_type (^^int &, ^^int &));
+ static_assert (is_trivially_assignable_type (^^int &, ^^int &&));
+ static_assert (is_trivially_assignable_type (^^int &, ^^const int &));
+ static_assert (!is_trivially_assignable_type (^^int &, ^^int *));
+ static_assert (!is_trivially_assignable_type (^^int &, ^^void *));
+ static_assert (!is_trivially_assignable_type (^^const int, ^^int));
+ static_assert (!is_trivially_assignable_type (^^const int &, ^^int));
+ static_assert (!is_trivially_assignable_type (^^const int &, ^^const int &));
+ static_assert (is_trivially_assignable_type (^^const int *&, ^^int *));
+ static_assert (!is_trivially_assignable_type (^^int *&, ^^const int *&));
+ static_assert (!is_trivially_assignable_type (^^int *&, ^^const int &));
+ static_assert (!is_trivially_assignable_type (^^const int *&, ^^void *));
+ static_assert (is_trivially_assignable_type (^^const void *&, ^^void *));
+ static_assert (is_trivially_assignable_type (^^const void *&, ^^int *));
+ static_assert (is_trivially_assignable_type (^^TType, ^^TType));
+ static_assert (is_trivially_assignable_type (^^TType &, ^^TType));
+ static_assert (is_trivially_assignable_type (^^TType &, ^^TType &));
+ static_assert (is_trivially_assignable_type (^^TType &, ^^TType &&));
+ static_assert (is_trivially_assignable_type (^^TType &, ^^const TType &));
+ static_assert (is_trivially_assignable_type (^^PODType, ^^PODType));
+ static_assert (!is_trivially_assignable_type (^^NType &, ^^NType &));
+ static_assert (is_trivially_assignable_type (^^SLType, ^^SLType));
+ static_assert (is_trivially_assignable_type (^^N3::Empty, ^^N3::Empty));
+ static_assert (!is_trivially_assignable_type (^^N3::Abstract, ^^N3::Abstract));
+ static_assert (is_trivially_assignable_type (^^N3::Ellipsis, ^^N3::Ellipsis));
+ static_assert (is_trivially_assignable_type (^^N3::DelEllipsis, ^^N3::DelEllipsis));
+ static_assert (is_trivially_assignable_type (^^N3::Any, ^^N3::Any));
+ static_assert (is_trivially_assignable_type (^^N3::DelDef, ^^N3::DelDef));
+ static_assert (is_trivially_assignable_type (^^N3::DelCopy, ^^N3::DelCopy));
+ static_assert (!is_trivially_assignable_type (^^N3::Nontrivial, ^^N3::Nontrivial));
+ static_assert (is_trivially_assignable_type (^^N3::AnyAssign, ^^N3::AnyAssign));
+ static_assert (is_trivially_assignable_type (^^N3::DelAnyAssign, ^^N3::DelAnyAssign));
+ static_assert (is_trivially_assignable_type (^^N3::DelCopyAssign, ^^N3::DelCopyAssign));
+ static_assert (is_trivially_assignable_type (^^N3::MO, ^^N3::MO));
+ static_assert (is_trivially_assignable_type (^^N3::MO, ^^N3::MO &&));
+ static_assert (!is_trivially_assignable_type (^^N3::MO, ^^N3::MO &));
+ static_assert (!is_trivially_assignable_type (^^N3::MO, ^^const N3::MO &));
+ static_assert (!is_trivially_assignable_type (^^CopyConsOnlyType, ^^CopyConsOnlyType));
+ static_assert (!is_trivially_assignable_type (^^CopyConsOnlyType, ^^const CopyConsOnlyType &));
+ static_assert (!is_trivially_assignable_type (^^MoveConsOnlyType, ^^MoveConsOnlyType));
+ static_assert (!is_trivially_assignable_type (^^MoveConsOnlyType, ^^MoveConsOnlyType &&));
+ static_assert (!is_trivially_assignable_type (^^HasTemplateCAssign, ^^HasTemplateCAssign));
+ static_assert (is_trivially_assignable_type (^^HasTemplateCAssign, ^^const HasTemplateCAssign &));
+ static_assert (is_trivially_assignable_type (^^ClassType, ^^DerivedType));
+ static_assert (is_trivially_assignable_type (^^ClassType, ^^DerivedType &));
+ static_assert (is_trivially_assignable_type (^^ClassType, ^^DerivedType &&));
+ static_assert (is_trivially_assignable_type (^^ClassType, ^^const DerivedType &));
+ static_assert (is_trivially_assignable_type (^^MoveOnly3, ^^MoveOnly3));
+ static_assert (is_trivially_assignable_type (^^MoveOnly3, ^^MoveOnly3 &&));
+ static_assert (!is_trivially_assignable_type (^^MoveOnly3, ^^MoveOnly3 &));
+ static_assert (!is_trivially_assignable_type (^^MoveOnly3, ^^const MoveOnly3 &));
+ static_assert (!is_trivially_assignable_type (^^MoveOnly4, ^^MoveOnly4));
+ 
+ static_assert (is_trivially_copy_assignable_type (^^int));
+ static_assert (is_trivially_copy_assignable_type (^^TType));
+ static_assert (is_trivially_copy_assignable_type (^^PODType));
+ static_assert (!is_trivially_copy_assignable_type (^^NType));
+ static_assert (is_trivially_copy_assignable_type (^^SLType));
+ static_assert (is_trivially_copy_assignable_type (^^N3::Empty));
+ static_assert (!is_trivially_copy_assignable_type (^^N3::Abstract));
+ static_assert (is_trivially_copy_assignable_type (^^N3::Ellipsis));
+ static_assert (is_trivially_copy_assignable_type (^^N3::DelEllipsis));
+ static_assert (is_trivially_copy_assignable_type (^^N3::Any));
+ static_assert (is_trivially_copy_assignable_type (^^N3::DelDef));
+ static_assert (is_trivially_copy_assignable_type (^^N3::DelCopy));
+ static_assert (!is_trivially_copy_assignable_type (^^N3::Nontrivial));
+ static_assert (is_trivially_copy_assignable_type (^^N3::AnyAssign));
+ static_assert (is_trivially_copy_assignable_type (^^N3::DelAnyAssign));
+ static_assert (!is_trivially_copy_assignable_type (^^N3::DelCopyAssign));
+ static_assert (!is_trivially_copy_assignable_type (^^N3::MO));
+ static_assert (!is_trivially_copy_assignable_type (^^CopyConsOnlyType));
+ static_assert (!is_trivially_copy_assignable_type (^^MoveConsOnlyType));
+ static_assert (is_trivially_copy_assignable_type (^^HasTemplateCAssign));
+ static_assert (!is_trivially_copy_assignable_type (^^MoveOnly3));
+ static_assert (!is_trivially_copy_assignable_type (^^MoveOnly4));
+ static_assert (!is_trivially_copy_assignable_type (^^void));
+ 
+ static_assert (is_trivially_move_assignable_type (^^int));
+ static_assert (is_trivially_move_assignable_type (^^TType));
+ static_assert (is_trivially_move_assignable_type (^^PODType));
+ static_assert (!is_trivially_move_assignable_type (^^NType));
+ static_assert (is_trivially_move_assignable_type (^^SLType));
+ static_assert (is_trivially_move_assignable_type (^^N3::Empty));
+ static_assert (!is_trivially_move_assignable_type (^^N3::Abstract));
+ static_assert (is_trivially_move_assignable_type (^^N3::Ellipsis));
+ static_assert (is_trivially_move_assignable_type (^^N3::DelEllipsis));
+ static_assert (is_trivially_move_assignable_type (^^N3::Any));
+ static_assert (is_trivially_move_assignable_type (^^N3::DelDef));
+ static_assert (is_trivially_move_assignable_type (^^N3::DelCopy));
+ static_assert (!is_trivially_move_assignable_type (^^N3::Nontrivial));
+ static_assert (is_trivially_move_assignable_type (^^N3::AnyAssign));
+ static_assert (is_trivially_move_assignable_type (^^N3::DelAnyAssign));
+ static_assert (is_trivially_move_assignable_type (^^N3::DelCopyAssign));
+ static_assert (is_trivially_move_assignable_type (^^N3::MO));
+ static_assert (!is_trivially_move_assignable_type (^^CopyConsOnlyType));
+ static_assert (!is_trivially_move_assignable_type (^^MoveConsOnlyType));
+ static_assert (!is_trivially_move_assignable_type (^^HasTemplateCAssign));
+ static_assert (is_trivially_move_assignable_type (^^MoveOnly3));
+ static_assert (!is_trivially_move_assignable_type (^^MoveOnly4));
+ static_assert (!is_trivially_move_assignable_type (^^void));
+ 
+ static_assert (is_trivially_destructible_type (^^int));
+ static_assert (is_trivially_destructible_type (^^TType));
+ static_assert (is_trivially_destructible_type (^^PODType));
+ static_assert (!is_trivially_destructible_type (^^NType));
+ static_assert (!is_trivially_destructible_type (^^SLType));
+ 
+ static_assert (is_nothrow_default_constructible_type (^^int));
+ static_assert (is_nothrow_default_constructible_type (^^float));
+ static_assert (is_nothrow_default_constructible_type (^^EnumType));
+ static_assert (is_nothrow_default_constructible_type (^^int *));
+ static_assert (is_nothrow_default_constructible_type (^^int (*) (int)));
+ static_assert (is_nothrow_default_constructible_type (^^int (ClassType:: *)));
+ static_assert (is_nothrow_default_constructible_type (^^int (ClassType:: *) (int)));
+ static_assert (is_nothrow_default_constructible_type (^^int [2]));
+ static_assert (is_nothrow_default_constructible_type (^^EnumType [2][3][4]));
+ static_assert (is_nothrow_default_constructible_type (^^int * [3]));
+ static_assert (is_nothrow_default_constructible_type (^^int (ClassType::* [2][3])));
+ static_assert (is_nothrow_default_constructible_type (^^ClassType));
+ static_assert (is_nothrow_default_constructible_type (^^NoexceptDefaultClass));
+ static_assert (!is_nothrow_default_constructible_type (^^void));
+ static_assert (!is_nothrow_default_constructible_type (^^int []));
+ static_assert (!is_nothrow_default_constructible_type (^^float [][3]));
+ static_assert (!is_nothrow_default_constructible_type (^^int (* [][2]) (int)));
+ static_assert (!is_nothrow_default_constructible_type (^^int (ClassType:: * [][2][3]) (int)));
+ static_assert (!is_nothrow_default_constructible_type (^^ThrowDefaultClass));
+ static_assert (!is_nothrow_default_constructible_type (^^ExceptDefaultClass));
+ 
+ static_assert (is_nothrow_copy_constructible_type (^^int));
+ static_assert (is_nothrow_copy_constructible_type (^^float));
+ static_assert (is_nothrow_copy_constructible_type (^^EnumType));
+ static_assert (is_nothrow_copy_constructible_type (^^int *));
+ static_assert (is_nothrow_copy_constructible_type (^^int (*) (int)));
+ static_assert (is_nothrow_copy_constructible_type (^^int (ClassType:: *)));
+ static_assert (is_nothrow_copy_constructible_type (^^int (ClassType:: *) (int)));
+ static_assert (is_nothrow_copy_constructible_type (^^NoexceptCopyConsClass));
+ static_assert (is_nothrow_copy_constructible_type (^^const NoexceptCopyConsClass));
+ static_assert (!is_nothrow_copy_constructible_type (^^void));
+ static_assert (!is_nothrow_copy_constructible_type (^^int [2]));
+ static_assert (!is_nothrow_copy_constructible_type (^^int []));
+ static_assert (!is_nothrow_copy_constructible_type (^^float [][3]));
+ static_assert (!is_nothrow_copy_constructible_type (^^EnumType [2][3][4]));
+ static_assert (!is_nothrow_copy_constructible_type (^^int * [3]));
+ static_assert (!is_nothrow_copy_constructible_type (^^int (* [][2]) (int)));
+ static_assert (!is_nothrow_copy_constructible_type (^^int (ClassType:: * [2][3])));
+ static_assert (!is_nothrow_copy_constructible_type (^^int (ClassType:: * [][2][3]) (int)));
+ static_assert (!is_nothrow_copy_constructible_type (^^ClassType (unsigned) const &));
+ static_assert (!is_nothrow_copy_constructible_type (^^bool (ClassType) const));
+ static_assert (!is_nothrow_copy_constructible_type (^^bool (...) &&));
+ static_assert (!is_nothrow_copy_constructible_type (^^EnumType (int, ...)));
+ static_assert (!is_nothrow_copy_constructible_type (^^volatile NoexceptCopyConsClass));
+ static_assert (!is_nothrow_copy_constructible_type (^^ThrowCopyConsClass));
+ static_assert (!is_nothrow_copy_constructible_type (^^ExceptCopyConsClass));
+ 
+ static_assert (is_nothrow_move_constructible_type (^^int));
+ static_assert (is_nothrow_move_constructible_type (^^float));
+ static_assert (is_nothrow_move_constructible_type (^^EnumType));
+ static_assert (is_nothrow_move_constructible_type (^^int *));
+ static_assert (is_nothrow_move_constructible_type (^^int (*) (int)));
+ static_assert (is_nothrow_move_constructible_type (^^int (ClassType:: *)));
+ static_assert (is_nothrow_move_constructible_type (^^int (ClassType:: *) (int)));
+ static_assert (is_nothrow_move_constructible_type (^^NoexceptMoveConsClass));
+ static_assert (!is_nothrow_move_constructible_type (^^void));
+ static_assert (!is_nothrow_move_constructible_type (^^int [2]));
+ static_assert (!is_nothrow_move_constructible_type (^^int []));
+ static_assert (!is_nothrow_move_constructible_type (^^float [][3]));
+ static_assert (!is_nothrow_move_constructible_type (^^EnumType [2][3][4]));
+ static_assert (!is_nothrow_move_constructible_type (^^int * [3]));
+ static_assert (!is_nothrow_move_constructible_type (^^int (* [][2]) (int)));
+ static_assert (!is_nothrow_move_constructible_type (^^int (ClassType:: * [2][3])));
+ static_assert (!is_nothrow_move_constructible_type (^^int (ClassType:: * [][2][3]) (int)));
+ static_assert (!is_nothrow_move_constructible_type (^^ClassType (unsigned) const &));
+ static_assert (!is_nothrow_move_constructible_type (^^bool (ClassType) const));
+ static_assert (!is_nothrow_move_constructible_type (^^bool (...) &&));
+ static_assert (!is_nothrow_move_constructible_type (^^EnumType (int, ...)));
+ static_assert (!is_nothrow_move_constructible_type (^^const NoexceptMoveConsClass));
+ static_assert (!is_nothrow_move_constructible_type (^^volatile NoexceptMoveConsClass));
+ static_assert (!is_nothrow_move_constructible_type (^^ThrowMoveConsClass));
+ static_assert (!is_nothrow_move_constructible_type (^^ExceptMoveConsClass));
+ 
+ static_assert (is_nothrow_assignable_type (^^int &, ^^int));
+ static_assert (is_nothrow_assignable_type (^^int &, ^^const int));
+ static_assert (is_nothrow_assignable_type (^^NoexceptCopyAssignClass &, ^^const NoexceptCopyAssignClass &));
+ static_assert (is_nothrow_assignable_type (^^NoexceptMoveAssignClass &, ^^NoexceptMoveAssignClass &&));
+ static_assert (is_nothrow_assignable_type (^^NoexceptCopyAssignClass &, ^^NoexceptCopyAssignClass &&));
+ static_assert (!is_nothrow_assignable_type (^^int, ^^int));
+ static_assert (!is_nothrow_assignable_type (^^int, ^^const int));
+ static_assert (!is_nothrow_assignable_type (^^ExceptCopyAssignClass &, ^^const ExceptCopyAssignClass &));
+ static_assert (!is_nothrow_assignable_type (^^ExceptMoveAssignClass &, ^^ExceptMoveAssignClass &&));
+ static_assert (!is_nothrow_assignable_type (^^NoexceptMoveAssignClass &, ^^const NoexceptMoveAssignClass &));
+ 
+ static_assert (is_nothrow_copy_assignable_type (^^int));
+ static_assert (is_nothrow_copy_assignable_type (^^float));
+ static_assert (is_nothrow_copy_assignable_type (^^EnumType));
+ static_assert (is_nothrow_copy_assignable_type (^^int *));
+ static_assert (is_nothrow_copy_assignable_type (^^int (*) (int)));
+ static_assert (is_nothrow_copy_assignable_type (^^int (ClassType:: *)));
+ static_assert (is_nothrow_copy_assignable_type (^^int (ClassType:: *) (int)));
+ static_assert (is_nothrow_copy_assignable_type (^^NoexceptCopyAssignClass));
+ static_assert (!is_nothrow_copy_assignable_type (^^void));
+ static_assert (!is_nothrow_copy_assignable_type (^^int [2]));
+ static_assert (!is_nothrow_copy_assignable_type (^^float [][3]));
+ static_assert (!is_nothrow_copy_assignable_type (^^EnumType [2][3][4]));
+ static_assert (!is_nothrow_copy_assignable_type (^^int * [3]));
+ static_assert (!is_nothrow_copy_assignable_type (^^int (* [][2]) (int)));
+ static_assert (!is_nothrow_copy_assignable_type (^^int (ClassType:: * [2][3])));
+ static_assert (!is_nothrow_copy_assignable_type (^^int (ClassType:: * [][2][3]) (int)));
+ static_assert (!is_nothrow_copy_assignable_type (^^ClassType (unsigned) const &));
+ static_assert (!is_nothrow_copy_assignable_type (^^bool (ClassType) const));
+ static_assert (!is_nothrow_copy_assignable_type (^^bool (...) &&));
+ static_assert (!is_nothrow_copy_assignable_type (^^EnumType (int, ...)));
+ static_assert (!is_nothrow_copy_assignable_type (^^ExceptCopyAssignClass));
+ static_assert (!is_nothrow_copy_assignable_type (^^NoexceptMoveAssignClass));
+ static_assert (!is_nothrow_copy_assignable_type (^^ExceptMoveAssignClass));
+ static_assert (!is_nothrow_copy_assignable_type (^^DeletedCopyAssignClass));
+ static_assert (!is_nothrow_copy_assignable_type (^^DeletedMoveAssignClass));
+ 
+ static_assert (is_nothrow_move_assignable_type (^^int));
+ static_assert (is_nothrow_move_assignable_type (^^float));
+ static_assert (is_nothrow_move_assignable_type (^^EnumType));
+ static_assert (is_nothrow_move_assignable_type (^^int *));
+ static_assert (is_nothrow_move_assignable_type (^^int (*) (int)));
+ static_assert (is_nothrow_move_assignable_type (^^int (ClassType:: *)));
+ static_assert (is_nothrow_move_assignable_type (^^int (ClassType:: *) (int)));
+ static_assert (is_nothrow_move_assignable_type (^^NoexceptMoveAssignClass));
+ static_assert (is_nothrow_move_assignable_type (^^NoexceptCopyAssignClass));
+ static_assert (!is_nothrow_move_assignable_type (^^void));
+ static_assert (!is_nothrow_move_assignable_type (^^int [2]));
+ static_assert (!is_nothrow_move_assignable_type (^^float [][3]));
+ static_assert (!is_nothrow_move_assignable_type (^^EnumType [2][3][4]));
+ static_assert (!is_nothrow_move_assignable_type (^^int * [3]));
+ static_assert (!is_nothrow_move_assignable_type (^^int (* [][2]) (int)));
+ static_assert (!is_nothrow_move_assignable_type (^^int (ClassType:: * [2][3])));
+ static_assert (!is_nothrow_move_assignable_type (^^int (ClassType:: * [][2][3]) (int)));
+ static_assert (!is_nothrow_move_assignable_type (^^ClassType (unsigned) const &));
+ static_assert (!is_nothrow_move_assignable_type (^^bool (ClassType) const));
+ static_assert (!is_nothrow_move_assignable_type (^^bool (...) &&));
+ static_assert (!is_nothrow_move_assignable_type (^^EnumType (int, ...)));
+ static_assert (!is_nothrow_move_assignable_type (^^ExceptMoveAssignClass));
+ static_assert (!is_nothrow_move_assignable_type (^^ExceptCopyAssignClass));
+ static_assert (!is_nothrow_move_assignable_type (^^DeletedMoveAssignClass));
+ static_assert (!is_nothrow_move_assignable_type (^^DeletedCopyAssignClass));
+ 
+ static_assert (is_nothrow_destructible_type (^^int));
+ static_assert (is_nothrow_destructible_type (^^const int));
+ static_assert (is_nothrow_destructible_type (^^const volatile int));
+ static_assert (is_nothrow_destructible_type (^^int [12]));
+ static_assert (is_nothrow_destructible_type (^^const int [12]));
+ static_assert (is_nothrow_destructible_type (^^const volatile int [12]));
+ static_assert (is_nothrow_destructible_type (^^decltype (nullptr)));
+ static_assert (is_nothrow_destructible_type (^^std::initializer_list<int>));
+ static_assert (is_nothrow_destructible_type (^^std::initializer_list<decltype (nullptr)>));
+ static_assert (is_nothrow_destructible_type (^^std::initializer_list<N2::TD1>));
+ static_assert (is_nothrow_destructible_type (^^std::initializer_list<N2::TD2>));
+ static_assert (is_nothrow_destructible_type (^^N2::E));
+ static_assert (is_nothrow_destructible_type (^^const N2::E));
+ static_assert (is_nothrow_destructible_type (^^const volatile N2::E));
+ static_assert (is_nothrow_destructible_type (^^N2::NTD1));
+ static_assert (is_nothrow_destructible_type (^^N2::NTD2));
+ static_assert (is_nothrow_destructible_type (^^N2::NTD3));
+ static_assert (is_nothrow_destructible_type (^^N2::Aggr));
+ static_assert (is_nothrow_destructible_type (^^N2::U1));
+ static_assert (is_nothrow_destructible_type (^^void (*) ()));
+ static_assert (is_nothrow_destructible_type (^^void *));
+ static_assert (is_nothrow_destructible_type (^^int &));
+ static_assert (is_nothrow_destructible_type (^^N2::TD1 &));
+ static_assert (is_nothrow_destructible_type (^^N2::TD2 &));
+ static_assert (is_nothrow_destructible_type (^^N2::TD1 *));
+ static_assert (is_nothrow_destructible_type (^^N2::TD2 *));
+ static_assert (is_nothrow_destructible_type (^^void (&) ()));
+ static_assert (is_nothrow_destructible_type (^^void (&&) ()));
+ static_assert (is_nothrow_destructible_type (^^N2::En));
+ static_assert (is_nothrow_destructible_type (^^N2::En *));
+ static_assert (is_nothrow_destructible_type (^^N2::En &));
+ static_assert (is_nothrow_destructible_type (^^N2::En2));
+ static_assert (is_nothrow_destructible_type (^^N2::En2 *));
+ static_assert (is_nothrow_destructible_type (^^N2::En2 &));
+ static_assert (is_nothrow_destructible_type (^^N2::TD1 (&) (N2::Aggr2, N2::TD2)));
+ static_assert (is_nothrow_destructible_type (^^N2::TD1 (*) (N2::Aggr2, N2::TD2)));
+ static_assert (is_nothrow_destructible_type (^^N2::Abstract1));
+ static_assert (is_nothrow_destructible_type (^^N2::Der));
+ static_assert (is_nothrow_destructible_type (^^N2::Del &));
+ static_assert (is_nothrow_destructible_type (^^N2::Del2 &));
+ static_assert (is_nothrow_destructible_type (^^N2::Del3 &));
+ static_assert (is_nothrow_destructible_type (^^N2::Del (&) [1]));
+ static_assert (is_nothrow_destructible_type (^^N2::Del2 (&) [2]));
+ static_assert (is_nothrow_destructible_type (^^N2::Del3 (&) [3]));
+ static_assert (is_nothrow_destructible_type (^^N2::Del &&));
+ static_assert (is_nothrow_destructible_type (^^N2::Del2 &&));
+ static_assert (is_nothrow_destructible_type (^^N2::Del3 &));
+ static_assert (is_nothrow_destructible_type (^^N2::Del (&&) [1]));
+ static_assert (is_nothrow_destructible_type (^^N2::Del2 (&&) [2]));
+ static_assert (is_nothrow_destructible_type (^^N2::Del3 (&&) [3]));
+ static_assert (is_nothrow_destructible_type (^^N2::Ut &));
+ static_assert (is_nothrow_destructible_type (^^N2::Ut &&));
+ static_assert (is_nothrow_destructible_type (^^N2::Ut *));
+ static_assert (is_nothrow_destructible_type (^^N2::Abstract2 &));
+ static_assert (is_nothrow_destructible_type (^^N2::Abstract3 &));
+ static_assert (is_nothrow_destructible_type (^^N2::Abstract2 *));
+ static_assert (is_nothrow_destructible_type (^^N2::Abstract3 *));
+ static_assert (!is_nothrow_destructible_type (^^void));
+ static_assert (!is_nothrow_destructible_type (^^const void));
+ static_assert (!is_nothrow_destructible_type (^^void ()));
+ static_assert (!is_nothrow_destructible_type (^^void () const));
+ static_assert (!is_nothrow_destructible_type (^^N2::TD1 (N2::Aggr2, N2::TD2)));
+ static_assert (!is_nothrow_destructible_type (^^int []));
+ static_assert (!is_nothrow_destructible_type (^^const int []));
+ static_assert (!is_nothrow_destructible_type (^^const volatile int []));
+ static_assert (!is_nothrow_destructible_type (^^int [][123]));
+ static_assert (!is_nothrow_destructible_type (^^N2::TD1));
+ static_assert (!is_nothrow_destructible_type (^^N2::TD2));
+ static_assert (!is_nothrow_destructible_type (^^N2::Aggr2));
+ static_assert (!is_nothrow_destructible_type (^^N2::Aggr2 [1]));
+ static_assert (!is_nothrow_destructible_type (^^N2::TD1 [1][2]));
+ static_assert (!is_nothrow_destructible_type (^^N2::Ut));
+ static_assert (!is_nothrow_destructible_type (^^N2::Ut [3]));
+ static_assert (!is_nothrow_destructible_type (^^N2::AbstractDelDtor));
+ static_assert (!is_nothrow_destructible_type (^^N2::Abstract2));
+ static_assert (!is_nothrow_destructible_type (^^N2::Abstract3));
+ static_assert (!is_nothrow_destructible_type (^^N2::Der2));
+ static_assert (!is_nothrow_destructible_type (^^N2::Del));
+ static_assert (!is_nothrow_destructible_type (^^N2::Del2));
+ static_assert (!is_nothrow_destructible_type (^^N2::Del3));
+ static_assert (!is_nothrow_destructible_type (^^N2::Del [1]));
+ static_assert (!is_nothrow_destructible_type (^^N2::Del2 [2]));
+ static_assert (!is_nothrow_destructible_type (^^N2::Del3 [3]));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait8.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait8.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait8.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait8.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,129 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], type properties.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ class ClassType { };
+ class DerivedType : public ClassType { };
+ enum EnumType { e0 };
+ class AbstractClass { virtual void rotate (int) = 0; };
+ class PolymorphicClass { virtual void rotate (int); };
+ class DerivedPolymorphic : public PolymorphicClass { };
+ class VirtualDestructorClass { virtual ~VirtualDestructorClass (); };
+ 
+ static_assert (has_virtual_destructor (^^VirtualDestructorClass));
+ static_assert (!has_virtual_destructor (^^PolymorphicClass));
+ static_assert (!has_virtual_destructor (^^DerivedPolymorphic));
+ static_assert (!has_virtual_destructor (^^AbstractClass));
+ static_assert (!has_virtual_destructor (^^void));
+ static_assert (!has_virtual_destructor (^^int (int)));
+ static_assert (!has_virtual_destructor (^^int &));
+ static_assert (!has_virtual_destructor (^^EnumType));
+ static_assert (!has_virtual_destructor (^^ClassType));
+ static_assert (!has_virtual_destructor (^^DerivedType));
+ 
+ static_assert (has_unique_object_representations (^^char));
+ static_assert (has_unique_object_representations (^^unsigned char));
+ static_assert (has_unique_object_representations (^^signed char));
+ static_assert (has_unique_object_representations (^^unsigned));
+ static_assert (has_unique_object_representations (^^bool));
+ enum E3 : unsigned { };
+ static_assert (has_unique_object_representations (^^E3));
+ static_assert (has_unique_object_representations (^^unsigned [3]));
+ static_assert (has_unique_object_representations (^^unsigned [3][2]));
+ static_assert (has_unique_object_representations (^^unsigned []));
+ static_assert (has_unique_object_representations (^^unsigned [][2]));
+ static_assert (has_unique_object_representations (^^E3 [3]));
+ static_assert (has_unique_object_representations (^^E3 [3][2]));
+ static_assert (has_unique_object_representations (^^E3 []));
+ static_assert (has_unique_object_representations (^^E3 [][2]));
+ struct Padded { char c1; alignas(4) char c2; };
+ struct Bitfield { int i : 3; };
+ struct Aligned { alignas(4) char c; };
+ static_assert (!has_unique_object_representations (^^void));
+ static_assert (!has_unique_object_representations (^^float));
+ static_assert (!has_unique_object_representations (^^Padded));
+ static_assert (!has_unique_object_representations (^^Padded [2]));
+ static_assert (!has_unique_object_representations (^^Padded [2][1]));
+ static_assert (!has_unique_object_representations (^^Padded []));
+ static_assert (!has_unique_object_representations (^^Padded [][1]));
+ static_assert (!has_unique_object_representations (^^Bitfield));
+ static_assert (!has_unique_object_representations (^^Bitfield [2]));
+ static_assert (!has_unique_object_representations (^^Bitfield [2][1]));
+ static_assert (!has_unique_object_representations (^^Bitfield []));
+ static_assert (!has_unique_object_representations (^^Bitfield [][1]));
+ static_assert (!has_unique_object_representations (^^Aligned));
+ static_assert (!has_unique_object_representations (^^Aligned [2]));
+ static_assert (!has_unique_object_representations (^^Aligned [2][1]));
+ static_assert (!has_unique_object_representations (^^Aligned []));
+ static_assert (!has_unique_object_representations (^^Aligned [][1]));
+ 
+ struct A { A(); };
+ struct B { operator int (); explicit operator int && (); };
+ struct C { operator int (); explicit operator int & (); };
+ 
+ static_assert (!reference_constructs_from_temporary (^^int, ^^int));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^void));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^const volatile void));
+ static_assert (!reference_constructs_from_temporary (^^void, ^^void));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^int));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^int &));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^int &&));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^long));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^long &));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^long &&));
+ static_assert (reference_constructs_from_temporary (^^const int &, ^^int));
+ static_assert (!reference_constructs_from_temporary (^^const int &, ^^int &));
+ static_assert (!reference_constructs_from_temporary (^^const int &, ^^int &&));
+ static_assert (reference_constructs_from_temporary (^^const int &, ^^long));
+ static_assert (reference_constructs_from_temporary (^^const int &, ^^long &));
+ static_assert (reference_constructs_from_temporary (^^const int &, ^^long &&));
+ static_assert (reference_constructs_from_temporary (^^int &&, ^^int));
+ static_assert (!reference_constructs_from_temporary (^^int &&, ^^int &));
+ static_assert (!reference_constructs_from_temporary (^^int &&, ^^int &&));
+ static_assert (reference_constructs_from_temporary (^^int &&, ^^long));
+ static_assert (reference_constructs_from_temporary (^^int &&, ^^long &));
+ static_assert (reference_constructs_from_temporary (^^int &&, ^^long &&));
+ static_assert (reference_constructs_from_temporary (^^const A &, ^^A));
+ static_assert (!reference_constructs_from_temporary (^^const A &, ^^A &&));
+ static_assert (reference_constructs_from_temporary (^^A &&, ^^A));
+ static_assert (!reference_constructs_from_temporary (^^int &, ^^int []));
+ static_assert (!reference_constructs_from_temporary (^^const int &, ^^int []));
+ static_assert (!reference_constructs_from_temporary (^^int &&, ^^int []));
+ static_assert (!reference_constructs_from_temporary (^^int &&, ^^B));
+ static_assert (!reference_constructs_from_temporary (^^const int &, ^^C));
+ static_assert (reference_constructs_from_temporary (^^const std::string &, ^^const char *));
+ 
+ static_assert (!reference_converts_from_temporary (^^int, ^^int));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^void));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^const volatile void));
+ static_assert (!reference_converts_from_temporary (^^void, ^^void));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^int));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^int &));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^int &&));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^long));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^long &));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^long &&));
+ static_assert (reference_converts_from_temporary (^^const int &, ^^int));
+ static_assert (!reference_converts_from_temporary (^^const int &, ^^int &));
+ static_assert (!reference_converts_from_temporary (^^const int &, ^^int &&));
+ static_assert (reference_converts_from_temporary (^^const int &, ^^long));
+ static_assert (reference_converts_from_temporary (^^const int &, ^^long &));
+ static_assert (reference_converts_from_temporary (^^const int &, ^^long &&));
+ static_assert (reference_converts_from_temporary (^^int &&, ^^int));
+ static_assert (!reference_converts_from_temporary (^^int &&, ^^int &));
+ static_assert (!reference_converts_from_temporary (^^int &&, ^^int &&));
+ static_assert (reference_converts_from_temporary (^^int &&, ^^long));
+ static_assert (reference_converts_from_temporary (^^int &&, ^^long &));
+ static_assert (reference_converts_from_temporary (^^int &&, ^^long &&));
+ static_assert (reference_converts_from_temporary (^^const A &, ^^A));
+ static_assert (!reference_converts_from_temporary (^^const A &, ^^A &&));
+ static_assert (reference_converts_from_temporary (^^A &&, ^^A));
+ static_assert (!reference_converts_from_temporary (^^int &, ^^int []));
+ static_assert (!reference_converts_from_temporary (^^const int &, ^^int []));
+ static_assert (!reference_converts_from_temporary (^^int &&, ^^int []));
+ static_assert (reference_converts_from_temporary (^^int &&, ^^B));
+ static_assert (reference_converts_from_temporary (^^const int &, ^^C));
+ static_assert (reference_converts_from_temporary (^^const std::string &, ^^const char *));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait9.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait9.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/type_trait9.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/type_trait9.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,67 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test reflection type traits [meta.reflection.traits], type property
+ // queries.
+ 
+ #include <meta>
+ using namespace std::meta;
+ 
+ class ClassType { };
+ 
+ static_assert (rank (^^int) == 0);
+ static_assert (rank (^^const void) == 0);
+ static_assert (rank (^^char &) == 0);
+ static_assert (rank (^^long &&) == 0);
+ static_assert (rank (^^int [2]) == 1);
+ static_assert (rank (^^int [][4]) == 2);
+ static_assert (rank (^^int [2][2][4][4][6][6]) == 6);
+ static_assert (rank (^^int []) == 1);
+ static_assert (rank (^^ClassType) == 0);
+ static_assert (rank (^^ClassType [2]) == 1);
+ static_assert (rank (^^ClassType [][4]) == 2);
+ static_assert (rank (^^ClassType [2][2][4][4][6][6]) == 6);
+ static_assert (rank (^^ClassType []) == 1);
+ using D = ClassType [2][2][4][4][6][6][6];
+ static_assert (rank (^^D) == 7);
+ 
+ static_assert (extent (^^int) == 0);
+ static_assert (extent (^^const void, 0) == 0);
+ static_assert (extent (^^char &, 42) == 0);
+ static_assert (extent (^^long &&, 18) == 0);
+ static_assert (extent (^^int [2]) == 2);
+ static_assert (extent (^^int [2][4]) == 2);
+ static_assert (extent (^^int [][4]) == 0);
+ static_assert (extent (^^int []) == 0);
+ static_assert (extent (^^int, 0) == 0);
+ static_assert (extent (^^int [2], 0) == 2);
+ static_assert (extent (^^int [2][4], 0) == 2);
+ static_assert (extent (^^int [][4], 0) == 0);
+ static_assert (extent (^^int [], 0) == 0);
+ static_assert (extent (^^int, 1) == 0);
+ static_assert (extent (^^int [2], 1) == 0);
+ static_assert (extent (^^int [2][4], 1) == 4);
+ static_assert (extent (^^int [][4], 1) == 4);
+ static_assert (extent (^^int [10][4][6][8][12][2], 4) == 12);
+ static_assert (extent (^^int [], 1) == 0);
+ static_assert (extent (^^ClassType) == 0);
+ static_assert (extent (^^ClassType [2]) == 2);
+ static_assert (extent (^^ClassType [2][4]) == 2);
+ static_assert (extent (^^ClassType [][4]) == 0);
+ static_assert (extent (^^ClassType, 0) == 0);
+ static_assert (extent (^^ClassType [2], 0) == 2);
+ static_assert (extent (^^ClassType [2][4], 0) == 2);
+ static_assert (extent (^^ClassType [][4], 0) == 0);
+ static_assert (extent (^^ClassType, 1) == 0);
+ static_assert (extent (^^ClassType [2], 1) == 0);
+ static_assert (extent (^^ClassType [2][4], 1) == 4);
+ static_assert (extent (^^ClassType [][4], 1) == 4);
+ static_assert (extent (^^ClassType [10][4][6][8][12][2], 4) == 12);
+ 
+ __extension__ void
+ ext ()
+ {
+   static_assert (rank (^^int [0]) == 1);
+   static_assert (extent (^^int [0]) == 0);
+   static_assert (extent (^^int [0], 0) == 0);
+   static_assert (extent (^^int [0], 1) == 0);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/u8display_string_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/u8display_string_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/u8display_string_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/u8display_string_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,230 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::u8display_string_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr info null_reflection;
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T () {}
+   T (const T &) {}
+   ~T () {}
+ };
+ struct U {
+   int u;
+   int v : 5;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ namespace {
+   namespace NS2 {}
+ };
+ namespace NS3 {
+   namespace {
+     namespace {
+       namespace NS4 {}
+     }
+   }
+ };
+ enum { Z };
+ 
+ constexpr auto ctx = access_context::current ();
+ 
+ struct AN { int a; long b; char c; };
+ 
+ [[=1, =AN { 1, 42, ' ' }]] void bar (long, const T f, int g[2], T &);
+ 
+ struct V1 {
+   constexpr V1 (int) {}
+ };
+ struct V2 {
+   V2 &operator = (const V2 &);
+ };
+ struct V3 {
+   V3 &operator = (V3 &&);
+ };
+ struct V4 {
+   V4 &operator += (const V4 &);
+ };
+ struct V5 {
+   operator int ();
+ };
+ int operator ""_a (const char *);
+ 
+ void
+ foo (int a, const long b, T c, int d[4], T &e)
+ {
+   static_assert (u8display_string_of (^^a) == u8"a");
+   static_assert (u8display_string_of (^^b) == u8"b");
+   static_assert (u8display_string_of (^^c) == u8"c");
+   static_assert (u8display_string_of (^^d) == u8"d");
+   static_assert (u8display_string_of (^^e) == u8"e");
+   static_assert (u8display_string_of (parameters_of (^^foo)[0]) == u8"<parameter a of void foo(int, long int, T, int*, T&)>");
+   static_assert (u8display_string_of (parameters_of (^^foo)[1]) == u8"<parameter b of void foo(int, long int, T, int*, T&)>");
+   static_assert (u8display_string_of (parameters_of (^^foo)[2]) == u8"<parameter c of void foo(int, long int, T, int*, T&)>");
+   static_assert (u8display_string_of (parameters_of (^^foo)[3]) == u8"<parameter d of void foo(int, long int, T, int*, T&)>");
+   static_assert (u8display_string_of (parameters_of (^^foo)[4]) == u8"<parameter e of void foo(int, long int, T, int*, T&)>");
+   static_assert (u8display_string_of (parameters_of (^^bar)[0]) == u8"<unnamed parameter 1 of void bar(long int, T, int*, T&)>");
+   static_assert (u8display_string_of (parameters_of (^^bar)[1]) == u8"<parameter f of void bar(long int, T, int*, T&)>");
+   static_assert (u8display_string_of (parameters_of (^^bar)[2]) == u8"<parameter g of void bar(long int, T, int*, T&)>");
+   static_assert (u8display_string_of (parameters_of (^^bar)[3]) == u8"<unnamed parameter 4 of void bar(long int, T, int*, T&)>");
+   static_assert (u8display_string_of (null_reflection) == u8"<null reflection>");
+   static_assert (u8display_string_of (^^::) == u8"::");
+   static_assert (u8display_string_of (^^NS2) == u8"{anonymous}::NS2");
+   static_assert (u8display_string_of (parent_of (^^NS2)) == u8"{anonymous}");
+   static_assert (u8display_string_of (^^NS3::NS4) == u8"NS3::{anonymous}::{anonymous}::NS4");
+   static_assert (u8display_string_of (parent_of (^^NS3::NS4)) == u8"NS3::{anonymous}::{anonymous}");
+   static_assert (u8display_string_of (parent_of (parent_of (^^NS3::NS4))) == u8"NS3::{anonymous}");
+   static_assert (u8display_string_of (parent_of (parent_of (parent_of   (^^NS3::NS4)))) == u8"NS3");
+   static_assert (u8display_string_of (^^Z) == u8"Z");
+   static_assert (u8display_string_of (parent_of (^^Z)) == u8"<unnamed enum>");
+   static_assert (u8display_string_of (reflect_constant (42)) == u8"42");
+   static_assert (u8display_string_of (reflect_object (arr[1])) == u8"arr[1]");
+   static_assert (u8display_string_of (^^arr) == u8"arr");
+   static_assert (u8display_string_of (^^a3) == u8"a3");
+   static_assert (u8display_string_of (^^fn) == u8"void fn()");
+   static_assert (u8display_string_of (^^fn2) == u8"auto& fn2()");
+   static_assert (u8display_string_of (^^Enum::A) == u8"A");
+   static_assert (u8display_string_of (^^Alias) == u8"Alias {aka int}");
+   static_assert (u8display_string_of (^^S) == u8"S");
+   static_assert (u8display_string_of (^^S::mem) == u8"S::mem");
+   static_assert (u8display_string_of (members_of (^^S, ctx)[1]) == u8"S::<unnamed bit-field>");
+   static_assert (u8display_string_of (^^TCls) == u8"template<auto <anonymous> > struct TCls");
+   static_assert (u8display_string_of (^^TFn) == u8"template<auto <anonymous> > void TFn()");
+   static_assert (u8display_string_of (^^TVar) == u8"template<auto <anonymous> > int TVar<<anonymous> >");
+   static_assert (u8display_string_of (^^Concept) == u8"template<auto <anonymous> > concept Concept");
+   static_assert (u8display_string_of (^^NSAlias) == u8"NSAlias");
+   static_assert (u8display_string_of (^^NS) == u8"NS");
+   static_assert (u8display_string_of (bases_of (^^S, ctx)[0]) == u8"S: B");
+   static_assert (u8display_string_of (data_member_spec (^^int, { .name = "member", .alignment = 128, .no_unique_address = true })) == u8"(int, member, 128, , true)");
+   static_assert (u8display_string_of (data_member_spec (^^const int, { .name = "member", .bit_width = 6 })) == u8"(const int, member, , 6, false)");
+   static_assert (u8display_string_of (data_member_spec (^^int, { .bit_width = 0 })) == u8"(int, , , 0, false)");
+   static_assert (u8display_string_of (data_member_spec (^^long, { .bit_width = 5 })) == u8"(long int, , , 5, false)");
+   static_assert (u8display_string_of (annotations_of (^^bar)[0]) == u8"[[=1]]");
+   static_assert (u8display_string_of (annotations_of (^^bar)[1]) == u8"[[=AN{1, 42, ' '}]]");
+   static_assert (u8display_string_of (^^int) == u8"int");
+   static_assert (u8display_string_of (^^unsigned) == u8"unsigned int");
+   static_assert (u8display_string_of (^^unsigned long) == u8"long unsigned int");
+   static_assert (u8display_string_of (^^const long long &) == u8"const long long int&");
+   static_assert (u8display_string_of (^^const double **) == u8"const double**");
+   static_assert (u8display_string_of (^^int (int)) == u8"int(int)");
+   static_assert (u8display_string_of (^^int (&) (int, long, S &)) == u8"int (&)(int, long int, S&)");
+   static_assert (u8display_string_of (^^int (*) (int, long, S &)) == u8"int (*)(int, long int, S&)");
+   static_assert (u8display_string_of (members_of (^^V2, ctx)[0]) == u8"V2& V2::operator=(const V2&)");
+   static_assert (u8display_string_of (members_of (^^V3, ctx)[0]) == u8"V3& V3::operator=(V3&&)");
+   static_assert (u8display_string_of (members_of (^^V4, ctx)[0]) == u8"V4& V4::operator+=(const V4&)");
+   static_assert (u8display_string_of (members_of (^^V5, ctx)[0]) == u8"V5::operator int()");
+   static_assert (u8display_string_of (^^operator""_a) == u8"int operator\"\"_a(const char*)");
+ }
+ 
+ namespace NS5 {
+   int arr[] = {1, 2, 3};
+   auto [a1, a2, a3] = arr;
+   void fn();
+   auto &fn2();
+   enum Enum { A };
+   using Alias = int;
+   struct B {};
+   struct S : B {
+     int mem;
+     int : 0;
+   };
+   struct T {
+     T () {}
+     T (const T &) {}
+     ~T () {}
+   };
+   struct U {
+     int u;
+     int v : 5;
+   };
+   template<auto> struct TCls {};
+   template<auto> void TFn();
+   template<auto> int TVar;
+   template<auto> concept Concept = requires { true; };
+   enum { Z };
+ 
+   struct AN { int a; long b; char c; };
+ 
+   [[=1, =AN { 1, 42, ' ' }]] void bar (long, const T f, int g[2], T &);
+ 
+   struct V1 {
+     constexpr V1 (int) {}
+   };
+   struct V2 {
+     V2 &operator = (const V2 &);
+   };
+   struct V3 {
+     V3 &operator = (V3 &&);
+   };
+   struct V4 {
+     V4 &operator += (const V4 &);
+   };
+   struct V5 {
+     operator int ();
+   };
+   int operator ""_a (const char *);
+ 
+   void
+   foo (int a, const long b, T c, int d[4], T &e)
+   {
+     static_assert (u8display_string_of (^^a) == u8"a");
+     static_assert (u8display_string_of (^^b) == u8"b");
+     static_assert (u8display_string_of (^^c) == u8"c");
+     static_assert (u8display_string_of (^^d) == u8"d");
+     static_assert (u8display_string_of (^^e) == u8"e");
+     static_assert (u8display_string_of (parameters_of (^^foo)[0]) == u8"<parameter a of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (u8display_string_of (parameters_of (^^foo)[1]) == u8"<parameter b of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (u8display_string_of (parameters_of (^^foo)[2]) == u8"<parameter c of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (u8display_string_of (parameters_of (^^foo)[3]) == u8"<parameter d of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (u8display_string_of (parameters_of (^^foo)[4]) == u8"<parameter e of void NS5::foo(int, long int, T, int*, T&)>");
+     static_assert (u8display_string_of (parameters_of (^^bar)[0]) == u8"<unnamed parameter 1 of void NS5::bar(long int, T, int*, T&)>");
+     static_assert (u8display_string_of (parameters_of (^^bar)[1]) == u8"<parameter f of void NS5::bar(long int, T, int*, T&)>");
+     static_assert (u8display_string_of (parameters_of (^^bar)[2]) == u8"<parameter g of void NS5::bar(long int, T, int*, T&)>");
+     static_assert (u8display_string_of (parameters_of (^^bar)[3]) == u8"<unnamed parameter 4 of void NS5::bar(long int, T, int*, T&)>");
+     static_assert (u8display_string_of (^^Z) == u8"NS5::Z");
+     static_assert (u8display_string_of (parent_of (^^Z)) == u8"NS5::<unnamed enum>");
+     static_assert (u8display_string_of (reflect_constant (42)) == u8"42");
+     static_assert (u8display_string_of (reflect_object (arr[1])) == u8"NS5::arr[1]");
+     static_assert (u8display_string_of (^^arr) == u8"NS5::arr");
+     static_assert (u8display_string_of (^^a3) == u8"NS5::a3");
+     static_assert (u8display_string_of (^^fn) == u8"void NS5::fn()");
+     static_assert (u8display_string_of (^^fn2) == u8"auto& NS5::fn2()");
+     static_assert (u8display_string_of (^^Enum::A) == u8"NS5::A");
+     static_assert (u8display_string_of (^^Alias) == u8"NS5::Alias {aka int}");
+     static_assert (u8display_string_of (^^S) == u8"NS5::S");
+     static_assert (u8display_string_of (^^S::mem) == u8"NS5::S::mem");
+     static_assert (u8display_string_of (members_of (^^S, ctx)[1]) == u8"NS5::S::<unnamed bit-field>");
+     static_assert (u8display_string_of (^^TCls) == u8"template<auto <anonymous> > struct NS5::TCls");
+     static_assert (u8display_string_of (^^TFn) == u8"template<auto <anonymous> > void NS5::TFn()");
+     static_assert (u8display_string_of (^^TVar) == u8"template<auto <anonymous> > int NS5::TVar<<anonymous> >");
+     static_assert (u8display_string_of (^^Concept) == u8"template<auto <anonymous> > concept NS5::Concept");
+     static_assert (u8display_string_of (bases_of (^^S, ctx)[0]) == u8"NS5::S: NS5::B");
+     static_assert (u8display_string_of (annotations_of (^^bar)[0]) == u8"[[=1]]");
+     static_assert (u8display_string_of (annotations_of (^^bar)[1]) == u8"[[=NS5::AN{1, 42, ' '}]]");
+     static_assert (u8display_string_of (^^int (&) (int, long, S &)) == u8"int (&)(int, long int, NS5::S&)");
+     static_assert (u8display_string_of (^^int (*) (int, long, S &)) == u8"int (*)(int, long int, NS5::S&)");
+     static_assert (u8display_string_of (members_of (^^V2, ctx)[0]) == u8"NS5::V2& NS5::V2::operator=(const NS5::V2&)");
+     static_assert (u8display_string_of (members_of (^^V3, ctx)[0]) == u8"NS5::V3& NS5::V3::operator=(NS5::V3&&)");
+     static_assert (u8display_string_of (members_of (^^V4, ctx)[0]) == u8"NS5::V4& NS5::V4::operator+=(const NS5::V4&)");
+     static_assert (u8display_string_of (members_of (^^V5, ctx)[0]) == u8"NS5::V5::operator int()");
+     static_assert (u8display_string_of (^^operator""_a) == u8"int NS5::operator\"\"_a(const char*)");
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/u8identifier_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/u8identifier_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/u8identifier_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/u8identifier_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,168 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::u8identifier_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ struct C { };
+ 
+ constexpr std::u8string_view sv = std::meta::u8identifier_of (^^C);
+ static_assert (sv == u8"C");
+ static_assert (sv.data ()[0] == u8'C');
+ static_assert (sv.data ()[1] == u8'\0');
+ 
+ struct S { };
+ using T = int;
+ using U = S;
+ enum E { E1, E2 };
+ enum { E3, E4 };
+ typedef enum { E5, E6 } E7;
+ 
+ static_assert (u8identifier_of (^^T) == std::u8string_view (u8"T"));
+ static_assert (u8identifier_of (^^S) == std::u8string_view (u8"S"));
+ static_assert (u8identifier_of (^^U) == std::u8string_view (u8"U"));
+ static_assert (u8identifier_of (^^std) == std::u8string_view (u8"std"));
+ static_assert (u8identifier_of (^^std::meta) == std::u8string_view (u8"meta"));
+ static_assert (u8identifier_of (^^E1) == std::u8string_view (u8"E1"));
+ static_assert (u8identifier_of (^^E) == std::u8string_view (u8"E"));
+ static_assert (u8identifier_of (parent_of (^^E5)) == std::u8string_view (u8"E7"));
+ static_assert (u8identifier_of (^^E7) == std::u8string_view (u8"E7"));
+ static_assert (u8identifier_of (data_member_spec (^^long, { .name = u8"foo", .bit_width = 6 })) == std::u8string_view (u8"foo"));
+ static_assert (u8identifier_of (data_member_spec (^^long, { .name = u8"extremely_long_string_used_as_identifier" })) == std::u8string_view (u8"extremely_long_string_used_as_identifier"));
+ 
+ namespace N {}
+ namespace NA = N;
+ static_assert (u8identifier_of (^^N) == std::u8string_view (u8"N"));
+ static_assert (u8identifier_of (^^NA) == std::u8string_view (u8"NA"));
+ 
+ namespace {
+   int a;
+   namespace M {}
+   static_assert (u8identifier_of (^^a) == std::u8string_view (u8"a"));
+   static_assert (u8identifier_of (^^M) == std::u8string_view (u8"M"));
+ }
+ 
+ typedef struct {
+   int a;
+   static_assert (u8identifier_of (^^a) == std::u8string_view (u8"a"));
+ } SV;
+ static_assert (u8identifier_of (^^SV) == std::u8string_view (u8"SV"));
+ static_assert (u8identifier_of (parent_of (^^SV::a)) == std::u8string_view (u8"SV"));
+ static_assert (u8identifier_of (dealias (^^SV)) == std::u8string_view (u8"SV"));
+ 
+ template <int N>
+ struct ST
+ {
+   static_assert (u8identifier_of (^^ST) == std::u8string_view (u8"ST"));
+ };
+ 
+ struct V
+ {
+   void foo () { int a; static_assert (u8identifier_of (parent_of (^^a)) == std::u8string_view (u8"foo")); }
+   template <int N>
+   void bar () { int a; static_assert (u8identifier_of (parent_of (^^a)) == std::u8string_view (u8"bar")); }
+ };
+ 
+ int
+ operator ""_a (const char *)
+ {
+   int a;
+   static_assert (u8identifier_of (parent_of (^^a)) == std::u8string_view (u8"_a"));
+   return 0;
+ }
+ 
+ int v;
+ static_assert (u8identifier_of (^^V::foo) == std::u8string_view (u8"foo"));
+ static_assert (u8identifier_of (^^V::bar) == std::u8string_view (u8"bar"));
+ 
+ void foo (int);
+ static_assert (u8identifier_of (^^foo) == std::u8string_view (u8"foo"));
+ 
+ int arr[3];
+ 
+ void
+ foo (int a)
+ {
+   auto [b, c, d] = arr;
+   static_assert (u8identifier_of (^^foo) == std::u8string_view (u8"foo"));
+   static_assert (u8identifier_of (^^a) == std::u8string_view (u8"a"));
+   static_assert (u8identifier_of (^^b) == std::u8string_view (u8"b"));
+   static_assert (u8identifier_of (^^c) == std::u8string_view (u8"c"));
+   static_assert (u8identifier_of (^^d) == std::u8string_view (u8"d"));
+ }
+ 
+ template <int N>
+ void
+ bar (int a)
+ {
+   auto [...b, c] = arr;
+   static_assert (u8identifier_of (^^a) == std::u8string_view (u8"a"));
+   static_assert (u8identifier_of (^^c) == std::u8string_view (u8"c"));
+ }
+ 
+ void
+ baz ()
+ {
+   auto a = [] {
+     int a;
+     static_assert (u8identifier_of (^^a) == std::u8string_view (u8"a"));
+     static_assert (u8identifier_of (parent_of (parent_of (parent_of (^^a)))) == std::u8string_view (u8"baz"));
+   };
+   using t = decltype (a);
+   static_assert (u8identifier_of (^^t) == std::u8string_view (u8"t"));
+ }
+ 
+ void qux (int, int b, int c, int d, int);
+ constexpr auto p0 = parameters_of (^^qux)[0];
+ constexpr auto p1 = parameters_of (^^qux)[1];
+ constexpr auto p2 = parameters_of (^^qux)[2];
+ constexpr auto p3 = parameters_of (^^qux)[3];
+ constexpr auto p4 = parameters_of (^^qux)[4];
+ static_assert (u8identifier_of (p1) == std::u8string_view (u8"b"));
+ static_assert (u8identifier_of (p2) == std::u8string_view (u8"c"));
+ static_assert (u8identifier_of (p3) == std::u8string_view (u8"d"));
+ void qux (int a, int, int c, int e, int);
+ static_assert (u8identifier_of (p0) == std::u8string_view (u8"a"));
+ static_assert (u8identifier_of (p1) == std::u8string_view (u8"b"));
+ static_assert (u8identifier_of (p2) == std::u8string_view (u8"c"));
+ 
+ void
+ qux (int a, int, int, int e, int)
+ {
+   static_assert (u8identifier_of (p0) == std::u8string_view (u8"a"));
+   static_assert (u8identifier_of (p1) == std::u8string_view (u8"b"));
+   static_assert (u8identifier_of (p2) == std::u8string_view (u8"c"));
+   static_assert (u8identifier_of (variable_of (p0)) == std::u8string_view (u8"a"));
+   static_assert (u8identifier_of (variable_of (p3)) == std::u8string_view (u8"e"));
+ }
+ 
+ void qux (int f, int, int, int, int g);
+ static_assert (u8identifier_of (p1) == std::u8string_view (u8"b"));
+ static_assert (u8identifier_of (p2) == std::u8string_view (u8"c"));
+ static_assert (u8identifier_of (p4) == std::u8string_view (u8"g"));
+ 
+ template <typename... T>
+ void
+ freddy (int a, T... b)
+ {
+ }
+ 
+ static_assert (u8identifier_of (parameters_of (^^freddy <int, long, char>)[0]) == std::u8string_view (u8"a"));
+ 
+ struct {
+   int a;
+ } s;
+ 
+ static_assert (u8identifier_of (^^s) == std::u8string_view (u8"s"));
+ 
+ int qu\u00E6 = 1;
+ 
+ static_assert (u8identifier_of (^^qu\u00E6) == std::u8string_view (u8"qu\N{LATIN SMALL LETTER AE}"));
+ 
+ typedef enum {
+   E8,
+   E9
+ } E10;
+ static_assert (u8identifier_of (parent_of (^^E8)) == std::u8string_view (u8"E10"));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/u8symbol_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/u8symbol_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/u8symbol_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/u8symbol_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,61 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::u8symbol_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval bool
+ has_u8symbol_of (operators op)
+ {
+   try { u8symbol_of (op); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!has_u8symbol_of (static_cast <operators> (4242)));
+ static_assert (u8symbol_of (op_new) == std::u8string_view (u8"new"));
+ static_assert (u8symbol_of (op_delete) == std::u8string_view (u8"delete"));
+ static_assert (u8symbol_of (op_array_new) == std::u8string_view (u8"new[]"));
+ static_assert (u8symbol_of (op_array_delete) == std::u8string_view (u8"delete[]"));
+ static_assert (u8symbol_of (op_co_await) == std::u8string_view (u8"co_await"));
+ static_assert (u8symbol_of (op_parentheses) == std::u8string_view (u8"()"));
+ static_assert (u8symbol_of (op_square_brackets) == std::u8string_view (u8"[]"));
+ static_assert (u8symbol_of (op_arrow) == std::u8string_view (u8"->"));
+ static_assert (u8symbol_of (op_arrow_star) == std::u8string_view (u8"->*"));
+ static_assert (u8symbol_of (op_tilde) == std::u8string_view (u8"~"));
+ static_assert (u8symbol_of (op_exclamation) == std::u8string_view (u8"!"));
+ static_assert (u8symbol_of (op_plus) == std::u8string_view (u8"+"));
+ static_assert (u8symbol_of (op_minus) == std::u8string_view (u8"-"));
+ static_assert (u8symbol_of (op_star) == std::u8string_view (u8"*"));
+ static_assert (u8symbol_of (op_slash) == std::u8string_view (u8"/"));
+ static_assert (u8symbol_of (op_percent) == std::u8string_view (u8"%"));
+ static_assert (u8symbol_of (op_caret) == std::u8string_view (u8"^"));
+ static_assert (u8symbol_of (op_ampersand) == std::u8string_view (u8"&"));
+ static_assert (u8symbol_of (op_equals) == std::u8string_view (u8"="));
+ static_assert (u8symbol_of (op_pipe) == std::u8string_view (u8"|"));
+ static_assert (u8symbol_of (op_plus_equals) == std::u8string_view (u8"+="));
+ static_assert (u8symbol_of (op_minus_equals) == std::u8string_view (u8"-="));
+ static_assert (u8symbol_of (op_star_equals) == std::u8string_view (u8"*="));
+ static_assert (u8symbol_of (op_slash_equals) == std::u8string_view (u8"/="));
+ static_assert (u8symbol_of (op_percent_equals) == std::u8string_view (u8"%="));
+ static_assert (u8symbol_of (op_caret_equals) == std::u8string_view (u8"^="));
+ static_assert (u8symbol_of (op_ampersand_equals) == std::u8string_view (u8"&="));
+ static_assert (u8symbol_of (op_pipe_equals) == std::u8string_view (u8"|="));
+ static_assert (u8symbol_of (op_equals_equals) == std::u8string_view (u8"=="));
+ static_assert (u8symbol_of (op_exclamation_equals) == std::u8string_view (u8"!="));
+ static_assert (u8symbol_of (op_less) == std::u8string_view (u8"<"));
+ static_assert (u8symbol_of (op_greater) == std::u8string_view (u8">"));
+ static_assert (u8symbol_of (op_less_equals) == std::u8string_view (u8"<="));
+ static_assert (u8symbol_of (op_greater_equals) == std::u8string_view (u8">="));
+ static_assert (u8symbol_of (op_spaceship) == std::u8string_view (u8"<=>"));
+ static_assert (u8symbol_of (op_ampersand_ampersand) == std::u8string_view (u8"&&"));
+ static_assert (u8symbol_of (op_pipe_pipe) == std::u8string_view (u8"||"));
+ static_assert (u8symbol_of (op_less_less) == std::u8string_view (u8"<<"));
+ static_assert (u8symbol_of (op_greater_greater) == std::u8string_view (u8">>"));
+ static_assert (u8symbol_of (op_less_less_equals) == std::u8string_view (u8"<<="));
+ static_assert (u8symbol_of (op_greater_greater_equals) == std::u8string_view (u8">>="));
+ static_assert (u8symbol_of (op_plus_plus) == std::u8string_view (u8"++"));
+ static_assert (u8symbol_of (op_minus_minus) == std::u8string_view (u8"--"));
+ static_assert (u8symbol_of (op_comma) == std::u8string_view (u8","));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/underlying_type1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/underlying_type1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/underlying_type1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/underlying_type1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::underlying_type.
+ 
+ #include <meta>
+ 
+ constexpr auto a = std::meta::underlying_type (^^int);	// { dg-error "uncaught exception of type" }
+ 
+ enum E {
+   E0 = 1,
+   E1 = std::meta::underlying_type (^^E) == ^^int,	// { dg-error "uncaught exception of type" }
+   E2 = 2						// { dg-error "enumerator value for 'E1' is not an integer constant" "" { target *-*-* } .-1 }
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/using1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/using1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/using1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/using1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,13 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ struct A {
+   int a;
+   consteval A(int p) : a(p) {}
+ };
+ 
+ constexpr auto r = ^^A;
+ 
+ struct B : A {
+   using typename [: r :]::A;
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/value_or_object1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/value_or_object1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/value_or_object1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/value_or_object1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,50 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::is_value and is_object.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ constexpr int i = 42;
+ 
+ template<int N>
+ constexpr int v = N;
+ 
+ static_assert (!is_object (^^i));
+ static_assert (!is_value (^^i));
+ static_assert (is_variable (^^i));
+ static_assert (!is_object (reflect_constant (^^i)));
+ static_assert (is_value (reflect_constant (^^i)));
+ static_assert (!is_variable (reflect_constant (^^i)));
+ static_assert (!is_object (substitute (^^v, { reflect_constant (15) })));
+ static_assert (!is_object (^^v<15>));
+ static_assert (!is_value (^^v<15>));
+ static_assert (is_variable (^^v<15>));
+ static_assert (is_value (reflect_constant (^^v<15>)));
+ static_assert (!is_object (reflect_constant (^^v<15>)));
+ static_assert (!is_variable (reflect_constant (^^v<15>)));
+ 
+ constexpr std::pair<std::pair<int, bool>, int> p = {{1, true}, 2};
+ constexpr info rfirst = reflect_object (p.first);
+ static_assert (is_object (rfirst) && !is_value (rfirst));
+ static_assert (type_of (rfirst) == ^^const std::pair<int, bool>);
+ static_assert (rfirst != reflect_constant (std::make_pair (1, true)));
+ 
+ constexpr int k = 3;
+ constexpr const int *pk = &k;
+ constexpr const int &ref = k;
+ constexpr auto rp = ^^pk;
+ constexpr auto rref = ^^ref;
+ static_assert (is_variable (rp));
+ static_assert (!is_object (rp));
+ static_assert (!is_value (rp));
+ static_assert (!is_variable (reflect_constant (rp)));
+ static_assert (!is_object (reflect_constant (rp)));
+ static_assert (is_value (reflect_constant (rp)));
+ static_assert (is_variable (rref));
+ static_assert (!is_object (rref));
+ static_assert (!is_value (rref));
+ static_assert (!is_variable (reflect_constant (rref)));
+ static_assert (!is_object (reflect_constant (rref)));
+ static_assert (is_value (reflect_constant (rref)));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variable_of1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variable_of1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variable_of1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variable_of1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,136 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::variable_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ int arr[] = {1, 2, 3};
+ auto [a1, a2, a3] = arr;
+ void fn();
+ auto &fn2();
+ enum Enum { A };
+ using Alias = int;
+ struct B {};
+ struct S : B {
+   int mem;
+   int : 0;
+ };
+ struct T {
+   T ();
+   T (const T &);
+   ~T ();
+ };
+ struct U {
+   int u;
+ };
+ template<auto> struct TCls {};
+ template<auto> void TFn();
+ template<auto> int TVar;
+ template<auto> concept Concept = requires { true; };
+ namespace NS {};
+ namespace NSAlias = NS;
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ consteval bool
+ has_variable_of (info r)
+ {
+   try { variable_of (r); }
+   catch (std::meta::exception &) { return false; }
+   return true;
+ }
+ 
+ static_assert (!has_variable_of (std::meta::reflect_constant (42)));
+ static_assert (!has_variable_of (std::meta::reflect_object (arr[1])));
+ static_assert (!has_variable_of (^^arr));
+ static_assert (!has_variable_of (^^a3));
+ static_assert (!has_variable_of (^^fn));
+ static_assert (!has_variable_of (^^fn2));
+ static_assert (!has_variable_of (^^Enum::A));
+ static_assert (!has_variable_of (^^Alias));
+ static_assert (!has_variable_of (^^S));
+ static_assert (!has_variable_of (^^S::mem));
+ static_assert (!has_variable_of (std::meta::members_of (^^S, ctx)[1]));
+ static_assert (!has_variable_of (^^TCls));
+ static_assert (!has_variable_of (^^TFn));
+ static_assert (!has_variable_of (^^TVar));
+ static_assert (!has_variable_of (^^Concept));
+ static_assert (!has_variable_of (^^NSAlias));
+ static_assert (!has_variable_of (^^NS));
+ static_assert (!has_variable_of (std::meta::bases_of (^^S, ctx)[0]));
+ static_assert (!has_variable_of (std::meta::data_member_spec (^^int, { .name = "member" })));
+ 
+ void
+ bar (long, const T f, int g[2], T &)
+ {
+ }
+ 
+ void
+ foo (int a, const long b, T c, int d[4], T &e)
+ {
+   static_assert (!has_variable_of (^^a));
+   static_assert (!has_variable_of (^^b));
+   static_assert (!has_variable_of (^^c));
+   static_assert (!has_variable_of (^^d));
+   static_assert (!has_variable_of (^^e));
+   static_assert (has_variable_of (parameters_of (^^foo)[0]));
+   static_assert (has_variable_of (parameters_of (^^foo)[1]));
+   static_assert (has_variable_of (parameters_of (^^foo)[2]));
+   static_assert (has_variable_of (parameters_of (^^foo)[3]));
+   static_assert (has_variable_of (parameters_of (^^foo)[4]));
+   static_assert (!has_variable_of (parameters_of (^^bar)[0]));
+   static_assert (!has_variable_of (parameters_of (^^bar)[1]));
+   static_assert (!has_variable_of (parameters_of (^^bar)[2]));
+   static_assert (!has_variable_of (parameters_of (^^bar)[3]));
+   static_assert (variable_of (parameters_of (^^foo)[0]) == ^^a);
+   static_assert (variable_of (parameters_of (^^foo)[1]) == ^^b);
+   static_assert (variable_of (parameters_of (^^foo)[2]) == ^^c);
+   static_assert (variable_of (parameters_of (^^foo)[3]) == ^^d);
+   static_assert (variable_of (parameters_of (^^foo)[4]) == ^^e);
+   static_assert (variable_of (parameters_of (^^foo)[0]) != parameters_of (^^foo)[0]);
+   static_assert (variable_of (parameters_of (^^foo)[1]) != parameters_of (^^foo)[1]);
+   static_assert (variable_of (parameters_of (^^foo)[2]) != parameters_of (^^foo)[2]);
+   static_assert (variable_of (parameters_of (^^foo)[3]) != parameters_of (^^foo)[3]);
+   static_assert (variable_of (parameters_of (^^foo)[4]) != parameters_of (^^foo)[4]);
+   static_assert (parameters_of (^^foo)[0] != ^^a);
+   static_assert (parameters_of (^^foo)[1] != ^^b);
+   static_assert (parameters_of (^^foo)[2] != ^^c);
+   static_assert (parameters_of (^^foo)[3] != ^^d);
+   static_assert (parameters_of (^^foo)[4] != ^^e);
+ }
+ 
+ consteval bool
+ baz (int a, info b, info c, info d)
+ {
+   if (a != 43)
+     return false;
+   if (b != d)
+     return false;
+   if (b == c)
+     return false;
+   if (b == parameters_of (^^baz)[1])
+     return false;
+ 
+   // variable can be accessed only in innermost scope
+   try { variable_of (c); return false; }
+   catch (exception) {}
+   try { variable_of (parameters_of (^^baz)[1]); return false; } 
+   catch (exception) {}
+   return true;
+ }
+ 
+ consteval bool
+ qux (int a)
+ {
+   return baz (a + 1, ^^a, parameters_of (^^qux)[0],
+   // TODO: This doesn't work yet, I think we want to check
+   // whether DECL_CONTEXT of the PARM_DECL is current_function_decl
+   // or any of the ctx->call->fundef->decl on the constexpr evaluation
+   // stack.  But currently we only have access to the innermost.
+ 	      // variable_of (parameters_of (^^qux)[0]));
+ 	      ^^a);
+ }
+ 
+ static_assert (qux (42));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variable_of2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variable_of2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variable_of2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variable_of2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,21 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::variable_of.
+ 
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ consteval int fn(int p) {
+   constexpr auto rp = parameters_of(^^fn)[0];
+   constexpr auto rv = variable_of(rp);
+   static_assert(is_function_parameter(rp));
+   static_assert(!is_function_parameter(rv));
+   static_assert(!is_variable(rp));
+   static_assert(is_variable(rv));
+   static_assert(^^p == rv);
+ 
+   return [:variable_of(parameters_of(^^fn)[0]):];
+ }
+ 
+ static_assert(fn(42) == 42);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variable_of3.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variable_of3.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variable_of3.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variable_of3.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,28 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::variable_of.
+ 
+ #include <meta>
+ #include <utility>
+ 
+ using namespace std::meta;
+ 
+ constexpr int fn(int, int) {
+   return [: variable_of (parameters_of (^^fn)[0]) :]
+        + [: variable_of (parameters_of (^^fn)[1]) :];
+ }
+ 
+ static_assert(fn(10, 32) == 42);
+ 
+ template<typename... Args>
+ constexpr int bar(Args...)
+ {
+   constexpr int vt[] {__integer_pack (sizeof...(Args))...};
+   constexpr auto [...ids] = vt;
+   return (0 + ... + [: variable_of (parameters_of (^^bar<Args...>)[ids]) :]);
+ }
+ 
+ static_assert(bar(42) == 42);
+ static_assert(bar(10, 32) == 42);
+ static_assert(bar(10, 15, 17) == 42);
+ static_assert(bar(10, 15, 11, 6) == 42);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variant1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variant1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variant1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variant1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,37 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::variant_{size,alternative}.
+ 
+ #include <meta>
+ #include <variant>
+ 
+ using namespace std::meta;
+ 
+ using V0 = std::variant<>;
+ static_assert (variant_size (^^V0) == 0);
+ static_assert (variant_size (^^const V0) == 0);
+ 
+ using V1 = std::variant<void *>;
+ static_assert (variant_size (^^V1) == 1);
+ static_assert (variant_size (^^const V1) == 1);
+ static_assert (variant_alternative (0, ^^V1) == ^^void *);
+ 
+ using V4 = std::variant<long, long, void *, double>;
+ static_assert (variant_size (^^V4) == 4);
+ static_assert (variant_size (^^const V4) == 4);
+ static_assert (variant_alternative (0, ^^V4) == ^^long);
+ static_assert (variant_alternative (1, ^^V4) == ^^long);
+ static_assert (variant_alternative (2, ^^V4) == ^^void *);
+ static_assert (variant_alternative (3, ^^V4) == ^^double);
+ // cv-qualification on the variant type propagates to the extracted alternative type.
+ static_assert (variant_alternative (0, ^^const V4) == ^^const long);
+ static_assert (variant_alternative (1, ^^const V4) == ^^const long);
+ static_assert (variant_alternative (2, ^^const V4) == ^^void *const);
+ static_assert (variant_alternative (3, ^^const V4) == ^^const double);
+ 
+ using mytype1 = float;
+ using mytype2 = mytype1 *;
+ using V2 = std::variant<mytype1, mytype2>;
+ static_assert (variant_size (^^V2) == 2);
+ static_assert (variant_alternative (0, ^^V2) == ^^float);
+ static_assert (variant_alternative (1, ^^V2) == ^^float *);
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variant2.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variant2.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/variant2.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/variant2.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,19 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::meta::variant_{size,alternative}.
+ 
+ #include <meta>
+ #include <variant>
+ 
+ using namespace std::meta;
+ 
+ constexpr auto s1 = variant_size (^^int); // { dg-error "couldn't instantiate 'std::variant_size<int>'" }
+ int x;
+ constexpr auto s2 = variant_size (^^x); // { dg-error "uncaught exception" }
+ 
+ constexpr auto r1 = variant_alternative (0, ^^std::variant<>); // { dg-error "uncaught exception" }
+ constexpr auto r2 = variant_alternative (0, ^^int); // { dg-error "uncaught exception" }
+ constexpr auto r3 = variant_alternative (0, ^^x); // { dg-error "uncaught exception" }
+ 
+ // { dg-error "static assertion failed" "" { target *-*-* } 0 }
+ // { dg-error "pack index .0." "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/vector1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/vector1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/vector1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/vector1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,28 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ // Test std::vector<std::meta::info>.
+ 
+ #include <vector>
+ #include <meta>
+ 
+ using namespace std::meta;
+ 
+ void die ();
+ 
+ consteval void
+ f ()
+ {
+   constexpr auto e = std::vector<info>{^^int}[0];
+   typename [:e:] i = 42;
+   auto f = std::vector<info>{^^int}[0];
+   std::vector<info> v1 = { ^^int };
+   auto v2 = std::vector<info>{^^int};
+   if (v1.size () != v2.size ())
+     die ();
+ }
+ 
+ void
+ g ()
+ {
+   f ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/reflect/visibility1.C gcc-16-20260118/gcc/testsuite/g++.dg/reflect/visibility1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/reflect/visibility1.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/reflect/visibility1.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,121 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection -O0" }
+ 
+ #include <meta>
+ 
+ template <int N, std::meta::info I>
+ void
+ foo ()
+ {
+ }
+ 
+ struct A {};
+ 
+ namespace
+ {
+   void baz (int) {}
+   struct B {};
+   struct C : public A {};
+   template <typename T>
+   struct G {};
+ }
+ 
+ struct D : public B {};
+ 
+ template <typename T>
+ struct F {};
+ 
+ struct H : public A {};
+ 
+ static union { int au; };
+ int b;
+ static int c;
+ 
+ constexpr auto ctx = std::meta::access_context::current ();
+ 
+ static void
+ bar (int x)
+ {
+   int v = 42;
+   foo <100, ^^x> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi100EL" } } - var in TU-local fn
+   foo <101, ^^v> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi101EL" } } - var in TU-local fn
+   foo <102, parameters_of (^^baz)[0]> ();	// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi102EL" } } - param of TU-local fn
+   foo <103, bases_of (^^C, ctx)[0]> ();		// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi103EL" } } - direct base relationship with TU-local derived
+   foo <104, bases_of (^^D, ctx)[0]> ();		// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi104EL" } } - direct base relationship with TU-local base
+   foo <105, data_member_spec (^^B, { .name = "foo" })> (); // { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi105EL" } } - data member spec with TU-local type
+ }
+ 
+ inline void
+ qux (int x)
+ {
+   int v = 42;
+   foo <106, ^^x> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi106EL" } } - var in inline fn - TODO, shall this be exported?
+   foo <107, ^^v> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi107EL" } } - var in inline fn - TODO, shall this be exported?
+ }
+ 
+ template <int N>
+ void
+ plugh (int x)
+ {
+   int v = 42;
+   foo <132, ^^x> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi132EL" } } - var in public fn template instantiation - TODO, shall this be exported?
+   foo <133, ^^v> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi133EL" } } - var in public fn template instantiation - TODO, shall this be exported?
+   foo <134, parameters_of (parent_of (^^v))[0]> (); // { dg-final { scan-assembler "\t.weak\t_Z3fooILi134EL" { target *-*-linux* } } } - fn parm of public fn template instantiation
+ }
+ 
+ namespace {
+ template <int N>
+ void
+ garply (int x)
+ {
+   int v = 42;
+   foo <135, ^^x> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi135EL" } } - var in TU-local fn template instantiation
+   foo <136, ^^v> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi136EL" } } - var in Tu-local fn template instantiation
+   foo <137, parameters_of (parent_of (^^v))[0]> (); // { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi137EL" } } - fn parm of TU-local fn template instantiation
+ }
+ }
+ 
+ template <typename T>
+ void
+ fred (int x)
+ {
+   int v = 42;
+   foo <138, ^^x> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi138EL" } } - var in TU-local fn template instantiation
+   foo <139, ^^v> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi139EL" } } - var in Tu-local fn template instantiation
+   foo <140, parameters_of (parent_of (^^v))[0]> (); // { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi140EL" { xfail *-*-* } } } - fn parm of TU-local fn template instantiation - TODO, I think this shouldn't be exported and the mangling of these 3 doesn't include the template parameter
+ }
+ 
+ [[=1]] void
+ xyzzy (int x)
+ {
+   int v;
+   struct E {};
+   qux (x);
+   foo <108, annotations_of (^^xyzzy)[0]> ();	// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi108EL" } } - annotations always TU-local
+   foo <109, parameters_of (^^bar)[0]> ();	// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi109EL" } } - fn parm of TU-local fn
+   foo <110, parameters_of (^^qux)[0]> ();	// { dg-final { scan-assembler "\t.weak\t_Z3fooILi110EL" { target *-*-linux* } } } - fn parm of inline fn
+   foo <111, parameters_of (^^xyzzy)[0]> ();	// { dg-final { scan-assembler "\t.weak\t_Z3fooILi111EL" { target *-*-linux* } } } - fn parm of public fn
+   foo <112, ^^B> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi112EL" } } - TU-local class
+   foo <113, ^^C> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi113EL" } } - TU-local class
+   foo <114, ^^D> ();				// { dg-final { scan-assembler "\t.weak\t_Z3fooILi114EL" { target *-*-linux* } } } - public class
+   foo <115, ^^E> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi115EL" } } - TU-local class
+   foo <116, ^^au> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi116EL" } } - anon union var at namespace scope
+   foo <117, ^^F> ();				// { dg-final { scan-assembler "\t.weak\t_Z3fooILi117EL" { target *-*-linux* } } } - public template
+   foo <118, ^^F <int>> ();			// { dg-final { scan-assembler "\t.weak\t_Z3fooILi118EL" { target *-*-linux* } } } - specialization of public template
+   foo <119, ^^F <A>> ();			// { dg-final { scan-assembler "\t.weak\t_Z3fooILi119EL" { target *-*-linux* } } } - specialization of public template
+   foo <120, ^^F <B>> ();			// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi120EL" } } - specialization with TU-local parameter
+   foo <121, ^^G> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi121EL" } } - TU-local template
+   foo <122, ^^G <int>> ();			// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi122EL" } } - specialization of TU-local template
+   foo <123, ^^G <A>> ();			// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi123EL" } } - specialization of TU-local template
+   foo <124, ^^G <B>> ();			// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi124EL" } } - specialization of TU-local template
+   foo <125, ^^x> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi125EL" } } - var in public fn but non-comdat - TODO, shall this be exported?
+   foo <126, ^^v> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi126EL" } } - var in public fn but non-comdat - TODO, shall this be exported?
+   foo <127, std::meta::info {}> ();		// { dg-final { scan-assembler "\t.weak\t_Z3fooILi127EL" { target *-*-linux* } } } - null reflection
+   foo <128, ^^b> ();				// { dg-final { scan-assembler "\t.weak\t_Z3fooILi128EL" { target *-*-linux* } } } - public variable
+   foo <129, ^^c> ();				// { dg-final { scan-assembler-not "\t.weak\t_Z3fooILi129EL" } } - TU-local variable
+   foo <130, data_member_spec (^^D, { .name = "foo" })> (); // { dg-final { scan-assembler "\t.weak\t_Z3fooILi130EL" { target *-*-linux* } } } - data member spec with public type
+   foo <131, bases_of (^^H, ctx)[0]> ();		// { dg-final { scan-assembler "\t.weak\t_Z3fooILi131EL" { target *-*-linux* } } } - direct base relationship with both types public
+   plugh <42> (x);
+   garply <42> (x);
+   fred <B> (x);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/tree-ssa/vector-compare-1.C gcc-16-20260118/gcc/testsuite/g++.dg/tree-ssa/vector-compare-1.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/tree-ssa/vector-compare-1.C	Sun Jan 11 22:32:10 2026
--- gcc-16-20260118/gcc/testsuite/g++.dg/tree-ssa/vector-compare-1.C	Sun Jan 18 22:32:09 2026
***************
*** 1,4 ****
! // { dg-do compile { target { c++11 && non_strict_align } } }
  // { dg-options "-O2 -fdump-tree-optimized" }
  
  // PR tree-optimization/116651
--- 1,6 ----
! // Even though arm sometimes has unaligned loads, memcmp is not transformed so disable
! // the test for arm targets.
! // { dg-do compile { target { c++11 && { non_strict_align && { ! { arm*-*-* } } } } } }
  // { dg-options "-O2 -fdump-tree-optimized" }
  
  // PR tree-optimization/116651
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/vect/pr123525-2.cc gcc-16-20260118/gcc/testsuite/g++.dg/vect/pr123525-2.cc
*** gcc-16-20260111/gcc/testsuite/g++.dg/vect/pr123525-2.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/vect/pr123525-2.cc	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,38 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-march=tigerlake -std=c++23" { target { x86_64-*-* i?86-*-* } } } */
+ /* { dg-additional-options "-std=c++23" } */
+ 
+ short ScAddress_nTabP;
+ struct ScAddress {
+   short nCol;
+   short nTab;
+   ScAddress(short nColP) : nCol(nColP), nTab(ScAddress_nTabP) {}
+ };
+ 
+ struct ScRange {
+   ScAddress aStart;
+ };
+ 
+ struct CellRangeAddress {
+   int StartColumn;
+   int StartRow;
+   int EndColumn;
+   int EndRow;
+ };
+ 
+ struct ScCellRangeObj {
+   ScCellRangeObj(int, ScRange &);
+ };
+ 
+ CellRangeAddress ScVbaRangeMergeArea_aCellAddress;
+ void ScVbaRangeMergeArea() {
+   if (ScVbaRangeMergeArea_aCellAddress.StartColumn == 0 &&
+       ScVbaRangeMergeArea_aCellAddress.EndColumn == 0 &&
+       ScVbaRangeMergeArea_aCellAddress.StartRow == 0 &&
+       ScVbaRangeMergeArea_aCellAddress.EndRow == 0)
+     ;
+   else {
+     ScRange refRange(ScVbaRangeMergeArea_aCellAddress.StartColumn);
+     ScCellRangeObj(0, refRange);
+   }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/warn/Warray-bounds-pr122824.C gcc-16-20260118/gcc/testsuite/g++.dg/warn/Warray-bounds-pr122824.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/warn/Warray-bounds-pr122824.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/warn/Warray-bounds-pr122824.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,15 ----
+ // { dg-do compile }
+ // { dg-options "-O2 -std=gnu++23 -Warray-bounds" }
+ 
+ #include <format>
+ 
+ template <typename... Args>
+ auto foo(std::format_string<Args...> && format, Args &&... args)
+ {
+   return std::format(std::move(format), std::forward<Args>(args)...);
+ }
+ 
+ int main()
+ {
+   auto a = foo("{}", 42);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-10.C gcc-16-20260118/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-10.C
*** gcc-16-20260111/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-10.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.dg/warn/Wmismatched-new-delete-10.C	Sun Jan 18 22:32:09 2026
***************
*** 0 ****
--- 1,25 ----
+ // PR tree-optimization/123513
+ // { dg-do compile }
+ // { dg-options "-Wmismatched-new-delete" }
+ 
+ typedef __SIZE_TYPE__ size_t;
+ 
+ template <size_t N>
+ class A {};
+ struct B { B (); };
+ 
+ template <size_t N>
+ void *operator new (size_t, A <N> &);
+ 
+ template <size_t N>
+ void operator delete (void *, A <N> &);
+ 
+ void
+ foo (B *, A <1024> &);
+ 
+ void
+ bar ()
+ {
+   A <1024> a;
+   foo (new (a) B (), a);	// { dg-bogus "called on pointer returned from a mismatched allocation function" }
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.old-deja/g++.other/lineno2.C gcc-16-20260118/gcc/testsuite/g++.old-deja/g++.other/lineno2.C
*** gcc-16-20260111/gcc/testsuite/g++.old-deja/g++.other/lineno2.C	Sun Jan 11 22:32:10 2026
--- gcc-16-20260118/gcc/testsuite/g++.old-deja/g++.other/lineno2.C	Sun Jan 18 22:32:10 2026
***************
*** 2,15 ****
  // Submitted by Nathan Sidwell <nathan@acm.org>
  // Bug: g++ wasn't listing candidates for a failed conversion.
  
! void f(int, double);		// { dg-message "" } candidate
! void f(double, int);		// { dg-message "" } candidate
! void f(int);			// { dg-message "" } candidate
  
  int
  main ()
  {
    void (*ptr)(int, int);
    
!   ptr = &f;			// { dg-error "" } no match
  }
--- 2,15 ----
  // Submitted by Nathan Sidwell <nathan@acm.org>
  // Bug: g++ wasn't listing candidates for a failed conversion.
  
! void f(int, double);		// { dg-message "candidate" }
! void f(double, int);		// { dg-message "candidate" }
! void f(int);			// { dg-message "candidate" }
  
  int
  main ()
  {
    void (*ptr)(int, int);
    
!   ptr = &f;			// { dg-error "no matches" }
  }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.old-deja/g++.pt/t37.C gcc-16-20260118/gcc/testsuite/g++.old-deja/g++.pt/t37.C
*** gcc-16-20260111/gcc/testsuite/g++.old-deja/g++.pt/t37.C	Sun Jan 11 22:32:10 2026
--- gcc-16-20260118/gcc/testsuite/g++.old-deja/g++.pt/t37.C	Sun Jan 18 22:32:10 2026
***************
*** 1,14 ****
  // { dg-do compile  }
  
! class A { // { dg-message "A::A" } synthesized copy ctor
!   // { dg-message "defined here" "note" { target *-*-* } .-1 }
  public:
!   A(int);			// { dg-message "A::A" }
!   A(float);			// { dg-message "A::A" }
    ~A();
  };
  
! A::A() {		// { dg-error "" } 
  }
    
  A::A(int) {
--- 1,14 ----
  // { dg-do compile  }
  
! class A { // { dg-message "A::A\\\(const A&\\\)" } synthesized copy ctor
!   // { dg-message "'class A' defined here" "note" { target *-*-* } .-1 }
  public:
!   A(int);			// { dg-message "A::A\\\(int\\\)" }
!   A(float);			// { dg-message "A::A\\\(float\\\)" }
    ~A();
  };
  
! A::A() {		// { dg-error "no declaration matches" } 
  }
    
  A::A(int) {
diff -Nrcpad gcc-16-20260111/gcc/testsuite/g++.target/i386/avx512fp16-pr123607.C gcc-16-20260118/gcc/testsuite/g++.target/i386/avx512fp16-pr123607.C
*** gcc-16-20260111/gcc/testsuite/g++.target/i386/avx512fp16-pr123607.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/g++.target/i386/avx512fp16-pr123607.C	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,60 ----
+ // PR target/123607
+ // { dg-do assemble { target avx512fp16 } }
+ // { dg-options "-std=c++23 -O2 -mavx512fp16" }
+ 
+ namespace std::simd {
+ template <int> struct basic_mask {
+   bool _M_data;
+   bool operator[](int) { return _M_data; }
+ };
+ template <int _Ap>
+   requires(_Ap > 1)
+ struct basic_mask<_Ap> {
+   static constexpr int _N0 = _Ap / 2;
+   using _Mask1 = basic_mask<_N0>;
+   _Mask1 _M_data1;
+   static basic_mask _S_init(basic_mask<_N0>, _Mask1 __y) {
+     basic_mask __r;
+     __r._M_data1 = __y;
+     return __r;
+   }
+ };
+ template <int _Ap> struct basic_vec {
+   _Float16 _M_data;
+   using mask_type = basic_mask<_Ap>;
+   friend mask_type operator<(basic_vec __x, basic_vec __y) {
+     return mask_type(__x._M_data < __y._M_data);
+   }
+   friend basic_vec __select_impl(mask_type __k, basic_vec __t, basic_vec __f) {
+     return __k[0] ? __t : __f;
+   }
+ };
+ template <int _Ap>
+   requires(_Ap > 1)
+ struct basic_vec<_Ap> {
+   static constexpr int _N0 = _Ap / 2;
+   using _DataType1 = basic_vec<_N0>;
+   _DataType1 _M_data0;
+   _DataType1 _M_data1;
+   using mask_type = basic_mask<_Ap>;
+   static basic_vec _S_init(_DataType1 __y) {
+     basic_vec __r;
+     __r._M_data1 = __y;
+     return __r;
+   }
+   friend mask_type operator<(basic_vec __x, basic_vec __y) {
+     return mask_type::_S_init(__x._M_data0 < __y._M_data0,
+                               __x._M_data1 < __y._M_data1);
+   }
+   friend basic_vec __select_impl(mask_type __k, basic_vec __t, basic_vec __f) {
+     return _S_init(__select_impl(__k._M_data1, __t._M_data1, __f._M_data1));
+   }
+ };
+ basic_vec<4> b;
+ basic_vec<4> max(basic_vec<4> a) {
+   basic_mask __trans_tmp_1 = a < b;
+   return __select_impl(__trans_tmp_1, b, a);
+ }
+ }
+ namespace simd = std::simd;
+ simd::basic_vec test_runner___trans_tmp_2 = max(simd::basic_vec<4>());
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.c-torture/compile/pr120250.c gcc-16-20260118/gcc/testsuite/gcc.c-torture/compile/pr120250.c
*** gcc-16-20260111/gcc/testsuite/gcc.c-torture/compile/pr120250.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.c-torture/compile/pr120250.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,38 ----
+ /* PR target/120250 */
+ 
+ int a = 5, b = 7, c, *d;
+ void *l;
+ void foo (const char *s);
+ void bar (void);
+ void qux (const char *, int);
+ 
+ int
+ baz (int *d, int a, int b)
+ {
+   int c = 0;
+   for (int i = 0; i < a; ++i)
+     for (int j = 0; j < b; ++j)
+       c += d[i * b + j];
+   return c;
+ }
+ 
+ int
+ main ()
+ {
+   d = __builtin_malloc (a * b * sizeof (int));
+   if (!d)
+     {
+       foo ("foo");
+       __builtin_exit (1);
+     }
+   for (int i = 0; i < a; ++i)
+     for (int j = 0; j < b; ++j)
+       d[i * b + j] = i * b + j;
+   l = (void *) &bar;
+   goto *l;
+ bar:
+   c = baz (d, a, b);
+   qux ("bar", c);
+   __builtin_free (d);
+   return 0;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/Wstrict-overflow-1.c gcc-16-20260118/gcc/testsuite/gcc.dg/Wstrict-overflow-1.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/Wstrict-overflow-1.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/Wstrict-overflow-1.c	Thu Jan  1 00:00:00 1970
***************
*** 1,13 ****
- /* { dg-do compile } */
- /* { dg-options "-fstrict-overflow -O2 -Wstrict-overflow=3" } */
- 
- /* Source: Ian Lance Taylor.  Based on strict-overflow-1.c.  */
- 
- /* We can only simplify the conditional when using strict overflow
-    semantics.  */
- 
- int
- foo (int i)
- {
-   return i - 5 < 10; /* { dg-warning "assuming signed overflow does not occur" "correct warning" } */
- }
--- 0 ----
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/asm-hard-reg-error-1.c gcc-16-20260118/gcc/testsuite/gcc.dg/asm-hard-reg-error-1.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/asm-hard-reg-error-1.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/asm-hard-reg-error-1.c	Sun Jan 18 22:32:10 2026
*************** test (void)
*** 65,71 ****
    __asm__ ("" :: GPR1","GPR2 (42), GPR2","GPR3 (42));
    __asm__ ("" :: GPR1","GPR2 (42), GPR3","GPR2 (42)); /* { dg-error "multiple inputs to hard register" } */
    __asm__ ("" :: GPR1","GPR2 (42), GPR1","GPR3 (42)); /* { dg-error "multiple inputs to hard register" } */
-   __asm__ ("" :: GPR1 GPR2 (42), GPR2 (42)); /* { dg-error "multiple inputs to hard register" } */
    __asm__ ("" : "+"GPR1 (x), "="GPR1 (y)); /* { dg-error "multiple outputs to hard register" } */
    __asm__ ("" : "="GPR1 (y) : GPR1 (42), "0" (42)); /* { dg-error "multiple inputs to hard register" } */
    __asm__ ("" : "+"GPR1 (x) : GPR1 (42)); /* { dg-error "multiple inputs to hard register" } */
--- 65,70 ----
*************** test (void)
*** 74,80 ****
    __asm__ ("" : "="GPR2 (gpr1)); /* { dg-error "constraint and register 'asm' for output operand 0 are unsatisfiable" } */
    __asm__ ("" :: GPR2 (gpr1)); /* { dg-error "constraint and register 'asm' for input operand 0 are unsatisfiable" } */
    __asm__ ("" : "="GPR1 (x) : "0" (gpr1));
!   __asm__ ("" : "="GPR1 GPR2 (x) : "0" (gpr1)); /* { dg-error "constraint and register 'asm' for input operand 0 are unsatisfiable" } */
  
    __asm__ ("" : "=&"GPR1 (x) : "0" (gpr1));
    __asm__ ("" : "=&"GPR1 (x) : "0" (42));
--- 73,79 ----
    __asm__ ("" : "="GPR2 (gpr1)); /* { dg-error "constraint and register 'asm' for output operand 0 are unsatisfiable" } */
    __asm__ ("" :: GPR2 (gpr1)); /* { dg-error "constraint and register 'asm' for input operand 0 are unsatisfiable" } */
    __asm__ ("" : "="GPR1 (x) : "0" (gpr1));
!   __asm__ ("" : "="GPR2 (x) : "0" (gpr1)); /* { dg-error "constraint and register 'asm' for input operand 0 are unsatisfiable" } */
  
    __asm__ ("" : "=&"GPR1 (x) : "0" (gpr1));
    __asm__ ("" : "=&"GPR1 (x) : "0" (42));
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/asm-hard-reg-error-6.c gcc-16-20260118/gcc/testsuite/gcc.dg/asm-hard-reg-error-6.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/asm-hard-reg-error-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/asm-hard-reg-error-6.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,35 ----
+ /* { dg-do compile { target lra } } */
+ 
+ #if defined __hppa__
+ # define R0 "20"
+ # define R1 "21"
+ #elif defined __AVR__
+ # define R0 "20"
+ # define R1 "24"
+ #elif defined __PRU__
+ # define R0 "0"
+ # define R1 "4"
+ #else
+ # define R0 "0"
+ # define R1 "1"
+ #endif
+ 
+ int
+ test (void)
+ {
+   int x;
+ 
+   __asm__ ("" : "={"R0"}{"R1"}" (x));            /* { dg-error "multiple hard register constraints in one alternative are not supported" } */
+   __asm__ ("" : "={"R0"}m{"R1"}" (x) : "r" (x)); /* { dg-error "multiple hard register constraints in one alternative are not supported" } */
+   __asm__ ("" : "={"R0"}m" (x) : "r" (x));
+   __asm__ ("" : "=r" (x) : "{"R0"}{"R1"}" (x));  /* { dg-error "multiple hard register constraints in one alternative are not supported" } */
+   __asm__ ("" : "=r" (x) : "{"R0"}i{"R1"}" (x)); /* { dg-error "multiple hard register constraints in one alternative are not supported" } */
+   __asm__ ("" : "=r" (x) : "{"R0"}i" (x));
+ 
+   __asm__ ("" : "={"R0"}r" (x) : "r" (x)); /* { dg-error "hard register constraints and regular register constraints in one alternative are not supported" } */
+   __asm__ ("" : "=r{"R0"}" (x) : "r" (x)); /* { dg-error "hard register constraints and regular register constraints in one alternative are not supported" } */
+   __asm__ ("" : "=r" (x) : "{"R0"}r" (x)); /* { dg-error "hard register constraints and regular register constraints in one alternative are not supported" } */
+   __asm__ ("" : "=r" (x) : "r{"R0"}" (x)); /* { dg-error "hard register constraints and regular register constraints in one alternative are not supported" } */
+ 
+   return x;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2-char.c gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2-char.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2-char.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2-char.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,8 ----
+ /* Test the attribute counted_by for pointer field in anonymous struct/union
+    and its usage in __builtin_dynamic_object_size.  */
+ /* { dg-do run } */
+ /* { dg-options "-O2" } */
+ 
+ #define PTR_TYPE char 
+ #define FAM_TYPE char 
+ #include "counted-by-anonymous-2.c"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2-float.c gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2-float.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2-float.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2-float.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,8 ----
+ /* Test the attribute counted_by for pointer field in anonymous struct/union
+    and its usage in __builtin_dynamic_object_size.  */
+ /* { dg-do run } */
+ /* { dg-options "-O2" } */
+ 
+ #define PTR_TYPE float 
+ #define FAM_TYPE float 
+ #include "counted-by-anonymous-2.c"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2-struct.c gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2-struct.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2-struct.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2-struct.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,16 ----
+ /* Test the attribute counted_by for pointer field in anonymous struct/union
+    and its usage in __builtin_dynamic_object_size.  */
+ /* { dg-do run } */
+ /* { dg-options "-O2" } */
+ 
+ struct A {
+   int a;
+   char *b;
+ };
+ struct B {
+   float a;
+   double b;
+ };
+ #define PTR_TYPE struct A
+ #define FAM_TYPE struct B 
+ #include "counted-by-anonymous-2.c"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2-union.c gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2-union.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2-union.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2-union.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,16 ----
+ /* Test the attribute counted_by for pointer field in anonymous struct/union
+    and its usage in __builtin_dynamic_object_size.  */
+ /* { dg-do run } */
+ /* { dg-options "-O2" } */
+ 
+ union A {
+   int a;
+   char *b;
+ };
+ union B {
+   float a;
+   double b;
+ };
+ #define PTR_TYPE union A
+ #define FAM_TYPE union B 
+ #include "counted-by-anonymous-2.c"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2.c gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-2.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,66 ----
+ /* Test the attribute counted_by for pointer field in anonymous struct/union
+    and its usage in __builtin_dynamic_object_size.  */
+ /* { dg-do run } */
+ /* { dg-options "-O2" } */
+ 
+ #include "builtin-object-size-common.h"
+ #ifndef PTR_TYPE
+ #define PTR_TYPE int
+ #endif
+ #ifndef FAM_TYPE
+ #define FAM_TYPE int
+ #endif
+ 
+ #define __counted_by(member) \
+     __attribute__((__counted_by__(member)))
+ 
+ struct nested_mixed {
+   struct {
+     union {
+       int b;
+       float f;
+     };
+     int n;
+   };
+   struct {
+     PTR_TYPE *pointer __counted_by(n);
+     FAM_TYPE c[] __counted_by(b);
+   };
+ } *nested_mixed_annotated;
+ 
+ 
+ void __attribute__((__noinline__)) setup (int pointer_array_count,
+ 					  int fam_count)
+ {
+   nested_mixed_annotated
+     = (struct nested_mixed *) malloc (sizeof (struct nested_mixed)
+ 				      + fam_count * sizeof (FAM_TYPE));
+   nested_mixed_annotated->pointer 
+     = (PTR_TYPE *) malloc (sizeof (PTR_TYPE) * pointer_array_count);
+   nested_mixed_annotated->b = fam_count;
+   nested_mixed_annotated->n = pointer_array_count;
+   return;
+ }
+ 
+ void __attribute__((__noinline__)) test ()
+ {
+   EXPECT(__builtin_dynamic_object_size(nested_mixed_annotated->c, 1),
+ 	 nested_mixed_annotated->b * sizeof (FAM_TYPE));
+   EXPECT(__builtin_dynamic_object_size(nested_mixed_annotated->pointer, 1),
+ 	 nested_mixed_annotated->n * sizeof (PTR_TYPE));
+ }
+ 
+ void cleanup ()
+ {
+   free (nested_mixed_annotated->pointer);
+   free (nested_mixed_annotated);
+ }
+ 
+ int main(int argc, char *argv[])
+ {
+   setup (10,20);   
+   test ();
+   DONE ();
+   cleanup ();
+   return 0;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-3.c gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-3.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous-3.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous-3.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,44 ----
+ /* Testing the correct usage of attribute counted_by for anonymous
+    structures with -fms-extensions.  */
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -fms-extensions" } */
+ 
+ #define __counted_by(member) \
+     __attribute__((__counted_by__(member)))
+ 
+ /* Do not support the inward-to-outward counted-by field reference for 
+    ms-extensions since checking the validity of such reference depends
+    on unknown situation at the end of the structure definition.  */
+ struct bar {
+   char *buf __counted_by (n); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ };
+ 
+ struct foo {
+   int n;
+   struct bar;
+ };
+ 
+ /* However, at the same time, support the outward-to-inward counted-by
+    field reference for ms-extensions.  */
+ struct ids
+ {
+   int length_ad;
+   int length_na;
+ };
+ 
+ typedef union
+ {
+   int length_hb;
+   float other;
+ } ids_2;
+ 
+ struct person
+ {
+   int age;
+   int weight;
+   struct ids;    // Anonymous structure, no name needed
+   ids_2; // Anonymous union, no name needed
+   char *address __attribute__ ((counted_by (length_ad)));
+   char *hobby __attribute__ ((counted_by (length_hb)));
+   char name[]  __attribute__ ((counted_by (length_na)));
+ };
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous.c gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/counted-by-anonymous.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/counted-by-anonymous.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,163 ----
+ /* Testing the correct usage of attribute counted_by for anonymous
+    structures.  */
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ 
+ #define __counted_by(member) \
+     __attribute__((__counted_by__(member)))
+ 
+ struct fam_in_union {
+   int count;
+   union {
+     char a;
+     char fam[] __counted_by(count);
+   };
+ };
+ 
+ struct fam_in_union_2 {
+   int count;
+   union inside {
+     char a;
+     char fam[] __counted_by(count); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+   } inside_u;
+ };
+ 
+ struct fam_in_struct {
+   int count;
+   struct {
+     char a;
+     char fam[] __counted_by(count);
+   };
+ };
+ 
+ struct fam_in_struct_2 {
+   int count;
+   struct insidestruct {
+     char a;
+     char fam[] __counted_by(count); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+   } inside_s;
+ };
+ 
+ struct pointer_in_union {
+   union {
+     char a;
+     char* p __counted_by(count);
+   };
+   int count;
+ };
+ 
+ struct pointer_in_union_2 {
+   union insideunion {
+     char a;
+     char* p __counted_by(count); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+   } inside_u;
+   int count;
+ };
+ 
+ struct pointer_in_union_3 {
+   union {
+     char b;
+     char* p __counted_by(countp); /* { dg-error "attribute is not a field declaration with an integer type" } */
+ 
+   };
+   float countp;
+ };
+ 
+ struct pointer_in_struct {
+   struct {
+     int count_q;
+     char *p __counted_by(count_p);
+     float *q __counted_by(count_q);
+     int count_fam;
+     struct {
+       int count_p;
+       char a;
+       char fam[] __counted_by(count_fam);
+     };
+   };
+ };
+ 
+ struct nested_mixed {
+   struct {
+     union {
+       int b;
+       float f;
+     };
+     int n;
+   };
+   struct {
+     int *pointer __counted_by(n);
+     float *pointer_2 __counted_by(f); /* { dg-error "attribute is not a field declaration with an integer type" } */
+     char c[] __counted_by(b);
+   };
+ } *array_nested_annotated;
+ 
+ /* Support an untagged type as its own top-level type.  */
+ 
+ /* A. Variable declaration.  */
+ 
+ struct { int a0; char b0[] __attribute__ ((counted_by (a0))); } x0;
+ struct { char b0[] __attribute__ ((counted_by (a0))); } x00; /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct { int a; char b[] __attribute__ ((counted_by (a))); } *x;
+ struct { char b1[] __attribute__ ((counted_by (a1))); } *x1; /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct { char *e __attribute__ ((counted_by (f))); int f; } *x2;
+ struct { char *e1 __attribute__ ((counted_by (f1))); } *x3; /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct { char *e4 __attribute__ ((counted_by (f4))); int f4; } **x4;
+ struct { char *e5 __attribute__ ((counted_by (f5))); } **x5; /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ /* B. Function declaration and definitions.  */
+ struct { int c0; char d0[] __attribute__ ((counted_by (c0))); } func0 (int a, int b);
+ struct { char d[] __attribute__ ((counted_by (c))); } func00 (int a, int b); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct { int c; char d[] __attribute__ ((counted_by (c))); } *func (int a, int b);
+ struct { char d1[] __attribute__ ((counted_by (c1))); } *func1 (int a, int b); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct { int c2; char *d2 __attribute__ ((counted_by (c2))); } *func2 () { return 0; }
+ struct { char *d3 __attribute__ ((counted_by (c3))); } *func3 () { return 0; } /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct { int c4; char *d4 __attribute__ ((counted_by (c4))); } **func4 () { return 0; }
+ struct { char *d5 __attribute__ ((counted_by (c5))); } **func5 () { return 0; } /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ /* C. Parameter declaration.  */
+ void func6 (struct { float *f __attribute__ ((counted_by (g))); int g; } *pa, int count); /* { dg-warning "anonymous struct declared inside parameter list will not be visible outside" } */
+ void func7 (struct { float *f1 __attribute__ ((counted_by (g1)));} *pa, int count); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 										    /* { dg-warning "anonymous struct declared inside parameter list will not be visible outside" "" { target *-*-* } .-1 } */
+ 
+ /* D. Typename.  */
+ int foo ()
+ {
+   int res = sizeof (struct {int count; char *p __attribute__ ((counted_by (count))); });
+ 
+   res += alignof (struct {char *p1 __attribute__ ((counted_by (count1))); }); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+   return res;
+ }
+ 
+ typedef struct {
+  int mc;
+  char *d __attribute__ ((counted_by (mc)));
+ } mys;
+ 
+ typedef struct {
+  char *md1 __attribute__ ((counted_by (mc1))); /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ } mys1;
+ 
+ 
+ /* Support an unnamed field with a named struct/union.  */
+ struct s0 { struct { int a0; char b0[] __attribute__ ((counted_by (a0))); } x; } yy0;
+ struct s00 { struct { char c0[] __attribute__ ((counted_by (d0))); } x; } yy00; /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct s { struct { int a; char b[] __attribute__ ((counted_by (a))); } *x; } *y;
+ struct s1 { struct { char c[] __attribute__ ((counted_by (d))); } *x; } *yy; /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct s2 { struct { char *b __attribute__ ((counted_by (a))); int a; } *x; } *y2;
+ struct s3 { struct { char *c __attribute__ ((counted_by (d))); } *x; } *y3; /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct s4 { struct { char *b4 __attribute__ ((counted_by (a4))); int a4; } x[3]; } *y4;
+ struct s5 { struct { char *c5 __attribute__ ((counted_by (d5))); } x[4]; } *y5; /* { dg-error "attribute is not a field declaration in the same structure as" } */
+ 
+ struct s6 { struct { char *b6 __attribute__ ((counted_by (a6))); int a6; } *x[3]; } *y6;
+ 
+ struct s7 { struct { char *c7 __attribute__ ((counted_by (d7))); } *x[4]; } *y7; /* { dg-error "attribute is not a field declaration in the same structure as" } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/guality/guality.exp gcc-16-20260118/gcc/testsuite/gcc.dg/guality/guality.exp
*** gcc-16-20260111/gcc/testsuite/gcc.dg/guality/guality.exp	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/guality/guality.exp	Sun Jan 18 22:32:10 2026
*************** dg-init
*** 40,53 ****
  torture-init
  
  global GDB
  if ![info exists ::env(GUALITY_GDB_NAME)] {
      if [info exists GDB] {
  	set guality_gdb_name "$GDB"
!     } elseif { [info exists rootme] && [file exists $rootme/../gdb/gdb] } {
  	# If we're doing a combined build, and gdb is available, use it.
  	set guality_gdb_name "$rootme/../gdb/gdb"
      } else {
! 	set guality_gdb_name "[transform gdb]"
      }
      setenv GUALITY_GDB_NAME "$guality_gdb_name"
  }
--- 40,56 ----
  torture-init
  
  global GDB
+ global host_triplet target_triplet
  if ![info exists ::env(GUALITY_GDB_NAME)] {
      if [info exists GDB] {
  	set guality_gdb_name "$GDB"
!     } elseif { [string equal $host_triplet $target_triplet]
! 	       && [info exists rootme]
! 	       && [file exists $rootme/../gdb/gdb] } {
  	# If we're doing a combined build, and gdb is available, use it.
  	set guality_gdb_name "$rootme/../gdb/gdb"
      } else {
! 	set guality_gdb_name "gdb"
      }
      setenv GUALITY_GDB_NAME "$guality_gdb_name"
  }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/hierarchical-discriminator-loop-version.c gcc-16-20260118/gcc/testsuite/gcc.dg/hierarchical-discriminator-loop-version.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/hierarchical-discriminator-loop-version.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/hierarchical-discriminator-loop-version.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,20 ----
+ /* Test hierarchical discriminators for loop versioning pass.
+    { dg-do compile }
+    { dg-options "-O3 -g -fdump-tree-lversion-details" }
+    { dg-require-effective-target size32plus }  */
+ 
+ void
+ test_loop_versioning (double *x, int stepx, int n)
+ {
+   for (int i = 0; i < n; ++i)
+     x[stepx * i] = 100;
+ }
+ 
+ /* Loop versioning creates two versions of the loop, each should get a distinct
+    copyid in the hierarchical discriminator format: [Base:8][Multiplicity:7][CopyID:11][Unused:6].
+    The exact copyid values depend on what other passes have run before, but both
+    loop versions should have non-zero discriminators to distinguish them for AutoFDO. */
+ 
+ /* Check that loop versioning occurred and discriminators are present on the loop body. */
+ /* { dg-final { scan-tree-dump "versioned this loop for when certain strides are 1" "lversion" } } */
+ /* { dg-final { scan-assembler "\\.loc 1 (9|10) \[0-9\]+ is_stmt 0 discriminator \[0-9\]+" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/hierarchical-discriminator-unroll.c gcc-16-20260118/gcc/testsuite/gcc.dg/hierarchical-discriminator-unroll.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/hierarchical-discriminator-unroll.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/hierarchical-discriminator-unroll.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,30 ----
+ /* Test that loop unrolling assigns copyid discriminators.
+    { dg-do compile }
+    { dg-options "-S -O2 -g  -fno-tree-vectorize" } */
+ 
+ int a[100];
+ int
+ test_unroll (void)
+ {
+   int sum = 0;
+   int i;
+   
+   /* Small fixed-count loop that should be completely unrolled */
+   #pragma GCC unroll 4
+   for (i = 0; i < 4; i++)
+     {
+       /* Each unrolled iteration gets a distinct copyid (1, 2, 3, 4) */
+       asm ("nop");
+       sum += a[i] * 2; 
+     }
+   
+   return sum;
+ }
+ 
+ /* Loop unrolling with #pragma GCC unroll 4 should create 4 copies with distinct
+    copyids in the hierarchical discriminator format: [Base:8][Multiplicity:7][CopyID:11][Unused:6].
+    Each unrolled iteration should get a different copyid, resulting in different discriminators.
+    The exact values depend on what other passes have run, but all should be non-zero. */
+ 
+ /* Check that unrolled iterations have non-zero discriminators on the asm statement line. */
+ /* { dg-final { scan-assembler "\\.loc 1 17 7 is_stmt 0 discriminator (\[1-9\]\[0-9\]*|0x\[1-9a-fA-F\]\[0-9a-fA-F\]*)" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/hierarchical-discriminator-vect-version.c gcc-16-20260118/gcc/testsuite/gcc.dg/hierarchical-discriminator-vect-version.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/hierarchical-discriminator-vect-version.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/hierarchical-discriminator-vect-version.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,19 ----
+ /* Test that vectorization assigns multiplicity and copyid discriminators.
+    { dg-do compile }
+    { dg-options "-O3 -g -ftree-vectorize -fno-vect-cost-model" }
+    { dg-require-effective-target vect_int }
+     */
+ 
+ void
+ test_vectorize (int *a, int *b, int *c, int n)
+ {
+   int i;
+   for (i = 0; i < n; i++)
+     {
+       a[i] = b[i] + c[i];  /* Main vectorized loop and epilog */
+     }
+ }
+ 
+ /* Check that vectorized code has discriminators on the main loop body line.
+    The discriminator should be non-zero to distinguish vector vs scalar versions. */
+ /* { dg-final { scan-assembler "\\.loc 1 13 \[0-9\]+ is_stmt 0 discriminator (\[1-9\]\[0-9\]*|0x\[1-9a-fA-F\]\[0-9a-fA-F\]*)" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/ipa/pr122458.c gcc-16-20260118/gcc/testsuite/gcc.dg/ipa/pr122458.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/ipa/pr122458.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/ipa/pr122458.c	Sun Jan 18 22:32:10 2026
***************
*** 4,9 ****
  
  static int foo (void) { return 0; };
  
! asm (".quad %c0" :: "i" (foo));
  
  int main() {}
--- 4,9 ----
  
  static int foo (void) { return 0; };
  
! asm (".dc.a %c0" :: "i" (foo));
  
  int main() {}
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/ipa/pr123542.c gcc-16-20260118/gcc/testsuite/gcc.dg/ipa/pr123542.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/ipa/pr123542.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/ipa/pr123542.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -std=gnu89" } */
+ 
+ double cos(double);
+ void sub(p1, p2, p3, p4, p5, p6) float p1, p2, p3, *p4, p5, p6;
+ {
+   float ar2 = cos(*p4);
+   if (p2)
+     ar2 = 0.0;
+   for (;;)
+     *p4 += ar2;
+ }
+ void main() { sub(1.0, 2.0); }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/ipa/pr123543.c gcc-16-20260118/gcc/testsuite/gcc.dg/ipa/pr123543.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/ipa/pr123543.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/ipa/pr123543.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do run } */
+ /* { dg-options "-O3" } */
+ 
+ __attribute__((noinline))
+ static int local_f(int a, int b) { return a + b; }
+ 
+ __attribute__((noinline))
+ int extern_f(int a, int b) { return local_f(a, b); }
+ 
+ int  unused_g1(int b) { return extern_f(0, b); }
+ 
+ int (*volatile fp)(int, int) = extern_f;
+ 
+ int main() { if (fp(1, 2) != 3) __builtin_abort(); }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/pr123109.c gcc-16-20260118/gcc/testsuite/gcc.dg/pr123109.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/pr123109.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/pr123109.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,25 ----
+ /* { dg-do compile { target { x86_64-*-* aarch64-*-* } } } */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ typedef int v4si __attribute__((vector_size(4 * sizeof(int))));
+ typedef unsigned int v4usi __attribute__((vector_size(4 * sizeof(unsigned int))));
+ 
+ #define TEST_NE(type)                                         \
+   type test_ne_##type (type a) { return (a >> 31) != 0; }
+ 
+ #define TEST_EQ(type)                                         \
+   type test_eq_##type (type a) { return (a >> 31) == 0; }
+ 
+ TEST_NE(int)
+ TEST_NE(unsigned)
+ TEST_NE(v4si)
+ TEST_NE(v4usi)
+ TEST_EQ(int)
+ TEST_EQ(unsigned)
+ TEST_EQ(v4si)
+ TEST_EQ(v4usi)
+ 
+ /* { dg-final { scan-tree-dump-times ">= 0" 2 optimized } } */
+ /* { dg-final { scan-tree-dump-times "< 0" 2 optimized } } */
+ /* { dg-final { scan-tree-dump-times ">= { 0, 0, 0, 0 }" 2 optimized } } */
+ /* { dg-final { scan-tree-dump-times ">> 31" 2 optimized } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/pr123309.c gcc-16-20260118/gcc/testsuite/gcc.dg/pr123309.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/pr123309.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/pr123309.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,13 ----
+ /* { dg-do compile } */
+ /* { dg-options "-std=c11" } */
+ 
+ typedef union {
+   const struct sockaddr *_Atomic __sockaddr__;
+ } __CONST_SOCKADDR_ARG __attribute__((transparent_union));
+ extern int sendto (__CONST_SOCKADDR_ARG __addr);
+ 
+ int sendto(const struct sockaddr *_Atomic to)
+ {
+ 	const struct sockaddr * _Atomic *p = &to;
+ }
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/pr123544.c gcc-16-20260118/gcc/testsuite/gcc.dg/pr123544.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/pr123544.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/pr123544.c	Sun Jan 18 22:32:10 2026
***************
*** 0 ****
--- 1,44 ----
+ /* PR rtl-optimization/123544 */
+ /* { dg-do run { target bitint } } */
+ /* { dg-options "-O1 -w" } */
+ 
+ typedef unsigned char V __attribute__((vector_size (4)));
+ unsigned long long c;
+ 
+ signed char
+ foo  ()
+ {
+   return 0;
+ }
+ 
+ unsigned int
+ bar (V x, short int y, long long z)
+ {
+   _BitInt (15) a = 828;
+   a &= (unsigned) z < 5 ? 0 : (unsigned) x[1];
+   if (y)
+     return a;
+   for (unsigned short d; d; )
+     ;
+ }
+ 
+ int
+ baz (unsigned char x)
+ {
+   unsigned long long a[] = { };
+   unsigned long long b = bar ((V) { 1, 1, 1 }, 1, -1);
+   if (x)
+     {
+       c += b;
+       return 0;
+     }
+   a[bar ((V) {}, 0, foo  ())];
+ }
+ 
+ int
+ main ()
+ {
+   baz (1);
+   if (c)
+     __builtin_abort ();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/rtl/powerpc/test-frame-related.c gcc-16-20260118/gcc/testsuite/gcc.dg/rtl/powerpc/test-frame-related.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/rtl/powerpc/test-frame-related.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/rtl/powerpc/test-frame-related.c	Sun Jan 18 22:32:10 2026
***************
*** 1,5 ****
  /* { dg-do compile { target { powerpc64*-*-linux* } } } */
! /* { dg-options "-O2 -mregnames" } */
  
  int __RTL (startwith ("cprop_hardreg")) test_frame_related ()
  {
--- 1,5 ----
  /* { dg-do compile { target { powerpc64*-*-linux* } } } */
! /* { dg-options "-O2 -mregnames -mpowerpc64" } */
  
  int __RTL (startwith ("cprop_hardreg")) test_frame_related ()
  {
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/store_merging_18.c gcc-16-20260118/gcc/testsuite/gcc.dg/store_merging_18.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/store_merging_18.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/store_merging_18.c	Sun Jan 18 22:32:10 2026
***************
*** 1,7 ****
  /* PR tree-optimization/83843 */
  /* { dg-do run } */
  /* { dg-options "-O2 -fno-tree-vectorize -fdump-tree-store-merging" } */
! /* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" { target { store_merge && { ! arm*-*-* } } } } } */
  
  __attribute__((noipa)) void
  foo (unsigned char *buf, unsigned char *tab)
--- 1,8 ----
  /* PR tree-optimization/83843 */
  /* { dg-do run } */
  /* { dg-options "-O2 -fno-tree-vectorize -fdump-tree-store-merging" } */
! /* xfailed after PR 122845, see PR 123541 ( */
! /* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" { target { store_merge && { ! arm*-*-* } } xfail *-*-* } } } */
  
  __attribute__((noipa)) void
  foo (unsigned char *buf, unsigned char *tab)
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/store_merging_19.c gcc-16-20260118/gcc/testsuite/gcc.dg/store_merging_19.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/store_merging_19.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/store_merging_19.c	Sun Jan 18 22:32:10 2026
***************
*** 1,7 ****
  /* PR tree-optimization/83843 */
  /* { dg-do run } */
  /* { dg-options "-O2 -fno-tree-vectorize -fdump-tree-store-merging" } */
! /* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" { target store_merge } } } */
  
  __attribute__((noipa)) void
  foo (unsigned char *buf, unsigned char *tab)
--- 1,8 ----
  /* PR tree-optimization/83843 */
  /* { dg-do run } */
  /* { dg-options "-O2 -fno-tree-vectorize -fdump-tree-store-merging" } */
! /* xfailed after PR 122845, see PR 123541 ( */
! /* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" { target store_merge xfail *-*-* } } } */
  
  __attribute__((noipa)) void
  foo (unsigned char *buf, unsigned char *tab)
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/bitint-64.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/bitint-64.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/bitint-64.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/bitint-64.c	Sun Jan 18 22:32:11 2026
***************
*** 1,5 ****
--- 1,6 ----
  /* PR middle-end/114332 */
  /* { dg-do run { target bitint } } */
+ /* { dg-require-effective-target sync_char_short } */
  /* { dg-options "-std=c23 -fwrapv" } */
  /* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
  /* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/bitint-82.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/bitint-82.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/bitint-82.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/bitint-82.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do run { target bitint } } */
+ /* { dg-require-effective-target sync_char_short } */
  /* { dg-options "-std=c23 -pedantic-errors" } */
  /* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
  /* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/bitint-84.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/bitint-84.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/bitint-84.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/bitint-84.c	Sun Jan 18 22:32:11 2026
***************
*** 1,5 ****
--- 1,6 ----
  /* A simple variant of gcc.dg/torture/bitint-64.c */
  /* { dg-do run { target bitint } } */
+ /* { dg-require-effective-target sync_char_short } */
  /* { dg-options "-std=c23" } */
  /* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
  /* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr120322.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr120322.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr120322.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr120322.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,33 ----
+ /* PR tree-optimization/120322 */
+ /* { dg-do run } */
+ /* { dg-additional-options "-fno-early-inlining" } */
+ 
+ int a, b, c;
+ 
+ void
+ foo (int e)
+ {
+   if (e > 0)
+     while (b)
+       ;
+ }
+ 
+ void
+ bar (unsigned short e)
+ {
+   foo (e);
+ }
+ 
+ static void
+ baz (short e)
+ {
+   bar (e);
+   c = a;
+ }
+ 
+ int
+ main ()
+ {
+   if (sizeof (int) > sizeof (short))
+     baz (-1);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123175-1.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123175-1.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123175-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123175-1.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-fgimple" } */
+ 
+ typedef int v4si __attribute__((vector_size(16)));
+ typedef int v2si __attribute__((vector_size(8)));
+ typedef char v4qi __attribute__((vector_size(4)));
+ 
+ v4si res;
+ v2si a;
+ v2si b;
+ 
+ void __attribute__((noipa)) __GIMPLE() foo ()
+ {
+   v2si a_;
+   v2si b_;
+   v4si res_;
+   a_ = a;
+   b_ = b;
+   res_ = __VEC_PERM (a_, b_, _Literal (v4qi) { 0, 1, 2, 3 });
+   res = res_;
+ }
+ 
+ int main()
+ {
+   a = (v2si){ 4, 3 };
+   b = (v2si){ 2, 1 };
+   foo ();
+   if (res[0] != 4 || res[1] != 3 || res[2] != 2 || res[3] != 1)
+     __builtin_abort ();
+   return 0;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123175-2.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123175-2.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123175-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123175-2.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,31 ----
+ /* { dg-do run } */
+ /* { dg-additional-options "-fgimple" } */
+ 
+ typedef int v4si __attribute__((vector_size(16)));
+ typedef int v2si __attribute__((vector_size(8)));
+ typedef char v4qi __attribute__((vector_size(4)));
+ 
+ v4si res;
+ v2si a;
+ v2si b;
+ 
+ void __attribute__((noipa)) __GIMPLE() foo ()
+ {
+   v2si a_;
+   v2si b_;
+   v4si res_;
+   a_ = a;
+   b_ = b;
+   res_ = __VEC_PERM (a_, b_, _Literal (v4qi) { 0, 2, 2, 1 });
+   res = res_;
+ }
+ 
+ int main()
+ {
+   a = (v2si){ 4, 3 };
+   b = (v2si){ 2, 1 };
+   foo ();
+   if (res[0] != 4 || res[1] != 2 || res[2] != 2 || res[3] != 3)
+     __builtin_abort ();
+   return 0;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123530.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123530.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123530.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123530.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-do compile } */
+ int a, b, c;
+ void d() {
+   int e = -1;
+   (c >> e | ~(b << 1) ^ 1) & a;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123645-1.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123645-1.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123645-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123645-1.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do run } */
+ 
+ /* PR tree-optimization/123645 */
+ /* Phi-opt was transforming f into __builtin_popcount which was incorrect. */
+ 
+ __attribute__((noinline))
+ int f(unsigned a)
+ {
+   return a < 1 ? __builtin_popcount(a) : 0;
+ }
+ 
+ int main()
+ {
+   if (f(1) != 0)
+     __builtin_abort();
+   if (f(0) != 0)
+     __builtin_abort();
+   if (f(2) != 0)
+     __builtin_abort();
+   if (f(3) != 0)
+     __builtin_abort();
+   if (f(-1) != 0)
+     __builtin_abort();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123645-2.c gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123645-2.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/torture/pr123645-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/torture/pr123645-2.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do run } */
+ 
+ /* PR tree-optimization/123645 */
+ /* Phi-opt was transforming f into __builtin_bswap which was incorrect. */
+ 
+ __attribute__((noinline))
+ int f(unsigned a)
+ {
+   return a < 1 ? __builtin_bswap32(a) : 0;
+ }
+ 
+ int main()
+ {
+   if (f(1) != 0)
+     __builtin_abort();
+   if (f(0) != 0)
+     __builtin_abort();
+   if (f(2) != 0)
+     __builtin_abort();
+   if (f(3) != 0)
+     __builtin_abort();
+   if (f(-1) != 0)
+     __builtin_abort();
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/bitops-12.c gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/bitops-12.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/bitops-12.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/bitops-12.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-optimized-raw" } */
+ /* PR tree-optimization/122845 */
+ 
+ struct s1
+ {
+   signed f1:3;
+ };
+ struct s1 p;
+ void f(void)
+ {
+  p.f1 ^= -47;
+  p.f1 ^= -47;
+ }
+ 
+ /* There should be no gimple stmts left except for return.
+    That is the ^ has been optimized away.   */
+ /* { dg-final { scan-tree-dump-not "gimple_assign <" "optimized"  } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/bitops-13.c gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/bitops-13.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/bitops-13.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/bitops-13.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,18 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -fdump-tree-optimized-raw" } */
+ /* PR tree-optimization/122845 */
+ 
+ int f(signed char a, int  b)
+ {
+   int aa = a;
+   int bb = b;
+   aa &= bb;
+   signed char t = aa;
+   aa = t;
+   aa &= bb;
+   t = aa;
+   return t;
+ }
+ 
+ /* There should be only 1 bit_and_expr left as both ands are the same. */
+ /* { dg-final { scan-tree-dump-times "bit_and_expr, " 1 "optimized"  } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/bitops-14.c gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/bitops-14.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/bitops-14.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/bitops-14.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile }  */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ 
+ __attribute__((noipa))
+ int x(_Bool iftmp, unsigned _6)
+ {
+         return ((-iftmp) & _6) & (~_6);
+ }
+ __attribute__((noipa))
+ int y(_Bool iftmp, unsigned _6)
+ {
+         return (iftmp * _6) & (~_6);
+ }
+ __attribute__((noipa))
+ int z(_Bool iftmp, unsigned _6)
+ {
+         unsigned t = ~_6;
+         unsigned t1 = (iftmp ? _6 : 0);
+         return t1 & t;
+ }
+ 
+ /* In this case AND should be removed.  */
+ /* { dg-final { scan-tree-dump-not " & " "optimized" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/bitops-15.c gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/bitops-15.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/bitops-15.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/bitops-15.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile }  */
+ /* { dg-options "-O2 -fdump-tree-optimized" } */
+ 
+ 
+ __attribute__((noipa))
+ int x(_Bool iftmp, unsigned _6)
+ {
+         return ((-iftmp) & _6) & (_6);
+ }
+ __attribute__((noipa))
+ int y(_Bool iftmp, unsigned _6)
+ {
+         return (iftmp * _6) & (_6);
+ }
+ __attribute__((noipa))
+ int z(_Bool iftmp, unsigned _6)
+ {
+         unsigned t = _6;
+         unsigned t1 = (iftmp ? _6 : 0);
+         return t1 & t;
+ }
+ 
+ /* In this case AND should be removed.  */
+ /* { dg-final { scan-tree-dump-not " & " "optimized" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-112.c gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-112.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-112.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-112.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,27 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O -fno-tree-sra -fdump-tree-fre1" } */
+ 
+ struct s1
+ {
+   int c;
+ };
+ struct s2
+ {
+   struct s1 l;
+ };
+ 
+ void f(int fill)
+ {
+   struct s1 D144916, last;
+   int a = fill;
+   D144916.c = a;
+   struct s2 D135323;
+   D135323.l = D144916;
+   struct s1 *s = &D135323.l;
+   const int *sc = &s->c;
+   if (*sc != a)
+     __builtin_abort();
+ }
+ 
+ /* We should be able to optimize out the condition guarding the abort.  */
+ /* { dg-final { scan-tree-dump-not "abort" "fre1" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/vrp99.c gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/vrp99.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/tree-ssa/vrp99.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/tree-ssa/vrp99.c	Sun Jan 18 22:32:11 2026
***************
*** 3,9 ****
  
  unsigned f(unsigned i){
    i >>= __SIZEOF_INT__ * __CHAR_BIT__ - 1;
!   return i == 0;
  }
  
  /* { dg-final { scan-tree-dump-not "\\(unsigned int\\)" "vrp1" } } */
--- 3,9 ----
  
  unsigned f(unsigned i){
    i >>= __SIZEOF_INT__ * __CHAR_BIT__ - 1;
!   return i == 1;
  }
  
  /* { dg-final { scan-tree-dump-not "\\(unsigned int\\)" "vrp1" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-1.c gcc-16-20260118/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-1.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-1.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,60 ----
+ /* Testing the attribute counted_by for anonymous structures as ms-extensions. 
+    used in bounds sanitizer.  */
+ /* { dg-do run } */
+ /* { dg-options "-O2 -fms-extensions -fsanitize=bounds" } */
+ /* { dg-output "index 12 out of bounds for type 'char \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+ /* { dg-output "\[^\n\r]*index 22 out of bounds for type 'char \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+ /* { dg-output "\[^\n\r]*index 31 out of bounds for type 'char \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+ 
+ 
+ struct ids 
+ {
+   int length_ad;
+   int length_na;
+ };
+ 
+ typedef union 
+ {
+   int length_hb;
+   float other;
+ } ids_2;
+ 
+ struct person
+ {
+   int age;
+   int weight;
+   struct ids;    // Anonymous structure, no name needed
+   ids_2; // Anonymous union, no name needed
+   char *address __attribute__ ((counted_by (length_ad))); 
+   char *hobby __attribute__ ((counted_by (length_hb)));
+   char name[]  __attribute__ ((counted_by (length_na)));
+ } *Jim;
+ 
+ static void
+ setup (int address_l, int name_l, int hb_l)
+ {
+   Jim = (struct person *) __builtin_malloc (sizeof (struct person)
+ 					    + name_l * sizeof (char));
+   Jim->length_na = name_l;
+   Jim->address = (char *) __builtin_malloc (sizeof (char) * address_l);
+   Jim->length_ad = address_l; 
+   Jim->hobby = (char *) __builtin_malloc (sizeof (char) * hb_l);
+   Jim->length_hb = hb_l;
+ }
+ 
+ static void
+ cleanup ()
+ {
+   __builtin_free (Jim->address);
+   __builtin_free (Jim->hobby);
+   __builtin_free (Jim);
+ }
+ 
+ int main()
+ {
+   setup (20, 10, 30);
+   Jim->name[12] = 'a';
+   Jim->address[22] = 'k';
+   Jim->hobby[31] = 'h';
+   return 0;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-2.c gcc-16-20260118/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-2.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds-2.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,66 ----
+ /* Testing the attribute counted_by for anonymous structures as plan9-extensions.
+    used in bounds sanitizer.  */
+ /* { dg-do run } */
+ /* { dg-options "-O2 -fplan9-extensions -fsanitize=bounds" } */
+ /* { dg-output "index 12 out of bounds for type 'char \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+ /* { dg-output "\[^\n\r]*index 22 out of bounds for type 'char \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+ /* { dg-output "\[^\n\r]*index 31 out of bounds for type 'char \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+ 
+ struct ids 
+ {
+   int length_ad;
+   int length_na;
+ };
+ 
+ typedef union 
+ {
+   int length_hb;
+   float other;
+ } ids_2;
+ 
+ struct person
+ {
+   int age;
+   int weight;
+   struct ids;    // Anonymous structure, no name needed
+   ids_2; // Anonymous union, no name needed
+   char *address __attribute__ ((counted_by (length_ad))); 
+   char *hobby __attribute__ ((counted_by (length_hb)));
+   char name[]  __attribute__ ((counted_by (length_na)));
+ } *Jim;
+ 
+ static void
+ set_counted_by (struct ids *p, ids_2 *p2,
+                 int address_l, int name_l, int hb_l)
+ {
+   p->length_ad = address_l;
+   p->length_na = name_l;
+   p2->length_hb = hb_l;
+ }
+ 
+ static void
+ setup (int address_l, int name_l, int hb_l)
+ {
+   Jim = (struct person *) __builtin_malloc (sizeof (struct person)
+ 					    + name_l * sizeof (char));
+   Jim->address = (char *) __builtin_malloc (sizeof (char) * address_l);
+   Jim->hobby = (char *) __builtin_malloc (sizeof (char) * hb_l);
+   set_counted_by (Jim, Jim, address_l, name_l, hb_l);
+ }
+ 
+ static void
+ cleanup ()
+ {
+   __builtin_free (Jim->address);
+   __builtin_free (Jim->hobby);
+   __builtin_free (Jim);
+ }
+ 
+ int main()
+ {
+   setup (20, 10, 30);
+   Jim->name[12] = 'a';
+   Jim->address[22] = 'k';
+   Jim->hobby[31] = 'h';
+   return 0;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds.c gcc-16-20260118/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/ubsan/counted-by-anonymous-bounds.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,23 ----
+ /* Testing the attribute counted_by for anonymous structures as the top-level
+    type and as the type for an unnamed field.  */ 
+ /* { dg-do run } */
+ /* { dg-options "-O2 -fsanitize=bounds" } */
+ /* { dg-output "index 11 out of bounds for type 'char \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+ /* { dg-output "\[^\n\r]*index 22 out of bounds for type 'char \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
+ 
+ 
+ struct { int a; char b[] __attribute__ ((counted_by (a))); } *x;
+ struct s { struct { int a; char b[] __attribute__ ((counted_by (a))); } *x; } *y;
+ 
+ int main ()
+ {
+   x = (typeof (x)) __builtin_malloc (sizeof (*x) + sizeof (char) * 10);
+   x->a = 10;
+   x->b[11] = 0;
+ 
+   y = (struct s *) __builtin_malloc (sizeof (struct s));
+   y->x = (typeof (y->x)) __builtin_malloc (sizeof (y->x) + sizeof (char) * 20);
+   y->x->a = 20;
+   y->x->b[22] = 0;
+   return 0;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/union-composite-type.c gcc-16-20260118/gcc/testsuite/gcc.dg/union-composite-type.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/union-composite-type.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/union-composite-type.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-Wpedantic" } */
+ 
+ /* An old extension */
+ 
+ int f(union { int a; });
+ int f(int a);			/* { dg-warning "not truly compatible" } */
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c gcc-16-20260118/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/vect/complex/fast-math-complex-add-half-float.c	Sun Jan 18 22:32:11 2026
***************
*** 1,5 ****
  /* { 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 } */
--- 1,5 ----
  /* { 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 } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-1.c gcc-16-20260118/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-1.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-1.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,38 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-O3 -mavx2 -mno-avx512f" } */
+ 
+ typedef struct {
+    double real;
+    double imag;
+ } complex;
+ 
+ typedef struct { complex e[3][3]; } su3_matrix;
+ 
+ void mult_su3_na( su3_matrix *a, su3_matrix *b, su3_matrix *c ){
+ int i,j;
+ register double t,ar,ai,br,bi,cr,ci;
+     for(i=0;i<3;i++)
+       for(j=0;j<3;j++){
+ 
+         ar=a->e[i][0].real; ai=a->e[i][0].imag;
+         br=b->e[j][0].real; bi=b->e[j][0].imag;
+         cr=ar*br; t=ai*bi; cr += t;
+         ci=ai*br; t=ar*bi; ci -= t;
+ 
+         ar=a->e[i][1].real; ai=a->e[i][1].imag;
+         br=b->e[j][1].real; bi=b->e[j][1].imag;
+         t=ar*br; cr += t; t=ai*bi; cr += t;
+         t=ar*bi; ci -= t; t=ai*br; ci += t;
+ 
+         ar=a->e[i][2].real; ai=a->e[i][2].imag;
+         br=b->e[j][2].real; bi=b->e[j][2].imag;
+         t=ar*br; cr += t; t=ai*bi; cr += t;
+         t=ar*bi; ci -= t; t=ai*br; ci += t;
+ 
+         c->e[i][j].real=cr;
+         c->e[i][j].imag=ci;
+     }
+ }
+ 
+ /* { dg-final { scan-tree-dump "optimized: loop vectorized using 32" "vect" } } */
+ /* { dg-final { scan-tree-dump "optimized: epilogue loop vectorized using 16 byte vectors and unroll factor 1" "vect" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-2.c gcc-16-20260118/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-2.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-2.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/vect/costmodel/x86_64/costmodel-pr123190-2.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,7 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-O2 -mavx2 -mno-avx512f" } */
+ 
+ #include "costmodel-pr123190-1.c"
+ 
+ /* { dg-final { scan-tree-dump "optimized: loop vectorized using 32" "vect" } } */
+ /* { dg-final { scan-tree-dump "optimized: epilogue loop vectorized using 16 byte vectors and unroll factor 1" "vect" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/vect/fast-math-slp-38.c gcc-16-20260118/gcc/testsuite/gcc.dg/vect/fast-math-slp-38.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/vect/fast-math-slp-38.c	Sun Jan 11 22:32:11 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/vect/fast-math-slp-38.c	Sun Jan 18 22:32:11 2026
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-additional-options "-ffast-math" } */
  /* { dg-require-effective-target vect_double } */
  
  double self[1024];
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-additional-options "-ffast-math --param vect-epilogues-nomask=0" } */
  /* { dg-require-effective-target vect_double } */
  
  double self[1024];
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/vect/pr123525.c gcc-16-20260118/gcc/testsuite/gcc.dg/vect/pr123525.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/vect/pr123525.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/vect/pr123525.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,14 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-mavx512f" { target { x86_64-*-* i?86-*-* } } } */
+ /* { dg-additional-options "-Wno-psabi" } */
+ 
+ typedef __attribute__((__vector_size__(64))) long V;
+ typedef __attribute__((__vector_size__(64))) int W;
+ 
+ V v;
+ 
+ V
+ foo(W w)
+ {
+   return w[5] > v;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/vect/slp-28.c gcc-16-20260118/gcc/testsuite/gcc.dg/vect/slp-28.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/vect/slp-28.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.dg/vect/slp-28.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-require-effective-target vect_int } */
+ /* { dg-additional-options "--param vect-epilogues-nomask=0" } */
  
  #include <stdarg.h>
  #include "tree-vect.h"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.dg/vect/vect-pr12358.c gcc-16-20260118/gcc/testsuite/gcc.dg/vect/vect-pr12358.c
*** gcc-16-20260111/gcc/testsuite/gcc.dg/vect/vect-pr12358.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.dg/vect/vect-pr12358.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,25 ----
+ /* { dg-do compile } */
+ 
+ typedef __attribute__((__vector_size__(1))) char V;
+ unsigned char c;
+ union {
+   _Bool b;
+   V v;
+ } u;
+ 
+ _Complex char *p;
+ 
+ void
+ foo()
+ {
+   _Bool t = u.b;
+   int t1 = t;
+   char ip = __imag__ *p;
+   char rp = __real__ *p;
+   int t2 = rp;
+   _Bool pp = t1 != t2;
+   _Bool p2 = ip != 0;
+   p2 |= pp;
+   u.b = p2;
+   u.v |= c;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/dbl_mov_immediate_1.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/dbl_mov_immediate_1.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/dbl_mov_immediate_1.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/dbl_mov_immediate_1.c	Sun Jan 18 22:32:11 2026
*************** double d4(void)
*** 41,48 ****
  
  /* { dg-final { scan-assembler-times "movi\td\[0-9\]+, #?0"                 1 } } */
  
! /* { dg-final { scan-assembler-times "adrp\tx\[0-9\]+, \.LC\[0-9\]"         2 } } */
! /* { dg-final { scan-assembler-times "ldr\td\[0-9\]+, \\\[x\[0-9\], #:lo12:\.LC\[0-9\]\\\]" 2 } } */
  
  /* { dg-final { scan-assembler-times "fmov\td\[0-9\]+, 1\\\.5e\\\+0"        1 } } */
  
--- 41,48 ----
  
  /* { dg-final { scan-assembler-times "movi\td\[0-9\]+, #?0"                 1 } } */
  
! /* { dg-final { scan-assembler-times "adrp\tx\[0-9\]+, "         2 } } */
! /* { dg-final { scan-assembler-times "ldr\td\[0-9\]+, \\\[x\[0-9\], #:lo12:" 2 } } */
  
  /* { dg-final { scan-assembler-times "fmov\td\[0-9\]+, 1\\\.5e\\\+0"        1 } } */
  
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/aarch64-pch.exp gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/aarch64-pch.exp
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/aarch64-pch.exp	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/aarch64-pch.exp	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,52 ----
+ #  Regression driver checking precompiled header compatibility of acle headers.
+ #  Copyright (C) 2026 Free Software Foundation, Inc.
+ #  Contributed by ARM Ltd.
+ #
+ #  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.
+ #
+ #  You should have received a copy of the GNU General Public License
+ #  along with GCC; see the file COPYING3.  If not see
+ #  <http://www.gnu.org/licenses/>.  */
+ 
+ # GCC testsuite checking acle headers can be included in precompiled headers
+ # that uses the `dg.exp' driver.
+ 
+ # Exit immediately if this isn't an AArch64 target.
+ if {![istarget aarch64*-*-*] } then {
+   return
+ }
+ 
+ # Load support procs.
+ load_lib gcc-dg.exp
+ load_lib dg-pch.exp
+ load_lib torture-options.exp
+ 
+ # Initialize `dg'.
+ dg-init
+ torture-init
+ set-torture-options $DG_TORTURE_OPTIONS
+ pch-init
+ 
+ set arch_flags "-march=armv8.5-a+sve2+sme"
+ set old_dg_do_what_default "${dg-do-what-default}"
+ # Main loop.
+ foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.c]] {
+   global torture_without_loops
+   dg-flags-pch $subdir $test $arch_flags \
+   	[concat [list {-O0 -g}] $torture_without_loops] ".h"
+ }
+ 
+ # All done.
+ pch-finish
+ torture-finish
+ dg-finish
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ #include "pch_arm_acle.h"
+ 
+ uint32_t ror(uint32_t a, uint32_t b)
+ {
+   return __ror(a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_acle.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,7 ----
+ #include "pch_arm_acle_include_post.h"
+ #include <arm_acle.h>
+ 
+ uint32_t ror(uint32_t a, uint32_t b)
+ {
+   return __ror(a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_acle_include_post.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_acle.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ #include "pch_arm_multiple.h"
+ 
+ svint32_t add_vectors(svint32_t a, svint32_t b)
+ {
+   return svadd_s32_z(svptrue_b32(), a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ #pragma once
+ #include <arm_sme.h>
+ #include <arm_sve.h>
+ #include <arm_neon_sve_bridge.h>
+ #include <arm_neon.h>
+ #include <arm_acle.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,11 ----
+ #include "pch_arm_multiple_include_post.h"
+ #include <arm_sme.h>
+ #include <arm_sve.h>
+ #include <arm_neon_sve_bridge.h>
+ #include <arm_neon.h>
+ #include <arm_acle.h>
+ 
+ svint32_t add_vectors(svint32_t a, svint32_t b)
+ {
+   return svadd_s32_z(svptrue_b32(), a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_multiple_include_post.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ #pragma once
+ #include <arm_sme.h>
+ #include <arm_sve.h>
+ #include <arm_neon_sve_bridge.h>
+ #include <arm_neon.h>
+ #include <arm_acle.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ #include "pch_arm_neon.h"
+ 
+ uint32x4_t add_vectors(uint32x4_t a, uint32x4_t b)
+ {
+   return vaddq_u32(a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_neon.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,7 ----
+ #include "pch_arm_neon_include_post.h"
+ #include "arm_neon.h"
+ 
+ uint32x4_t add_vectors(uint32x4_t a, uint32x4_t b)
+ {
+   return vaddq_u32(a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_include_post.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_neon.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ #include "pch_arm_neon_sve_bridge.h"
+ 
+ svint8_t set(svint8_t a, int8x16_t b)
+ {
+   return svset_neonq(a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_neon_sve_bridge.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,7 ----
+ #include "pch_arm_neon_sve_bridge_include_post.h"
+ #include <arm_neon_sve_bridge.h>
+ 
+ svint8_t set(svint8_t a, int8x16_t b)
+ {
+   return svset_neonq(a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_neon_sve_bridge_include_post.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_neon_sve_bridge.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ #include "pch_arm_sme.h"
+ 
+ void st(svbool_t pg, void *ptr, uint32_t slice_base) 
+   __arm_streaming __arm_inout("za"){
+   svst1_hor_za8(0, slice_base, pg, ptr);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_sme.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,7 ----
+ #include "pch_arm_sme_include_post.h"
+ #include <arm_sme.h>
+ 
+ void st(svbool_t pg, void *ptr, uint32_t slice_base) 
+   __arm_streaming __arm_inout("za"){
+   svst1_hor_za8(0, slice_base, pg, ptr);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sme_include_post.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_sme.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,6 ----
+ #include "pch_arm_sve.h"
+ 
+ svint32_t add_vectors(svint32_t a, svint32_t b)
+ {
+   return svadd_s32_z(svptrue_b32(), a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_sve.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,7 ----
+ #include "pch_arm_sve_include_post.h"
+ #include "arm_sve.h"
+ 
+ svint32_t add_vectors(svint32_t a, svint32_t b)
+ {
+   return svadd_s32_z(svptrue_b32(), a, b);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.hs gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.hs
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.hs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pch/pch_arm_sve_include_post.hs	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,2 ----
+ #pragma once
+ #include <arm_sve.h>
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pr114528.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pr114528.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pr114528.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pr114528.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,76 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2" } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ 
+ /*
+ ** f1:
+ **	mov	x0, 20014547599360
+ **	add	x0, x0, 5664768
+ **	ret
+ */
+ 
+ long f1 (void)
+ {
+   return 0x123400567000;
+ }
+ 
+ /*
+ ** f2:
+ **	mov	x0, 20014547599360
+ **	sub	x0, x0, #11112448
+ **	ret
+ */
+ 
+ long f2 (void)
+ {
+   return 0x1233ff567000;
+ }
+ 
+ /*
+ ** f3:
+ **	mov	x0, 1311673391471656959
+ **	add	x0, x0, 5668864
+ **	ret
+ */
+ 
+ long f3 (void)
+ {
+   return 0x1234000000567fff;
+ }
+ 
+ /*
+ ** f4:
+ **	mov	x0, 1312236341425078271
+ **	sub	x0, x0, #11108352
+ **	ret
+ */
+ 
+ long f4 (void)
+ {
+   return 0x1235ffffff567fff;
+ }
+ 
+ /*
+ ** f5:
+ **	mov	x0, 8102099357864587376
+ **	add	x0, x0, 10600448
+ **	ret
+ */
+ 
+ long f5 (void)
+ {
+   return 0x7070707071123070;
+ }
+ 
+ /*
+ ** f6:
+ **	mov	x0, 8102099357864587376
+ **	sub	x0, x0, #8273920
+ **	ret
+ */
+ 
+ long f6 (void)
+ {
+   return 0x707070706ff23070;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pr63304_1.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pr63304_1.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/pr63304_1.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/pr63304_1.c	Sun Jan 18 22:32:11 2026
*************** cal3 (double a)
*** 45,48 ****
      return 1;
  }
  
! /* { dg-final { scan-assembler-times "adrp" 6 } } */
--- 45,48 ----
      return 1;
  }
  
! /* { dg-final { scan-assembler-times "adrp" 4 } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/signbitv2sf.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/signbitv2sf.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/signbitv2sf.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/signbitv2sf.c	Sun Jan 18 22:32:11 2026
*************** main ()
*** 27,32 ****
--- 27,34 ----
    foo (out + 4, in + 4);
    foo (out + 6, in + 6);
  
+   #pragma GCC novector
+   #pragma GCC unroll(0)
    for (i = 0; i < N; i++)
    {
      if (in[i] >= 0.0 && out[i])
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_bf16_x2.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_bf16_x2.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_bf16_x2.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_bf16_x2.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok && aarch64_asm_bf16_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok && aarch64_asm_bf16_ok } } } } */
  
  #pragma GCC target "+fp8+bf16"
  #include "test_sme2_acle.h"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f16_x2.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f16_x2.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f16_x2.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f16_x2.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f32_x4.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f32_x4.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f32_x4.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvt_mf8_f32_x4.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_mf8_f32_x4.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_mf8_f32_x4.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_mf8_f32_x4.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/cvtn_mf8_f32_x4.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x2.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f16_x4.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x2.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f32_x4.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x2.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c	Sun Jan 11 22:32:12 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sme2/acle-asm/scale_f64_x4.c	Sun Jan 18 22:32:11 2026
***************
*** 1,4 ****
--- 1,6 ----
  /* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+ /* { dg-do assemble { target { aarch64_asm_fp8_ok } } } */
+ /* { dg-do compile { target { ! { aarch64_asm_fp8_ok } } } } */
  
  #include "test_sme2_acle.h"
  #pragma GCC target "+fp8"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr123392.c gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr123392.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr123392.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/aarch64/sve/acle/general/pr123392.c	Sun Jan 18 22:32:11 2026
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -g" } */
+ 
+ #include <arm_sve.h>
+ 
+ svint32_t res (int32_t *a)
+ {
+   svint32_t s = { a[0], a[1], a[2], a[3] };
+   return s;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/i386/pr123121.c gcc-16-20260118/gcc/testsuite/gcc.target/i386/pr123121.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/i386/pr123121.c	Sun Jan 11 22:32:13 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/i386/pr123121.c	Sun Jan 18 22:32:12 2026
***************
*** 1,8 ****
  /* { dg-do run } */
- /* { dg-require-effective-target lp64 } */
  /* { dg-options "-O3 -fno-ipa-cp -fschedule-insns" } */
  
! int a[256], d, e, f, g, h, j, v[] = {0, -6, 0};;
  unsigned c;
  unsigned k(int l, unsigned m) { return (l & 6777215) ^ a[(l ^ m) & 55]; }
  int n(int l, int m[]) {
--- 1,7 ----
  /* { dg-do run } */
  /* { dg-options "-O3 -fno-ipa-cp -fschedule-insns" } */
  
! int a[256], d, e, f, g, h, j, v[] = {0, -6, 0};
  unsigned c;
  unsigned k(int l, unsigned m) { return (l & 6777215) ^ a[(l ^ m) & 55]; }
  int n(int l, int m[]) {
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/i386/pr123484.c gcc-16-20260118/gcc/testsuite/gcc.target/i386/pr123484.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/i386/pr123484.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/i386/pr123484.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,17 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -mavx512vl -mavx512fp16 " }*/
+ typedef __attribute__((__vector_size__ (8))) _Float16 F;
+ int a, b;
+ F f, *p;
+ 
+ void
+ foo ()
+ {
+   do
+     {
+       f /= b ? *p : (F) {40};
+ l:
+     }
+   while (a);
+   goto l;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/i386/pr123523.c gcc-16-20260118/gcc/testsuite/gcc.target/i386/pr123523.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/i386/pr123523.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/i386/pr123523.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,24 ----
+ /* PR rtl-optimization/123523 */
+ /* { dg-do compile } */
+ /* { dg-options "-O -mavx512vl -mavx512bw" } */
+ 
+ typedef __attribute__((__vector_size__ (16))) short V;
+ typedef __attribute__((__vector_size__ (32))) short W;
+ 
+ char c;
+ W *p, *q;
+ short s;
+ 
+ void
+ bar (V v, int, int, int, int, int, int, void *)
+ {
+   W w = __builtin_ia32_psrlw256_mask ((W) { }, v, *p, 0);
+   short x = __builtin_ia32_pcmpgtw256_mask (w, *q, 0);
+   __builtin_mul_overflow (x, c, &s);
+ }
+ 
+ void
+ foo ()
+ {
+   bar ((V){0, -14}, 0, 0, 0, 0, 0, 0, q);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/loongarch/la64/attr-model-6.c gcc-16-20260118/gcc/testsuite/gcc.target/loongarch/la64/attr-model-6.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/loongarch/la64/attr-model-6.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/loongarch/la64/attr-model-6.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,8 ----
+ /* { dg-do compile } */
+ /* { dg-options "-mexplicit-relocs=none -mcmodel=normal -O2 -fno-pic" } */
+ /* { dg-final { scan-assembler "la.local\t\\\$r\[0-9\]+,\\\$r\[0-9\]+,x" } } */
+ /* { dg-final { scan-assembler "la.local\t\\\$r\[0-9\]+,y" } } */
+ /* { dg-final { scan-assembler "la.local\t\\\$r\[0-9\]+,\\\$r\[0-9\]+,counter" } } */
+ 
+ #define ATTR_MODEL_TEST
+ #include "attr-model-test.c"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123521.c gcc-16-20260118/gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123521.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123521.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/loongarch/vector/lasx/pr123521.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,11 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O1 -msimd=lasx" } */
+ 
+ typedef long long v4i64 __attribute__ ((vector_size (32), aligned (32)));
+ extern long long *x_si;
+ v4i64
+ test (void)
+ {
+   v4i64 a = { x_si[1], x_si[0], 0x411, 0x411 };
+   return a;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/powerpc/asm-hard-reg-1.c gcc-16-20260118/gcc/testsuite/gcc.target/powerpc/asm-hard-reg-1.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/powerpc/asm-hard-reg-1.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/powerpc/asm-hard-reg-1.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,10 ----
+ /* { dg-do compile } */
+ 
+ long double a;
+ double b;
+ void c (double, double);
+ void d (void)
+ {
+   __asm__ ("" : "={fr2}" (b) : "{fr1}" (a));
+   c (0, 0);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/riscv/bitint-32-on-rv64.c gcc-16-20260118/gcc/testsuite/gcc.target/riscv/bitint-32-on-rv64.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/riscv/bitint-32-on-rv64.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/riscv/bitint-32-on-rv64.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,47 ----
+ /* { dg-do compile { target bitint } } */
+ /* { dg-additional-options "-march=rv64gc -mabi=lp64d -std=c23 -O -fno-stack-clash-protection -g -fpie -mcmodel=medlow -fno-section-anchors" } */
+ /* { dg-skip-if "" { *-*-* } { "-flto" "-O0"} } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ signed _BitInt(32) a;
+ unsigned _BitInt(32) b;
+ signed _BitInt(16) c;
+ unsigned _BitInt(16) d;
+ 
+ signed _BitInt(32) f1(void) {
+ /*
+ ** f1:
+ **	...
+ **	lw	a0,a
+ **      ret
+ */
+   return a;
+ }
+ unsigned _BitInt(32) f2(void) {
+ /*
+ ** f2:
+ **	...
+ **	lw	a0,b
+ **      ret
+ */
+   return b;
+ }
+ 
+ signed _BitInt(16) f3(void) {
+ /*
+ ** f3:
+ **	...
+ **	lh	a0,c
+ **      ret
+ */
+   return c;
+ }
+ unsigned _BitInt(16) f4(void) {
+ /*
+ ** f4:
+ **	...
+ **	lhu	a0,d
+ **      ret
+ */
+   return d;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/riscv/bitint-alignments.c gcc-16-20260118/gcc/testsuite/gcc.target/riscv/bitint-alignments.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/riscv/bitint-alignments.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/riscv/bitint-alignments.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,60 ----
+ /* { dg-do run { target bitint } } */
+ /* { dg-additional-options "-std=c23" } */
+ 
+ static long unsigned int
+ calc_alignof (int n)
+ {
+ #if __riscv_xlen == 64
+   if (n > 64)
+     return alignof(__int128_t);
+ #endif
+   if (n > 32)
+     return alignof(long long);
+   if (n > 16)
+     return alignof(int);
+   if (n > 8)
+     return alignof(short);
+   else
+     return alignof(char);
+ }
+ 
+ #define CHECK_ALIGNMENT(N) \
+   if (alignof(_BitInt(N)) != calc_alignof(N)) \
+     __builtin_abort ();
+ 
+ int main (void)
+ {
+   CHECK_ALIGNMENT(2);
+   CHECK_ALIGNMENT(3);
+   CHECK_ALIGNMENT(7);
+   CHECK_ALIGNMENT(8);
+   CHECK_ALIGNMENT(9);
+   CHECK_ALIGNMENT(13);
+   CHECK_ALIGNMENT(15);
+   CHECK_ALIGNMENT(16);
+   CHECK_ALIGNMENT(17);
+   CHECK_ALIGNMENT(24);
+   CHECK_ALIGNMENT(31);
+   CHECK_ALIGNMENT(32);
+   CHECK_ALIGNMENT(33);
+   CHECK_ALIGNMENT(42);
+   CHECK_ALIGNMENT(53);
+   CHECK_ALIGNMENT(63);
+   CHECK_ALIGNMENT(64);
+   CHECK_ALIGNMENT(65);
+   CHECK_ALIGNMENT(79);
+   CHECK_ALIGNMENT(96);
+   CHECK_ALIGNMENT(113);
+   CHECK_ALIGNMENT(127);
+   CHECK_ALIGNMENT(128);
+   CHECK_ALIGNMENT(129);
+   CHECK_ALIGNMENT(153);
+   CHECK_ALIGNMENT(255);
+   CHECK_ALIGNMENT(256);
+   CHECK_ALIGNMENT(257);
+   CHECK_ALIGNMENT(353);
+   CHECK_ALIGNMENT(512);
+   CHECK_ALIGNMENT(620);
+   CHECK_ALIGNMENT(1024);
+   CHECK_ALIGNMENT(30000);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/riscv/bitint-args.c gcc-16-20260118/gcc/testsuite/gcc.target/riscv/bitint-args.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/riscv/bitint-args.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/riscv/bitint-args.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,82 ----
+ /* { dg-do compile { target bitint } } */
+ /* { dg-additional-options "-march=rv64gc -mabi=lp64d -std=c23 -O -fno-stack-clash-protection -g" } */
+ /* { dg-skip-if "" { *-*-* } { "-flto" "-O0"} } */
+ /* { dg-final { check-function-bodies "**" "" } } */
+ 
+ #define CHECK_ARG(N)				\
+ void f##N(_BitInt(N) *ptr, _BitInt(N) y)	\
+ {						\
+     *ptr = y;					\
+ }
+ 
+ 
+ CHECK_ARG(2)
+ /*
+ ** f2:
+ **	sb	a1,0\(a0\)
+ **	ret
+ */
+ CHECK_ARG(8)
+ /*
+ ** f8:
+ **	sb	a1,0\(a0\)
+ **	ret
+ */
+ CHECK_ARG(9)
+ /*
+ ** f9:
+ **	sh	a1,0\(a0\)
+ **	ret
+ */
+ CHECK_ARG(16)
+ /*
+ ** f16:
+ **	sh	a1,0\(a0\)
+ **	ret
+ */
+ CHECK_ARG(19)
+ /*
+ ** f19:
+ **	sw	a1,0\(a0\)
+ **	ret
+ */
+ CHECK_ARG(32)
+ /*
+ ** f32:
+ **	sw	a1,0\(a0\)
+ **	ret
+ */
+ CHECK_ARG(42)
+ /*
+ ** f42:
+ **	sd	a1,0\(a0\)
+ **	ret
+ */
+ CHECK_ARG(64)
+ /*
+ ** f64:
+ **	sd	a1,0\(a0\)
+ **	ret
+ */
+ CHECK_ARG(65)
+ /*
+ ** f65:
+ **	sd	a1,0\(a0\)
+ **	sd	a2,8\(a0\)
+ **	ret
+ */
+ CHECK_ARG(127)
+ /*
+ ** f127:
+ **	sd	a1,0\(a0\)
+ **	sd	a2,8\(a0\)
+ **	ret
+ */
+ 
+ CHECK_ARG(128)
+ /*
+ ** f128:
+ **	sd	a1,0\(a0\)
+ **	sd	a2,8\(a0\)
+ **	ret
+ */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/riscv/bitint-sizes.c gcc-16-20260118/gcc/testsuite/gcc.target/riscv/bitint-sizes.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/riscv/bitint-sizes.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/riscv/bitint-sizes.c	Sun Jan 18 22:32:12 2026
***************
*** 0 ****
--- 1,65 ----
+ /* { dg-do run { target bitint } } */
+ /* { dg-additional-options "-std=c23" } */
+ 
+ static long unsigned int
+ calc_size (int n)
+ {
+ #if __riscv_xlen == 64
+   if (n > 128)
+     return ((n - 1)/128 + 1)  * sizeof(__int128_t);
+   if (n > 64)
+     return sizeof(__int128_t);
+ #elif __riscv_xlen == 32
+   if (n > 64)
+     return ((n - 1)/64 + 1)  * sizeof(long long);
+ #endif
+   if (n > 32)
+     return sizeof(long long);
+   if (n > 16)
+     return sizeof(int);
+   if (n > 8)
+     return sizeof(short);
+   else
+     return sizeof(char);
+ }
+ 
+ #define CHECK_SIZE(N) \
+   if (sizeof(_BitInt(N)) != calc_size(N)) \
+     __builtin_abort ();
+ 
+ int main (void)
+ {
+   CHECK_SIZE(2);
+   CHECK_SIZE(3);
+   CHECK_SIZE(7);
+   CHECK_SIZE(8);
+   CHECK_SIZE(9);
+   CHECK_SIZE(13);
+   CHECK_SIZE(15);
+   CHECK_SIZE(16);
+   CHECK_SIZE(17);
+   CHECK_SIZE(24);
+   CHECK_SIZE(31);
+   CHECK_SIZE(32);
+   CHECK_SIZE(33);
+   CHECK_SIZE(42);
+   CHECK_SIZE(53);
+   CHECK_SIZE(63);
+   CHECK_SIZE(64);
+   CHECK_SIZE(65);
+   CHECK_SIZE(79);
+   CHECK_SIZE(96);
+   CHECK_SIZE(113);
+   CHECK_SIZE(127);
+   CHECK_SIZE(128);
+   CHECK_SIZE(129);
+   CHECK_SIZE(153);
+   CHECK_SIZE(255);
+   CHECK_SIZE(256);
+   CHECK_SIZE(257);
+   CHECK_SIZE(353);
+   CHECK_SIZE(512);
+   CHECK_SIZE(620);
+   CHECK_SIZE(1024);
+   CHECK_SIZE(30000);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/riscv/pr123092.c gcc-16-20260118/gcc/testsuite/gcc.target/riscv/pr123092.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/riscv/pr123092.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/riscv/pr123092.c	Sun Jan 18 22:32:13 2026
***************
*** 0 ****
--- 1,12 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O2 -march=rv64gc_zicbop -mabi=lp64d" } */
+ struct a {
+   char *b;
+ } d;
+ int e;
+ int c(struct a *);
+ void f() {
+   __builtin_prefetch(d.b + 64);
+   if (e)
+     c(&d);
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c gcc-16-20260118/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c	Sun Jan 11 22:32:13 2026
--- gcc-16-20260118/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr122445.c	Sun Jan 18 22:32:13 2026
*************** x264_add4x4_idct (uint8_t *p_dst, int16_
*** 22,26 ****
      }
  }
  
! /* { dg-final { scan-rtl-dump "Propagating AVL: \\(const_int 4" "avlprop" } } */
  /* { dg-final { scan-rtl-dump-not "Propagating AVL: \\(const_int 1" "avlprop" } } */
--- 22,26 ----
      }
  }
  
! /* { dg-final { scan-rtl-dump "Propagating AVL: \\(const_int 8" "avlprop" } } */
  /* { dg-final { scan-rtl-dump-not "Propagating AVL: \\(const_int 1" "avlprop" } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c gcc-16-20260118/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr123301.c	Sun Jan 18 22:32:13 2026
***************
*** 0 ****
--- 1,45 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=rv64gcv -mabi=lp64d" } */
+ 
+ #define BS_VEC(type, num) type __attribute__((vector_size(num * sizeof(type))))
+ #define BITCAST(T, F, arg)                                                     \
+     ((union {                                                                  \
+         F src;                                                                 \
+         T dst;                                                                 \
+     })arg)                                                                     \
+         .dst
+ #include <riscv_bitmanip.h>
+ BS_VEC(uint64_t, 2)
+ backsmith_snippet_423(BS_VEC(int16_t, 2), BS_VEC(int32_t, 8), uint8_t)
+ {}
+ uint32_t backsmith_pure_1(BS_VEC(uint32_t, 2) BS_ARG_2, int8_t BS_ARG_3)
+ {
+     BS_VEC(uint64_t, 4) BS_VAR_0;
+     int32_t BS_VAR_4;
+     uint64_t BS_TEMP_105 = 8;
+     for (uint64_t BS_INC_0 = 0; BS_INC_0 < BS_TEMP_105; BS_INC_0 += 1)
+         if (BS_ARG_2[1])
+         {
+             BS_VAR_4 = BS_INC_0;
+             BS_VEC(uint32_t, 2)
+             BS_TEMP_107 = __builtin_convertvector(
+                 (BS_VEC(int32_t, 2)){ BS_VAR_4, BS_VAR_4 },
+                 BS_VEC(uint32_t, 2));
+             BS_VEC(uint32_t, 2)
+             BS_TEMP_108 = __builtin_convertvector(
+                 (BS_VEC(int8_t, 2)){ BS_ARG_3 }, BS_VEC(uint32_t, 2));
+             if (BITCAST(uint64_t, BS_VEC(uint32_t, 2),
+                         ((BS_VEC(uint32_t, 2)){
+                             BS_TEMP_107[0] ? BS_TEMP_108[0] : 0,
+                             BS_TEMP_107[1] ? BS_TEMP_108[1] : 0 }))
+                 < backsmith_snippet_423(
+                     __builtin_convertvector((BS_VEC(uint64_t, 2)){},
+                                             BS_VEC(int16_t, 2)),
+                     (BS_VEC(int32_t, 8)){}, 0)[1])
+                 BS_VAR_0 |= __builtin_convertvector(
+                     (BS_VEC(int32_t, 4)){ BS_VAR_4 }, BS_VEC(uint64_t, 4));
+         }
+     if (BS_VAR_0[0])
+         for (;;)
+             ;
+ }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/pr123501.c gcc-16-20260118/gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/pr123501.c
*** gcc-16-20260111/gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/pr123501.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gcc.target/riscv/rvv/autovec/reduc/pr123501.c	Sun Jan 18 22:32:13 2026
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile } */
+ /* { dg-options "-O3 -march=rv64gcv_zvl256b -mabi=lp64d -mrvv-vector-bits=zvl -mrvv-max-lmul=m4" } */
+ 
+ long long b;
+ _Bool a=1;
+ char e[13];
+ 
+ int main() {
+   for (long h=0; h<13; ++h)
+     e[h] = 110;
+   for (int i=5; i<9; i++)
+     for (int k=0; k<1031; k++) {
+         int l = e[0] ? e[i] : 0;
+         a = l ? a:l;
+     }
+   b = (int)a;
+   if (b != 1)
+     __builtin_abort ();
+ }
+ 
+ /* { dg-final { scan-assembler-times "vcpop.m" 2 } } */
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/guality/guality.exp gcc-16-20260118/gcc/testsuite/gfortran.dg/guality/guality.exp
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/guality/guality.exp	Sun Jan 11 22:32:14 2026
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/guality/guality.exp	Sun Jan 18 22:32:13 2026
*************** dg-init
*** 21,34 ****
  torture-init
  
  global GDB
  if ![info exists ::env(GUALITY_GDB_NAME)] {
      if [info exists GDB] {
  	set guality_gdb_name "$GDB"
!     } elseif { [info exists rootme] && [file exists $rootme/../gdb/gdb] } {
  	# If we're doing a combined build, and gdb is available, use it.
  	set guality_gdb_name "$rootme/../gdb/gdb"
      } else {
! 	set guality_gdb_name "[transform gdb]"
      }
      setenv GUALITY_GDB_NAME "$guality_gdb_name"
  }
--- 21,37 ----
  torture-init
  
  global GDB
+ global host_triplet target_triplet
  if ![info exists ::env(GUALITY_GDB_NAME)] {
      if [info exists GDB] {
  	set guality_gdb_name "$GDB"
!     } elseif { [string equal $host_triplet $target_triplet]
! 	       && [info exists rootme]
! 	       && [file exists $rootme/../gdb/gdb] } {
  	# If we're doing a combined build, and gdb is available, use it.
  	set guality_gdb_name "$rootme/../gdb/gdb"
      } else {
! 	set guality_gdb_name "gdb"
      }
      setenv GUALITY_GDB_NAME "$guality_gdb_name"
  }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/namelist_101.f90 gcc-16-20260118/gcc/testsuite/gfortran.dg/namelist_101.f90
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/namelist_101.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/namelist_101.f90	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,16 ----
+ ! { dg-do run )
+ ! { dg-shouldfail "Missing quote" }
+ program nml_quotes_bug
+   implicit none
+   integer      :: unit = 10
+   character(8) :: c1, c2
+   namelist /tovs_obs_chan/ c1, c2
+   open (unit ,file="nml-quotes-bug.nml")
+   write(unit,*) "&tovs_obs_chan"
+   write(unit,*) "  c1 = '1',"
+   write(unit,*) "  c2 =  2a ,"
+   write(unit,*) "/"
+   rewind(unit)
+   read (unit ,nml=tovs_obs_chan)
+   close(unit ,status="delete")
+ end program nml_quotes_bug
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/pdt_81.f03 gcc-16-20260118/gcc/testsuite/gfortran.dg/pdt_81.f03
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/pdt_81.f03	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/pdt_81.f03	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,48 ----
+ ! { dg-do compile )
+ !
+ ! Test the fix for PR112460, in which mismatched, constant typespec parameters were
+ ! not detected.
+ !
+ ! Contributed by Juergen Reuter  <juergen.reuter@desy.de>
+ !
+ module color_propagator
+   implicit none
+   integer, parameter :: pk = kind (1.0)
+   type :: t (k, n_in, n_out)
+      integer, kind :: k = pk
+      integer, len :: n_in = 0, n_out = 0
+      logical :: is_ghost = .false.
+      integer, dimension(n_in) :: in
+      integer, dimension(n_out) :: out
+   end type t
+ end module color_propagator
+ 
+ program foo
+   use color_propagator
+   type(t(n_out=1)) :: aa
+   type(t(n_in=1,n_out=2)) :: bb
+   type(t), dimension(3) :: cc, dd, ee, gg
+   type(t(pk,n_in=1,n_out=2)), dimension(3) :: ff, hh
+   type(t(kind(1d0),n_in=1,n_out=2)), dimension(3) :: ii
+   type(t(pk,n_in=1,n_out=1)), dimension(3) :: jj
+   integer :: i
+ 
+ ! Starting point was mismatched parameters in array constructors; eg.:
+ ! Error: Mismatched type parameters ‘n_in’(1/0) in array constructor at (1)/(2)
+ 
+   cc = [t(pk,1,1)(.true.,[5] ,[6]), aa, bb]     ! { dg-error "Mismatched type parameters" }
+   dd = [aa, [t(pk,1,2)(.true.,[5] ,[6,6]), bb]] ! { dg-error "Mismatched type parameters" }
+   ee = [bb, [t(pk,1,2)(.true.,[5],[6,6]), aa]]  ! { dg-error "Mismatched type parameters" }
+   ff = [bb, [t(pk,1,2)(.true.,[5],[6,6]), bb]]  ! OK
+   gg = [bb, [t(kind (1d0),1,2)(.true.,[5],[6,6]), bb]]  ! { dg-error "Mismatched type parameters" }
+ 
+ ! Test ordinary assignment; eg.:
+ ! Error: Mismatched type parameters ‘k’(8/4) in assignment at (1)/(2)
+ 
+   aa = t(pk,1,2)(.true.,[5] ,[6,7])             ! { dg-error "Mismatched type parameters" }
+   bb = t(pk,1,2)(.true.,[5] ,[6,7])             ! OK
+   hh = ff                                       ! OK
+   ii = ff                                       ! { dg-error "Mismatched type parameters" }
+   jj = ff                                       ! { dg-error "Mismatched type parameters" }
+   print *, ff
+ end program foo
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/pr109512.f90 gcc-16-20260118/gcc/testsuite/gfortran.dg/pr109512.f90
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/pr109512.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/pr109512.f90	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,10 ----
+ ! { dg-do compile }
+ subroutine foo(bar)
+   implicit none (external)
+   call bar(1)  ! { dg-error "requires an EXTERNAL attribute" }
+ end subroutine foo
+ 
+ function bah(bar)
+   implicit none (external)
+   foo = bar(1)        ! { dg-error "requires an EXTERNAL attribute" }
+ end function bah
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/pr69962.f90 gcc-16-20260118/gcc/testsuite/gfortran.dg/pr69962.f90
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/pr69962.f90	Sun Jan 11 22:32:14 2026
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/pr69962.f90	Sun Jan 18 22:32:14 2026
*************** program p
*** 4,6 ****
--- 4,7 ----
     character(3), parameter :: x(2) = ['abc', 'xyz']
     character(2), parameter :: y(2) = [x(2)(2:3), x(n)(1:2)] ! { dg-error "CHARACTER length must be a constant" }
  end
+ ! { dg-prune-output "Expecting constant expression" }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/pr77415_1.f90 gcc-16-20260118/gcc/testsuite/gfortran.dg/pr77415_1.f90
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/pr77415_1.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/pr77415_1.f90	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,6 ----
+ integer function f()
+    f(g) = 0       ! { dg-error "Statement function" }
+ contains
+    integer function g()
+    end
+ end
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/pr77415_2.f90 gcc-16-20260118/gcc/testsuite/gfortran.dg/pr77415_2.f90
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/pr77415_2.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/pr77415_2.f90	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,8 ----
+ ! { dg-do compile }
+ function f()
+    f(g) = 0       ! { dg-error "Statement function" }
+ contains
+    function g()
+    end
+ end
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/pr91960_1.f90 gcc-16-20260118/gcc/testsuite/gfortran.dg/pr91960_1.f90
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/pr91960_1.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/pr91960_1.f90	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,6 ----
+ ! { dg-do compile }
+ module m
+    integer :: i, j
+    integer, parameter :: a(3) = [1, 2, 3]
+    integer, parameter :: b(3) = [(a(j), i=1,3)] ! { dg-error "Expecting constant expression" }
+ end
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/pr91960_2.f90 gcc-16-20260118/gcc/testsuite/gfortran.dg/pr91960_2.f90
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/pr91960_2.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/pr91960_2.f90	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,8 ----
+ ! { dg-do compile }
+ module m
+   implicit none
+   integer :: i, j
+   integer, parameter :: a(3) = [1, 2, 3]
+   integer, parameter :: c    = a(j)
+   integer            :: d    = c       ! { dg-error "initialization expression at" }
+ end
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gfortran.dg/pr94377.f90 gcc-16-20260118/gcc/testsuite/gfortran.dg/pr94377.f90
*** gcc-16-20260111/gcc/testsuite/gfortran.dg/pr94377.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gfortran.dg/pr94377.f90	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,26 ----
+ ! { dg-do run }
+ ! Test case from the reporter, PR94377
+ program pdt
+   type :: av_t(n)
+     integer, len :: n
+     integer :: i
+     real :: c
+     real :: u(n)
+   end type av_t
+   type(av_t(:)), allocatable :: av(:)
+   integer :: k2, k3
+   k2 = 3
+   k3 = 5
+ contains
+   subroutine al_test(k)
+     integer, intent(in) :: k
+     integer :: ista
+     if (k == 1)  then
+       allocate ( av_t(k2) :: av(k3), stat=ista)
+       return
+     else
+       deallocate(av, stat=ista)
+     end if
+   end subroutine al_test
+ end program pdt
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/gnat.dg/component_value2.adb gcc-16-20260118/gcc/testsuite/gnat.dg/component_value2.adb
*** gcc-16-20260111/gcc/testsuite/gnat.dg/component_value2.adb	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/gnat.dg/component_value2.adb	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,22 ----
+ --  { dg-do run }
+ 
+ procedure Component_Value2 is
+ 
+    type Bool_Packed_Array is array (Positive range 1 .. 20) of Boolean
+      with Default_Component_Value => False, Pack;
+ 
+    type Bool_Nonpacked_Array is array (Positive range 1 .. 20) of Boolean
+      with Default_Component_Value => False;
+ 
+    P  : Bool_Packed_Array;
+    NP : Bool_Nonpacked_Array;
+ 
+ begin
+    if not (for all I in P'Range => P(I) = False) then
+       raise Program_Error;
+    end if;
+ 
+    if not (for all I in NP'Range => P(I) = False) then
+       raise Program_Error;
+    end if;
+ end;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/lib/gcc-dg.exp gcc-16-20260118/gcc/testsuite/lib/gcc-dg.exp
*** gcc-16-20260111/gcc/testsuite/lib/gcc-dg.exp	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/testsuite/lib/gcc-dg.exp	Sun Jan 18 22:32:14 2026
*************** proc gdb-exists { args } {
*** 1374,1384 ****
  	    if [info exists GDB] {
  		setenv GDB_FOR_GCC_TESTING "$GDB"
  	    } else {
! 		setenv GDB_FOR_GCC_TESTING "[transform gdb]"
  	    }
  	}
      }
!     if { [which $::env(GDB_FOR_GCC_TESTING)] != 0 } {
  	return 1;
      }
      return 0;
--- 1374,1385 ----
  	    if [info exists GDB] {
  		setenv GDB_FOR_GCC_TESTING "$GDB"
  	    } else {
! 		setenv GDB_FOR_GCC_TESTING "gdb"
  	    }
  	}
      }
!     if { [lindex [remote_exec target "$::env(GDB_FOR_GCC_TESTING)" "-v"] 0]
! 	 == 0 } {
  	return 1;
      }
      return 0;
diff -Nrcpad gcc-16-20260111/gcc/testsuite/lib/gcc-gdb-test.exp gcc-16-20260118/gcc/testsuite/lib/gcc-gdb-test.exp
*** gcc-16-20260111/gcc/testsuite/lib/gcc-gdb-test.exp	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/testsuite/lib/gcc-gdb-test.exp	Sun Jan 18 22:32:14 2026
***************
*** 27,34 ****
  #   the literal string with extra whitespace removed.
  # Argument 3 handles expected failures and the like
  proc gdb-test { useline args } {
-     if { ![isnative] || [is_remote target] } { return }
- 
      if { [llength $args] >= 4 } {
  	switch [dg-process-target [lindex $args 3]] {
  	    "S" { }
--- 27,32 ----
*************** proc gdb-test { useline args } {
*** 80,90 ****
      puts $fd "quit"
      close $fd
  
!     send_log "Spawning: $gdb_name -nx -nw -quiet -batch -x $cmd_file ./$output_file\n"
!     set res [remote_spawn target "$gdb_name -nx -nw -quiet -batch -x $cmd_file ./$output_file"]
      if { $res < 0 || $res == "" } {
  	unsupported "$testname"
  	file delete $cmd_file
  	return
      }
  
--- 78,94 ----
      puts $fd "quit"
      close $fd
  
!     set cmd_file_remote [remote_download target $cmd_file]
!     set output_file_remote [remote_download target $output_file]
!     send_log "Spawning: $gdb_name -nx -nw -quiet -batch -x $cmd_file_remote $output_file_remote\n"
!     set res [remote_spawn target "$gdb_name -nx -nw -quiet -batch -x $cmd_file_remote $output_file_remote"]
      if { $res < 0 || $res == "" } {
  	unsupported "$testname"
  	file delete $cmd_file
+ 	if { [is_remote target] } {
+ 	    remote_file target delete $cmd_file_remote
+ 	    remote_file target delete $output_file_remote
+ 	}
  	return
      }
  
*************** proc gdb-test { useline args } {
*** 94,99 ****
--- 98,107 ----
  	    unsupported "$testname"
  	    remote_close target
  	    file delete $cmd_file
+ 	    if { [is_remote target] } {
+ 		remote_file target delete $cmd_file_remote
+ 		remote_file target delete $output_file_remote
+ 	    }
  	    return
  	}
  	# print var; print expected
*************** proc gdb-test { useline args } {
*** 110,115 ****
--- 118,127 ----
  	    }
  	    remote_close target
  	    file delete $cmd_file
+ 	    if { [is_remote target] } {
+ 		remote_file target delete $cmd_file_remote
+ 		remote_file target delete $output_file_remote
+ 	    }
  	    return
  	}
  	# ptype var;
*************** proc gdb-test { useline args } {
*** 131,142 ****
--- 143,162 ----
  	    }
  	    remote_close target
  	    file delete $cmd_file
+ 	    if { [is_remote target] } {
+ 		remote_file target delete $cmd_file_remote
+ 		remote_file target delete $output_file_remote
+ 	    }
  	    return
  	}
  	timeout {
  	    unsupported "$testname"
  	    remote_close target
  	    file delete $cmd_file
+ 	    if { [is_remote target] } {
+ 		remote_file target delete $cmd_file_remote
+ 		remote_file target delete $output_file_remote
+ 	    }
  	    return
  	}
      }
*************** proc gdb-test { useline args } {
*** 144,149 ****
--- 164,173 ----
      unsupported "$testname"
      remote_close target
      file delete $cmd_file
+     if { [is_remote target] } {
+ 	remote_file target delete $cmd_file_remote
+ 	remote_file target delete $output_file_remote
+     }
      return
  }
  
*************** proc gdb-test { useline args } {
*** 152,166 ****
  # Argument 1 is the location where gdb is used
  # 
  proc report_gdb { gdb loc } {
!     if { [catch { exec which $gdb } msg] } {
! 	send_log "gdb not found in $loc: $msg\n"
  	return
      }
-     set gdb [exec which $gdb]
      send_log "gdb used in $loc: $gdb\n"
  
      send_log "gdb used in $loc: "
!     if { [catch { exec $gdb -v } gdb_version] } {
  	send_log "getting version failed:\n"
      } else {
  	send_log "version:\n"
--- 176,193 ----
  # Argument 1 is the location where gdb is used
  # 
  proc report_gdb { gdb loc } {
!     set status [remote_exec target "which" "$gdb"]
!     set gdb [string trim [lindex $status 1]]
!     if { [lindex $status 0] != 0 } {
! 	send_log "gdb not found in $loc: $gdb\n"
  	return
      }
      send_log "gdb used in $loc: $gdb\n"
  
      send_log "gdb used in $loc: "
!     set status [remote_exec target "$gdb" "-v"]
!     set gdb_version [lindex $status 1]
!     if { [lindex $status 0] != 0 } {
  	send_log "getting version failed:\n"
      } else {
  	send_log "version:\n"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/lib/gcc-simulate-thread.exp gcc-16-20260118/gcc/testsuite/lib/gcc-simulate-thread.exp
*** gcc-16-20260111/gcc/testsuite/lib/gcc-simulate-thread.exp	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/testsuite/lib/gcc-simulate-thread.exp	Sun Jan 18 22:32:14 2026
*************** load_lib timeout.exp
*** 24,31 ****
  # Call 'fail' if a given test printed "FAIL:", otherwise call 'pass'.
  
  proc simulate-thread { args } {
-     if { ![isnative] || [is_remote target] } { return }
- 
      if { [llength $args] == 1 } {
  	switch [dg-process-target [lindex $args 0]] {
  		"F" { setup_xfail "*-*-*" }
--- 24,29 ----
*************** proc simulate-thread { args } {
*** 49,58 ****
  
      set message "thread simulation test"
  
!     send_log "Spawning: $gdb_name -nx -nw -batch -x $cmd_file ./$exec_file\n"
!     set res [remote_spawn target "$gdb_name -nx -nw -batch -x $cmd_file ./$exec_file"]
      if { $res < 0 || $res == "" } {
  	unsupported "$testcase $message"
  	return
      }
  
--- 47,62 ----
  
      set message "thread simulation test"
  
!     set cmd_file_remote [remote_download target $cmd_file]
!     set exec_file_remote [remote_download target $exec_file]
!     send_log "Spawning: $gdb_name -nx -nw -batch -x $cmd_file_remote $exec_file_remote\n"
!     set res [remote_spawn target "$gdb_name -nx -nw -batch -x $cmd_file_remote $exec_file_remote"]
      if { $res < 0 || $res == "" } {
  	unsupported "$testcase $message"
+ 	if { [is_remote target] } {
+ 	    remote_file target delete $cmd_file_remote
+ 	    remote_file target delete $exec_file_remote
+ 	}
  	return
      }
  
*************** proc simulate-thread { args } {
*** 62,72 ****
--- 66,84 ----
  	# Too old GDB
  	-re "Unhandled dwarf expression|Error in sourced command file" {
  	    unsupported "$testcase $message"
+ 	    if { [is_remote target] } {
+ 		remote_file target delete $cmd_file_remote
+ 		remote_file target delete $exec_file_remote
+ 	    }
  	    remote_close target
  	    return
  	}
  	-re "FAIL:" {
  	    fail "$testcase $message"
+ 	    if { [is_remote target] } {
+ 		remote_file target delete $cmd_file_remote
+ 		remote_file target delete $exec_file_remote
+ 	    }
  	    remote_close target
  	    return
  	}
*************** proc simulate-thread { args } {
*** 79,89 ****
--- 91,109 ----
  	}
  	timeout {
  	    fail "$testcase $message"
+ 	    if { [is_remote target] } {
+ 		remote_file target delete $cmd_file_remote
+ 		remote_file target delete $exec_file_remote
+ 	    }
  	    remote_close target
  	    return
  	}
      }
  
+     if { [is_remote target] } {
+ 	remote_file target delete $cmd_file_remote
+ 	remote_file target delete $exec_file_remote
+     }
      remote_close target
      if {$gdb_worked} {
  	pass "$testcase $message"
diff -Nrcpad gcc-16-20260111/gcc/testsuite/lib/scanasm.exp gcc-16-20260118/gcc/testsuite/lib/scanasm.exp
*** gcc-16-20260111/gcc/testsuite/lib/scanasm.exp	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/testsuite/lib/scanasm.exp	Sun Jan 18 22:32:14 2026
*************** proc check_function_body { functions nam
*** 983,990 ****
      }
      set fn_res [regexp "^$body_regexp\$" $up_functions($name)]
      if { !$fn_res } {
!       verbose -log "body: $body_regexp"
!       verbose -log "against: $up_functions($name)"
      }
      return $fn_res
  }
--- 983,990 ----
      }
      set fn_res [regexp "^$body_regexp\$" $up_functions($name)]
      if { !$fn_res } {
!       verbose -log "expected: $body_regexp"
!       verbose -log "found: $up_functions($name)"
      }
      return $fn_res
  }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/lib/target-supports.exp gcc-16-20260118/gcc/testsuite/lib/target-supports.exp
*** gcc-16-20260111/gcc/testsuite/lib/target-supports.exp	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/testsuite/lib/target-supports.exp	Sun Jan 18 22:32:14 2026
*************** proc check_effective_target_sha { } {
*** 11688,11693 ****
--- 11688,11698 ----
  
  # Return 1 if avx512dq instructions can be compiled.
  proc check_effective_target_avx512dq { } {
+     # PR target/123415: In addition to the %k0 issue also affecting avx512bw,
+     # Solaris/x86 as doesn't accept {sae} syntax.
+     if { [istarget *-*-solaris2*] && ![check_effective_target_gas] } {
+ 	return 0;
+     }
      return [check_no_compiler_messages avx512dq object {
  	typedef long long __v8di __attribute__ ((__vector_size__ (64)));
  	__v8di
*************** proc check_effective_target_avx512dq { }
*** 11703,11708 ****
--- 11708,11718 ----
  
  # Return 1 if avx512bw instructions can be compiled.
  proc check_effective_target_avx512bw { } {
+     # PR target/123415: Solaris/x86 doesn't accept %k0 as source/destination
+     # in some cases.
+     if { [istarget *-*-solaris2*] && ![check_effective_target_gas] } {
+ 	return 0;
+     }
      return [check_no_compiler_messages avx512bw object {
  	typedef short __v32hi __attribute__ ((__vector_size__ (64)));
  	__v32hi
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/issue-3874.rs gcc-16-20260118/gcc/testsuite/rust/compile/issue-3874.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/issue-3874.rs	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/testsuite/rust/compile/issue-3874.rs	Sun Jan 18 22:32:14 2026
***************
*** 1,4 ****
  fn wow(){
      &#[serde]
!     // { dg-error "found unexpected token .#. in null denotation" "" { target *-*-* } .-1 }
! }
--- 1,3 ----
  fn wow(){
      &#[serde]
! } // { dg-error "found unexpected token .\}. in null denotation" "" { target *-*-* } . }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/issue-3904.rs gcc-16-20260118/gcc/testsuite/rust/compile/issue-3904.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/issue-3904.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/issue-3904.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1 ----
+ static STATIC_1: dyn = *#[serde()]; // { dg-error "found unexpected token .;. in null denotation" "" { target *-*-* } 0 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/issue-4163-2.rs gcc-16-20260118/gcc/testsuite/rust/compile/issue-4163-2.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/issue-4163-2.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/issue-4163-2.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,10 ----
+ enum Enum {
+     NotEmpty {x: i32},
+     Struct {},
+     Tuple (),
+ }
+ 
+ fn main() {
+     Enum::Struct {};
+     Enum::Tuple {};
+ }
\ No newline at end of file
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/issue-4163.rs gcc-16-20260118/gcc/testsuite/rust/compile/issue-4163.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/issue-4163.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/issue-4163.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,9 ----
+ enum Enum {
+     Unit,
+     Tuple(i32),
+     Struct { x: i32 },
+ }
+ 
+ fn main() {
+     Enum::Unit {};
+ }
\ No newline at end of file
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/issue-4213.rs gcc-16-20260118/gcc/testsuite/rust/compile/issue-4213.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/issue-4213.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/issue-4213.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,34 ----
+ // Test for issue #4213 - rogue macro detected during Lowering.
+ 
+ macro_rules! inner {
+     () => {
+         $crate::    // { dg-error "could not parse path expression segment" }
+     };
+ }
+ 
+ macro_rules! multi_arm {
+     (a) => { $crate:: };     // { dg-error "could not parse path expression segment" }
+     (b) => { () };
+ }
+ 
+ macro_rules! another_macro {
+     () => { $crate:: }      // { dg-error "could not parse path expression segment" }
+ }
+ macro_rules! generic_macro {
+     ($t:ty) => {
+         $crate::            // { dg-error "could not parse path expression segment" }
+     };
+ }
+ 
+ macro_rules! empty_case {
+     () => {};
+ }
+ 
+ pub fn main() {
+     let _ = inner!();
+     let _ = multi_arm!(a);
+     let _ = multi_arm!(b);
+     let _ = another_macro!();
+     let _ = generic_macro!(i32);
+     empty_case!();
+ }
\ No newline at end of file
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/link_name-malformed.rs gcc-16-20260118/gcc/testsuite/rust/compile/link_name-malformed.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/link_name-malformed.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/link_name-malformed.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,5 ----
+ // { dg-options "-w" }
+ #[link_name] // { dg-error "malformed .link_name. attribute input" }
+ fn foo() {}
+ 
+ // { dg-note "must be of the form" "" { target *-*-* } .-3 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/no_mangle-malformed.rs gcc-16-20260118/gcc/testsuite/rust/compile/no_mangle-malformed.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/no_mangle-malformed.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/no_mangle-malformed.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,4 ----
+ // { dg-options "-w" }
+ #[no_mangle(foo)] // { dg-error "malformed .no_mangle. attribute input" }
+ fn foo() {}
+ // { dg-note "must be of the form" "" { target *-*-* } .-2 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/redundant-semicolons_0.rs gcc-16-20260118/gcc/testsuite/rust/compile/redundant-semicolons_0.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/redundant-semicolons_0.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/redundant-semicolons_0.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,10 ----
+ // { dg-additional-options "-frust-unused-check-2.0" }
+ 
+ pub fn foo() -> i32 
+ {
+     let a = 32;;
+ // { dg-warning "unnecessary trailing semicolons" "" { target *-*-* } .-1 }
+     return a
+ }
+ 
+ 
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/target_feature-malformed-4233.rs gcc-16-20260118/gcc/testsuite/rust/compile/target_feature-malformed-4233.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/target_feature-malformed-4233.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/target_feature-malformed-4233.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,6 ----
+ // { dg-options "-w" }
+ // Test for issue #4233 - malformed #[target_feature] attribute input
+ 
+ #[target_feature] // { dg-error "malformed .target_feature. attribute input" }
+ unsafe fn foo_sse() {} 
+ // { dg-note "must be of the form" "" { target *-*-* } .-2 }
diff -Nrcpad gcc-16-20260111/gcc/testsuite/rust/compile/unused-label_0.rs gcc-16-20260118/gcc/testsuite/rust/compile/unused-label_0.rs
*** gcc-16-20260111/gcc/testsuite/rust/compile/unused-label_0.rs	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/gcc/testsuite/rust/compile/unused-label_0.rs	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,28 ----
+ // { dg-additional-options "-frust-unused-check-2.0" }
+ 
+ pub fn foo_1() {
+     'a: loop {
+         break 'a;
+     }
+ }
+ 
+ pub fn foo_2() {
+     'a: loop {
+ // { dg-warning "unused label ..a." "" { target *-*-* } .-1 }
+         break;
+     }
+ }
+ 
+ 
+ pub fn bar_1() {
+     'a: loop {
+         continue 'a;
+     }
+ }
+ 
+ pub fn bar_2() {
+     'a: loop {
+ // { dg-warning "unused label ..a." "" { target *-*-* } .-1 }
+         continue;
+     }
+ }
diff -Nrcpad gcc-16-20260111/gcc/timevar.def gcc-16-20260118/gcc/timevar.def
*** gcc-16-20260111/gcc/timevar.def	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/timevar.def	Sun Jan 18 22:32:14 2026
*************** DEFTIMEVAR (TV_JIT_CLIENT_CODE   , "JIT
*** 347,353 ****
  
  /* Analyzer timevars.  */
  DEFTIMEVAR (TV_ANALYZER              , "analyzer")
! DEFTIMEVAR (TV_ANALYZER_SUPERGRAPH   , "analyzer: supergraph")
  DEFTIMEVAR (TV_ANALYZER_STATE_PURGE  , "analyzer: state purge")
  DEFTIMEVAR (TV_ANALYZER_PLAN         , "analyzer: planning")
  DEFTIMEVAR (TV_ANALYZER_SCC          , "analyzer: scc")
--- 347,356 ----
  
  /* Analyzer timevars.  */
  DEFTIMEVAR (TV_ANALYZER              , "analyzer")
! DEFTIMEVAR (TV_ANALYZER_SUPERGRAPH_CREATION, "analyzer: supergraph: creation")
! DEFTIMEVAR (TV_ANALYZER_SUPERGRAPH_FIXUP_LOCATIONS, "analyzer: supergraph: fixup locations")
! DEFTIMEVAR (TV_ANALYZER_SUPERGRAPH_SIMPLIFY, "analyzer: supergraph: simplify")
! DEFTIMEVAR (TV_ANALYZER_SUPERGRAPH_SORTING, "analyzer: supergraph: sorting")
  DEFTIMEVAR (TV_ANALYZER_STATE_PURGE  , "analyzer: state purge")
  DEFTIMEVAR (TV_ANALYZER_PLAN         , "analyzer: planning")
  DEFTIMEVAR (TV_ANALYZER_SCC          , "analyzer: scc")
diff -Nrcpad gcc-16-20260111/gcc/tree-core.h gcc-16-20260118/gcc/tree-core.h
*** gcc-16-20260111/gcc/tree-core.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-core.h	Sun Jan 18 22:32:14 2026
*************** struct GTY(()) tree_base {
*** 1183,1189 ****
  	 present in tree_base instead of tree_type is to save space.  The size
  	 of the field must be large enough to hold addr_space_t values.
  	 For CONSTRUCTOR nodes this holds the clobber_kind enum.
! 	 The C++ front-end uses this in IDENTIFIER_NODE and NAMESPACE_DECL.  */
        unsigned address_space : 8;
      } bits;
  
--- 1183,1190 ----
  	 present in tree_base instead of tree_type is to save space.  The size
  	 of the field must be large enough to hold addr_space_t values.
  	 For CONSTRUCTOR nodes this holds the clobber_kind enum.
! 	 The C++ front-end uses this in IDENTIFIER_NODE, REFLECT_EXPR, and
! 	 NAMESPACE_DECL.  */
        unsigned address_space : 8;
      } bits;
  
diff -Nrcpad gcc-16-20260111/gcc/tree-if-conv.cc gcc-16-20260118/gcc/tree-if-conv.cc
*** gcc-16-20260111/gcc/tree-if-conv.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-if-conv.cc	Sun Jan 18 22:32:14 2026
*************** convert_scalar_cond_reduction (gimple *r
*** 1993,1998 ****
--- 1993,1999 ----
    ifn = get_conditional_internal_fn (reduction_op);
    if (loop_versioned && ifn != IFN_LAST
        && vectorized_internal_fn_supported_p (ifn, TREE_TYPE (lhs))
+       && !VECTOR_TYPE_P (TREE_TYPE (lhs))
        && !swap)
      {
        gcall *cond_call = gimple_build_call_internal (ifn, 4,
diff -Nrcpad gcc-16-20260111/gcc/tree-pretty-print.cc gcc-16-20260118/gcc/tree-pretty-print.cc
*** gcc-16-20260111/gcc/tree-pretty-print.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-pretty-print.cc	Sun Jan 18 22:32:14 2026
*************** print_omp_context_selector (FILE *file,
*** 1780,1786 ****
  /* Dump location LOC to PP.  */
  
  void
! dump_location (pretty_printer *pp, location_t loc)
  {
    expanded_location xloc = expand_location (loc);
    int discriminator = get_discriminator_from_loc (loc);
--- 1780,1786 ----
  /* Dump location LOC to PP.  */
  
  void
! dump_location (pretty_printer *pp, location_t loc, dump_flags_t flags)
  {
    expanded_location xloc = expand_location (loc);
    int discriminator = get_discriminator_from_loc (loc);
*************** dump_location (pretty_printer *pp, locat
*** 1794,1800 ****
    pp_decimal_int (pp, xloc.line);
    pp_colon (pp);
    pp_decimal_int (pp, xloc.column);
!   if (discriminator)
    {
      pp_string (pp, " discrim ");
      pp_decimal_int (pp, discriminator);
--- 1794,1800 ----
    pp_decimal_int (pp, xloc.line);
    pp_colon (pp);
    pp_decimal_int (pp, xloc.column);
!   if (discriminator && (flags & TDF_COMPARE_DEBUG) == 0)
    {
      pp_string (pp, " discrim ");
      pp_decimal_int (pp, discriminator);
*************** dump_block_node (pretty_printer *pp, tre
*** 1829,1835 ****
      return;
  
    if (BLOCK_SOURCE_LOCATION (block))
!     dump_location (pp, BLOCK_SOURCE_LOCATION (block));
  
    newline_and_indent (pp, spc + 2);
  
--- 1829,1835 ----
      return;
  
    if (BLOCK_SOURCE_LOCATION (block))
!     dump_location (pp, BLOCK_SOURCE_LOCATION (block), flags);
  
    newline_and_indent (pp, spc + 2);
  
*************** dump_generic_node (pretty_printer *pp, t
*** 2191,2197 ****
      }
  
    if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
!     dump_location (pp, EXPR_LOCATION (node));
  
    code = TREE_CODE (node);
    switch (code)
--- 2191,2197 ----
      }
  
    if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
!     dump_location (pp, EXPR_LOCATION (node), flags);
  
    code = TREE_CODE (node);
    switch (code)
diff -Nrcpad gcc-16-20260111/gcc/tree-pretty-print.h gcc-16-20260118/gcc/tree-pretty-print.h
*** gcc-16-20260111/gcc/tree-pretty-print.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-pretty-print.h	Sun Jan 18 22:32:14 2026
*************** extern void print_call_name (pretty_prin
*** 56,61 ****
  extern void pp_tree_identifier (pretty_printer *, tree);
  extern void dump_function_header (FILE *, tree, dump_flags_t);
  extern void pp_double_int (pretty_printer *pp, double_int d, bool uns);
! extern void dump_location (pretty_printer *pp, location_t loc);
  
  #endif /* ! GCC_TREE_PRETTY_PRINT_H */
--- 56,62 ----
  extern void pp_tree_identifier (pretty_printer *, tree);
  extern void dump_function_header (FILE *, tree, dump_flags_t);
  extern void pp_double_int (pretty_printer *pp, double_int d, bool uns);
! extern void dump_location (pretty_printer *pp, location_t loc,
! 			   dump_flags_t = TDF_NONE);
  
  #endif /* ! GCC_TREE_PRETTY_PRINT_H */
diff -Nrcpad gcc-16-20260111/gcc/tree-ssa-forwprop.cc gcc-16-20260118/gcc/tree-ssa-forwprop.cc
*** gcc-16-20260111/gcc/tree-ssa-forwprop.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-ssa-forwprop.cc	Sun Jan 18 22:32:14 2026
*************** simplify_vector_constructor (gimple_stmt
*** 4260,4266 ****
        if (nelts != refnelts)
  	res = gimple_build (&stmts, BIT_FIELD_REF,
  			    conv_code != ERROR_MARK ? conv_src_type : type,
! 			    res, TYPE_SIZE (type), bitsize_zero_node);
        if (conv_code != ERROR_MARK)
  	res = gimple_build (&stmts, conv_code, type, res);
        else if (!useless_type_conversion_p (type, TREE_TYPE (res)))
--- 4260,4269 ----
        if (nelts != refnelts)
  	res = gimple_build (&stmts, BIT_FIELD_REF,
  			    conv_code != ERROR_MARK ? conv_src_type : type,
! 			    res,
! 			    TYPE_SIZE (conv_code != ERROR_MARK ? conv_src_type
! 							       : type),
! 			    bitsize_zero_node);
        if (conv_code != ERROR_MARK)
  	res = gimple_build (&stmts, conv_code, type, res);
        else if (!useless_type_conversion_p (type, TREE_TYPE (res)))
diff -Nrcpad gcc-16-20260111/gcc/tree-ssa-loop-ivcanon.cc gcc-16-20260118/gcc/tree-ssa-loop-ivcanon.cc
*** gcc-16-20260111/gcc/tree-ssa-loop-ivcanon.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-ssa-loop-ivcanon.cc	Sun Jan 18 22:32:14 2026
*************** along with GCC; see the file COPYING3.
*** 65,70 ****
--- 65,71 ----
  #include "tree-ssa-sccvn.h"
  #include "tree-vectorizer.h" /* For find_loop_location */
  #include "dbgcnt.h"
+ #include "hierarchical_discriminator.h"
  
  /* Specifies types of loops that may be unrolled.  */
  
*************** try_unroll_loop_completely (class loop *
*** 980,986 ****
        if (!gimple_duplicate_loop_body_to_header_edge (
  	    loop, loop_preheader_edge (loop), n_unroll, wont_exit, exit,
  	    &edges_to_remove,
! 	    DLTHE_FLAG_UPDATE_FREQ | DLTHE_FLAG_COMPLETTE_PEEL))
  	{
            free_original_copy_tables ();
  	  if (dump_file && (dump_flags & TDF_DETAILS))
--- 981,988 ----
        if (!gimple_duplicate_loop_body_to_header_edge (
  	    loop, loop_preheader_edge (loop), n_unroll, wont_exit, exit,
  	    &edges_to_remove,
! 	    DLTHE_FLAG_UPDATE_FREQ | DLTHE_FLAG_COMPLETTE_PEEL
! 	    | DLTHE_RECORD_HIERARCHICAL_DISCRIMINATOR))
  	{
            free_original_copy_tables ();
  	  if (dump_file && (dump_flags & TDF_DETAILS))
*************** try_peel_loop (class loop *loop,
*** 1222,1228 ****
  
    if (!gimple_duplicate_loop_body_to_header_edge (
  	loop, loop_preheader_edge (loop), npeel, wont_exit, exit,
! 	&edges_to_remove, DLTHE_FLAG_UPDATE_FREQ))
      {
        free_original_copy_tables ();
        return false;
--- 1224,1231 ----
  
    if (!gimple_duplicate_loop_body_to_header_edge (
  	loop, loop_preheader_edge (loop), npeel, wont_exit, exit,
! 	&edges_to_remove,
! 	DLTHE_FLAG_UPDATE_FREQ | DLTHE_RECORD_HIERARCHICAL_DISCRIMINATOR))
      {
        free_original_copy_tables ();
        return false;
diff -Nrcpad gcc-16-20260111/gcc/tree-ssa-phiopt.cc gcc-16-20260118/gcc/tree-ssa-phiopt.cc
*** gcc-16-20260111/gcc/tree-ssa-phiopt.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-ssa-phiopt.cc	Sun Jan 18 22:32:14 2026
*************** cond_removal_in_builtin_zero_pattern (ba
*** 2627,2642 ****
        || arg != gimple_cond_lhs (cond))
      return false;
  
!   /* Canonicalize.  */
!   if ((e2->flags & EDGE_TRUE_VALUE
!        && gimple_cond_code (cond) == NE_EXPR)
!       || (e1->flags & EDGE_TRUE_VALUE
! 	  && gimple_cond_code (cond) == EQ_EXPR))
      {
        std::swap (arg0, arg1);
-       std::swap (e1, e2);
      }
  
    /* Check PHI arguments.  */
    if (lhs != arg0
        || TREE_CODE (arg1) != INTEGER_CST)
--- 2627,2662 ----
        || arg != gimple_cond_lhs (cond))
      return false;
  
!   edge true_edge, false_edge;
!   /* We need to know which is the true edge and which is the false
!      edge so that we know when to invert the condition below.  */
!   extract_true_false_edges_from_block (cond_bb, &true_edge, &false_edge);
! 
!   /* Forward the edges over the middle basic block.  */
!   if (true_edge->dest == middle_bb)
!     true_edge = EDGE_SUCC (true_edge->dest, 0);
!   if (false_edge->dest == middle_bb)
!     false_edge = EDGE_SUCC (false_edge->dest, 0);
! 
!   /* Canonicalize the args with respect to the edges,
!      arg0 is from the true edge and arg1 is from the
!      false edge.
!      That is `cond ? arg0 : arg1`.*/
!   if (true_edge == e1)
!     gcc_assert (false_edge == e2);
!   else
      {
+       gcc_assert (false_edge == e1);
+       gcc_assert (true_edge == e2);
        std::swap (arg0, arg1);
      }
  
+   /* Canonicalize the args such that we get:
+      `arg != 0 ? arg0 : arg1`. So swap arg0/arg1
+      around if cond was an equals.  */
+   if (gimple_cond_code (cond) == EQ_EXPR)
+     std::swap (arg0, arg1);
+ 
    /* Check PHI arguments.  */
    if (lhs != arg0
        || TREE_CODE (arg1) != INTEGER_CST)
diff -Nrcpad gcc-16-20260111/gcc/tree-ssa-sccvn.cc gcc-16-20260118/gcc/tree-ssa-sccvn.cc
*** gcc-16-20260111/gcc/tree-ssa-sccvn.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-ssa-sccvn.cc	Sun Jan 18 22:32:14 2026
*************** vn_walk_cb_data::push_partial_def (pd_da
*** 2316,2322 ****
    /* Make sure to interpret in a type that has a range covering the whole
       access size.  */
    if (INTEGRAL_TYPE_P (vr->type) && maxsizei != TYPE_PRECISION (vr->type))
!     type = build_nonstandard_integer_type (maxsizei, TYPE_UNSIGNED (type));
    tree val;
    if (BYTES_BIG_ENDIAN)
      {
--- 2316,2328 ----
    /* Make sure to interpret in a type that has a range covering the whole
       access size.  */
    if (INTEGRAL_TYPE_P (vr->type) && maxsizei != TYPE_PRECISION (vr->type))
!     {
!       if (TREE_CODE (vr->type) == BITINT_TYPE
! 	  && maxsizei > MAX_FIXED_MODE_SIZE)
! 	type = build_bitint_type (maxsizei, TYPE_UNSIGNED (type));
!       else
! 	type = build_nonstandard_integer_type (maxsizei, TYPE_UNSIGNED (type));
!     }
    tree val;
    if (BYTES_BIG_ENDIAN)
      {
*************** vn_reference_lookup_3 (ao_ref *ref, tree
*** 3615,3621 ****
  	  if (i > 0)
  	    {
  	      int temi = i - 1;
! 	      extra_off = vr->operands[i].off;
  	      while (temi >= 0
  		     && known_ne (vr->operands[temi].off, -1))
  		{
--- 3621,3627 ----
  	  if (i > 0)
  	    {
  	      int temi = i - 1;
! 	      poly_int64 tem_extra_off = extra_off + vr->operands[i].off;
  	      while (temi >= 0
  		     && known_ne (vr->operands[temi].off, -1))
  		{
*************** vn_reference_lookup_3 (ao_ref *ref, tree
*** 3627,3646 ****
  		      i = temi;
  		      /* Strip the component that was type matched to
  			 the MEM_REF.  */
! 		      extra_off += vr->operands[i].off - lhs_ops[j].off;
  		      i--, j--;
  		      /* Strip further equal components.  */
  		      found = true;
  		      break;
  		    }
! 		  extra_off += vr->operands[temi].off;
  		  temi--;
  		}
  	    }
  	  if (!found && j > 0)
  	    {
  	      int temj = j - 1;
! 	      extra_off = -lhs_ops[j].off;
  	      while (temj >= 0
  		     && known_ne (lhs_ops[temj].off, -1))
  		{
--- 3633,3653 ----
  		      i = temi;
  		      /* Strip the component that was type matched to
  			 the MEM_REF.  */
! 		      extra_off = (tem_extra_off
! 				   + vr->operands[i].off - lhs_ops[j].off);
  		      i--, j--;
  		      /* Strip further equal components.  */
  		      found = true;
  		      break;
  		    }
! 		  tem_extra_off += vr->operands[temi].off;
  		  temi--;
  		}
  	    }
  	  if (!found && j > 0)
  	    {
  	      int temj = j - 1;
! 	      poly_int64 tem_extra_off = extra_off - lhs_ops[j].off;
  	      while (temj >= 0
  		     && known_ne (lhs_ops[temj].off, -1))
  		{
*************** vn_reference_lookup_3 (ao_ref *ref, tree
*** 3652,3675 ****
  		      j = temj;
  		      /* Strip the component that was type matched to
  			 the MEM_REF.  */
! 		      extra_off += vr->operands[i].off - lhs_ops[j].off;
  		      i--, j--;
  		      /* Strip further equal components.  */
  		      found = true;
  		      break;
  		    }
! 		  extra_off += -lhs_ops[temj].off;
  		  temj--;
  		}
  	    }
! 	  /* When the LHS is already at the outermost level simply
! 	     adjust for any offset difference.  Further lookups
! 	     will fail when there's too gross of a type compatibility
! 	     issue.  */
! 	  if (!found && j == 0)
  	    {
! 	      extra_off = vr->operands[i].off - lhs_ops[j].off;
! 	      i--, j--;
  	      found = true;
  	    }
  	  /* If we did find a match we'd eventually append a MEM_REF
--- 3659,3701 ----
  		      j = temj;
  		      /* Strip the component that was type matched to
  			 the MEM_REF.  */
! 		      extra_off = (tem_extra_off
! 				   + vr->operands[i].off - lhs_ops[j].off);
  		      i--, j--;
  		      /* Strip further equal components.  */
  		      found = true;
  		      break;
  		    }
! 		  tem_extra_off += -lhs_ops[temj].off;
  		  temj--;
  		}
  	    }
! 	  /* When we cannot find a common base to reconstruct the full
! 	     reference instead try to reduce the lookup to the new
! 	     base plus a constant offset.  */
! 	  if (!found)
  	    {
! 	      while (j >= 0
! 		     && known_ne (lhs_ops[j].off, -1))
! 		{
! 		  extra_off += -lhs_ops[j].off;
! 		  j--;
! 		}
! 	      if (j != -1)
! 		return (void *)-1;
! 	      while (i >= 0
! 		     && known_ne (vr->operands[i].off, -1))
! 		{
! 		  /* Punt if the additional ops contain a storage order
! 		     barrier.  */
! 		  if (vr->operands[i].opcode == VIEW_CONVERT_EXPR
! 		      && vr->operands[i].reverse)
! 		    break;
! 		  extra_off += vr->operands[i].off;
! 		  i--;
! 		}
! 	      if (i != -1)
! 		return (void *)-1;
  	      found = true;
  	    }
  	  /* If we did find a match we'd eventually append a MEM_REF
*************** vn_reference_lookup_3 (ao_ref *ref, tree
*** 3689,3705 ****
  	  j--;
  	}
  
-       /* When we still didn't manage to strip off all components from
- 	 lhs_op, opportunistically continue for those we can handle
- 	 via extra_off.  Note this is an attempt to fixup secondary
- 	 copies after we hit the !found && j == 0 case above.  */
-       while (j != -1
- 	     && known_ne (lhs_ops[j].off, -1))
- 	{
- 	  extra_off += -lhs_ops[j].off;
- 	  j--;
- 	}
- 
        /* i now points to the first additional op.
  	 ???  LHS may not be completely contained in VR, one or more
  	 VIEW_CONVERT_EXPRs could be in its way.  We could at least
--- 3715,3720 ----
diff -Nrcpad gcc-16-20260111/gcc/tree-vect-generic.cc gcc-16-20260118/gcc/tree-vect-generic.cc
*** gcc-16-20260111/gcc/tree-vect-generic.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-vect-generic.cc	Sun Jan 18 22:32:14 2026
*************** lower_vec_perm (gimple_stmt_iterator *gs
*** 1620,1626 ****
    tree mask_type = TREE_TYPE (mask);
    tree vect_elt_type = TREE_TYPE (vect_type);
    tree mask_elt_type = TREE_TYPE (mask_type);
!   unsigned HOST_WIDE_INT elements;
    vec<constructor_elt, va_gc> *v;
    tree constr, t, si, i_val;
    tree vec0tmp = NULL_TREE, vec1tmp = NULL_TREE, masktmp = NULL_TREE;
--- 1620,1626 ----
    tree mask_type = TREE_TYPE (mask);
    tree vect_elt_type = TREE_TYPE (vect_type);
    tree mask_elt_type = TREE_TYPE (mask_type);
!   unsigned HOST_WIDE_INT elements, in_elements;
    vec<constructor_elt, va_gc> *v;
    tree constr, t, si, i_val;
    tree vec0tmp = NULL_TREE, vec1tmp = NULL_TREE, masktmp = NULL_TREE;
*************** lower_vec_perm (gimple_stmt_iterator *gs
*** 1628,1634 ****
    location_t loc = gimple_location (gsi_stmt (*gsi));
    unsigned i;
  
!   if (!TYPE_VECTOR_SUBPARTS (res_vect_type).is_constant (&elements))
      return;
  
    if (TREE_CODE (mask) == SSA_NAME)
--- 1628,1635 ----
    location_t loc = gimple_location (gsi_stmt (*gsi));
    unsigned i;
  
!   if (!TYPE_VECTOR_SUBPARTS (res_vect_type).is_constant (&elements)
!       || !TYPE_VECTOR_SUBPARTS (vect_type).is_constant (&in_elements))
      return;
  
    if (TREE_CODE (mask) == SSA_NAME)
*************** lower_vec_perm (gimple_stmt_iterator *gs
*** 1644,1650 ****
    if (TREE_CODE (mask) == VECTOR_CST
        && tree_to_vec_perm_builder (&sel_int, mask))
      {
!       vec_perm_indices indices (sel_int, 2, elements);
        machine_mode vmode = TYPE_MODE (vect_type);
        tree lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
        machine_mode lhs_mode = TYPE_MODE (lhs_type);
--- 1645,1651 ----
    if (TREE_CODE (mask) == VECTOR_CST
        && tree_to_vec_perm_builder (&sel_int, mask))
      {
!       vec_perm_indices indices (sel_int, 2, in_elements);
        machine_mode vmode = TYPE_MODE (vect_type);
        tree lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
        machine_mode lhs_mode = TYPE_MODE (lhs_type);
*************** lower_vec_perm (gimple_stmt_iterator *gs
*** 1729,1738 ****
  	  unsigned HOST_WIDE_INT index;
  
  	  index = TREE_INT_CST_LOW (i_val);
! 	  if (!tree_fits_uhwi_p (i_val) || index >= elements)
! 	    i_val = build_int_cst (mask_elt_type, index & (elements - 1));
  
!           if (two_operand_p && (index & elements) != 0)
  	    t = vector_element (gsi, vec1, i_val, &vec1tmp);
  	  else
  	    t = vector_element (gsi, vec0, i_val, &vec0tmp);
--- 1730,1739 ----
  	  unsigned HOST_WIDE_INT index;
  
  	  index = TREE_INT_CST_LOW (i_val);
! 	  if (!tree_fits_uhwi_p (i_val) || index >= in_elements)
! 	    i_val = build_int_cst (mask_elt_type, index & (in_elements - 1));
  
! 	  if (two_operand_p && (index & in_elements) != 0)
  	    t = vector_element (gsi, vec1, i_val, &vec1tmp);
  	  else
  	    t = vector_element (gsi, vec0, i_val, &vec0tmp);
diff -Nrcpad gcc-16-20260111/gcc/tree-vect-loop-manip.cc gcc-16-20260118/gcc/tree-vect-loop-manip.cc
*** gcc-16-20260111/gcc/tree-vect-loop-manip.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-vect-loop-manip.cc	Sun Jan 18 22:32:14 2026
*************** along with GCC; see the file COPYING3.
*** 53,58 ****
--- 53,60 ----
  #include "langhooks.h"
  #include "tree-vector-builder.h"
  #include "optabs-tree.h"
+ #include "hierarchical_discriminator.h"
+ 
  
  /*************************************************************************
    Simple Loop Peeling Utilities
*************** vect_do_peeling (loop_vec_info loop_vinf
*** 3464,3469 ****
--- 3466,3480 ----
        gcc_assert (prolog);
        prolog->force_vectorize = false;
  
+       /* Assign hierarchical discriminators to distinguish prolog loop.  */
+       gimple *prolog_last = last_nondebug_stmt (prolog->header);
+       location_t prolog_loc
+        	= prolog_last ? gimple_location (prolog_last) : UNKNOWN_LOCATION;
+       if (prolog_loc != UNKNOWN_LOCATION)
+ 	{
+ 	  unsigned int prolog_copyid = allocate_copyid_base (prolog_loc, 1);
+ 	  assign_discriminators_to_loop (prolog, 0, prolog_copyid);
+ 	}
        first_loop = prolog;
        reset_original_copy_tables ();
  
*************** vect_do_peeling (loop_vec_info loop_vinf
*** 3573,3578 ****
--- 3584,3605 ----
        epilog->force_vectorize = false;
        bb_before_epilog = loop_preheader_edge (epilog)->src;
  
+       /* Assign hierarchical discriminators to distinguish epilog loop.
+ 	 Only assign if it's a scalar epilog.  If it will be vectorized
+ 	 (vect_epilogues), discriminators will be assigned.
+ 	 Use dynamic copy_id allocation instead of hardcoded constants.  */
+       if (!vect_epilogues)
+ 	{
+ 	  gimple *epilog_last = last_nondebug_stmt (epilog->header);
+ 	  location_t epilog_loc
+ 	    = epilog_last ? gimple_location (epilog_last) : UNKNOWN_LOCATION;
+ 	  if (epilog_loc != UNKNOWN_LOCATION)
+ 	    {
+ 	      unsigned int epilog_copyid = allocate_copyid_base (epilog_loc, 1);
+ 	      assign_discriminators_to_loop (epilog, 0, epilog_copyid);
+ 	    }
+ 	}
+ 
        /* Scalar version loop may be preferred.  In this case, add guard
  	 and skip to epilog.  Note this only happens when the number of
  	 iterations of loop is unknown at compile time, otherwise this
*************** vect_loop_versioning (loop_vec_info loop
*** 4501,4506 ****
--- 4528,4545 ----
        gcc_assert (nloop);
        nloop = get_loop_copy (loop);
  
+       /* Assign hierarchical discriminators to distinguish loop versions.
+ 	 Only assign to the scalar version here; the vectorized version will
+ 	 get discriminators later during transformation/peeling.
+ 	 Use dynamic copy_id allocation instead of hardcoded constants.  */
+       gimple *nloop_last = last_nondebug_stmt (nloop->header);
+       location_t nloop_loc
+        	= nloop_last ? gimple_location (nloop_last) : UNKNOWN_LOCATION;
+       if (nloop_loc != UNKNOWN_LOCATION)
+ 	{
+ 	  unsigned int nloop_copyid = allocate_copyid_base (nloop_loc, 1);
+ 	  assign_discriminators_to_loop (nloop, 0, nloop_copyid);
+ 	}
        /* For cycle vectorization with SLP we rely on the PHI arguments
  	 appearing in the same order as the SLP node operands which for the
  	 loop PHI nodes means the preheader edge dest index needs to remain
diff -Nrcpad gcc-16-20260111/gcc/tree-vect-loop.cc gcc-16-20260118/gcc/tree-vect-loop.cc
*** gcc-16-20260111/gcc/tree-vect-loop.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-vect-loop.cc	Sun Jan 18 22:32:14 2026
*************** along with GCC; see the file COPYING3.
*** 59,64 ****
--- 59,65 ----
  #include "case-cfn-macros.h"
  #include "langhooks.h"
  #include "opts.h"
+ #include "hierarchical_discriminator.h"
  
  /* Loop Vectorization Pass.
  
*************** vect_analyze_loop_costing (loop_vec_info
*** 1792,1800 ****
  	    }
  	}
        /* Reject vectorizing for a single scalar iteration, even if
! 	 we could in principle implement that using partial vectors.  */
        unsigned peeling_gap = LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo);
!       if (scalar_niters <= peeling_gap + 1)
  	{
  	  if (dump_enabled_p ())
  	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
--- 1793,1805 ----
  	    }
  	}
        /* Reject vectorizing for a single scalar iteration, even if
! 	 we could in principle implement that using partial vectors.
! 	 But allow such vectorization if VF == 1 in case we do not
! 	 need to peel for gaps (if we need, avoid vectorization for
! 	 reasons of code footprint).  */
        unsigned peeling_gap = LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo);
!       if (scalar_niters <= peeling_gap + 1
! 	  && (assumed_vf > 1 || peeling_gap != 0))
  	{
  	  if (dump_enabled_p ())
  	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
*************** vect_create_epilog_for_reduction (loop_v
*** 6000,6006 ****
  	       && (mode1 = targetm.vectorize.split_reduction (mode)) != mode)
  	nunits1 = GET_MODE_NUNITS (mode1).to_constant ();
  
!       tree vectype1 = vectype;
        if (mode1 != mode)
  	{
  	  vectype1 = get_related_vectype_for_scalar_type (TYPE_MODE (vectype),
--- 6005,6011 ----
  	       && (mode1 = targetm.vectorize.split_reduction (mode)) != mode)
  	nunits1 = GET_MODE_NUNITS (mode1).to_constant ();
  
!       tree vectype1 = compute_vectype;
        if (mode1 != mode)
  	{
  	  vectype1 = get_related_vectype_for_scalar_type (TYPE_MODE (vectype),
*************** vect_transform_loop (loop_vec_info loop_
*** 11206,11211 ****
--- 11211,11233 ----
  			      &step_vector, &niters_vector_mult_vf, th,
  			      check_profitability, niters_no_overflow,
  			      &advance);
+ 
+   /* Assign hierarchical discriminators to the vectorized loop.  */
+   poly_uint64 vf_val = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
+   unsigned int vf_int = constant_lower_bound (vf_val);
+   if (vf_int > DISCR_MULTIPLICITY_MAX)
+     vf_int = DISCR_MULTIPLICITY_MAX;
+ 
+   /* Assign unique copy_id dynamically instead of using hardcoded constants.
+      Epilogue and main vectorized loops get different copy_ids.  */
+   gimple *loop_last = last_nondebug_stmt (loop->header);
+   location_t loop_loc
+     = loop_last ? gimple_location (loop_last) : UNKNOWN_LOCATION;
+   if (loop_loc != UNKNOWN_LOCATION)
+     {
+       unsigned int copyid = allocate_copyid_base (loop_loc, 1);
+       assign_discriminators_to_loop (loop, vf_int, copyid);
+     }
    if (LOOP_VINFO_SCALAR_LOOP (loop_vinfo)
        && LOOP_VINFO_SCALAR_LOOP_SCALING (loop_vinfo).initialized_p ())
      {
diff -Nrcpad gcc-16-20260111/gcc/tree-vect-patterns.cc gcc-16-20260118/gcc/tree-vect-patterns.cc
*** gcc-16-20260111/gcc/tree-vect-patterns.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-vect-patterns.cc	Sun Jan 18 22:32:14 2026
*************** vect_recog_bool_pattern (vec_info *vinfo
*** 6006,6012 ****
        || rhs_code == VIEW_CONVERT_EXPR
        || rhs_code == FLOAT_EXPR)
      {
!       if (VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (lhs)))
  	return NULL;
        vectype = get_vectype_for_scalar_type (vinfo, TREE_TYPE (lhs));
  
--- 6006,6014 ----
        || rhs_code == VIEW_CONVERT_EXPR
        || rhs_code == FLOAT_EXPR)
      {
!       if (! (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
! 	     || SCALAR_FLOAT_TYPE_P (TREE_TYPE (lhs)))
! 	  || VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (lhs)))
  	return NULL;
        vectype = get_vectype_for_scalar_type (vinfo, TREE_TYPE (lhs));
  
diff -Nrcpad gcc-16-20260111/gcc/tree-vect-stmts.cc gcc-16-20260118/gcc/tree-vect-stmts.cc
*** gcc-16-20260111/gcc/tree-vect-stmts.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-vect-stmts.cc	Sun Jan 18 22:32:14 2026
*************** get_load_store_type (vec_info  *vinfo, s
*** 2087,2092 ****
--- 2087,2093 ----
    tree *ls_type = &ls->ls_type;
    bool *slp_perm = &ls->slp_perm;
    unsigned *n_perms = &ls->n_perms;
+   unsigned *n_loads = &ls->n_loads;
    tree *supported_offset_vectype = &ls->supported_offset_vectype;
    int *supported_scale = &ls->supported_scale;
    loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo);
*************** get_load_store_type (vec_info  *vinfo, s
*** 2103,2108 ****
--- 2104,2110 ----
    *ls_type = NULL_TREE;
    *slp_perm = false;
    *n_perms = -1U;
+   *n_loads = -1U;
    ls->subchain_p = false;
  
    bool perm_ok = true;
*************** get_load_store_type (vec_info  *vinfo, s
*** 2110,2116 ****
  
    if (SLP_TREE_LOAD_PERMUTATION (slp_node).exists ())
      perm_ok = vect_transform_slp_perm_load (vinfo, slp_node, vNULL, NULL,
! 					    vf, true, n_perms);
  
    if (STMT_VINFO_GROUPED_ACCESS (stmt_info))
      {
--- 2112,2118 ----
  
    if (SLP_TREE_LOAD_PERMUTATION (slp_node).exists ())
      perm_ok = vect_transform_slp_perm_load (vinfo, slp_node, vNULL, NULL,
! 					    vf, true, n_perms, n_loads);
  
    if (STMT_VINFO_GROUPED_ACCESS (stmt_info))
      {
*************** vectorizable_load (vec_info *vinfo,
*** 11880,11897 ****
  	 in PR101120 and friends.  */
        if (costing_p)
  	{
! 	  gcc_assert (ls.n_perms != -1U);
  	  if (ls.n_perms != 0)
  	    inside_cost = record_stmt_cost (cost_vec, ls.n_perms, vec_perm,
  					    slp_node, 0, vect_body);
  	}
        else
  	{
! 	  unsigned n_perms2;
  	  bool ok = vect_transform_slp_perm_load (vinfo, slp_node, dr_chain,
  						  gsi, vf, false, &n_perms2,
! 						  nullptr, true);
! 	  gcc_assert (ok && ls.n_perms == n_perms2);
  	}
      }
  
--- 11882,11901 ----
  	 in PR101120 and friends.  */
        if (costing_p)
  	{
! 	  gcc_assert (ls.n_perms != -1U && ls.n_loads != -1U);
  	  if (ls.n_perms != 0)
  	    inside_cost = record_stmt_cost (cost_vec, ls.n_perms, vec_perm,
  					    slp_node, 0, vect_body);
+ 	  if (n_adjacent_loads > 0)
+ 	    n_adjacent_loads = ls.n_loads;
  	}
        else
  	{
! 	  unsigned n_perms2, n_loads2;
  	  bool ok = vect_transform_slp_perm_load (vinfo, slp_node, dr_chain,
  						  gsi, vf, false, &n_perms2,
! 						  &n_loads2, true);
! 	  gcc_assert (ok && ls.n_perms == n_perms2 && ls.n_loads == n_loads2);
  	}
      }
  
diff -Nrcpad gcc-16-20260111/gcc/tree-vectorizer.h gcc-16-20260118/gcc/tree-vectorizer.h
*** gcc-16-20260111/gcc/tree-vectorizer.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree-vectorizer.h	Sun Jan 18 22:32:14 2026
*************** struct vect_load_store_data : vect_data
*** 307,312 ****
--- 307,313 ----
    /* True if the load requires a load permutation.  */
    bool slp_perm;    // SLP_TREE_LOAD_PERMUTATION
    unsigned n_perms; // SLP_TREE_LOAD_PERMUTATION
+   unsigned n_loads; // SLP_TREE_LOAD_PERMUTATION
    /* Whether the load permutation is consecutive and simple.  */
    bool subchain_p; // VMAT_STRIDED_SLP and VMAT_GATHER_SCATTER
  };
diff -Nrcpad gcc-16-20260111/gcc/tree.cc gcc-16-20260118/gcc/tree.cc
*** gcc-16-20260111/gcc/tree.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree.cc	Sun Jan 18 22:32:14 2026
*************** valid_new_delete_pair_p (tree new_asm, t
*** 15318,15323 ****
--- 15318,15330 ----
    if ((new_name[2] != 'w' || delete_name[2] != 'l')
        && (new_name[2] != 'a' || delete_name[2] != 'a'))
      return false;
+   if (new_name[3] == 'I' || delete_name[3] == 'I')
+     {
+       /* When ::operator new or ::operator delete are function templates,
+ 	 return uncertain mismatch, we need demangler in that case.  */
+       *pcertain = false;
+       return false;
+     }
    /* 'j', 'm' and 'y' correspond to size_t.  */
    if (new_name[3] != 'j' && new_name[3] != 'm' && new_name[3] != 'y')
      return false;
diff -Nrcpad gcc-16-20260111/gcc/tree.h gcc-16-20260118/gcc/tree.h
*** gcc-16-20260111/gcc/tree.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/gcc/tree.h	Sun Jan 18 22:32:14 2026
*************** extern void omp_clause_range_check_faile
*** 974,986 ****
        || flag_wrapv))
  
  /* True if overflow is undefined for the given integral or pointer type.
!    We may optimize on the assumption that values in the type never overflow.
! 
!    IMPORTANT NOTE: Any optimization based on TYPE_OVERFLOW_UNDEFINED
!    must issue a warning based on warn_strict_overflow.  In some cases
!    it will be appropriate to issue the warning immediately, and in
!    other cases it will be appropriate to simply set a flag and let the
!    caller decide whether a warning is appropriate or not.  */
  #define TYPE_OVERFLOW_UNDEFINED(TYPE)				\
    (POINTER_TYPE_P (TYPE)					\
     ? !flag_wrapv_pointer					\
--- 974,980 ----
        || flag_wrapv))
  
  /* True if overflow is undefined for the given integral or pointer type.
!    We may optimize on the assumption that values in the type never overflow.  */
  #define TYPE_OVERFLOW_UNDEFINED(TYPE)				\
    (POINTER_TYPE_P (TYPE)					\
     ? !flag_wrapv_pointer					\
*************** extern void omp_clause_range_check_faile
*** 1240,1245 ****
--- 1234,1245 ----
  #define TREE_PURPOSE(NODE) (TREE_LIST_CHECK (NODE)->list.purpose)
  #define TREE_VALUE(NODE) (TREE_LIST_CHECK (NODE)->list.value)
  
+ /* In TREE_VALUE of an attribute this means the attribute is never equal to
+    different attribute with the same name and value and that the attribute
+    is order sensitive, the order of attributes with this flag on their
+    TREE_VALUE should be preserved.  */
+ #define ATTR_UNIQUE_VALUE_P(NODE) (TREE_LIST_CHECK (NODE)->base.protected_flag)
+ 
  /* In a TREE_VEC node.  */
  #define TREE_VEC_LENGTH(NODE) (TREE_VEC_CHECK (NODE)->base.u.length)
  #define TREE_VEC_BEGIN(NODE) (&TREE_VEC_CHECK (NODE)->vec.a[0])
*************** extern tree vector_element_bits_tree (co
*** 2767,2775 ****
     vtable where the offset to the virtual base can be found.  */
  #define BINFO_VPTR_FIELD(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vptr_field)
  
! /* Indicates the accesses this binfo has to its bases. The values are
     access_public_node, access_protected_node or access_private_node.
!    If this array is not present, public access is implied.  */
  #define BINFO_BASE_ACCESSES(NODE) \
    (TREE_BINFO_CHECK (NODE)->binfo.base_accesses)
  
--- 2767,2780 ----
     vtable where the offset to the virtual base can be found.  */
  #define BINFO_VPTR_FIELD(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vptr_field)
  
! /* Indicates the accesses this binfo has to its bases.  The values are
     access_public_node, access_protected_node or access_private_node.
!    If this vector is not present, public access is implied.  If present,
!    the vector should have BINFO_N_BASE_BINFOS or larger length.  Elements
!    beyond BINFO_N_BASE_BINFOS are base attributes instead of the
!    access_p*_node values for base with index IDX at IDX + BINFO_N_BASE_BINFOS
!    index.  If that is beyond the length of the vector, no attributes for
!    that base is implied.  */
  #define BINFO_BASE_ACCESSES(NODE) \
    (TREE_BINFO_CHECK (NODE)->binfo.base_accesses)
  
diff -Nrcpad gcc-16-20260111/libatomic/ChangeLog gcc-16-20260118/libatomic/ChangeLog
*** gcc-16-20260111/libatomic/ChangeLog	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libatomic/ChangeLog	Sun Jan 18 22:32:14 2026
***************
*** 1,3 ****
--- 1,14 ----
+ 2026-01-13  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR libstdc++/123396
+ 	* acinclude.m4 (LIBAT_BUILD_ASNEEDED_SOLINK): New AM_CONDITIONAL.
+ 	* libatomic_asneeded.so: New file.
+ 	* libatomic_asneeded.a: New file.
+ 	* Makefile.am (toolexeclib_DATA): Set if LIBAT_BUILD_ASNEEDED_SOLINK.
+ 	(all-local): Install those files into gcc subdir.
+ 	* Makefile.in: Regenerate.
+ 	* configure: Regenerate.
+ 
  2025-12-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
  
  	* configure: Regenerate.
diff -Nrcpad gcc-16-20260111/libatomic/Makefile.am gcc-16-20260118/libatomic/Makefile.am
*** gcc-16-20260111/libatomic/Makefile.am	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libatomic/Makefile.am	Sun Jan 18 22:32:14 2026
*************** AM_CCASFLAGS = $(XCFLAGS)
*** 40,45 ****
--- 40,48 ----
  AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS)
  
  toolexeclib_LTLIBRARIES = libatomic.la
+ if LIBAT_BUILD_ASNEEDED_SOLINK
+ toolexeclib_DATA = libatomic_asneeded.so libatomic_asneeded.a
+ endif
  noinst_LTLIBRARIES = libatomic_convenience.la
  
  if LIBAT_BUILD_VERSIONED_SHLIB
*************** all-multi: $(libatomic_la_LIBADD)
*** 183,188 ****
--- 186,195 ----
  gcc_objdir = `pwd`/$(MULTIBUILDTOP)../../gcc/
  all-local: libatomic.la
  	$(LIBTOOL) --mode=install $(INSTALL_DATA) libatomic.la $(gcc_objdir)$(MULTISUBDIR)/
+ if LIBAT_BUILD_ASNEEDED_SOLINK
+ 	$(INSTALL_DATA) $(top_srcdir)/libatomic_asneeded.so $(gcc_objdir)$(MULTISUBDIR)/
+ 	$(INSTALL_DATA) $(top_srcdir)/libatomic_asneeded.a $(gcc_objdir)$(MULTISUBDIR)/
+ endif
  	rm $(gcc_objdir)$(MULTISUBDIR)/libatomic.la
  
  # target overrides
diff -Nrcpad gcc-16-20260111/libatomic/Makefile.in gcc-16-20260118/libatomic/Makefile.in
*** gcc-16-20260111/libatomic/Makefile.in	Sun Jan 11 22:32:19 2026
--- gcc-16-20260118/libatomic/Makefile.in	Sun Jan 18 22:32:19 2026
***************
*** 14,19 ****
--- 14,20 ----
  
  @SET_MAKE@
  
+ 
  VPATH = @srcdir@
  am__is_gnu_make = { \
    if test -z '$(MAKELEVEL)'; then \
*************** am__uninstall_files_from_dir = { \
*** 158,164 ****
      || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
           $(am__cd) "$$dir" && rm -f $$files; }; \
    }
! am__installdirs = "$(DESTDIR)$(toolexeclibdir)"
  LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
  @ARCH_AARCH64_LINUX_TRUE@@PARTIAL_VXWORKS_FALSE@am__objects_1 =  \
  @ARCH_AARCH64_LINUX_TRUE@@PARTIAL_VXWORKS_FALSE@	atomic_16.lo
--- 159,166 ----
      || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
           $(am__cd) "$$dir" && rm -f $$files; }; \
    }
! am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \
! 	"$(DESTDIR)$(toolexeclibdir)"
  LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
  @ARCH_AARCH64_LINUX_TRUE@@PARTIAL_VXWORKS_FALSE@am__objects_1 =  \
  @ARCH_AARCH64_LINUX_TRUE@@PARTIAL_VXWORKS_FALSE@	atomic_16.lo
*************** am__can_run_installinfo = \
*** 244,249 ****
--- 246,252 ----
      n|no|NO) false;; \
      *) (install-info --version) >/dev/null 2>&1;; \
    esac
+ DATA = $(toolexeclib_DATA)
  RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
    distclean-recursive maintainer-clean-recursive
  am__recursive_targets = \
*************** AM_CFLAGS = $(XCFLAGS)
*** 422,427 ****
--- 425,431 ----
  AM_CCASFLAGS = $(XCFLAGS)
  AM_LDFLAGS = $(XLDFLAGS) $(SECTION_LDFLAGS) $(OPT_LDFLAGS)
  toolexeclib_LTLIBRARIES = libatomic.la
+ @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@toolexeclib_DATA = libatomic_asneeded.so libatomic_asneeded.a
  noinst_LTLIBRARIES = libatomic_convenience.la
  @LIBAT_BUILD_VERSIONED_SHLIB_FALSE@libatomic_version_script = 
  @LIBAT_BUILD_VERSIONED_SHLIB_GNU_TRUE@@LIBAT_BUILD_VERSIONED_SHLIB_TRUE@libatomic_version_script = -Wl,--version-script,$(top_srcdir)/libatomic.map
*************** clean-libtool:
*** 667,672 ****
--- 671,697 ----
  
  distclean-libtool:
  	-rm -f libtool config.lt
+ install-toolexeclibDATA: $(toolexeclib_DATA)
+ 	@$(NORMAL_INSTALL)
+ 	@list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
+ 	if test -n "$$list"; then \
+ 	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
+ 	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
+ 	fi; \
+ 	for p in $$list; do \
+ 	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ 	  echo "$$d$$p"; \
+ 	done | $(am__base_list) | \
+ 	while read files; do \
+ 	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibdir)'"; \
+ 	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibdir)" || exit $$?; \
+ 	done
+ 
+ uninstall-toolexeclibDATA:
+ 	@$(NORMAL_UNINSTALL)
+ 	@list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
+ 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ 	dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir)
  
  # This directory's subdirectories are mostly independent; you can cd
  # into them and run 'make' without going through this Makefile.
*************** distclean-tags:
*** 775,784 ****
  	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
  check-am: all-am
  check: check-recursive
! all-am: Makefile $(LTLIBRARIES) auto-config.h all-local
  installdirs: installdirs-recursive
  installdirs-am:
! 	for dir in "$(DESTDIR)$(toolexeclibdir)"; do \
  	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
  	done
  install: install-recursive
--- 800,809 ----
  	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
  check-am: all-am
  check: check-recursive
! all-am: Makefile $(LTLIBRARIES) $(DATA) auto-config.h all-local
  installdirs: installdirs-recursive
  installdirs-am:
! 	for dir in "$(DESTDIR)$(toolexeclibdir)" "$(DESTDIR)$(toolexeclibdir)"; do \
  	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
  	done
  install: install-recursive
*************** install-dvi: install-dvi-recursive
*** 842,848 ****
  
  install-dvi-am:
  
! install-exec-am: install-exec-local install-toolexeclibLTLIBRARIES
  
  install-html: install-html-recursive
  
--- 867,874 ----
  
  install-dvi-am:
  
! install-exec-am: install-exec-local install-toolexeclibDATA \
! 	install-toolexeclibLTLIBRARIES
  
  install-html: install-html-recursive
  
*************** ps: ps-recursive
*** 885,891 ****
  
  ps-am:
  
! uninstall-am: uninstall-toolexeclibLTLIBRARIES
  
  .MAKE: $(am__recursive_targets) all install-am install-strip
  
--- 911,918 ----
  
  ps-am:
  
! uninstall-am: uninstall-toolexeclibDATA \
! 	uninstall-toolexeclibLTLIBRARIES
  
  .MAKE: $(am__recursive_targets) all install-am install-strip
  
*************** uninstall-am: uninstall-toolexeclibLTLIB
*** 900,911 ****
  	install-exec install-exec-am install-exec-local install-html \
  	install-html-am install-info install-info-am install-man \
  	install-pdf install-pdf-am install-ps install-ps-am \
! 	install-strip install-toolexeclibLTLIBRARIES installcheck \
! 	installcheck-am installdirs installdirs-am maintainer-clean \
  	maintainer-clean-generic maintainer-clean-local mostlyclean \
  	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
  	mostlyclean-local pdf pdf-am ps ps-am tags tags-am uninstall \
! 	uninstall-am uninstall-toolexeclibLTLIBRARIES
  
  .PRECIOUS: Makefile
  
--- 927,940 ----
  	install-exec install-exec-am install-exec-local install-html \
  	install-html-am install-info install-info-am install-man \
  	install-pdf install-pdf-am install-ps install-ps-am \
! 	install-strip install-toolexeclibDATA \
! 	install-toolexeclibLTLIBRARIES installcheck installcheck-am \
! 	installdirs installdirs-am maintainer-clean \
  	maintainer-clean-generic maintainer-clean-local mostlyclean \
  	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
  	mostlyclean-local pdf pdf-am ps ps-am tags tags-am uninstall \
! 	uninstall-am uninstall-toolexeclibDATA \
! 	uninstall-toolexeclibLTLIBRARIES
  
  .PRECIOUS: Makefile
  
*************** vpath % $(strip $(search_path))
*** 931,936 ****
--- 960,967 ----
  all-multi: $(libatomic_la_LIBADD)
  all-local: libatomic.la
  	$(LIBTOOL) --mode=install $(INSTALL_DATA) libatomic.la $(gcc_objdir)$(MULTISUBDIR)/
+ @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	$(INSTALL_DATA) $(top_srcdir)/libatomic_asneeded.so $(gcc_objdir)$(MULTISUBDIR)/
+ @LIBAT_BUILD_ASNEEDED_SOLINK_TRUE@	$(INSTALL_DATA) $(top_srcdir)/libatomic_asneeded.a $(gcc_objdir)$(MULTISUBDIR)/
  	rm $(gcc_objdir)$(MULTISUBDIR)/libatomic.la
  
  # target overrides
diff -Nrcpad gcc-16-20260111/libatomic/acinclude.m4 gcc-16-20260118/libatomic/acinclude.m4
*** gcc-16-20260111/libatomic/acinclude.m4	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libatomic/acinclude.m4	Sun Jan 18 22:32:14 2026
*************** AC_DEFUN([LIBAT_CHECK_LINKER_FEATURES],
*** 345,353 ****
--- 345,358 ----
    changequote(,)
    ldver=`$LD --version 2>/dev/null |
           sed -e 's/[. ][0-9]\{8\}$//;s/.* \([^ ]\{1,\}\)$/\1/; q'`
+   ldasneeded=`$LD --help 2>/dev/null | grep as-needed`
    changequote([,])
    libat_gnu_ld_version=`echo $ldver | \
           $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
+   libat_ld_asneeded=no
+   if test -n "$ldasneeded"; then
+     libat_ld_asneeded=yes
+   fi
  
    # Set --gc-sections.
    if test "$with_gnu_ld" = "notbroken"; then
*************** AC_DEFUN([LIBAT_CHECK_LINKER_FEATURES],
*** 394,399 ****
--- 399,405 ----
  
    AC_SUBST(SECTION_LDFLAGS)
    AC_SUBST(OPT_LDFLAGS)
+   AM_CONDITIONAL(LIBAT_BUILD_ASNEEDED_SOLINK, test $libat_ld_asneeded != no)
  ])
  
  
diff -Nrcpad gcc-16-20260111/libatomic/configure gcc-16-20260118/libatomic/configure
*** gcc-16-20260111/libatomic/configure	Sun Jan 11 22:32:19 2026
--- gcc-16-20260118/libatomic/configure	Sun Jan 18 22:32:19 2026
*************** LIBAT_BUILD_VERSIONED_SHLIB_GNU_FALSE
*** 656,661 ****
--- 656,663 ----
  LIBAT_BUILD_VERSIONED_SHLIB_GNU_TRUE
  LIBAT_BUILD_VERSIONED_SHLIB_FALSE
  LIBAT_BUILD_VERSIONED_SHLIB_TRUE
+ LIBAT_BUILD_ASNEEDED_SOLINK_FALSE
+ LIBAT_BUILD_ASNEEDED_SOLINK_TRUE
  OPT_LDFLAGS
  SECTION_LDFLAGS
  PARTIAL_VXWORKS_FALSE
*************** else
*** 11864,11870 ****
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 11867 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
--- 11866,11872 ----
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 11869 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
*************** else
*** 11970,11976 ****
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 11973 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
--- 11972,11978 ----
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 11975 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
*************** with_gnu_ld=$lt_cv_prog_gnu_ld
*** 15731,15739 ****
--- 15733,15746 ----
  
    ldver=`$LD --version 2>/dev/null |
           sed -e 's/[. ][0-9]\{8\}$//;s/.* \([^ ]\{1,\}\)$/\1/; q'`
+   ldasneeded=`$LD --help 2>/dev/null | grep as-needed`
  
    libat_gnu_ld_version=`echo $ldver | \
           $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
+   libat_ld_asneeded=no
+   if test -n "$ldasneeded"; then
+     libat_ld_asneeded=yes
+   fi
  
    # Set --gc-sections.
    if test "$with_gnu_ld" = "notbroken"; then
*************** $as_echo "$ac_sectionLDflags" >&6; }
*** 15797,15802 ****
--- 15804,15817 ----
  
  
  
+    if test $libat_ld_asneeded != no; then
+   LIBAT_BUILD_ASNEEDED_SOLINK_TRUE=
+   LIBAT_BUILD_ASNEEDED_SOLINK_FALSE='#'
+ else
+   LIBAT_BUILD_ASNEEDED_SOLINK_TRUE='#'
+   LIBAT_BUILD_ASNEEDED_SOLINK_FALSE=
+ fi
+ 
  
  
  
*************** if test -z "${PARTIAL_VXWORKS_TRUE}" &&
*** 16442,16447 ****
--- 16457,16466 ----
  Usually this means the macro was only invoked conditionally." "$LINENO" 5
  fi
  
+ if test -z "${LIBAT_BUILD_ASNEEDED_SOLINK_TRUE}" && test -z "${LIBAT_BUILD_ASNEEDED_SOLINK_FALSE}"; then
+   as_fn_error $? "conditional \"LIBAT_BUILD_ASNEEDED_SOLINK\" was never defined.
+ Usually this means the macro was only invoked conditionally." "$LINENO" 5
+ fi
  if test -z "${LIBAT_BUILD_VERSIONED_SHLIB_TRUE}" && test -z "${LIBAT_BUILD_VERSIONED_SHLIB_FALSE}"; then
    as_fn_error $? "conditional \"LIBAT_BUILD_VERSIONED_SHLIB\" was never defined.
  Usually this means the macro was only invoked conditionally." "$LINENO" 5
diff -Nrcpad gcc-16-20260111/libatomic/libatomic_asneeded.a gcc-16-20260118/libatomic/libatomic_asneeded.a
*** gcc-16-20260111/libatomic/libatomic_asneeded.a	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libatomic/libatomic_asneeded.a	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,3 ----
+ /* GNU ld script
+    Just link in libatomic.a.  */
+ INPUT ( libatomic.a )
diff -Nrcpad gcc-16-20260111/libatomic/libatomic_asneeded.so gcc-16-20260118/libatomic/libatomic_asneeded.so
*** gcc-16-20260111/libatomic/libatomic_asneeded.so	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libatomic/libatomic_asneeded.so	Sun Jan 18 22:32:14 2026
***************
*** 0 ****
--- 1,3 ----
+ /* GNU ld script
+    Add DT_NEEDED entry for -latomic only if needed.  */
+ INPUT ( AS_NEEDED ( -latomic ) )
diff -Nrcpad gcc-16-20260111/libcc1/ChangeLog gcc-16-20260118/libcc1/ChangeLog
*** gcc-16-20260111/libcc1/ChangeLog	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libcc1/ChangeLog	Sun Jan 18 22:32:14 2026
***************
*** 1,3 ****
--- 1,12 ----
+ 2026-01-15  Marek Polacek  <polacek@redhat.com>
+ 	    Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120775
+ 	PR c++/123081
+ 	PR c++/122634
+ 	* libcp1plugin.cc (start_class_def): Update the call to
+ 	finish_base_specifier.
+ 
  2025-12-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
  
  	* configure: Regenerate.
diff -Nrcpad gcc-16-20260111/libcc1/libcp1plugin.cc gcc-16-20260118/libcc1/libcp1plugin.cc
*** gcc-16-20260111/libcc1/libcp1plugin.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libcc1/libcp1plugin.cc	Sun Jan 18 22:32:14 2026
*************** start_class_def (tree type,
*** 1568,1574 ****
  
  	  tree base = finish_base_specifier
  	    (convert_in (base_classes->elements[i]), access,
! 	     (base_classes->flags[i] & GCC_CP_FLAG_BASECLASS_VIRTUAL) != 0);
  	  TREE_CHAIN (base) = bases;
  	  bases = base;
  	}
--- 1568,1575 ----
  
  	  tree base = finish_base_specifier
  	    (convert_in (base_classes->elements[i]), access,
! 	     (base_classes->flags[i] & GCC_CP_FLAG_BASECLASS_VIRTUAL) != 0,
! 	     NULL_TREE);
  	  TREE_CHAIN (base) = bases;
  	  bases = base;
  	}
diff -Nrcpad gcc-16-20260111/libcpp/ChangeLog gcc-16-20260118/libcpp/ChangeLog
*** gcc-16-20260111/libcpp/ChangeLog	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libcpp/ChangeLog	Sun Jan 18 22:32:14 2026
***************
*** 1,3 ****
--- 1,22 ----
+ 2026-01-15  Marek Polacek  <polacek@redhat.com>
+ 	    Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120775
+ 	PR c++/123081
+ 	PR c++/122634
+ 	* charset.cc (_cpp_destroy_iconv): Destroy narrow_cset_desc and
+ 	utf8_cset_desc.
+ 	(cpp_translate_string): New.
+ 	(cpp_valid_identifier): New.
+ 	* include/cpplib.h: Add OPEN_SPLICE, CLOSE_SPLICE, and REFLECT_OP to
+ 	TTYPE_TABLE.
+ 	(cpp_translate_string): Declare.
+ 	(cpp_valid_identifier): Declare.
+ 	* internal.h (struct cpp_reader): Add reverse_narrow_cset_desc and
+ 	reverse_utf8_cset_desc fields.
+ 	* lex.cc (_cpp_lex_direct): Emit CPP_CLOSE_SPLICE, CPP_REFLECT_OP,
+ 	and CPP_OPEN_SPLICE tokens.
+ 
  2026-01-09  Ben Boeckel  <ben.boeckel@kitware.com>
  
  	* configure: Regenerate.
diff -Nrcpad gcc-16-20260111/libcpp/charset.cc gcc-16-20260118/libcpp/charset.cc
*** gcc-16-20260111/libcpp/charset.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libcpp/charset.cc	Sun Jan 18 22:32:14 2026
*************** _cpp_destroy_iconv (cpp_reader *pfile)
*** 840,845 ****
--- 840,849 ----
  	iconv_close (pfile->char32_cset_desc.cd);
        if (pfile->wide_cset_desc.func == convert_using_iconv)
  	iconv_close (pfile->wide_cset_desc.cd);
+       if (pfile->reverse_narrow_cset_desc.func == convert_using_iconv)
+ 	iconv_close (pfile->narrow_cset_desc.cd);
+       if (pfile->reverse_utf8_cset_desc.func == convert_using_iconv)
+ 	iconv_close (pfile->utf8_cset_desc.cd);
      }
  }
  
*************** cpp_interpret_string_notranslate (cpp_re
*** 2726,2731 ****
--- 2730,2839 ----
    return retval;
  }
  
+ /* Convert a string FROM to TO, without handling of any UCNs etc., just
+    pure character set conversion.  If !REVERSE, convert from SOURCE_CHARSET
+    to execution charset corresponding to TYPE, if REVERSE, convert from the
+    execution charset corresponding to TYPE to SOURCE_CHARSET.  Return false
+    on error.  */
+ 
+ bool
+ cpp_translate_string (cpp_reader *pfile, const cpp_string *from,
+ 		      cpp_string *to, enum cpp_ttype type, bool reverse)
+ {
+   struct cset_converter cvt = converter_for_type (pfile, type);
+   struct _cpp_strbuf tbuf;
+   if (reverse)
+     {
+       struct cset_converter *pcvt;
+       switch (type)
+ 	{
+ 	default:
+ 	  pcvt = &pfile->reverse_narrow_cset_desc;
+ 	  break;
+ 	case CPP_UTF8CHAR:
+ 	case CPP_UTF8STRING:
+ 	  pcvt = &pfile->reverse_utf8_cset_desc;
+ 	  break;
+ 	case CPP_CHAR16:
+ 	case CPP_STRING16:
+ 	case CPP_CHAR32:
+ 	case CPP_STRING32:
+ 	case CPP_WCHAR:
+ 	case CPP_WSTRING:
+ 	  return false;
+ 	}
+       if (pcvt->func == NULL)
+ 	{
+ 	  *pcvt = init_iconv_desc (pfile, cvt.from, cvt.to);
+ 	  pcvt->width = cvt.width;
+ 	}
+       cvt = *pcvt;
+     }
+   tbuf.asize = MAX (OUTBUF_BLOCK_SIZE, from->len);
+   tbuf.text = XNEWVEC (uchar, tbuf.asize);
+   tbuf.len = 0;
+   if (!APPLY_CONVERSION (cvt, from->text, from->len, &tbuf))
+     {
+       XDELETEVEC (tbuf.text);
+       return false;
+     }
+   tbuf.text = XRESIZEVEC (uchar, tbuf.text, tbuf.len);
+   to->text = tbuf.text;
+   to->len = tbuf.len;
+   return true;
+ }
+ 
+ /* Return true if ID is a valid identifier, false otherwise.  Without any
+    diagnostics.  */
+ 
+ bool
+ cpp_valid_identifier (cpp_reader *pfile, const unsigned char *id)
+ {
+   normalize_state nst = INITIAL_NORMALIZE_STATE;
+   const unsigned char *p = id;
+   if (*p == '\0')
+     return false;
+   const unsigned char *limit
+     = (const unsigned char *) strchr ((const char *) p, '\0');
+   static const cppchar_t utf8_signifier = 0xC0;
+   if (ISIDST (*p))
+     {
+       NORMALIZE_STATE_UPDATE_IDNUM (&nst, *p);
+       ++p;
+     }
+   while (*p)
+     {
+       if (p != id && ISIDNUM (*p))
+ 	{
+ 	  while (ISIDNUM (*p))
+ 	    ++p;
+ 	  NORMALIZE_STATE_UPDATE_IDNUM (&nst, *(p - 1));
+ 	  continue;
+ 	}
+       if (CPP_OPTION (pfile, extended_identifiers) && *p >= utf8_signifier)
+ 	{
+ 	  const unsigned char *base = p;
+ 	  size_t inbytesleft = limit - p;
+ 	  cppchar_t c;
+ 	  if (one_utf8_to_cppchar (&p, &inbytesleft, &c))
+ 	    return false;
+ 	  switch (ucn_valid_in_identifier (pfile, c, &nst))
+ 	    {
+ 	    default:
+ 	      return false;
+ 	    case 1:
+ 	      continue;
+ 	    case 2:
+ 	      if (base == id)
+ 		return false;
+ 	      continue;
+ 	    }
+ 	}
+       return false;
+     }
+   return true;
+ }
+ 
  
  /* Return number of source characters in STR.  */
  static unsigned
diff -Nrcpad gcc-16-20260111/libcpp/include/cpplib.h gcc-16-20260118/libcpp/include/cpplib.h
*** gcc-16-20260111/libcpp/include/cpplib.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libcpp/include/cpplib.h	Sun Jan 18 22:32:14 2026
*************** class rich_location;
*** 101,106 ****
--- 101,108 ----
    OP(CLOSE_SQUARE,	"]")						\
    OP(OPEN_BRACE,	"{")						\
    OP(CLOSE_BRACE,	"}")						\
+   OP(OPEN_SPLICE,	"[:")						\
+   OP(CLOSE_SPLICE,	":]")						\
    /* The remainder of the punctuation.	Order is not significant.  */	\
    OP(SEMICOLON,		";")	/* structure */				\
    OP(ELLIPSIS,		"...")						\
*************** class rich_location;
*** 111,116 ****
--- 113,119 ----
    OP(SCOPE,		"::")						\
    OP(DEREF_STAR,	"->*")						\
    OP(DOT_STAR,		".*")						\
+   OP(REFLECT_OP,	"^^")						\
    OP(ATSIGN,		"@")  /* used in Objective-C */			\
  									\
    TK(NAME,		IDENT)	 /* word */				\
*************** extern const char *cpp_interpret_string_
*** 1306,1311 ****
--- 1309,1317 ----
  extern bool cpp_interpret_string_notranslate (cpp_reader *,
  					      const cpp_string *, size_t,
  					      cpp_string *, enum cpp_ttype);
+ extern bool cpp_translate_string (cpp_reader *, const cpp_string *,
+ 				  cpp_string *, enum cpp_ttype, bool);
+ extern bool cpp_valid_identifier (cpp_reader *, const unsigned char *);
  
  /* Convert a host character constant to the execution character set.  */
  extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t);
diff -Nrcpad gcc-16-20260111/libcpp/internal.h gcc-16-20260118/libcpp/internal.h
*** gcc-16-20260111/libcpp/internal.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libcpp/internal.h	Sun Jan 18 22:32:14 2026
*************** struct cpp_reader
*** 543,548 ****
--- 543,556 ----
       wide execution character set.  */
    struct cset_converter wide_cset_desc;
  
+   /* Descriptor for converting from the execution character set to the
+      source character set.  */
+   struct cset_converter reverse_narrow_cset_desc;
+ 
+   /* Descriptor for converting from the UTF-8 execution character set to the
+      source character set.  */
+   struct cset_converter reverse_utf8_cset_desc;
+ 
    /* Date and time text.  Calculated together if either is requested.  */
    const unsigned char *date;
    const unsigned char *time;
diff -Nrcpad gcc-16-20260111/libcpp/lex.cc gcc-16-20260118/libcpp/lex.cc
*** gcc-16-20260111/libcpp/lex.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libcpp/lex.cc	Sun Jan 18 22:32:14 2026
*************** _cpp_lex_direct (cpp_reader *pfile)
*** 4312,4317 ****
--- 4312,4321 ----
  	  else
  	    result->flags |= COLON_SCOPE;
  	}
+       else if (*buffer->cur == ']'
+ 	       && CPP_OPTION (pfile, cplusplus)
+ 	       && CPP_OPTION (pfile, lang) >= CLK_GNUCXX26)
+ 	buffer->cur++, result->type = CPP_CLOSE_SPLICE;
        else if (*buffer->cur == '>' && CPP_OPTION (pfile, digraphs))
  	{
  	  buffer->cur++;
*************** _cpp_lex_direct (cpp_reader *pfile)
*** 4323,4329 ****
      case '*': IF_NEXT_IS ('=', CPP_MULT_EQ, CPP_MULT); break;
      case '=': IF_NEXT_IS ('=', CPP_EQ_EQ, CPP_EQ); break;
      case '!': IF_NEXT_IS ('=', CPP_NOT_EQ, CPP_NOT); break;
!     case '^': IF_NEXT_IS ('=', CPP_XOR_EQ, CPP_XOR); break;
      case '#': IF_NEXT_IS ('#', CPP_PASTE, CPP_HASH); result->val.token_no = 0; break;
  
      case '?': result->type = CPP_QUERY; break;
--- 4327,4341 ----
      case '*': IF_NEXT_IS ('=', CPP_MULT_EQ, CPP_MULT); break;
      case '=': IF_NEXT_IS ('=', CPP_EQ_EQ, CPP_EQ); break;
      case '!': IF_NEXT_IS ('=', CPP_NOT_EQ, CPP_NOT); break;
!     case '^':
!       result->type = CPP_XOR;
!       if (*buffer->cur == '=')
! 	buffer->cur++, result->type = CPP_XOR_EQ;
!       else if (*buffer->cur == '^'
! 	       && CPP_OPTION (pfile, cplusplus)
! 	       && CPP_OPTION (pfile, lang) >= CLK_GNUCXX26)
! 	buffer->cur++, result->type = CPP_REFLECT_OP;
!       break;
      case '#': IF_NEXT_IS ('#', CPP_PASTE, CPP_HASH); result->val.token_no = 0; break;
  
      case '?': result->type = CPP_QUERY; break;
*************** _cpp_lex_direct (cpp_reader *pfile)
*** 4331,4337 ****
      case ',': result->type = CPP_COMMA; break;
      case '(': result->type = CPP_OPEN_PAREN; break;
      case ')': result->type = CPP_CLOSE_PAREN; break;
!     case '[': result->type = CPP_OPEN_SQUARE; break;
      case ']': result->type = CPP_CLOSE_SQUARE; break;
      case '{': result->type = CPP_OPEN_BRACE; break;
      case '}': result->type = CPP_CLOSE_BRACE; break;
--- 4343,4366 ----
      case ',': result->type = CPP_COMMA; break;
      case '(': result->type = CPP_OPEN_PAREN; break;
      case ')': result->type = CPP_CLOSE_PAREN; break;
!     case '[':
!       result->type = CPP_OPEN_SQUARE;
!       /* C++ [lex.pptoken]/4.3: "Otherwise, if the next three characters are
! 	 [:: and the subsequent character is not :, or if the next three
! 	 characters are [:>, the [ is treated as a preprocessing token by
! 	 itself and not as the first character of the preprocessing token [:."
! 	 Also, the tokens [: and :] cannot be composed from digraphs.  */
!       if (*buffer->cur == ':'
! 	  && CPP_OPTION (pfile, cplusplus)
! 	  && CPP_OPTION (pfile, lang) >= CLK_GNUCXX26)
! 	{
! 	  if ((buffer->cur[1] == ':' && buffer->cur[2] != ':')
! 	      || buffer->cur[1] == '>')
! 	    break;
! 	  else
! 	    buffer->cur++, result->type = CPP_OPEN_SPLICE;
! 	}
!       break;
      case ']': result->type = CPP_CLOSE_SQUARE; break;
      case '{': result->type = CPP_OPEN_BRACE; break;
      case '}': result->type = CPP_CLOSE_BRACE; break;
diff -Nrcpad gcc-16-20260111/libga68/ChangeLog gcc-16-20260118/libga68/ChangeLog
*** gcc-16-20260111/libga68/ChangeLog	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libga68/ChangeLog	Sun Jan 18 22:32:15 2026
***************
*** 1,3 ****
--- 1,13 ----
+ 2026-01-12  Pietro Monteiro  <pietro@sociotechnical.xyz>
+ 
+ 	* configure: Regenerate.
+ 	* configure.ac: Add --enable-algol68-gc-debug option and
+ 	define GC_DEBUG accordingly.
+ 	* ga68-alloc.c (_libga68_realloc): Use the C macro version of
+ 	the GC function.
+ 	(_libga68_realloc_unchecked): Likewise.
+ 	(_libga68_malloc): Likewise.
+ 
  2026-01-10  Pietro Monteiro  <pietro@sociotechnical.xyz>
  
  	* ga68-posix.c (_libga68_posixexit): New function.
diff -Nrcpad gcc-16-20260111/libga68/configure gcc-16-20260118/libga68/configure
*** gcc-16-20260111/libga68/configure	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libga68/configure	Sun Jan 18 22:32:15 2026
*************** enable_algol68_gc
*** 811,816 ****
--- 811,817 ----
  with_target_bdw_gc
  with_target_bdw_gc_include
  with_target_bdw_gc_lib
+ enable_algol68_gc_debug
  '
        ac_precious_vars='build_alias
  host_alias
*************** Optional Features:
*** 1463,1468 ****
--- 1464,1472 ----
    --disable-symvers       disable symbol versioning for libga68
    --enable-algol68-gc     enable use of Boehm's garbage collector with the GNU
                            Algol runtime
+   --enable-algol68-gc-debug
+                           enable use of Boehm's garbage collector debug
+                           functions with the GNU Algol runtime
  
  Optional Packages:
    --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
*************** else
*** 12829,12835 ****
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 12832 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
--- 12833,12839 ----
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 12836 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
*************** else
*** 12935,12941 ****
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 12938 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
--- 12939,12945 ----
    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
    lt_status=$lt_dlunknown
    cat > conftest.$ac_ext <<_LT_EOF
! #line 12942 "configure"
  #include "confdefs.h"
  
  #if HAVE_DLFCN_H
*************** if test "${with_target_bdw_gc_lib+set}"
*** 13532,13537 ****
--- 13536,13549 ----
  fi
  
  
+ # Check whether --enable-algol68-gc-debug was given.
+ if test "${enable_algol68_gc_debug+set}" = set; then :
+   enableval=$enable_algol68_gc_debug;
+ else
+   enable_algol68_gc_debug=no
+ fi
+ 
+ 
  bdw_lib_dir=
  case "$enable_algol68_gc" in
  no)
*************** case $host in
*** 13719,13724 ****
--- 13731,13747 ----
  esac
  
  
+ case "$enable_algol68_gc_debug" in
+   no) ;;
+   *)
+     if test "$use_bdw_gc" = no; then
+       as_fn_error $? "GC debugging enabled but GC is not being used" "$LINENO" 5
+     else
+       LIBGA68_GCFLAGS="$LIBGA68_GCFLAGS -DGC_DEBUG"
+     fi
+     ;;
+ esac
+ 
  # Subst some variables used in Makefile.am
  
  
diff -Nrcpad gcc-16-20260111/libga68/configure.ac gcc-16-20260118/libga68/configure.ac
*** gcc-16-20260111/libga68/configure.ac	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libga68/configure.ac	Sun Jan 18 22:32:15 2026
*************** AC_ARG_WITH([target-bdw-gc-lib],
*** 248,253 ****
--- 248,258 ----
  [AS_HELP_STRING([--with-target-bdw-gc-lib=PATHLIST],
  		[specify directories for installed bdw-gc library])])
  
+ AC_ARG_ENABLE(algol68-gc-debug,
+ [AS_HELP_STRING([--enable-algol68-gc-debug],
+ 		[enable use of Boehm's garbage collector debug functions
+ 		 with the GNU Algol runtime])],,enable_algol68_gc_debug=no)
+ 
  bdw_lib_dir=
  case "$enable_algol68_gc" in
  no)
*************** case $host in
*** 405,410 ****
--- 410,426 ----
  esac
  AC_SUBST(extra_darwin_ldflags_libga68)
  
+ case "$enable_algol68_gc_debug" in
+   no) ;;
+   *)
+     if test "$use_bdw_gc" = no; then
+       AC_MSG_ERROR([GC debugging enabled but GC is not being used])
+     else
+       LIBGA68_GCFLAGS="$LIBGA68_GCFLAGS -DGC_DEBUG"
+     fi
+     ;;
+ esac
+ 
  # Subst some variables used in Makefile.am
  AC_SUBST(LIBGA68_GCFLAGS)
  AC_SUBST(LIBGA68_BOEHM_GC_INCLUDES)
diff -Nrcpad gcc-16-20260111/libga68/ga68-alloc.c gcc-16-20260118/libga68/ga68-alloc.c
*** gcc-16-20260111/libga68/ga68-alloc.c	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libga68/ga68-alloc.c	Sun Jan 18 22:32:15 2026
*************** _libga68_init_heap (void)
*** 58,64 ****
  void *
  _libga68_realloc (void *ptr, size_t size)
  {
!   void *res = (void *) GC_realloc (ptr, size);
    if (!res)
      _libga68_abort ("Virtual memory exhausted\n");
    return res;
--- 58,64 ----
  void *
  _libga68_realloc (void *ptr, size_t size)
  {
!   void *res = (void *) GC_REALLOC (ptr, size);
    if (!res)
      _libga68_abort ("Virtual memory exhausted\n");
    return res;
*************** _libga68_realloc (void *ptr, size_t size
*** 67,80 ****
  void *
  _libga68_realloc_unchecked (void *ptr, size_t size)
  {
!   void *res = (void *) GC_realloc (ptr, size);
    return res;
  }
  
  void *
  _libga68_malloc (size_t size)
  {
!   void *res = (void *) GC_malloc (size);
    if (!res)
      _libga68_abort ("Virtual memory exhausted\n");
    return res;
--- 67,80 ----
  void *
  _libga68_realloc_unchecked (void *ptr, size_t size)
  {
!   void *res = (void *) GC_REALLOC (ptr, size);
    return res;
  }
  
  void *
  _libga68_malloc (size_t size)
  {
!   void *res = (void *) GC_MALLOC (size);
    if (!res)
      _libga68_abort ("Virtual memory exhausted\n");
    return res;
diff -Nrcpad gcc-16-20260111/libgcc/ChangeLog gcc-16-20260118/libgcc/ChangeLog
*** gcc-16-20260111/libgcc/ChangeLog	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcc/ChangeLog	Sun Jan 18 22:32:15 2026
***************
*** 1,3 ****
--- 1,24 ----
+ 2026-01-13  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR libstdc++/123396
+ 	* config/t-slibgcc (SHLIB_ASNEEDED_SOLINK,
+ 	SHLIB_MAKE_ASNEEDED_SOLINK, SHLIB_INSTALL_ASNEEDED_SOLINK): New
+ 	vars.
+ 	(SHLIB_LINK): Include $(SHLIB_MAKE_ASNEEDED_SOLINK).
+ 	(SHLIB_INSTALL): Include $(SHLIB_INSTALL_ASNEEDED_SOLINK).
+ 
+ 2026-01-13  Kito Cheng  <kito.cheng@sifive.com>
+ 
+ 	PR target/117581
+ 	* config/riscv/libgcc-riscv.ver: New file.
+ 	* config/riscv/t-elf (SHLIB_MAPFILES): Add libgcc-riscv.ver.
+ 	* config/riscv/t-softfp32 (softfp_extras): Add floatbitinttf and
+ 	fixtfbitint.
+ 
+ 2026-01-11  Jerome Guitton  <guitton@adacore.com>
+ 
+ 	* config/gthr-vxworks.h: Remove #include of tickLib.h.
+ 
  2026-01-10  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
  
  	* config.host: Include s390/t-float16.
diff -Nrcpad gcc-16-20260111/libgcc/config/riscv/libgcc-riscv.ver gcc-16-20260118/libgcc/config/riscv/libgcc-riscv.ver
*** gcc-16-20260111/libgcc/config/riscv/libgcc-riscv.ver	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgcc/config/riscv/libgcc-riscv.ver	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,29 ----
+ # Copyright (C) 2025 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.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with GCC; see the file COPYING3.  If not see
+ # <http://www.gnu.org/licenses/>.
+ 
+ GCC_16.0.0 {
+     __mulbitint3
+     __divmodbitint4
+     __fixsfbitint
+     __fixdfbitint
+     __fixtfbitint
+     __floatbitinthf
+     __floatbitintsf
+     __floatbitintdf
+     __floatbitinttf
+ }
diff -Nrcpad gcc-16-20260111/libgcc/config/riscv/t-elf gcc-16-20260118/libgcc/config/riscv/t-elf
*** gcc-16-20260111/libgcc/config/riscv/t-elf	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcc/config/riscv/t-elf	Sun Jan 18 22:32:15 2026
*************** LIB2ADD += $(srcdir)/config/riscv/save-r
*** 7,9 ****
--- 7,11 ----
  
  # Avoid the full unwinder being pulled along with the division libcalls.
  LIB2_DIVMOD_EXCEPTION_FLAGS := -fasynchronous-unwind-tables
+ 
+ SHLIB_MAPFILES += $(srcdir)/config/riscv/libgcc-riscv.ver
diff -Nrcpad gcc-16-20260111/libgcc/config/riscv/t-softfp32 gcc-16-20260118/libgcc/config/riscv/t-softfp32
*** gcc-16-20260111/libgcc/config/riscv/t-softfp32	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcc/config/riscv/t-softfp32	Sun Jan 18 22:32:15 2026
*************** endif
*** 34,39 ****
--- 34,41 ----
  
  endif
  
+ softfp_extras += floatbitinttf fixtfbitint
+ 
  else
  # ABI_QUAD
  
*************** softfp_truncations += tfhf dfhf sfhf \
*** 49,52 ****
  		      hfbf bfhf
  softfp_extras += fixhfsi fixhfdi fixunshfsi fixunshfdi \
  		 floatsihf floatdihf floatunsihf floatundihf \
! 		 floatsibf floatdibf floatunsibf floatundibf
--- 51,55 ----
  		      hfbf bfhf
  softfp_extras += fixhfsi fixhfdi fixunshfsi fixunshfdi \
  		 floatsihf floatdihf floatunsihf floatundihf \
! 		 floatsibf floatdibf floatunsibf floatundibf \
! 		 floatbitinthf
diff -Nrcpad gcc-16-20260111/libgcc/config/t-slibgcc gcc-16-20260118/libgcc/config/t-slibgcc
*** gcc-16-20260111/libgcc/config/t-slibgcc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcc/config/t-slibgcc	Sun Jan 18 22:32:15 2026
*************** SHLIB_LC = -lc
*** 30,35 ****
--- 30,44 ----
  SHLIB_MAKE_SOLINK = $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK)
  SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \
  	$(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
+ SHLIB_ASNEEDED_SOLINK = @shlib_base_name@_asneeded.so
+ SHLIB_MAKE_ASNEEDED_SOLINK = \
+         (echo "/* GNU ld script"; \
+          echo "   Add DT_NEEDED entry for libgcc_s.so only if needed.  */"; \
+          echo "INPUT ( AS_NEEDED ( -lgcc_s ) )" \
+         ) > $(SHLIB_DIR)/$(SHLIB_ASNEEDED_SOLINK)
+ SHLIB_INSTALL_ASNEEDED_SOLINK = \
+         $(INSTALL_DATA) $(SHLIB_DIR)/$(SHLIB_ASNEEDED_SOLINK) \
+           $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_ASNEEDED_SOLINK)
  
  SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \
  	$(SHLIB_LDFLAGS) $(LDFLAGS) \
*************** SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -sh
*** 41,47 ****
  		$(SHLIB_DIR)/$(SHLIB_SONAME).backup; \
  	else true; fi && \
  	mv $(SHLIB_DIR)/$(SHLIB_SONAME).tmp $(SHLIB_DIR)/$(SHLIB_SONAME) && \
! 	$(SHLIB_MAKE_SOLINK)
  
  INSTALL_SHLIB = $(INSTALL_DATA)
  
--- 50,57 ----
  		$(SHLIB_DIR)/$(SHLIB_SONAME).backup; \
  	else true; fi && \
  	mv $(SHLIB_DIR)/$(SHLIB_SONAME).tmp $(SHLIB_DIR)/$(SHLIB_SONAME) && \
! 	$(SHLIB_MAKE_SOLINK) && \
! 	$(SHLIB_MAKE_ASNEEDED_SOLINK)
  
  INSTALL_SHLIB = $(INSTALL_DATA)
  
*************** SHLIB_INSTALL = \
*** 50,53 ****
  	$(INSTALL_SHLIB) $(SHLIB_DIR)/$(SHLIB_SONAME) \
  	  $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \
  	rm -f $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
! 	$(SHLIB_INSTALL_SOLINK)
--- 60,64 ----
  	$(INSTALL_SHLIB) $(SHLIB_DIR)/$(SHLIB_SONAME) \
  	  $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \
  	rm -f $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
! 	$(SHLIB_INSTALL_SOLINK); \
! 	$(SHLIB_INSTALL_ASNEEDED_SOLINK)
diff -Nrcpad gcc-16-20260111/libgcobol/ChangeLog gcc-16-20260118/libgcobol/ChangeLog
*** gcc-16-20260111/libgcobol/ChangeLog	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/ChangeLog	Sun Jan 18 22:32:15 2026
***************
*** 1,3 ****
--- 1,184 ----
+ 2026-01-17  Robert Dubner  <rdubner@symas.com>
+ 	    James K. Lowden  <jklowden@cobolworx.com>
+ 
+ 	* charmaps.cc (__gg__encoding_iconv_name): Charsets.
+ 	(__gg__encoding_iconv_valid): Charsets.
+ 	(__gg__encoding_iconv_type): Charsets.
+ 	(encoding_descr): Charsets.
+ 	(__gg__encoding_iconv_descr): Charsets.
+ 	(__gg__iconverter): Charsets.
+ 	(__gg__miconverter): Charsets.
+ 	* charmaps.h (NOT_A_CHARACTER): Charsets.
+ 	(ascii_nul): Charsets.
+ 	(ascii_bang): Charsets.
+ 	(__gg__encoding_iconv_type): Charsets.
+ 	(__gg__iconverter): Charsets.
+ 	(__gg__miconverter): Charsets.
+ 	(DEFAULT_32_ENCODING): Charsets.
+ 	(class charmap_t): Charsets.
+ 	(__gg__get_charmap): Charsets.
+ 	* common-defs.h (enum cbl_field_attr_t):
+ 	(enum cbl_figconst_t): Formatting.
+ 	(LOW_VALUE_E): Handle enum arithmetic.
+ 	(ZERO_VALUE_E): Handle enum arithmetic.
+ 	(SPACE_VALUE_E): Handle enum arithmetic.
+ 	(QUOTE_VALUE_E): Handle enum arithmetic.
+ 	(HIGH_VALUE_E): Handle enum arithmetic.
+ 	(enum convert_type_t): Enum for new FUNCTION CONVERT.
+ 	(struct cbl_declarative_t): Formatting.
+ 	* encodings.h (struct encodings_t): Charsets.
+ 	* gcobolio.h: Charsets.
+ 	* gfileio.cc (get_filename): Rename to establish filename.
+ 	(establish_filename): Renamed from get_filename.
+ 	(relative_file_delete):  Charsets.
+ 	(__io__file_remove): Moved.
+ 	(trim_in_place): Charsets.
+ 	(relative_file_start): Charsets.
+ 	(relative_file_rewrite): Charsets.
+ 	(relative_file_write): Charsets.
+ 	(sequential_file_write): Charsets.
+ 	(line_sequential_file_read): Charsets.
+ 	(sequential_file_read): Charsets.
+ 	(relative_file_read): Charsets.
+ 	(__gg__file_reopen): Charsets.
+ 	(__io__file_open): Charsets.
+ 	(__io__file_close): Charsets.
+ 	(gcobol_fileops): Charsets.
+ 	(__gg__file_open): Charsets.
+ 	(__gg__file_remove): Charsets.
+ 	* gfileio.h (__gg__file_open): Charsets.
+ 	* gmath.cc (__gg__subtractf1_float_phase2): Comment.
+ 	(__gg__subtractf2_float_phase1): Comment.
+ 	(__gg__multiplyf1_phase2): Comment.
+ 	* intrinsic.cc (is_zulu_format): Charsets.
+ 	(string_to_dest): Charsets.
+ 	(get_all_time): Charsets.
+ 	(ftime_replace): Charsets.
+ 	(__gg__char): Charsets.
+ 	(__gg__current_date): Charsets.
+ 	(__gg__formatted_current_date): Charsets.
+ 	(__gg__formatted_date): Charsets.
+ 	(__gg__formatted_datetime): Charsets.
+ 	(__gg__formatted_time): Charsets.
+ 	(change_case): Charsets.
+ 	(__gg__upper_case): Charsets.
+ 	(numval): Charsets.
+ 	(numval_c): Charsets.
+ 	(__gg__trim): Charsets.
+ 	(__gg__reverse): Charsets.
+ 	(fill_cobol_tm): Charsets.
+ 	(__gg__seconds_from_formatted_time): Charsets.
+ 	(__gg__hex_of): Charsets.
+ 	(__gg__numval_f): Charsets.
+ 	(__gg__test_numval_f): Charsets.
+ 	(__gg__locale_date): Charsets.
+ 	(__gg__locale_time): Charsets.
+ 	(__gg__locale_time_from_seconds): Charsets.
+ 	* libgcobol.cc (NO_RDIGITS): Alias for (0).
+ 	(__gg__move): Forward reference.
+ 	(struct program_state): Charsets.
+ 	(cstrncmp): Charsets.
+ 	(__gg__init_program_state): Charsets.
+ 	(edited_to_binary): Charsets.
+ 	(var_is_refmod): Comment.
+ 	(__gg__power_of_ten): Reworked data initialization.
+ 	(__gg__scale_by_power_of_ten_1): Likewise.
+ 	(__gg__scale_by_power_of_ten_2): Likewise.
+ 	(value_is_too_big): Likewise.
+ 	(binary_to_big_endian): Likewise.
+ 	(binary_to_little_endian): Likewise.
+ 	(int128_to_int128_rounded): Likewise.
+ 	(get_binary_value_local): Likewise.
+ 	(get_init_value): Likewise.
+ 	(f128_to_i128_rounded): Likewise.
+ 	(__gg__initialization_values): Likewise.
+ 	(int128_to_field): Likewise.
+ 	(__gg__get_date_yymmdd): Charsets.
+ 	(__gg__field_from_string): Charsets.
+ 	(field_from_ascii): Charsets.
+ 	(__gg__get_date_yyyymmdd): Charsets.
+ 	(__gg__get_date_yyddd): Charsets.
+ 	(__gg__get_yyyyddd): Charsets.
+ 	(__gg__get_date_dow): Charsets.
+ 	(__gg__get_date_hhmmssff): Charsets.
+ 	(collation_position): Charsets.
+ 	(uber_compare): Charsets.
+ 	(__gg__dirty_to_binary): Charsets.
+ 	(__gg__dirty_to_float): Charsets.
+ 	(format_for_display_internal): Charsets.
+ 	(compare_88): Charsets.
+ 	(get_float128): Reworked.
+ 	(compare_field_class): Charsets.
+ 	(interconvert): Charsets.
+ 	(compare_strings): Charsets.
+ 	(__gg__compare_2): Charsets.
+ 	(compare_two_records): Charsets.
+ 	(__gg__sort_table): Charsets.
+ 	(init_var_both): Charsets.
+ 	(__gg__initialize_variable_clean): Charsets.
+ 	(alpha_to_alpha_move_from_location): Charsets.
+ 	(__gg__memdup): New function.
+ 	(alpha_to_alpha_move): Charsets.
+ 	(__gg__sort_workfile): Charsets.
+ 	(__gg__merge_files): Charsets.
+ 	(funky_find_wide): Charsets.
+ 	(funky_find_wide_backward): Charsets.
+ 	(normalize_id): Charsets.
+ 	(match_lengths): Charsets.
+ 	(the_alpha_and_omega): Charsets.
+ 	(the_alpha_and_omega_backward): Charsets.
+ 	(inspect_backward_format_1): Charsets.
+ 	(__gg__inspect_format_1): Charsets.
+ 	(inspect_backward_format_2): Charsets.
+ 	(__gg__inspect_format_2): Charsets.
+ 	(normalize_for_inspect_format_4): Charsets.
+ 	(__gg__inspect_format_4): Charsets.
+ 	(move_string): Charsets.
+ 	(brute_force_trim): Charsets.
+ 	(__gg__string): Charsets.
+ 	(display_both): Charsets.
+ 	(__gg__display_string): Charsets.
+ 	(__gg__bitwise_op): Charsets.
+ 	(is_numeric_display_numeric): Charsets.
+ 	(is_alpha_a_number): Charsets.
+ 	(classify_numeric_type): Charsets.
+ 	(classify_alphabetic_type): Charsets.
+ 	(__gg__classify): Charsets.
+ 	(__gg__convert_encoding): Charsets.
+ 	(accept_envar): Charsets.
+ 	(__gg__accept_envar): Charsets.
+ 	(__gg__get_argc): Charsets.
+ 	(__gg__get_argv): Charsets.
+ 	(__gg__get_command_line): Charsets.
+ 	(__gg__parser_set_conditional): Charsets.
+ 	(__gg__literaln_alpha_compare): Charsets.
+ 	(string_in): Charsets.
+ 	(__gg__unstring): Charsets.
+ 	(__gg__integer_from_float128): Charsets.
+ 	(__gg__adjust_dest_size): Charsets.
+ 	(__gg__just_mangle_name): Charsets.
+ 	(__gg__function_handle_from_name): Charsets.
+ 	(get_the_byte): Charsets.
+ 	(__gg__refer_from_string): Charsets.
+ 	(__gg__refer_from_psz): Charsets.
+ 	(__gg__find_string): Charsets.
+ 	(convert_for_convert): Charsets.
+ 	(__gg__convert): Charsets.
+ 	* libgcobol.h (__gg__compare_2): Charsets.
+ 	(__gg__field_from_string): Charsets.
+ 	(__gg__memdup): Charsets.
+ 	* posix/bin/Makefile: Posix bindings.
+ 	* posix/bin/scrape.awk: Posix bindings.
+ 	* posix/bin/udf-gen: Posix bindings.
+ 	* posix/udf/posix-lseek.cbl: Posix bindings.
+ 	* posix/udf/posix-unlink.cbl: Posix bindings.
+ 	* stringbin.cc (__gg__binary_to_string_encoded): Charsets.
+ 	(__gg__numeric_display_to_binary): Charsets.
+ 	* stringbin.h (__gg__binary_to_string_encoded): Charsets.
+ 	* valconv.cc (__gg__string_to_numeric_edited): Charsets.
+ 	* posix/cpy/psx-lseek.cpy: New file.
+ 	* posix/shim/lseek.cc: New file.
+ 
  2025-12-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
  
  	* configure: Regenerate.
diff -Nrcpad gcc-16-20260111/libgcobol/charmaps.cc gcc-16-20260118/libgcobol/charmaps.cc
*** gcc-16-20260111/libgcobol/charmaps.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/charmaps.cc	Sun Jan 18 22:32:15 2026
***************
*** 40,45 ****
--- 40,46 ----
  #include <algorithm>
  #include <unordered_map>
  #include <vector>
+ #include <langinfo.h>
  
  #include "ec.h"
  #include "common-defs.h"
*************** int __gg__decimal_separator    = ','  ;
*** 55,64 ****
--- 56,69 ----
  int __gg__quote_character      = '"'  ;
  int __gg__low_value_character  = 0x00 ;
  int __gg__high_value_character = 0xFF ;
+ cbl_char_t __gg__working_init  = NOT_A_CHARACTER;
+ cbl_char_t __gg__local_init    = NOT_A_CHARACTER;
+ uint32_t   __gg__wsclear       = NOT_A_CHARACTER;
  std::vector<std::string> __gg__currency_signs(256) ;
  int __gg__default_currency_sign;
  char *__gg__ct_currency_signs[256];  // Compile-time currency signs
  
+ cbl_encoding_t __gg__console_encoding  = no_encoding_e    ;
  cbl_encoding_t __gg__display_encoding  = no_encoding_e;
  cbl_encoding_t __gg__national_encoding = no_encoding_e;
  
*************** static encodings_t encodings[] = {
*** 1412,1417 ****
--- 1417,1445 ----
    { false, iconv_YU_e, "YU" },
  };
  
+ /*
+  * Because this variable is static, the contructor runs before main and is
+  * guaranted to run.
+  */
+ static class rt_encoding_t
+   {
+   const char *ctype, *lc_ctype;
+   public:
+   rt_encoding_t() : ctype( setlocale(LC_CTYPE, "") )
+     {
+     lc_ctype =  nl_langinfo(CODESET);
+     // Let's learn what the computer is using for the console:
+     // We need to establish the codeset used by the system console:
+   __gg__console_encoding = use_locale();
+     }
+   cbl_encoding_t use_locale() const
+     {
+     auto encoding = strstr(ctype, "UTF-8") ?
+       iconv_UTF_8_e : __gg__encoding_iconv_type(lc_ctype);
+     return encoding;
+     }
+   } rt_encoding;
+ 
  static const encodings_t *
  encoding_descr( cbl_encoding_t encoding ) {
    static encodings_t *eoencodings = encodings + COUNT_OF(encodings);
*************** encoding_descr( cbl_encoding_t encoding
*** 1423,1442 ****
    return p < eoencodings? p : nullptr;
  }
  
! const char *
! __gg__encoding_iconv_name( cbl_encoding_t encoding ) {
!   auto p = encoding_descr(encoding);
!   return p? p->name : nullptr;
! }
! 
! bool
! __gg__encoding_iconv_valid( cbl_encoding_t encoding ) {
!   auto p = encoding_descr(encoding);
!   return p? p->supported : false;
! }
! 
! cbl_encoding_t
! __gg__encoding_iconv_type( const char *name ) {
    static encodings_t *eoencodings = encodings + COUNT_OF(encodings);
  
    char *slashless = strdup(name);
--- 1451,1458 ----
    return p < eoencodings? p : nullptr;
  }
  
! static const encodings_t *
! encoding_descr( const char name[] ) {
    static encodings_t *eoencodings = encodings + COUNT_OF(encodings);
  
    char *slashless = strdup(name);
*************** __gg__encoding_iconv_type( const char *n
*** 1453,1492 ****
                           } );
    free(slashless);
  
!   return p < eoencodings? p->type : no_encoding_e;
  }
  
  char *
  __gg__iconverter( cbl_encoding_t from,
                    cbl_encoding_t to,
!             const char *str,
                    size_t length,
!                   size_t *outlength)
    {
    static size_t retsize = 1;
    static char *retval = static_cast<char *>(malloc(retsize));
  
!   // Let's consider the possibility of each input character needed four output
!   // characters:
!   size_t needed = 4*length;
    if( retsize < needed )
      {
      retsize = needed;
      retval = static_cast<char *>(realloc(retval, retsize));
      }
  
    if( from == to )
      {
      memcpy(retval, str, length);
!     *outlength = length;
      }
    else
      {
-     // Converts the given string from from to to using iconv.
- 
-     // The return value points to a static memory area in this function, the
-     // caller has to respect that.
- 
      // We attempt to minimize overhead by using a map to call
      // iconv_open but once for each from/to pairing.
  
--- 1469,1560 ----
                           } );
    free(slashless);
  
!   return p < eoencodings? p : nullptr;
! }
! 
! const encodings_t *
! __gg__encoding_iconv_descr( const char name[] ) {
!   return encoding_descr(name);
! }
! 
! const encodings_t *
! __gg__encoding_iconv_descr( cbl_encoding_t encoding ) {
!   return encoding_descr(encoding);
! }
! 
! const char *
! __gg__encoding_iconv_name( cbl_encoding_t encoding ) {
!   auto p = encoding_descr(encoding);
!   return p? p->name : nullptr;
! }
! 
! bool
! __gg__encoding_iconv_valid( cbl_encoding_t encoding ) {
!   auto p = encoding_descr(encoding);
!   return p? p->supported : false;
! }
! 
! cbl_encoding_t
! __gg__encoding_iconv_type( const char *name ) {
!   auto p = encoding_descr(name);
!   return p? p->type : no_encoding_e;
  }
  
  char *
  __gg__iconverter( cbl_encoding_t from,
                    cbl_encoding_t to,
!             const void *str_,
                    size_t length,
!                   size_t *outlength_p,
!                   size_t *iconv_retval_p )
    {
+   const char *str = static_cast<const char *>(str_);
+ 
+   // Attempts to convert 'length' bytes 'str' in 'from' encoding to
+   // the 'to' encoding.
+ 
+   // The return value points to a static memory area in this function, the
+   // caller has to respect that and make copies before doing something that
+   // will call this routine again.  Note that __gg__get_charmap, and
+   // charmap_t::mapped_character can call this routine.
+ 
+   // The routine optionally returns the number of bytes generated, the number
+   // of bytes eaten by iconv, and the actual return value from the iconv call.
+ 
+   // Let's consider the possibility of each input character needing four output
+   // characters.  We increase it by one to leave room for the terminating NUL,
+   // which itself might be four bytes of 0x00. The static area keeps growing
+   // as necessary.
+ 
+   // Get charmap first, because we might need it in the event of a conversion
+   // error, and we have to avoid problems with recursion clobbering the return
+   // buffer, because __gg__get_charmap can call us:
+   charmap_t *charmap_to = __gg__get_charmap(to);
+ 
    static size_t retsize = 1;
    static char *retval = static_cast<char *>(malloc(retsize));
  
!   size_t needed = 4*(length+1);
    if( retsize < needed )
      {
      retsize = needed;
      retval = static_cast<char *>(realloc(retval, retsize));
      }
  
+   size_t outlength;
+   size_t iconv_retval;
+ 
    if( from == to )
      {
+     // There is no need to actually convert.  Simulate a successful iconv()
+     // call:
+ 
      memcpy(retval, str, length);
!     outlength = length;
!     iconv_retval = 0;
      }
    else
      {
      // We attempt to minimize overhead by using a map to call
      // iconv_open but once for each from/to pairing.
  
*************** __gg__iconverter( cbl_encoding_t from,
*** 1514,1550 ****
  
      char *inbuf  = const_cast<char *>(str);
      char *outbuf = retval;
!     size_t incount = length;
!     size_t outcount = retsize;
!     *outlength = iconv( cd,
!                         &inbuf, &incount,
!                         &outbuf, &outcount);
!     *outlength = retsize - outcount;
  
!     if( *outlength == length )
        {
!       /*  In a kind of shortsighted way, we are going to assume
!           single-byte-coding, and we are going to cope here with the
!           COBOL-world reality of HIGH-VALUE being, by default, the value 0xFF.
!           This is required by IBM in the EBCDIC and ASCII worlds.  The
!           implications for other locales are being left for another time.
  
!           So, for now, we are regarding 0xFF as invariant.  Thus, at this
!           point, we have to scan the input and make sure the output has 0xFF
!           where the input does.  */
!       for(size_t i=0; i<length; i++)
          {
!         if( static_cast<unsigned char>(str[i]) == 0xFF )
            {
!           retval[i] = static_cast<char>(0xFF);
            }
          }
        }
      }
    // For the convenience of those who call this routine, we are sticking a
!   // terminating NUL on the end of the generated string
!   retval[*outlength] = '\0';
  
    return retval;
    }
  
--- 1582,1728 ----
  
      char *inbuf  = const_cast<char *>(str);
      char *outbuf = retval;
!     size_t inbytesleft  = length;
!     size_t outbytesleft = retsize;
  
!     /* It's time for some COBOL magic.  The default HIGH-VALUE in COBOL is
!        0xFF.  CP1252, UTF-16, and UTF32 all happily interconvert 0xFF, 0x00FF,
!        and 0x000000FF.  But CP1140 is a pain.
! 
!        A CP1252 0xFF becomes a CP1140 DF, which converts back to 0xFF
!        CP1140 DF becomes FF, 00ff and 000000FF.
! 
!        So, we need to intervene when the source, or dest, is ebcdic.  */
! 
!     char *inbuf_cpy = nullptr;
!     if( __gg__high_value_character == DEGENERATE_HIGH_VALUE )
        {
!       const charmap_t *map_from = __gg__get_charmap(from);
!       if( map_from->is_like_ebcdic() )
!         {
!         inbuf_cpy = static_cast<char *>(malloc(length));
!         assert(inbuf_cpy);
!         memcpy(inbuf_cpy, inbuf, length);
!         inbuf = inbuf_cpy;
!         for(size_t i=0; i<length; i++)
!           {
!           if( (unsigned char)inbuf[i] == (unsigned char)0xFF )
!             {
!             inbuf[i] = (char)0xDF;
!             }
!           }
!         }
!       }
  
!     // When the caller supplies iconv_retval_p, we only try to convert once,
!     // because they are telling us they will handle errors.
! 
!     // Otherwise, we just keep trying to convert, replacing unconvertable
!     // characters with a replacement.
! 
!     iconv_retval = 1; // This primes the pump:
!     for(;;)
!       {
!       iconv_retval = iconv( cd,
!                             &inbuf, &inbytesleft,
!                             &outbuf, &outbytesleft);
!       if( iconv_retval_p || iconv_retval == 0 )
          {
!         // Either there was no conversion error, or else our caller wants
!         // to know about the error
!         break;
!         }
!       // Arriving here means that there has been a conversion error.
!       if( charmap_to->stride() >= 2 )
!         {
!         // Put in the value for the U+FFFD Replacement Character
!         charmap_to->putch(REPLACEMENT_CHARACTER, outbuf, size_t(0));
!         outbuf += charmap_to->stride();
!         outbytesleft -= charmap_to->stride();
!         }
!       else if( charmap_to->is_like_utf8() )
!         {
!         // Put in the UTF-8 bytes for the U+FFFD Replacement Character
!         *outbuf++ = static_cast<char>(0xEF);
!         *outbuf++ = static_cast<char>(0xBF);
!         *outbuf++ = static_cast<char>(0xBD);
!         outbytesleft -= 3;
!         }
!       else
!         {
!         // This is some kind of single-byte-coded character set.  We just use
!         // a question mark as the replacement character.
!         *outbuf++ = charmap_to->mapped_character(ascii_query);
!         outbytesleft -= 1;
!         }
!       // skip past the byte that caused the conversion error:
!       inbuf += 1;
!       inbytesleft -= 1;
!       // Raise the run-time error:
! #ifdef IN_TARGET_LIBS
!       exception_raise(ec_data_conversion_e);
!       // And then loop around and try it again.
! #endif
!       }
! 
!     free(inbuf_cpy);
!     // Calculate the number of bytes generated:
!     outlength = retsize - outbytesleft;
! 
!     if( __gg__high_value_character == DEGENERATE_HIGH_VALUE )
!       {
!       const charmap_t *map_to = __gg__get_charmap(to);
!       if( map_to->is_like_ebcdic() )
!         {
!         for(size_t i=0; i<length; i++)
            {
!           if( (unsigned char)retval[i] == (unsigned char)0xDF )
!             {
!             retval[i] = (char)0xFF;
!             }
            }
          }
        }
      }
    // For the convenience of those who call this routine, we are sticking a
!   // terminating NUL on the end of the generated string.  Keeping in mind that
!   // a NUL isn't always a single byte, we are going to lay down four of them.
!   retval[outlength+0] = '\0';
!   retval[outlength+1] = '\0';
!   retval[outlength+2] = '\0';
!   retval[outlength+3] = '\0';
  
+   if( outlength_p )
+     {
+     *outlength_p = outlength;
+     }
+   if( iconv_retval_p )
+     {
+     *iconv_retval_p = iconv_retval;
+     }
+ 
+   return retval;
+   }
+ 
+ char *
+ __gg__miconverter( cbl_encoding_t from,
+                    cbl_encoding_t to,
+              const void *str_,
+                    size_t length,
+                    size_t *outlength_p,
+                    size_t *iconv_retval_p )
+   {
+   const char *converted = __gg__iconverter(from,
+                                            to,
+                                            str_,
+                                            length,
+                                            outlength_p,
+                                            iconv_retval_p);
+   char *retval = static_cast<char *>(malloc(*outlength_p + 4));
+   assert(retval);
+   memcpy(retval, converted, *outlength_p);
+   // Tack on four zeros to be a NUL in any encoding.
+   memset(retval + *outlength_p, 0, 4);
    return retval;
    }
  
diff -Nrcpad gcc-16-20260111/libgcobol/charmaps.h gcc-16-20260118/libgcobol/charmaps.h
*** gcc-16-20260111/libgcobol/charmaps.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/charmaps.h	Sun Jan 18 22:32:15 2026
***************
*** 35,40 ****
--- 35,42 ----
  #include <vector>
  
  #include <unistd.h>
+ #include <limits.h>
+ #include <iconv.h>
  
  /*  There are four distinct codeset domains in the COBOL compiler.
   *
***************
*** 106,111 ****
--- 108,116 ----
  
      Stay alert!    */
  
+ typedef uint32_t cbl_char_t;
+ #define NOT_A_CHARACTER (0xbadbeef)
+ 
  extern int    __gg__decimal_point        ;
  extern int    __gg__decimal_separator    ;
  extern int    __gg__quote_character      ;
*************** extern std::vector<std::string> __gg__cu
*** 115,125 ****
--- 120,183 ----
  extern int    __gg__default_currency_sign;
  extern cbl_encoding_t __gg__display_encoding ;
  extern cbl_encoding_t __gg__national_encoding ;
+ extern cbl_char_t __gg__working_init;
+ extern cbl_char_t __gg__local_init;
+ extern uint32_t __gg__wsclear;
+ 
+ enum
+   {
+   /* HIGH-VALUE is an endless source of irritation.
+   
+      0xFF is the default value for COBOL since time immemorial.  Its use that
+      way long predates the existence of code pages.  0xFF is a valid character
+      in many code pages, which make a muddle of the original intent of a
+      default value of 0xFF for high-value.
+ 
+      We want older programs to continue to work.  And we want to use 0xFF for
+      ascii and ebcdic, and it turns out that 0xFFFF works for UTF-16; it is
+      specifically designed in UNICODE as a well-formed non-character.
+      
+      0xFFFFFFFF, however, is not readily usable in UTF-32.  It is not well-
+      formed, and it is not a character.  Technically, the largest value in
+      UTF-32 is the largest UNICODE code point, which is 0x10FFFF.  It's
+      tempting to use that value as the UTF32 HIGH-VALUE, except that it doesn't
+      map into a single 16-bit value in UTF-16 (it takes a pair of 16-bit
+      values), and it doesn't map into anything sensible in ASCII or EBCDIC, and
+      it takes multiple bytes in UTF-8.
+      
+      So, we are going to work with the following observations:
+      
+      0xFF   in CP1252 <==> 0x000000FF in UTF32
+      0xFF   in CP1140 <==> 0x0000009F in UTF32
+      0xFFFF in UTF-16 <==> 0x0000FFFF in UTF32
+ 
+      Be it hereby acknowledged that not all possibilities for encoding inter-
+      conversion have been explored, and we anticipate finding and eliminating
+      HIGH-VALUE problems will be Whac-A-Mole territory for some time to come.
+      
+      Please use these constants for that kind of work, because otherwise
+      finding anomalies will be even more frustrating than I currently
+      anticipate.  Dubner, 2025-11-24  */
+   DEFAULT_HIGH_VALUE_8  =       0xFF,
+   DEFAULT_HIGH_VALUE_16 =     0x00FF,
+   DEFAULT_HIGH_VALUE_32 = 0x000000FF,
+   
+   /* These values are used as figurative constants when interconverting from
+      and encoding to UTF32.  Examine, for example, the implementation for
+      the INSPECT statement: */
+   ASCII_HIGH_VALUE_32   = 0x000000FF,
+   EBCDIC_HIGH_VALUE_32  = 0x000000FF,
+   UTF16_HIGH_VALUE_32   = 0x000000FF,
+   UTF32_HIGH_VALUE_32   = 0x000000FF,
+ 
+   REPLACEMENT_CHARACTER = 0xFFFD,
+   };
  
  #define NULLCH ('\0')
  #define DEGENERATE_HIGH_VALUE 0xFF
  #define DEGENERATE_LOW_VALUE 0x00
  
+ #define ascii_nul              ((uint8_t)('\0'))
  #define ascii_A                ((uint8_t)('A'))
  #define ascii_B                ((uint8_t)('B'))
  #define ascii_C                ((uint8_t)('C'))
*************** extern cbl_encoding_t __gg__national_enc
*** 189,194 ****
--- 247,253 ----
  #define ascii_colon            ((uint8_t)(':'))
  #define ascii_comma            ((uint8_t)(','))
  #define ascii_dollar_sign      ((uint8_t)('$'))
+ #define ascii_bang             ((uint8_t)('!'))
  #define ascii_dquote           ((uint8_t)('"'))
  #define ascii_oparen           ((uint8_t)('('))
  #define ascii_caret            ((uint8_t)('^'))
*************** extern const unsigned short __gg__ebcdic
*** 223,236 ****
  
  const char * __gg__encoding_iconv_name( cbl_encoding_t encoding );
  cbl_encoding_t __gg__encoding_iconv_type( const char *name );
  
  char * __gg__iconverter(cbl_encoding_t from,
                          cbl_encoding_t to,
!                   const char *str,
                          size_t length,
!                         size_t *outlength);
  
  #define DEFAULT_SOURCE_ENCODING (iconv_CP1252_e)
  
  class charmap_t
    {
--- 282,312 ----
  
  const char * __gg__encoding_iconv_name( cbl_encoding_t encoding );
  cbl_encoding_t __gg__encoding_iconv_type( const char *name );
+ extern cbl_encoding_t __gg__console_encoding;
  
+ // returns a pointer to a static buffer.  Beware!
  char * __gg__iconverter(cbl_encoding_t from,
                          cbl_encoding_t to,
!                   const void *str,
                          size_t length,
!                         size_t *outlength = nullptr,     // Bytes produced
!                         size_t *iconv_retval = nullptr);
! 
! // returns a malloced buffer.  Remember to free it.
! char * __gg__miconverter(cbl_encoding_t from,
!                          cbl_encoding_t to,
!                    const void *str,
!                          size_t length,
!                          size_t *outlength = nullptr,     // Bytes produced
!                          size_t *iconv_retval = nullptr);
! 
  
  #define DEFAULT_SOURCE_ENCODING (iconv_CP1252_e)
+ #define DEFAULT_32_ENCODING (iconv_UTF32LE_e)
+ 
+ class charmap_t;
+ 
+ charmap_t *__gg__get_charmap(cbl_encoding_t encoding);
  
  class charmap_t
    {
*************** class charmap_t
*** 240,246 ****
      bool m_is_valid;
      bool m_is_big_endian;
      bool m_has_bom = false;
!     int  m_stride; // Number of bytes between one character and the next
  
      enum
        {
--- 316,323 ----
      bool m_is_valid;
      bool m_is_big_endian;
      bool m_has_bom = false;
!     bool m_is_like_utf8;
!     uint8_t  m_stride; // Number of bytes between one character and the next
  
      enum
        {
*************** class charmap_t
*** 250,256 ****
  
      // This map retains the ASCII-to-encoded value in m_encoding, so that iconv
      // need be called but once for each ASCII value.
!     std::unordered_map<int, int>m_map_of_encodings;
  
    public:
      explicit charmap_t(cbl_encoding_t e) : m_encoding(e)
--- 327,333 ----
  
      // This map retains the ASCII-to-encoded value in m_encoding, so that iconv
      // need be called but once for each ASCII value.
!     std::unordered_map<cbl_char_t, cbl_char_t>m_map_of_encodings;
  
    public:
      explicit charmap_t(cbl_encoding_t e) : m_encoding(e)
*************** class charmap_t
*** 263,280 ****
        // what we get back.
        
        size_t outlength = 0;
!       const char challenge[] = "0";
!       const unsigned char *response = PTRCAST(unsigned char,
!                                    __gg__iconverter(DEFAULT_SOURCE_ENCODING,
!                                                     m_encoding,
!                                                     challenge,
!                                                     1,
!                                                     &outlength));
        unsigned char char_0 = 0x00;
  
        m_is_valid = false;
        m_has_bom  = false;
        m_is_big_endian = false;
  
        if( outlength == 1 )
          {
--- 340,370 ----
        // what we get back.
        
        size_t outlength = 0;
!       char challenge[] = "0";
!       char response_[8];
! 
!       iconv_t cd = iconv_open(
!                           __gg__encoding_iconv_name(m_encoding),
!                           __gg__encoding_iconv_name(DEFAULT_SOURCE_ENCODING));
!       char *inbuf  = challenge;
!       char *outbuf = response_;
!       size_t inbytesleft = 1;
!       size_t outbytesleft = sizeof(response_);
!       /*size_t nret = */ iconv( cd,
!                             &inbuf,  &inbytesleft,
!                             &outbuf, &outbytesleft);
!       outlength = sizeof(response_) - outbytesleft;
!       iconv_close(cd);
!       
!       const unsigned char *response = 
!                                   reinterpret_cast<unsigned char *>(response_);
!       
        unsigned char char_0 = 0x00;
  
        m_is_valid = false;
        m_has_bom  = false;
        m_is_big_endian = false;
+       m_is_like_utf8 = false;
  
        if( outlength == 1 )
          {
*************** class charmap_t
*** 349,368 ****
          m_is_valid = true;
          m_numeric_sign_type = sign_type_ebcdic;
          }
        }
  
!     bool is_valid()      const{return m_is_valid     ;}
!     bool is_big_endian() const{return m_is_big_endian;}
!     bool has_bom()       const{return m_has_bom      ;}
!     int  stride()        const{return m_stride       ;}
  
!     int mapped_character(int ch)
        {
        // The assumption is that anybody calling this routine is providing
        // a single-byte character in the DEFAULT_SOURCE_ENCODING encoding.  We
        // return the equivalent character in the m_encoding
!       int retval;
!       std::unordered_map<int, int>::const_iterator it =
                                                     m_map_of_encodings.find(ch);
        if( it != m_map_of_encodings.end() )
          {
--- 439,475 ----
          m_is_valid = true;
          m_numeric_sign_type = sign_type_ebcdic;
          }
+ 
+       // Let's see if this encoding is UTF-8.  We will do that by converting
+       // the single-byte CP1252 code for the Euro symbol to our encoding.
+       cd = iconv_open(
+                     __gg__encoding_iconv_name(iconv_CP1252_e),
+                     __gg__encoding_iconv_name(m_encoding));
+       challenge[0] = static_cast<char>(0x80);// This is the CP1252 Euro symbol.
+       inbuf  = challenge;
+       outbuf = response_;
+       inbytesleft = 1;
+       outbytesleft = sizeof(response_);
+       iconv(cd,
+             &inbuf,  &inbytesleft,
+             &outbuf, &outbytesleft);
+       outlength = sizeof(response_) - outbytesleft;
+       iconv_close(cd);
+       m_is_like_utf8 = (outlength == 3);
        }
  
!     bool is_valid()      const { return m_is_valid     ; }
!     bool is_big_endian() const { return m_is_big_endian; }
!     bool has_bom()       const { return m_has_bom      ; }
!     uint8_t stride()     const { return m_stride       ; }
  
!     cbl_char_t mapped_character(cbl_char_t ch) 
        {
        // The assumption is that anybody calling this routine is providing
        // a single-byte character in the DEFAULT_SOURCE_ENCODING encoding.  We
        // return the equivalent character in the m_encoding
!       cbl_char_t retval;
!       std::unordered_map<cbl_char_t, cbl_char_t>::const_iterator it =
                                                     m_map_of_encodings.find(ch);
        if( it != m_map_of_encodings.end() )
          {
*************** class charmap_t
*** 399,416 ****
        {
        return mapped_character(__gg__low_value_character);
        }
!     int high_value_character()
        {
!       return mapped_character(__gg__high_value_character);
        }
  
!     int figconst_character(cbl_figconst_t figconst)
        {
!       int const_char = 0;  // Head off a compiler warning
        switch(figconst)
          {
          case normal_value_e :
!           const_char = -1;
            break;
          case low_value_e    :
            const_char = low_value_character();
--- 506,543 ----
        {
        return mapped_character(__gg__low_value_character);
        }
!     cbl_char_t high_value_character()
        {
!       cbl_char_t retval = 0;
!       if( __gg__high_value_character == DEFAULT_HIGH_VALUE_8 )
!         {
!         switch(m_stride)
!           {
!           case 1:
!             retval = DEFAULT_HIGH_VALUE_8;
!             break;
!           case 2:
!             retval = DEFAULT_HIGH_VALUE_16;
!             break;
!           case 4:
!             retval = DEFAULT_HIGH_VALUE_32 ;
!             break;
!           }
!         }
!       else
!         {
!         retval = mapped_character(__gg__high_value_character);
!         }
!       return retval;
        }
  
!     cbl_char_t figconst_character(cbl_figconst_t figconst)
        {
!       cbl_char_t const_char = 0;  // Head off a compiler warning
        switch(figconst)
          {
          case normal_value_e :
!           abort();
            break;
          case low_value_e    :
            const_char = low_value_character();
*************** class charmap_t
*** 454,462 ****
      return retval;
      }
  
!   int
!   set_digit_negative(int digit, bool is_negative)
      {
      switch(m_numeric_sign_type)
        {
        case sign_type_ascii:
--- 581,591 ----
      return retval;
      }
  
!   cbl_char_t
!   set_digit_negative(cbl_char_t digit, bool is_negative)
      {
+     // Returns a 0-9 digit with the internal sign bit altered for ascii or
+     // ebcdic.
      switch(m_numeric_sign_type)
        {
        case sign_type_ascii:
*************** class charmap_t
*** 490,497 ****
      return m_numeric_sign_type == sign_type_ebcdic;
      }
  
!   };
  
! charmap_t *__gg__get_charmap(cbl_encoding_t encoding);
  
  #endif
--- 619,920 ----
      return m_numeric_sign_type == sign_type_ebcdic;
      }
  
!   bool
!   is_like_utf8() const
!     {
!     return m_is_like_utf8;
!     }
  
!   void
!   memset(void *dest_, cbl_char_t ch, size_t bytelength)
!     {
!     uint8_t *dest = static_cast<uint8_t *>(dest_);
!     switch(m_stride)
!       {
!       case 1:
!         {
!         if( (ch & 0xFFFFFF00) == 0x00000000 )
!           {
!           // This is the normal case of filling a buffer with a single byte
!           ::memset(dest, ch & 0xff, bytelength);
!           }
!         else
!           {
!           // We are being asked to fill a byte-wide buffer with a multi-byte
!           // character.
!           uint8_t byte3 = ch >> 24;
!           uint8_t byte2 = ch >> 16;
!           uint8_t byte1 = ch >>  8;
!           uint8_t byte0 = ch;
!           size_t fill;
!           size_t i=0;
!           if( byte3 )
!             {
!             fill = bytelength / 4;
!             while( i<fill )
!               {
!               dest[i++] = byte0;
!               dest[i++] = byte1;
!               dest[i++] = byte2;
!               dest[i++] = byte3;
!               }
!             }
!           else if( byte2 )
!             {
!             fill = bytelength / 3;
!             while( i<fill )
!               {
!               dest[i++] = byte0;
!               dest[i++] = byte1;
!               dest[i++] = byte2;
!               }
!             }
!           else
!             {
!             fill = bytelength / 2;
!             while( i<fill )
!               {
!               dest[i++] = byte0;
!               dest[i++] = byte1;
!               }
!             }
!           while( i < bytelength )
!             {
!             dest[i++] = mapped_character(ascii_space);
!             }
!           }
!         break;
!         }
! 
!       case 2:
!         {
!         assert( !(bytelength&1) );
!         // We know the target has an even number of bytes available.  We also
!         // know that each codepoint is usually one, but sometimes two, pairs
!         // of bytes
!         uint16_t top_half    = ch>>16;
!         uint16_t bottom_half = ch;
!         size_t fill = bytelength;
!         size_t i = 0;
!         uint16_t *p = PTRCAST(uint16_t, dest);
!         while( i<fill )
!           {
!           p[i/2] = bottom_half;
!           i += 2;
!           if( i>= fill )
!             {
!             break;
!             }
!           if( top_half )
!             {
!             p[i/2] = bottom_half;
!             i += 2;
!             }
!           }
!         if( i < bytelength )
!           {
!           // We were trying to put two-pair values into the destination, but
!           // there were an odd number of pairs available.
!           p[i] = mapped_character(ascii_space);
!           i += 2; // cppcheck-suppress unreadVariable
!           }
!         break;
!         }
! 
!       case 4:
!         {
!         assert( !(bytelength&3) );
!         // We know the target has multiple of four bytes available.
!         uint32_t *p = PTRCAST(uint32_t, dest);
!         size_t i = 0;
!         while( i<bytelength )
!           {
!           p[i/4] = ch;
!           i += 4;
!           }
!         break;
!         }
!       }
!     }
! 
!   void putch(cbl_char_t ch, void *base_, size_t location)
!     {
!     // This routine puts a character at a byte location.  It's up to the
!     // user to provide the correct byte location, and update it by the stride
!     // when necessary.
!     uint8_t *base = static_cast<uint8_t *>(base_);
!     memcpy(base+location, &ch, m_stride);
!     if( m_stride < 4 )
!       {
!       location += m_stride;
!       ch >>= (8 * m_stride);
!       while(ch)
!         {
!         memcpy(base+location, &ch, m_stride);
!         location += m_stride;
!         ch >>= (8 * m_stride);
!         }
!       }
!     }
! 
!   void putch(cbl_char_t ch, void *base_, size_t *location)
!     {
!     // This routine puts a character at a location, and updates the location
!     uint8_t *base = static_cast<uint8_t *>(base_);
!     memcpy(base+*location, &ch, m_stride);
!     *location += m_stride;
!     if( m_stride < 4 )
!       {
!       ch >>= 8 * m_stride;
!       while(ch)
!         {
!         memcpy(base+*location, &ch, m_stride);
!         *location += m_stride;
!         ch >>= 8 * m_stride;
!         }
!       }
!     }
! 
!   cbl_char_t getch(const void *base_, size_t location) const
!     {
!     // This routine gets a character at a location, and updates the location
!     cbl_char_t retval = 0;
!     const uint8_t *base = static_cast<const uint8_t *>(base_);
! 
!     memcpy(&retval, base+location, m_stride);
! ////    location += m_stride;
! ////  We need to do something about UTF-8 snd UTF-16
! ////    while(ch)
! ////      {
! ////      memcpy(base+*location, &ch, m_stride);
! ////      *location += m_stride;
! ////      ch >>= 8 * m_stride;
! ////      }
!     return retval;
!     }
! 
!   cbl_char_t getch(const void *base_, size_t *location) const
!     {
!     // This routine gets a character at a location, and updates the location
!     cbl_char_t retval = 0;
!     const uint8_t *base = static_cast<const uint8_t *>(base_);
! 
!     memcpy(&retval, base+*location, m_stride);
!     *location += m_stride;
! ////  We need to do something about UTF-8 snd UTF-16
! ////    while(ch)
! ////      {
! ////      memcpy(base+*location, &ch, m_stride);
! ////      *location += m_stride;
! ////      ch >>= 8 * m_stride;
! ////      }
!     return retval;
!     }
! 
!   unsigned long long strtoull(char *in, char **end, int /*base*/)
!     {
!     // This is like strtoull(3), but the base is restricted to 10.
!     size_t index = 0;
!     unsigned long long retval = 0;
!     cbl_char_t mapped_0 = mapped_character(ascii_0);
!     cbl_char_t mapped_9 = mapped_character(ascii_9);
!     for(;;)
!       {
!       cbl_char_t ch = getch(in, &index);
!       if( ch < mapped_0 || ch > mapped_9 )
!         {
!         break;
!         }
!       retval *= 10;
!       retval += ch & 0x0F;
!       }
!     *end = in + index-m_stride ;
!     return retval;
!     }
! 
!     template <typename T>
!     size_t
!     Strlen( T *input, ssize_t limit = SSIZE_MAX ) {
!       size_t i;
!       for( i = 0; i < (limit / sizeof(T)) && input[i] != 0; i++ )
!         ;
!       return i;
!     }
!     size_t strlen2( const void *converted, ssize_t limit = SSIZE_MAX ) {
!       switch(m_stride) {
!       case 1:
!         return Strlen( reinterpret_cast<const char*>(converted), limit );
!       case 2:
!         return Strlen( reinterpret_cast<const uint16_t*>(converted), limit );
!       case 4:
!         return Strlen( reinterpret_cast<const uint16_t*>(converted), limit );
!       }
!       //// gcc_unreachable();
!       return -1; // Mollify cppcheck.
!     }
!     
!   size_t
!   strlen( const void *converted,
!           ssize_t limit = SSIZE_MAX)
!     {
!     size_t retval;
! 
!     union
!       {
!       const uint8_t  *p8 ;
!       const uint16_t *p16;
!       const uint32_t *p32;
!       } ;
!     const uint8_t *p_start = reinterpret_cast<const uint8_t *>(converted);
!     p8 = p_start;
!     switch(m_stride)
!       {
!       case 1:
!         {
!         // Loop until the pointer is past the limit, or until we hit
!         // a character that is all zeroes
!         while(*p8)
!           {
!           if( p8 - p_start > limit )
!             {
!             break;
!             }
!           p8 += 1;
!           }
!         break;
!         }
!       case 2:
!         {
!         // Loop until the pointer is past the limit, or until we hit
!         // a character that is all zeroes
!         while(*p16)
!           {
!           if( p8 - p_start > limit )
!             {
!             break;
!             }
!           p8 += 2;
!           }
!         break;
!         }
!       case 4:
!         {
!         // Loop until the pointer is past the limit, or until we hit
!         // a character that is all zeroes
!         while(*p32)
!           {
!           if( p8 - p_start > limit )
!             {
!             break;
!             }
!           p8 += 4;
!           }
!         break;
!         }
!       }
!     retval = p8 - p_start;
!     return retval;
!     }
!   };
  
  #endif
diff -Nrcpad gcc-16-20260111/libgcobol/common-defs.h gcc-16-20260118/libgcobol/common-defs.h
*** gcc-16-20260111/libgcobol/common-defs.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/common-defs.h	Sun Jan 18 22:32:15 2026
***************
*** 60,66 ****
  
  /*  COBOL has the concept of Numeric Display values, which use an entire byte
      per digit.  IBM also calls this "Zoned Decimal".
!     
      In ASCII, the digits are '0' through '9' (0x30 through 0x39'.  Signed
      values are indicated by turning on the 0x40 bit in either the first
      byte (for LEADING variables) or the last byte (for TRAILING).
--- 60,66 ----
  
  /*  COBOL has the concept of Numeric Display values, which use an entire byte
      per digit.  IBM also calls this "Zoned Decimal".
! 
      In ASCII, the digits are '0' through '9' (0x30 through 0x39'.  Signed
      values are indicated by turning on the 0x40 bit in either the first
      byte (for LEADING variables) or the last byte (for TRAILING).
*************** enum cbl_field_type_t {
*** 187,235 ****
   *   (But maybe the fill character should just be an explicit character.)
   */
  enum cbl_field_attr_t : uint64_t {
!   none_e            = 0x0000000000,
!   figconst_1_e      = 0x0000000001, // This needs to be 1 - don't change the position
!   figconst_2_e      = 0x0000000002, // This needs to be 2
!   figconst_4_e      = 0x0000000004, // This needs to be 4
!   rjust_e           = 0x0000000008, // justify right
!   ljust_e           = 0x0000000010, // justify left
!   zeros_e           = 0x0000000020, // zero fill
!   signable_e        = 0x0000000040,
!   constant_e        = 0x0000000080, // pre-assigned constant
!   function_e        = 0x0000000100,
!   quoted_e          = 0x0000000200,
!   filler_e          = 0x0000000400,
!   register_e        = 0x0000000800, // Data definition is found in constants.cc
!   intermediate_e    = 0x0000001000, // Compiler-defined temporary variable
!   embiggened_e      = 0x0000002000, // redefined numeric made 64-bit by USAGE POINTER
!   all_alpha_e       = 0x0000004000, // FldAlphanumeric, but all A's
!   all_x_e           = 0x0000008000, // picture is all X's
!   all_ax_e          = 0x000000a000, // picture is all A's or all X's
!   prog_ptr_e        = 0x0000010000, // FUNCTION-POINTER or PROGRAM-POINTER
!   scaled_e          = 0x0000020000,
!   refmod_e          = 0x0000040000, // Runtime; indicates a refmod is active
!   based_e           = 0x0000080000, // pointer capacity, for ADDRESS OF or ALLOCATE
!   any_length_e      = 0x0000100000, // inferred length of linkage in nested program
!   global_e          = 0x0000200000, // field has global scope
!   external_e        = 0x0000400000, // field has external scope
!   blank_zero_e      = 0x0000800000, // BLANK WHEN ZERO
    // data division uses 2 low bits of high byte
!   linkage_e         = 0x0001000000, // field is in linkage section
!   local_e           = 0x0002000000, // field is in local section
!   leading_e         = 0x0004000000, // leading sign (signable_e alone means trailing)
!   separate_e        = 0x0008000000, // separate sign
!   envar_e           = 0x0010000000, // names an environment variable
!   encoded_e         = 0x0020000000, // data.initial matches codeset.encoding
!   bool_encoded_e    = 0x0040000000, // data.initial is a boolean string
!   hex_encoded_e     = 0x0080000000, // data.initial is a hex-encoded string
!   depends_on_e      = 0x0100000000, // A group hierachy contains a DEPENDING_ON
!   initialized_e     = 0x0200000000, // Don't call parser_initialize from parser_symbol_add
!   has_value_e       = 0x0400000000, // Flag to hierarchical descendents to ignore .initial
!   ieeedec_e         = 0x0800000000, // Indicates a FldFloat is IEEE 754 decimal, rather than binary
!   big_endian_e      = 0x1000000000, // Indicates a value is big-endian
!   same_as_e         = 0x2000000000, // Field produced by SAME AS (cannot take new members)
!   record_key_e      = 0x4000000000,
!   typedef_e         = 0x8000000000, // IS TYPEDEF
    strongdef_e       = typedef_e + intermediate_e, // STRONG TYPEDEF (not temporary)
  };
  // The separate_e value does double-duty for FldPacked/COMP-6, which is not
--- 187,235 ----
   *   (But maybe the fill character should just be an explicit character.)
   */
  enum cbl_field_attr_t : uint64_t {
!   none_e            =  0x0000000000,
!   figconst_1_e      =  0x0000000001, // This needs to be 1 - don't change the position
!   figconst_2_e      =  0x0000000002, // This needs to be 2
!   figconst_4_e      =  0x0000000004, // This needs to be 4
!   rjust_e           =  0x0000000008, // justify right
!   ljust_e           =  0x0000000010, // justify left
!   zeros_e           =  0x0000000020, // zero fill
!   signable_e        =  0x0000000040,
!   constant_e        =  0x0000000080, // pre-assigned constant
!   function_e        =  0x0000000100,
!   quoted_e          =  0x0000000200,
!   filler_e          =  0x0000000400,
!   register_e        =  0x0000000800, // Data definition is found in constants.cc
!   intermediate_e    =  0x0000001000, // Compiler-defined temporary variable
!   embiggened_e      =  0x0000002000, // redefined numeric made 64-bit by USAGE POINTER
!   all_alpha_e       =  0x0000004000, // FldAlphanumeric, but all A's
!   all_x_e           =  0x0000008000, // picture is all X's
!   all_ax_e          =  0x000000a000, // picture is all A's or all X's
!   prog_ptr_e        =  0x0000010000, // FUNCTION-POINTER or PROGRAM-POINTER
!   scaled_e          =  0x0000020000,
!   refmod_e          =  0x0000040000, // Runtime; indicates a refmod is active
!   based_e           =  0x0000080000, // pointer capacity, for ADDRESS OF or ALLOCATE
!   any_length_e      =  0x0000100000, // inferred length of linkage in nested program
!   global_e          =  0x0000200000, // field has global scope
!   external_e        =  0x0000400000, // field has external scope
!   blank_zero_e      =  0x0000800000, // BLANK WHEN ZERO
    // data division uses 2 low bits of high byte
!   linkage_e         =  0x0001000000, // field is in linkage section
!   local_e           =  0x0002000000, // field is in local section
!   leading_e         =  0x0004000000, // leading sign (signable_e alone means trailing)
!   separate_e        =  0x0008000000, // separate sign
!   envar_e           =  0x0010000000, // names an environment variable
!   encoded_e         =  0x0020000000, // data.initial matches codeset.encoding
!   bool_encoded_e    =  0x0040000000, // data.initial is a boolean string
!   hex_encoded_e     =  0x0080000000, // data.initial is a hex-encoded string
!   depends_on_e      =  0x0100000000, // A group hierachy contains a DEPENDING_ON
!   initialized_e     =  0x0200000000, // Don't call parser_initialize from parser_symbol_add
!   has_value_e       =  0x0400000000, // Flag to hierarchical descendents to ignore .initial
!   ieeedec_e         =  0x0800000000, // Indicates a FldFloat is IEEE 754 decimal, rather than binary
!   big_endian_e      =  0x1000000000, // Indicates a value is big-endian
!   same_as_e         =  0x2000000000, // Field produced by SAME AS (cannot take new members)
!   record_key_e      =  0x4000000000,
!   typedef_e         =  0x8000000000, // IS TYPEDEF
    strongdef_e       = typedef_e + intermediate_e, // STRONG TYPEDEF (not temporary)
  };
  // The separate_e value does double-duty for FldPacked/COMP-6, which is not
*************** enum cbl_field_attr_t : uint64_t {
*** 239,245 ****
  // that there is no sign nybble.
  #define packed_no_sign_e separate_e
  
! enum cbl_figconst_t
      {
      normal_value_e = 0, // This one must be zero
      low_value_e    = 1, // The order is important, because
--- 239,251 ----
  // that there is no sign nybble.
  #define packed_no_sign_e separate_e
  
! #define LOW_VALUE_E   figconst_1_e
! #define ZERO_VALUE_E  (figconst_2_e|figconst_1_e)
! #define SPACE_VALUE_E figconst_4_e
! #define QUOTE_VALUE_E  (figconst_4_e|figconst_1_e)
! #define HIGH_VALUE_E  (figconst_4_e|figconst_2_e)
! 
! enum cbl_figconst_t : uint64_t
      {
      normal_value_e = 0, // This one must be zero
      low_value_e    = 1, // The order is important, because
*************** enum module_type_t {
*** 431,436 ****
--- 437,454 ----
    module_toplevel_e,
  };
  
+ enum convert_type_t {
+   convert_alpha_e      = 0x01,
+   convert_nat_e        = 0x02,
+   convert_any_e        = 0x03, // i.e., both
+   convert_byte_e       = 0x04,
+   convert_hex_e        = 0x08, // may be combined with alpha or national
+   convert_just_bit_e   = 0x10,
+   convert_just_e       = 0x18, // combined with HEX
+   convert_rjust_bit_e  = 0x20,
+   convert_rjust_e      = 0x38, // combined with JUSTIFY
+ };
+ 
  /*
   * Compare a "raised" EC to an enabled EC or of a declarative.  "raised" may in
   * fact not be raised; in the compiler this function is used to compare a TURN
*************** struct cbl_declarative_t {
*** 490,496 ****
    size_t section; // implies program
    bool global;
    ec_type_t type;
!   uint32_t nfile, files[files_max];
    cbl_file_mode_t mode;
  
    explicit cbl_declarative_t( cbl_file_mode_t mode = file_mode_none_e )
--- 508,515 ----
    size_t section; // implies program
    bool global;
    ec_type_t type;
!   size_t nfile;
!   uint64_t files[files_max];
    cbl_file_mode_t mode;
  
    explicit cbl_declarative_t( cbl_file_mode_t mode = file_mode_none_e )
*************** struct cbl_declarative_t {
*** 545,550 ****
--- 564,570 ----
  
    /*
     * Sort file names before file modes, and file modes before non-IO.
+    * Sort file names before file modes, and file modes before non-IO.
     */
    bool operator<( const cbl_declarative_t& that ) const {
      // file name declaratives first, in section order
*************** struct cbl_declarative_t {
*** 566,572 ****
  
      // TRUE if there are no files to match, or the provided file is in the list.
      bool match_file( size_t file ) const {
!     static const uint32_t * pend = files + nfile;
  
      return nfile == 0 || pend != std::find(files, files + nfile, file);
    }
--- 586,592 ----
  
      // TRUE if there are no files to match, or the provided file is in the list.
      bool match_file( size_t file ) const {
!     static const uint64_t * pend = files + nfile;
  
      return nfile == 0 || pend != std::find(files, files + nfile, file);
    }
diff -Nrcpad gcc-16-20260111/libgcobol/encodings.h gcc-16-20260118/libgcobol/encodings.h
*** gcc-16-20260111/libgcobol/encodings.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/encodings.h	Sun Jan 18 22:32:15 2026
*************** valid_encoding( cbl_encoding_t enc ) {
*** 1209,1215 ****
  struct encodings_t {
    bool supported;
    cbl_encoding_t type;
!   const char name[32];
  };
  
  #endif
--- 1209,1215 ----
  struct encodings_t {
    bool supported;
    cbl_encoding_t type;
!   char name[32];
  };
  
  #endif
diff -Nrcpad gcc-16-20260111/libgcobol/gcobolio.h gcc-16-20260118/libgcobol/gcobolio.h
*** gcc-16-20260111/libgcobol/gcobolio.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/gcobolio.h	Sun Jan 18 22:32:15 2026
*************** typedef struct cblc_file_t
*** 123,131 ****
      int                  errnum;           // most recent errno; can't reuse "errno" as the name
      file_status_t        io_status;        // See 2014 standard, section 9.1.12
      int                  padding;          // Actually a char
!     int                  delimiter;        // ends a record; defaults to '\n'.
      int                  flags;            // cblc_file_flags_t
!     int                  recent_char;      // This is the most recent char sent to the file
      int                  recent_key;
      cblc_file_prior_op_t prior_op;         // run-time type is INT
      cbl_encoding_t       encoding;         // We assume size int
--- 123,132 ----
      int                  errnum;           // most recent errno; can't reuse "errno" as the name
      file_status_t        io_status;        // See 2014 standard, section 9.1.12
      int                  padding;          // Actually a char
!     uint32_t             delimiter;        // ends a record; defaults to '\n'.
!     int                  stride;           // Width of a character
      int                  flags;            // cblc_file_flags_t
!     uint32_t             recent_char;      // This is the most recent char sent to the file
      int                  recent_key;
      cblc_file_prior_op_t prior_op;         // run-time type is INT
      cbl_encoding_t       encoding;         // We assume size int
diff -Nrcpad gcc-16-20260111/libgcobol/gfileio.cc gcc-16-20260118/libgcobol/gfileio.cc
*** gcc-16-20260111/libgcobol/gfileio.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/gfileio.cc	Sun Jan 18 22:32:15 2026
*************** handle_errno(cblc_file_t *file, const ch
*** 190,244 ****
    }
  
  static
! char *
! get_filename( const cblc_file_t *file)
    {
!   bool is_quoted = !!(file->flags & file_name_quoted_e);
  
!   static size_t fname_size = MINIMUM_ALLOCATION_SIZE;
!   static char *fname = static_cast<char *>(malloc(MINIMUM_ALLOCATION_SIZE));
!   massert(fname);
!   if( strlen(file->filename)+1 > fname_size)
!     {
!     fname_size = strlen(file->filename)+1 ;
!     fname = static_cast<char *>(realloc(fname, fname_size));
!     }
  
!   strcpy(fname, file->filename);
  
!   if( !is_quoted )
      {
!     // We have been given something that might be the name of an
!     // environment variable that contains the filename:
!     const char *p_from_environment = getenv(fname);
!     if( p_from_environment )
        {
!       if( strlen(p_from_environment)+1 > fname_size )
          {
!         fname_size = strlen(p_from_environment)+1;
!         free(fname);
!         fname = static_cast<char *>(malloc(fname_size));
!         massert(fname);
          }
-       strcpy(fname, p_from_environment);
        }
      }
  
!   if(*fname)
      {
!     // COBOL strings are space-filled to the right, so we have to get rid
!     // of any spaces out there.  If somebody *wants* a filename space-filled
!     // to the right, well, at this juncture I am not prepared to be complicit
!     // in that particular flavor of lunacy.
!     size_t n = strlen(fname)-1;
!     // Note the conditional that terminates the loop when n goes from zero
!     // to a huge positive number in the event that the string is all SPACES
!     while( n < strlen(fname) && fname[n] == ascii_space )
        {
!       fname[n--] = '\0';
        }
      }
!   return fname;
    }
  
  static void
--- 190,272 ----
    }
  
  static
! void
! establish_filename(       cblc_file_t  *file,
!                     const cblc_field_t *field_of_name,
!                     char               *filename)
    {
!   // This routine sets file->filename to the provided name.  The name might
!   // ultimately be filename, which if present has to be in the system encoding
!   // and is flagged as not-quoted, meaning that it could have been from an
!   // environment variable.  It could be from a FldLiteral, which for a SELECT
!   // clause is not encoded in field_of_name->encoding.  Or it could be from a
!   // variable, in which case it is encoded.
  
!   // Whenever anybody establishes file->filename, it should be done through
!   // a malloc.
  
!   // The field_of_name was not encoded in any way.  The field_of_name->codeset
!   // might the same as ordinary alphanumerics, but the field->data for literals
!   // was not encoded.
  
!   char *allocated_here = nullptr;
!   if( !filename )
      {
!     // We weren't given a filename, so we extract it from the field_of_name
! 
!     file->flags |= file_name_quoted_e;
!     if( field_of_name->type == FldLiteralA )
        {
!       // For literals in SELECT clauses, the initial value is the
!       // nul-terminated filename in the source-code encoding.  The
!       // field->encoding is possibly wrong, but irrelevant.
!       allocated_here = static_cast<char *>(malloc(field_of_name->capacity+1));
!       massert(allocated_here);
!       memcpy(allocated_here, field_of_name->data, field_of_name->capacity);
!       allocated_here[field_of_name->capacity] = '\0';
!       filename = allocated_here;
!       }
!     else
!       {
!       // We need to convert from the designated encoding to the system
!       // encoding:
!       filename = __gg__iconverter(field_of_name->encoding,
!                                  __gg__console_encoding,
!                                  reinterpret_cast<char *>(field_of_name->data),
!                                  field_of_name->capacity);
!       // COBOL strings are space-filled to the right, so we have to get rid
!       // of any spaces out there.  If somebody *wants* a filename space-filled
!       // to the right, well, at this juncture I am not prepared to be complicit
!       // in that particular flavor of lunacy.
!       size_t n = strlen(filename)-1;
!       // Note the conditional that terminates the loop when n goes from zero
!       // to a huge positive number in the event that the string is all SPACES
!       while( n < strlen(filename) && filename[n] == ascii_space )
          {
!         filename[n--] = '\0';
          }
        }
      }
+   else
+     {
+     file->flags &= ~file_name_quoted_e;
+     }
  
!   // At this point, we have a trimmed filename in the system encoding:
! 
!   if( !(file->flags & file_name_quoted_e) )
      {
!     // We have been given something that might be the name of an
!     // environment variable that contains the filename:
!     char *p_from_environment = getenv(filename);
!     if( p_from_environment )
        {
!       filename = p_from_environment;
        }
      }
!   free(file->filename);
!   file->filename = strdup(filename);
!   free(allocated_here);
    }
  
  static void
*************** void
*** 308,314 ****
  __gg__file_init(
    cblc_file_t   *file,
    const char    *name,
!   size_t         symbol_table_index,
    cblc_field_t **keys,
    int           *key_numbers,
    int           *uniques,
--- 336,342 ----
  __gg__file_init(
    cblc_file_t   *file,
    const char    *name,
!   uint64_t       symbol_table_index,
    cblc_field_t **keys,
    int           *key_numbers,
    int           *uniques,
*************** __gg__file_init(
*** 353,358 ****
--- 381,387 ----
      file->errnum              = 0 ;
      file->io_status           = FsSuccess ;
      file->delimiter           = charmap->mapped_character(ascii_newline) ;
+     file->stride              = charmap->stride();
      file->flags               = file_flag_none_e;
          file->flags          |= (optional ? file_flag_optional_e : file_flag_none_e)
                                  + file_flag_initialized_e;
*************** relative_file_delete(cblc_file_t *file,
*** 666,672 ****
    file->errnum = 0;
    file->io_status = FsErrno;
  
!   char record_marker;
  
    unsigned char *stash = static_cast<unsigned char *>(malloc(file->default_record->capacity));
    massert(stash);
--- 695,701 ----
    file->errnum = 0;
    file->io_status = FsErrno;
  
!   cbl_char_t record_marker;
  
    unsigned char *stash = static_cast<unsigned char *>(malloc(file->default_record->capacity));
    massert(stash);
*************** relative_file_delete(cblc_file_t *file,
*** 731,736 ****
--- 760,766 ----
  
      errno = 0;
      file->errnum = 0;
+     record_marker = 0;
      ssize_t presult = pread(rfp.fd, &record_marker, 1, rfp.flag_position);
      if( presult < 0 )
        {
*************** __io__file_delete(cblc_file_t *file, boo
*** 1153,1197 ****
    }
  
  static void
! __io__file_remove(cblc_file_t *file, char *filename, int is_quoted)
    {
!   // filename is the result of a strdup or malloc.  Because both FILE OPEN
!   // and FILE DELETE can establish or change a name, we free it here and
!   // replace it.  The same is true in FILE DELETE Format 2
!   free(file->filename);
!   file->filename = filename;
!   file->flags &= ~file_name_quoted_e;
!   file->flags |= is_quoted ? file_name_quoted_e : file_flag_none_e;
!   int erc;
! 
!   // This code copied from reopen
!   const char *trimmed_name = get_filename(file);
!   if( !trimmed_name[0] )
      {
!     bool all_spaces = true;
!     for(size_t i=0; i<strlen(file->filename); i++)
        {
!       if( file->filename[i] != ascii_space )
!         {
!         all_spaces = false;
!         }
!       break;
        }
!     if( all_spaces )
        {
!       warnx("Warning: %s specified with a filename that is all spaces",
!             file->name);
!       file->io_status = FsNameError;    // "31"
!       goto done;
        }
  
!     warnx(  "%s(): There is no environment variable named \"%s\"\n",
!             __func__,
!             file->filename);
!     file->io_status = FsNoFile;    // "35"
      goto done;
      }
-   // trimmed_name is now the file system name of the file to be removed.
  
    // If the file is open, we flag that with "41"
    if( file->file_pointer )
--- 1183,1237 ----
    }
  
  static void
! trim_in_place(char *psz)
    {
!   // Get rid of leading spaces:
!   if( *psz == ascii_space )
      {
!     char *p = psz;
!     while(*p++ == ascii_space)
        {
!       // Just trim them away:
        }
!     p -= 1;
!     size_t i=0;
!     while(*p)
        {
!       psz[i++] = *p++;
        }
+     psz[i++] = '\0';
+     }
+   // Get rid of trailing spaces:
+   size_t len = strlen(psz);
+   size_t i   = len-1;
+   while( i < len && psz[i] == ascii_space )
+     {
+     psz[i--] = '\0';
+     }
+   }
  
! static void
! __io__file_remove(cblc_file_t  *file,
!             const char *filename)
!   {
!   file->errnum = 0;
!   file->io_status = FsErrno;
!   int erc;
! 
!   if( filename )
!     {
!     free(file->filename);
!     file->filename = strdup(filename);
!     trim_in_place(file->filename);
!     }
! 
!   if( !strlen(file->filename) )
!     {
!     warnx("Warning: %s specified with a filename that is empty",
!           file->name);
!     file->io_status = FsNameError;    // "31"
      goto done;
      }
  
    // If the file is open, we flag that with "41"
    if( file->file_pointer )
*************** __io__file_remove(cblc_file_t *file, cha
*** 1202,1208 ****
  
    // There's been a lot of buildup.  We can now try to remove the file:
    errno = 0;
!   erc = remove(trimmed_name);
    if( erc == 0 )
      {
      // All is copacetic.  There was a file, and now it's gone.
--- 1242,1248 ----
  
    // There's been a lot of buildup.  We can now try to remove the file:
    errno = 0;
!   erc = remove(file->filename);
    if( erc == 0 )
      {
      // All is copacetic.  There was a file, and now it's gone.
*************** __io__file_remove(cblc_file_t *file, cha
*** 1210,1222 ****
      }
    else if( errno == ENOENT )
      {
!     // The file didn't exist.  
      file->io_status = FsUnavail;    // "05"
      }
    else
      {
      // We have some other kind of error.  Lack of credentials, or whatever.
!     file->io_status = FsErrno;    // 
      goto done;
      }
  
--- 1250,1262 ----
      }
    else if( errno == ENOENT )
      {
!     // The file didn't exist.
      file->io_status = FsUnavail;    // "05"
      }
    else
      {
      // We have some other kind of error.  Lack of credentials, or whatever.
!     file->io_status = FsErrno;    //
      goto done;
      }
  
*************** relative_file_start(cblc_file_t *file,
*** 1504,1510 ****
    while(      rfp.record_position >= 0
            &&  rfp.record_position+total_record_length <= rfp.file_size )
      {
!     char record_marker;
      ssize_t presult = pread(rfp.fd, &record_marker, 1, rfp.flag_position);
      if( presult < 0 )
        {
--- 1544,1551 ----
    while(      rfp.record_position >= 0
            &&  rfp.record_position+total_record_length <= rfp.file_size )
      {
!     cbl_char_t record_marker;
!     record_marker = 0;
      ssize_t presult = pread(rfp.fd, &record_marker, 1, rfp.flag_position);
      if( presult < 0 )
        {
*************** relative_file_rewrite( cblc_file_t *file
*** 1952,1958 ****
      {
      // This is like a write, except the place we are putting
      // it has to be occupied instead of empty.
!     char record_marker;
      if( relative_file_parameters_get(   rfp,
                                          rfm_microfocus_e,
                                          file,
--- 1993,1999 ----
      {
      // This is like a write, except the place we are putting
      // it has to be occupied instead of empty.
!     cbl_char_t record_marker;
      if( relative_file_parameters_get(   rfp,
                                          rfm_microfocus_e,
                                          file,
*************** relative_file_rewrite( cblc_file_t *file
*** 1963,1968 ****
--- 2004,2010 ----
        goto done;
        }
  
+     record_marker = 0;
      ssize_t presult = pread(rfp.fd, &record_marker, 1, rfp.flag_position);
      if( presult < 0 )
        {
*************** relative_file_write(cblc_file_t    *file
*** 2513,2519 ****
          }
        }
      // Let's check to make sure the slot for this record is currently available:
!     char record_marker;
      ssize_t presult = pread(rfp.fd, &record_marker, 1, rfp.flag_position);
      if( presult < 0 )
        {
--- 2555,2562 ----
          }
        }
      // Let's check to make sure the slot for this record is currently available:
!     cbl_char_t record_marker;
!     record_marker = 0;
      ssize_t presult = pread(rfp.fd, &record_marker, 1, rfp.flag_position);
      if( presult < 0 )
        {
*************** sequential_file_write(cblc_file_t    *fi
*** 2599,2607 ****
    {
    // This code handles SEQUENTIAL and LINE SEQUENTIAl
    charmap_t *charmap = __gg__get_charmap(file->encoding);
  
!   char ch = '\0';
!   size_t characters_to_write;
  
    int lcount;
  
--- 2642,2652 ----
    {
    // This code handles SEQUENTIAL and LINE SEQUENTIAl
    charmap_t *charmap = __gg__get_charmap(file->encoding);
+   int stride = charmap->stride();
  
!   // ch is the vertical control character
!   cbl_char_t ch = '\0';
!   size_t bytes_to_write;
  
    int lcount;
  
*************** sequential_file_write(cblc_file_t    *fi
*** 2628,2640 ****
      }
  
    // By default, we write out the number of characters in the record area
!   characters_to_write = length;
  
    // That gets overridden if there is a record_length
    if( file->record_length )
      {
      int rdigits;
!     characters_to_write = (int)__gg__binary_value_from_field(
                                                        &rdigits,
                                                        file->record_length);
      }
--- 2673,2685 ----
      }
  
    // By default, we write out the number of characters in the record area
!   bytes_to_write = length;
  
    // That gets overridden if there is a record_length
    if( file->record_length )
      {
      int rdigits;
!     bytes_to_write = stride * (int)__gg__binary_value_from_field(
                                                        &rdigits,
                                                        file->record_length);
      }
*************** sequential_file_write(cblc_file_t    *fi
*** 2642,2661 ****
    if( file->org == file_line_sequential_e )
      {
      // If file-sequential, then trailing spaces are removed:
!     while(     characters_to_write > 0
!                && location[characters_to_write-1] == charmap->mapped_character(ascii_space) )
        {
!       characters_to_write -= 1;
        }
      }
  
!   if( after && file->org == file_line_sequential_e && ch == charmap->mapped_character(ascii_newline) )
      {
      // In general, we terminate every line with a newline.  Because this
      // line is supposed to start with a newline, we decrement the line
      // counter by one if we had already sent one.
!     if( lcount && (   file->recent_char == charmap->mapped_character(ascii_newline)
!                      || file->recent_char == charmap->mapped_character(ascii_ff)) )
        {
        lcount -= 1;
        }
--- 2687,2709 ----
    if( file->org == file_line_sequential_e )
      {
      // If file-sequential, then trailing spaces are removed:
!     while(bytes_to_write > 0
!            && charmap->getch(location, bytes_to_write-stride) 
!                                   == charmap->mapped_character(ascii_space) )
        {
!       bytes_to_write -= stride;
        }
      }
  
!   if( after && file->org == file_line_sequential_e 
!                            && ch == charmap->mapped_character(ascii_newline) )
      {
      // In general, we terminate every line with a newline.  Because this
      // line is supposed to start with a newline, we decrement the line
      // counter by one if we had already sent one.
!     if( lcount && 
!             (   file->recent_char == charmap->mapped_character(ascii_newline)
!                 || file->recent_char == charmap->mapped_character(ascii_ff)) )
        {
        lcount -= 1;
        }
*************** sequential_file_write(cblc_file_t    *fi
*** 2665,2671 ****
      {
      while(lcount--)
        {
!       fputc(ch, file->file_pointer);
        if( handle_ferror(file, __func__, "fputc() error [3]") )
          {
          goto done;
--- 2713,2722 ----
      {
      while(lcount--)
        {
!       fwrite( &ch,
!               stride,
!               1,
!               file->file_pointer);
        if( handle_ferror(file, __func__, "fputc() error [3]") )
          {
          goto done;
*************** sequential_file_write(cblc_file_t    *fi
*** 2679,2688 ****
    switch(file->org)
      {
      case file_line_sequential_e:
!       if( characters_to_write )
          {
          fwrite( location,
!                 characters_to_write,
                  1,
                  file->file_pointer);
          if( handle_ferror(file, __func__, "fwrite() error") )
--- 2730,2739 ----
    switch(file->org)
      {
      case file_line_sequential_e:
!       if( bytes_to_write )
          {
          fwrite( location,
!                 bytes_to_write,
                  1,
                  file->file_pointer);
          if( handle_ferror(file, __func__, "fwrite() error") )
*************** sequential_file_write(cblc_file_t    *fi
*** 2694,2706 ****
        break;
  
      case file_sequential_e:
!       if( characters_to_write )
          {
          // File sequential records can start off with a four-byte
          // preamble.
  
!         if(    characters_to_write < file->record_area_min
!                || characters_to_write > file->record_area_max)
            {
            file->io_status = FsBoundWrite; // "44"
            goto done;
--- 2745,2757 ----
        break;
  
      case file_sequential_e:
!       if( bytes_to_write )
          {
          // File sequential records can start off with a four-byte
          // preamble.
  
!         if(    bytes_to_write < file->record_area_min
!                || bytes_to_write > file->record_area_max)
            {
            file->io_status = FsBoundWrite; // "44"
            goto done;
*************** sequential_file_write(cblc_file_t    *fi
*** 2709,2719 ****
          if( file->record_area_min != file->record_area_max )
            {
            // Because of the min/max mismatch, we require a preamble:
!           // The first two bytes are the big-endian character count
            const unsigned char preamble[4] =
              {
!             (unsigned char)(characters_to_write>>8),
!             (unsigned char)(characters_to_write),
              0,
              0
              };
--- 2760,2770 ----
          if( file->record_area_min != file->record_area_max )
            {
            // Because of the min/max mismatch, we require a preamble:
!           // The first two bytes are the big-endian byte count
            const unsigned char preamble[4] =
              {
!             (unsigned char)(bytes_to_write>>8),
!             (unsigned char)(bytes_to_write),
              0,
              0
              };
*************** sequential_file_write(cblc_file_t    *fi
*** 2729,2735 ****
            }
  
          fwrite( location,
!                 characters_to_write,
                  1,
                  file->file_pointer);
          if( handle_ferror(file, __func__, "fwrite() error") )
--- 2780,2786 ----
            }
  
          fwrite( location,
!                 bytes_to_write,
                  1,
                  file->file_pointer);
          if( handle_ferror(file, __func__, "fwrite() error") )
*************** sequential_file_write(cblc_file_t    *fi
*** 2753,2759 ****
      {
      // Special case:  when AFTER NON-ZERO lines, we stick a newline on the
      // end of this record:
!     fputc(ch, file->file_pointer);
      if( handle_ferror(file, __func__, "fputc() error [4]") )
        {
        goto done;
--- 2804,2813 ----
      {
      // Special case:  when AFTER NON-ZERO lines, we stick a newline on the
      // end of this record:
!     fwrite( &ch,
!             stride,
!             1,
!             file->file_pointer);
      if( handle_ferror(file, __func__, "fputc() error [4]") )
        {
        goto done;
*************** sequential_file_write(cblc_file_t    *fi
*** 2766,2772 ****
      // We did the output BEFORE, so now it's time to send some newlines
      while(lcount--)
        {
!       fputc(ch, file->file_pointer);
        if( handle_ferror(file, __func__, "fputc() error [5]") )
          {
          goto done;
--- 2820,2829 ----
      // We did the output BEFORE, so now it's time to send some newlines
      while(lcount--)
        {
!       fwrite( &ch,
!               stride,
!               1,
!               file->file_pointer);
        if( handle_ferror(file, __func__, "fputc() error [5]") )
          {
          goto done;
*************** line_sequential_file_read(  cblc_file_t
*** 3044,3051 ****
    {
    file->errnum = 0;
    file->io_status = FsErrno;
!   size_t characters_read = 0;
!   size_t remaining;
    bool hit_eof;
  
    // According to IBM:
--- 3101,3107 ----
    {
    file->errnum = 0;
    file->io_status = FsErrno;
!   size_t bytes_read = 0;
    bool hit_eof;
  
    // According to IBM:
*************** line_sequential_file_read(  cblc_file_t
*** 3065,3072 ****
    // characters to the right as undefined.  I'm going with IBM,
    // it makes more sense to me.
  
    // We first stage the data into the record area.
!   int ch;
  
    long fpos = ftell(file->file_pointer);
    if( handle_ferror(file, __func__, "ftell() error") )
--- 3121,3131 ----
    // characters to the right as undefined.  I'm going with IBM,
    // it makes more sense to me.
  
+   charmap_t *charmap = __gg__get_charmap(file->encoding);
+   int stride = charmap->stride();
+ 
    // We first stage the data into the record area.
!   cbl_char_t ch;
  
    long fpos = ftell(file->file_pointer);
    if( handle_ferror(file, __func__, "ftell() error") )
*************** line_sequential_file_read(  cblc_file_t
*** 3076,3090 ****
      }
  
    hit_eof = false;
!   while( characters_read < file->record_area_max )
      {
!     ch = fgetc(file->file_pointer);
      file->errnum = ferror(file->file_pointer);
      if( ch == file->delimiter )
        {
        break;
        }
!     if( ch == EOF )
        {
        hit_eof = true;
        clearerr(file->file_pointer);
--- 3135,3150 ----
      }
  
    hit_eof = false;
!   while( bytes_read < file->record_area_max )
      {
!     ch = 0;
!     fread(&ch, 1, stride, file->file_pointer);
      file->errnum = ferror(file->file_pointer);
      if( ch == file->delimiter )
        {
        break;
        }
!     if( feof(file->file_pointer) )
        {
        hit_eof = true;
        clearerr(file->file_pointer);
*************** line_sequential_file_read(  cblc_file_t
*** 3095,3113 ****
        fpos = -1;
        goto done;
        }
!     file->default_record->data[characters_read] = (char)ch;
!     characters_read += 1;
!     }
!   remaining = characters_read;
!   while(remaining < file->record_area_max )
!     {
!     // Space fill shorty records
!     charmap_t *charmap = __gg__get_charmap(file->encoding);
!     file->default_record->data[remaining++] =
!                                         charmap->mapped_character(ascii_space);
      }
  
!   if( hit_eof && !characters_read)
      {
      // We got an end-of-file without characters
      file->io_status = FsEofSeq; // "10"
--- 3155,3169 ----
        fpos = -1;
        goto done;
        }
!     memcpy(file->default_record->data+bytes_read, &ch, stride);
!     bytes_read += stride;
      }
+   // Space fill shorty records
+     charmap->memset(file->default_record->data+bytes_read,
+                     charmap->mapped_character(ascii_space),
+                     file->record_area_max  - bytes_read);
  
!   if( hit_eof && !bytes_read)
      {
      // We got an end-of-file without characters
      file->io_status = FsEofSeq; // "10"
*************** line_sequential_file_read(  cblc_file_t
*** 3120,3126 ****
      // does another READ:
      file->io_status = FsErrno;
      }
!   else if (characters_read < file->record_area_max)
      {
      // Just discard an early record delimiter
      file->io_status = FsRecordLength;   // "04"
--- 3176,3182 ----
      // does another READ:
      file->io_status = FsErrno;
      }
!   else if (bytes_read < file->record_area_max )
      {
      // Just discard an early record delimiter
      file->io_status = FsRecordLength;   // "04"
*************** line_sequential_file_read(  cblc_file_t
*** 3133,3150 ****
      // Manual: "If the first unread character is the record delimiter, it
      // is discarded. Otherwise, the first unread character becomes the first
      // character read by the next READ statement."
-     ch = fgetc(file->file_pointer);
-     file->errnum = ferror();
-     // If that next character isn't a delimiter, put it back:
-     if( ch != file->delimiter && ch != EOF)
-       {
-       ungetc(ch, file->file_pointer);
-       }
-     else if( handle_ferror(file->file_pointer, __func__, "fgetc() error") )
-       {
-       fpos = -1;
-       goto done;
-       }
  #else
      // In this code, extra characters before the newline
      // are read next time are discarded.  GnuCOBOL works this way, and
--- 3189,3194 ----
*************** line_sequential_file_read(  cblc_file_t
*** 3153,3163 ****
      // SEQUENTIAL; it describes only SEQUENTIAL.
      for(;;)
        {
!       ch = fgetc(file->file_pointer);
        file->errnum = ferror(file->file_pointer);
        // We can't use handle_ferror() directly, because an EOF is
        // a legitimate way to end the last line.
!       if( ch == file->delimiter || ch == EOF)
          {
          clearerr(file->file_pointer);
          break;
--- 3197,3208 ----
      // SEQUENTIAL; it describes only SEQUENTIAL.
      for(;;)
        {
!       ch = 0;
!       fread(&ch, 1, stride, file->file_pointer);
        file->errnum = ferror(file->file_pointer);
        // We can't use handle_ferror() directly, because an EOF is
        // a legitimate way to end the last line.
!       if( ch == file->delimiter || feof(file->file_pointer) )
          {
          clearerr(file->file_pointer);
          break;
*************** line_sequential_file_read(  cblc_file_t
*** 3176,3182 ****
    if( file->record_length )
      {
      __gg__int128_to_field(file->record_length,
!                                     characters_read,
                                      0,
                                      truncation_e,
                                      NULL);
--- 3221,3227 ----
    if( file->record_length )
      {
      __gg__int128_to_field(file->record_length,
!                                     bytes_read/stride,
                                      0,
                                      truncation_e,
                                      NULL);
*************** sequential_file_read(  cblc_file_t  *fil
*** 3266,3279 ****
    if( characters_read < bytes_in_record )
      {
      charmap_t *charmap = __gg__get_charmap(file->encoding);
!     memset( file->default_record->data,
!             charmap->mapped_character(ascii_space),
!             bytes_to_read);
      file->io_status = FsEofSeq; // "10"
      fpos = -1;
      goto done;
      }
  
    // Let the caller know if we got too few or too many characters
    if(     bytes_in_record < file->record_area_min
            ||  bytes_in_record > file->record_area_max )
--- 3311,3337 ----
    if( characters_read < bytes_in_record )
      {
      charmap_t *charmap = __gg__get_charmap(file->encoding);
!     charmap->memset(file->default_record->data,
!                     charmap->mapped_character(ascii_space),
!                     bytes_to_read);
      file->io_status = FsEofSeq; // "10"
      fpos = -1;
      goto done;
      }
  
+   if( characters_read < file->default_record->capacity )
+     {
+     // The record area is longer than the characters we read.  Space-fill out
+     // to the end:
+ 
+     charmap_t *charmap = __gg__get_charmap(file->encoding);
+     charmap->memset( file->default_record->data + characters_read,
+                      charmap->mapped_character(ascii_space),
+                      file->default_record->capacity - characters_read );
+     }
+ 
+ 
+ 
    // Let the caller know if we got too few or too many characters
    if(     bytes_in_record < file->record_area_min
            ||  bytes_in_record > file->record_area_max )
*************** sequential_file_read(  cblc_file_t  *fil
*** 3292,3298 ****
    if( file->record_length )
      {
      __gg__int128_to_field(file->record_length,
!                                     characters_read,
                                      0,
                                      truncation_e,
                                      NULL);
--- 3350,3356 ----
    if( file->record_length )
      {
      __gg__int128_to_field(file->record_length,
!                                     characters_read/file->stride,
                                      0,
                                      truncation_e,
                                      NULL);
*************** relative_file_read( cblc_file_t *file,
*** 3570,3576 ****
        file->prior_read_location = -1;
        goto done;
        }
!     char record_marker;
      if( pread(rfp.fd, &record_marker, 1, rfp.flag_position) <= 0)
        {
        goto done;
--- 3628,3635 ----
        file->prior_read_location = -1;
        goto done;
        }
!     cbl_char_t record_marker;
!     record_marker = 0;
      if( pread(rfp.fd, &record_marker, 1, rfp.flag_position) <= 0)
        {
        goto done;
*************** __gg__file_reopen(cblc_file_t *file, int
*** 4189,4197 ****
  
    // Stash the mode_char for later analysis during READ and WRITE operations
    file->mode_char = mode_char;
!   char *trimmed_name;
!   trimmed_name = get_filename(file);
!   if( !trimmed_name[0] )
      {
      bool all_spaces = true;
      for(size_t i=0; i<strlen(file->filename); i++)
--- 4248,4254 ----
  
    // Stash the mode_char for later analysis during READ and WRITE operations
    file->mode_char = mode_char;
!   if( !file->filename[0] )
      {
      bool all_spaces = true;
      for(size_t i=0; i<strlen(file->filename); i++)
*************** __gg__file_reopen(cblc_file_t *file, int
*** 4220,4226 ****
    // achMode is the mode string that gets passed down below to fopen().
    random_access_mode = (    file->access == file_access_rnd_e
                                || file->access == file_access_dyn_e);
!   the_file_exists = access(trimmed_name, F_OK) == 0;
    file->flags |= the_file_exists ? file_flag_existed_e : file_flag_none_e ;
  
    // We have four operations: INPUT (r) OUTPUT (w) I-O (+) and EXTEND (a)
--- 4277,4283 ----
    // achMode is the mode string that gets passed down below to fopen().
    random_access_mode = (    file->access == file_access_rnd_e
                                || file->access == file_access_dyn_e);
!   the_file_exists = access(file->filename, F_OK) == 0;
    file->flags |= the_file_exists ? file_flag_existed_e : file_flag_none_e ;
  
    // We have four operations: INPUT (r) OUTPUT (w) I-O (+) and EXTEND (a)
*************** __gg__file_reopen(cblc_file_t *file, int
*** 4362,4368 ****
        }
      }
  
!   file->file_pointer = fopen(trimmed_name, achMode);
    if( file->file_pointer == NULL )
      {
      file->errnum = errno;
--- 4419,4425 ----
        }
      }
  
!   file->file_pointer = fopen(file->filename, achMode);
    if( file->file_pointer == NULL )
      {
      file->errnum = errno;
*************** __gg__file_reopen(cblc_file_t *file, int
*** 4406,4426 ****
  
  static void
  __io__file_open(cblc_file_t *file,
!                 char *filename,
!                 int mode_char,
!                 int is_quoted)
    {
-   // 'filename' is a pointer to a malloc() buffer.
-   // The 'filename' has to be in the system encoding, typically ASCII
- 
-   // The complication:  A filename can be literal text, it can be from a COBOL
-   // alphanumeric variable, or it can be the name of an environment variable
-   // that contains the actual name of the file.  The consequence is that if
-   // you want to call __gg__file_open from anywhere except the parser_file_open
-   // routine, then you had best really know what you are doing.
- 
    file->errnum = 0;
    file->io_status = FsErrno;
    if( file->file_pointer )
      {
      // The file is already open:
--- 4463,4489 ----
  
  static void
  __io__file_open(cblc_file_t *file,
!           const char *filename,
!                 int mode_char)
    {
    file->errnum = 0;
    file->io_status = FsErrno;
+ 
+   if( filename )
+     {
+     free(file->filename);
+     file->filename = strdup(filename);
+     trim_in_place(file->filename);
+     }
+ 
+   if( !strlen(file->filename) )
+     {
+     warnx("Warning: %s specified with a filename that is empty",
+           file->name);
+     file->io_status = FsNameError;    // "31"
+     goto done;
+     }
+ 
    if( file->file_pointer )
      {
      // The file is already open:
*************** __io__file_open(cblc_file_t *file,
*** 4428,4443 ****
      }
    else
      {
-     // filename is the result of a strdup or malloc.  Because both FILE OPEN
-     // and FILE DELETE can establish or change a name, we free it here and
-     // replace it.  The same is true in FILE DELETE Format 2
-     free(file->filename);
-     file->filename = filename;
-     file->flags &= ~file_name_quoted_e;
-     file->flags |= is_quoted ? file_name_quoted_e : file_flag_none_e;
- 
      __gg__file_reopen(file, mode_char);
      }
    file->prior_op = file_op_open;
    establish_status(file, -1);
    }
--- 4491,4499 ----
      }
    else
      {
      __gg__file_reopen(file, mode_char);
      }
+   done:
    file->prior_op = file_op_open;
    establish_status(file, -1);
    }
*************** __io__file_close( cblc_file_t *file, int
*** 4491,4500 ****
      file_indexed_close(file);
      }
  
-   // The filename was malloced.  So, we get rid of it here.
-   free(file->filename);
-   file->filename = NULL;
- 
    done:
    file->prior_op = file_op_close;
    establish_status(file, fpos);
--- 4547,4552 ----
*************** public:
*** 4548,4556 ****
    static const char constexpr marquee[64] = "libgcobol: gfileio.cc";
  
    typedef void (open_t)( cblc_file_t *file,
!                          char *filename,
!                          int mode_char,
!                          int is_quoted );
    typedef void (close_t)( cblc_file_t *file,
                            int how );
    typedef void (start_t)( cblc_file_t *file,
--- 4600,4607 ----
    static const char constexpr marquee[64] = "libgcobol: gfileio.cc";
  
    typedef void (open_t)( cblc_file_t *file,
!                    const char *filename,
!                          int mode_char);
    typedef void (close_t)( cblc_file_t *file,
                            int how );
    typedef void (start_t)( cblc_file_t *file,
*************** public:
*** 4565,4578 ****
                            int after,
                            int lines,
                            int is_random );
!   typedef void (rewrite_t)( cblc_file_t *file,
!                             size_t length, bool is_random );
!   typedef void (delete_t)( cblc_file_t *file,
                            bool is_random );
!   typedef void (remove_t)( cblc_file_t *file,
!                           char *filename,
!                           int is_quoted);
! 
    open_t      *Open;
    close_t     *Close;
    start_t     *Start;
--- 4616,4627 ----
                            int after,
                            int lines,
                            int is_random );
!   typedef void (rewrite_t)(cblc_file_t *file,
!                            size_t length, bool is_random );
!   typedef void (delete_t)(cblc_file_t *file,
                            bool is_random );
!   typedef void (remove_t)(cblc_file_t  *file,
!                     const char         *filename);
    open_t      *Open;
    close_t     *Close;
    start_t     *Start;
*************** gcobol_fileops() {
*** 4651,4659 ****
   * Then, in libgcobol, replace direct calls with calls through fileops.
   * That is, instead of
   *
!  *     __gg__file_open("foo", "r", false );
   * use
!  *     gfile->Open("foo", "r", false );
   *
   * You'll probably want some kind of trampoline to avoid the need to
   * generate the Gimple to call through a pointer to a structure:
--- 4700,4708 ----
   * Then, in libgcobol, replace direct calls with calls through fileops.
   * That is, instead of
   *
!  *     __gg__file_open("foo", "r" );
   * use
!  *     gfile->Open("foo", "r" );
   *
   * You'll probably want some kind of trampoline to avoid the need to
   * generate the Gimple to call through a pointer to a structure:
*************** gcobol_io_funcs() {
*** 4680,4692 ****
  extern "C"
  void
  __gg__file_open(cblc_file_t *file,
                  char *filename,
!                 int mode_char,
!                 int is_quoted)
    {
!   // The 'filename' has to be in the system encoding, typically ASCII
    gcobol_io_t *functions = gcobol_io_funcs();
!   functions->Open(file, filename, mode_char, is_quoted);
    }
  
  extern "C"
--- 4729,4741 ----
  extern "C"
  void
  __gg__file_open(cblc_file_t *file,
+           const cblc_field_t *field_of_name,
                  char *filename,
!                 int mode_char)
    {
!   establish_filename(file, field_of_name, filename);
    gcobol_io_t *functions = gcobol_io_funcs();
!   functions->Open(file, NULL, mode_char);
    }
  
  extern "C"
*************** __gg__file_delete(cblc_file_t *file, boo
*** 4749,4759 ****
  extern "C"
  
  void
! __gg__file_remove(cblc_file_t *file, char *name, int is_quoted)
    {
      // DELETE FILE Format 2 - removes a file.
      gcobol_io_t *functions = gcobol_io_funcs();
!     functions->Remove(file, name, is_quoted);
    }
  
  /* end interface functions */
--- 4798,4811 ----
  extern "C"
  
  void
! __gg__file_remove(      cblc_file_t *file,
!                   const cblc_field_t *field_of_name,
!                         char *filename)
    {
      // DELETE FILE Format 2 - removes a file.
+     establish_filename(file, field_of_name, filename);
      gcobol_io_t *functions = gcobol_io_funcs();
!     functions->Remove(file, NULL);
    }
  
  /* end interface functions */
diff -Nrcpad gcc-16-20260111/libgcobol/gfileio.h gcc-16-20260118/libgcobol/gfileio.h
*** gcc-16-20260111/libgcobol/gfileio.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/gfileio.h	Sun Jan 18 22:32:15 2026
*************** extern "C"
*** 59,67 ****
  void __gg__handle_error(const char *function, const char *msg);
  
  void __gg__file_open(   cblc_file_t *file,
                          char *filename,
!                         int mode_char,
!                         int is_quoted);
  
  void __gg__file_reopen(cblc_file_t *file, int mode_char);
  
--- 59,67 ----
  void __gg__handle_error(const char *function, const char *msg);
  
  void __gg__file_open(   cblc_file_t *file,
+                   const cblc_field_t *fname,
                          char *filename,
!                         int mode_char);
  
  void __gg__file_reopen(cblc_file_t *file, int mode_char);
  
diff -Nrcpad gcc-16-20260111/libgcobol/gmath.cc gcc-16-20260118/libgcobol/gmath.cc
*** gcc-16-20260111/libgcobol/gmath.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/gmath.cc	Sun Jan 18 22:32:15 2026
*************** __gg__subtractf1_float_phase2(cbl_arith_
*** 1097,1103 ****
    const size_t       *C_s = __gg__treeplet_3s;
  
    bool on_size_error = !!(on_error_flag & ON_SIZE_ERROR);
!   // This is the assignment phase of an ADD Format 2
    // We take phase1_result and subtract it from C
  
    GCOB_FP128 temp = __gg__float128_from_qualified_field(C[0], C_o[0], C_s[0]);
--- 1097,1103 ----
    const size_t       *C_s = __gg__treeplet_3s;
  
    bool on_size_error = !!(on_error_flag & ON_SIZE_ERROR);
!   // This is the assignment phase of an SUBTRACT Format 2
    // We take phase1_result and subtract it from C
  
    GCOB_FP128 temp = __gg__float128_from_qualified_field(C[0], C_o[0], C_s[0]);
*************** __gg__subtractf2_float_phase1(cbl_arith_
*** 1135,1145 ****
                            compute_error
                            );
  
!   // Subtract that from the B value:
    GCOB_FP128 value_b = __gg__float128_from_qualified_field(B[0], B_o[0], B_s[0]);
  
!   // The two numbers have the same number of rdigits.  It's now safe to add
!   // them.
    phase1_result_float = subtraction_helper_float(value_b, phase1_result_float, compute_error);
    }
  
--- 1135,1144 ----
                            compute_error
                            );
  
!   // Subtract that subtotal from the B value:
    GCOB_FP128 value_b = __gg__float128_from_qualified_field(B[0], B_o[0], B_s[0]);
  
! 
    phase1_result_float = subtraction_helper_float(value_b, phase1_result_float, compute_error);
    }
  
*************** __gg__multiplyf1_phase2(cbl_arith_format
*** 1366,1372 ****
      {
      if( C[0]->type == FldFloat )
        {
!       // gixed * float
        a_value = (GCOB_FP128) multiply_intermediate_int128;
        if( multiply_intermediate_rdigits )
          {
--- 1365,1371 ----
      {
      if( C[0]->type == FldFloat )
        {
!       // fixed * float
        a_value = (GCOB_FP128) multiply_intermediate_int128;
        if( multiply_intermediate_rdigits )
          {
diff -Nrcpad gcc-16-20260111/libgcobol/intrinsic.cc gcc-16-20260118/libgcobol/intrinsic.cc
*** gcc-16-20260111/libgcobol/intrinsic.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/intrinsic.cc	Sun Jan 18 22:32:15 2026
***************
*** 38,43 ****
--- 38,44 ----
  #include <langinfo.h>
  
  #include <cctype>
+ #include <cwctype>
  #include <cmath>
  #include <cstring>
  #include <ctime>
*************** trim_trailing_spaces(PCHAR left, PCHAR &
*** 100,110 ****
  static bool
  is_zulu_format(PCHAR left, PCHAR &right, charmap_t *charmap)
    {
!   int char_Z = charmap->mapped_character(ascii_Z);
    bool retval = false;
!   if( right > left )
      {
!     retval = std::toupper((unsigned char)*(right-1)) == char_Z;
      }
    return retval;
    }
--- 101,117 ----
  static bool
  is_zulu_format(PCHAR left, PCHAR &right, charmap_t *charmap)
    {
!   cbl_char_t char_Z = charmap->mapped_character(ascii_Z);
!   cbl_char_t char_z = charmap->mapped_character(ascii_z);
!   int stride = charmap->stride();
    bool retval = false;
!   if( right - left >= stride)
      {
!     cbl_char_t last_character = charmap->getch(right-stride, size_t(0));
!     if( last_character == char_Z || last_character == char_z )
!       {
!       retval = true;
!       }
      }
    return retval;
    }
*************** static
*** 228,238 ****
  void
  string_to_dest(cblc_field_t *dest, const char *psz)
    {
    size_t dest_length = dest->capacity;
!   size_t source_length = strlen(psz);
    size_t length = std::min(dest_length, source_length);
!   charmap_t *charmap = __gg__get_charmap(dest->encoding);
!   memset(dest->data, charmap->mapped_character(ascii_space), dest_length);
    memcpy(dest->data, psz, length);
    }
  
--- 235,245 ----
  void
  string_to_dest(cblc_field_t *dest, const char *psz)
    {
+   charmap_t *charmap = __gg__get_charmap(dest->encoding);
    size_t dest_length = dest->capacity;
!   size_t source_length = charmap->strlen(psz);
    size_t length = std::min(dest_length, source_length);
!   charmap->memset(dest->data, charmap->mapped_character(ascii_space), dest_length);
    memcpy(dest->data, psz, length);
    }
  
*************** get_all_time( const cblc_field_t *dest,
*** 574,579 ****
--- 581,587 ----
            ctm.day_of_week+1,
            ctm.day_of_year,
            ctm.ZZZZ);
+ 
    __gg__convert_encoding(PTRCAST(char, stime),
                           DEFAULT_SOURCE_ENCODING,
                           dest->encoding);
*************** ftime_replace(char *dest,
*** 801,807 ****
                char const * const dest_end,
                char const *       source,
                char const * const source_end,
!               charmap_t  *       charmap_source,
                char const * const ftime)
    {
    // This routine is highly dependent on the source format being correct.
--- 809,815 ----
                char const * const dest_end,
                char const *       source,
                char const * const source_end,
!               charmap_t  *       charmap,
                char const * const ftime)
    {
    // This routine is highly dependent on the source format being correct.
*************** ftime_replace(char *dest,
*** 824,856 ****
    static const int OFFSET_TO_DOY            = 34;
    static const int OFFSET_TO_ZZZZ           = 37;
  
!   unsigned int decimal_point =
!                    charmap_source->mapped_character(__gg__get_decimal_point());
!   unsigned int source_Y    = charmap_source->mapped_character(ascii_Y   );
!   unsigned int source_W    = charmap_source->mapped_character(ascii_W   );
!   unsigned int source_s    = charmap_source->mapped_character(ascii_s   );
!   unsigned int source_m    = charmap_source->mapped_character(ascii_m   );
!   unsigned int source_h    = charmap_source->mapped_character(ascii_h   );
!   unsigned int source_plus = charmap_source->mapped_character(ascii_plus);
!   unsigned int source_D    = charmap_source->mapped_character(ascii_D   );
!   unsigned int source_M    = charmap_source->mapped_character(ascii_M   );
  
    while( source < source_end && dest < dest_end )
      {
!     unsigned char fchar = *source;
      if( fchar == source_Y )
        {
        // This can only be a YYYY
        // But, we have a choice.  If there is a 'W' in the format, then we
        // need to use ZZZZ rather than YYYY:
!       src = ftime + OFFSET_TO_YYYY;
        const char *p = source;
        while(p < source_end)
          {
!         if( (unsigned char)*p++ == source_W )
            {
!           src = ftime + OFFSET_TO_ZZZZ;
            }
          }
  
        ncount = 4;
--- 832,869 ----
    static const int OFFSET_TO_DOY            = 34;
    static const int OFFSET_TO_ZZZZ           = 37;
  
!   int stride = charmap->stride();
! 
!   cbl_char_t decimal_point =
!                    charmap->mapped_character(__gg__get_decimal_point());
!   cbl_char_t source_Y    = charmap->mapped_character(ascii_Y   );
!   cbl_char_t source_W    = charmap->mapped_character(ascii_W   );
!   cbl_char_t source_s    = charmap->mapped_character(ascii_s   );
!   cbl_char_t source_m    = charmap->mapped_character(ascii_m   );
!   cbl_char_t source_h    = charmap->mapped_character(ascii_h   );
!   cbl_char_t source_plus = charmap->mapped_character(ascii_plus);
!   cbl_char_t source_D    = charmap->mapped_character(ascii_D   );
!   cbl_char_t source_M    = charmap->mapped_character(ascii_M   );
  
    while( source < source_end && dest < dest_end )
      {
!     cbl_char_t fchar = charmap->getch(source, size_t(0));
      if( fchar == source_Y )
        {
        // This can only be a YYYY
        // But, we have a choice.  If there is a 'W' in the format, then we
        // need to use ZZZZ rather than YYYY:
!       src = ftime + OFFSET_TO_YYYY*stride;
        const char *p = source;
+       size_t index = 0;
        while(p < source_end)
          {
!         //if( (unsigned char)*p++ == source_W )
!         if( charmap->getch(source, &index) == source_W )
            {
!           src = ftime + OFFSET_TO_ZZZZ*stride;
            }
+         p += stride;
          }
  
        ncount = 4;
*************** ftime_replace(char *dest,
*** 859,901 ****
        {
        // This can only be a MM
        ncount = 2;
!       src = ftime + OFFSET_TO_MM;
        }
      else if( fchar == source_D )
        {
        // It can be a D, DD or DDD
!       if( (unsigned char)source[2] == source_D )
          {
          ncount = 3;
!         src = ftime + OFFSET_TO_DOY;
          }
!       else if( (unsigned char)source[1] == source_D )
          {
          ncount = 2;
!         src = ftime + OFFSET_TO_DD;
          }
        else
          {
          ncount = 1;
!         src = ftime + OFFSET_TO_DOW;
          }
        }
      else if( fchar == source_plus )
        {
        saw_plus_sign = true;
        ncount = 1;
!       src = ftime + OFFSET_TO_OFFSET;
        }
      else if( fchar == source_h )
        {
        ncount = 2;
        if(saw_plus_sign)
          {
!         src = ftime + OFFSET_TO_OFFSET_HOUR;
          }
        else
          {
!         src = ftime + OFFSET_TO_HOUR;
          }
        }
      else if( fchar == source_m )
--- 872,914 ----
        {
        // This can only be a MM
        ncount = 2;
!       src = ftime + OFFSET_TO_MM*stride;
        }
      else if( fchar == source_D )
        {
        // It can be a D, DD or DDD
!       if( charmap->getch(source, 2*stride) == source_D )
          {
          ncount = 3;
!         src = ftime + OFFSET_TO_DOY*stride;
          }
!       else if( charmap->getch(source, 1*stride) == source_D )
          {
          ncount = 2;
!         src = ftime + OFFSET_TO_DD*stride;
          }
        else
          {
          ncount = 1;
!         src = ftime + OFFSET_TO_DOW*stride;
          }
        }
      else if( fchar == source_plus )
        {
        saw_plus_sign = true;
        ncount = 1;
!       src = ftime + OFFSET_TO_OFFSET*stride;
        }
      else if( fchar == source_h )
        {
        ncount = 2;
        if(saw_plus_sign)
          {
!         src = ftime + OFFSET_TO_OFFSET_HOUR*stride;
          }
        else
          {
!         src = ftime + OFFSET_TO_HOUR*stride;
          }
        }
      else if( fchar == source_m )
*************** ftime_replace(char *dest,
*** 903,913 ****
        ncount = 2;
        if(saw_plus_sign)
          {
!         src = ftime + OFFSET_TO_OFFSET_MINUTE;
          }
        else
          {
!         src = ftime + OFFSET_TO_MINUTE;
          }
        }
      else if( fchar == decimal_point )
--- 916,926 ----
        ncount = 2;
        if(saw_plus_sign)
          {
!         src = ftime + OFFSET_TO_OFFSET_MINUTE*stride;
          }
        else
          {
!         src = ftime + OFFSET_TO_MINUTE*stride;
          }
        }
      else if( fchar == decimal_point )
*************** ftime_replace(char *dest,
*** 922,939 ****
          {
          // There can be a variable number of fractional 's'
          ncount = -1;
!         src = ftime + OFFSET_TO_FRACTION;
          }
        else
          {
          ncount = 2;
!         src = ftime + OFFSET_TO_SECOND;
          }
        }
      else if( fchar == source_W )
        {
        ncount = 3;
!       src = ftime + OFFSET_TO_WEEK;
        }
      else
        {
--- 935,952 ----
          {
          // There can be a variable number of fractional 's'
          ncount = -1;
!         src = ftime + OFFSET_TO_FRACTION*stride;
          }
        else
          {
          ncount = 2;
!         src = ftime + OFFSET_TO_SECOND*stride;
          }
        }
      else if( fchar == source_W )
        {
        ncount = 3;
!       src = ftime + OFFSET_TO_WEEK*stride;
        }
      else
        {
*************** ftime_replace(char *dest,
*** 946,963 ****
        {
        // This indicates special processing for a variable number of 's'
        // characters
!       while((unsigned char)*source == source_s && dest < dest_end)
          {
!         source += 1;
!         *dest++ = *src++;
          }
        }
      else
        {
!       source += ncount;
        while(ncount-- && dest < dest_end)
          {
!         *dest++ = *src++;
          }
        }
      }
--- 959,980 ----
        {
        // This indicates special processing for a variable number of 's'
        // characters
!       while(charmap->getch(source, size_t(0)) == source_s && dest < dest_end)
          {
!         source += stride;
!         memcpy(dest, src, stride);
!         dest += stride;
!         src  += stride;
          }
        }
      else
        {
!       source += ncount*stride;
        while(ncount-- && dest < dest_end)
          {
!         memcpy(dest, src, stride);
!         dest += stride;
!         src += stride;
          }
        }
      }
*************** __gg__char( cblc_field_t *dest,
*** 1177,1202 ****
      }
  
    // We need to convert the ch character to the destination encoding.
!   const char achFrom[2] = {static_cast<char>(ch), '\0'};
    size_t charsout;
    const char *converted = __gg__iconverter(__gg__display_encoding,
                                             dest->encoding,
!                                            achFrom,
                                             1,
                                             &charsout );
    // Pick up our character, because mapped_character() might clobber
    // the converted contents.
!   int converted_char = *converted; // cppcheck-suppress variableScope
    // Space fill the dest:
!   charmap_t *charmap_dest = __gg__get_charmap(dest->encoding);
!   memset(dest->data,
!          charmap_dest->mapped_character(ascii_space),
!          dest->capacity);
    // Make the first character of the destination equal to our converted
    // character:
    if( ch > -1 && charsout == 1 )
      {
!     dest->data[0] = converted_char;
      }
    }
  
--- 1194,1224 ----
      }
  
    // We need to convert the ch character to the destination encoding.
!   // THIS IS A KLUDGE UNTIL WE MAKE THE CURRENT_COLLATION TO BE A MAP OF
!   // WIDE CHARACTERS!
!   charmap_t *charmap_dest = __gg__get_charmap(dest->encoding);
! 
!   cbl_char_t achFrom = 0;
!   memcpy(&achFrom, &ch, 1);
    size_t charsout;
    const char *converted = __gg__iconverter(__gg__display_encoding,
                                             dest->encoding,
!                                            &achFrom,
                                             1,
                                             &charsout );
    // Pick up our character, because mapped_character() might clobber
    // the converted contents.
!   int converted_char = 0;
!   memcpy(&converted_char, converted, charmap_dest->stride());
    // Space fill the dest:
!   charmap_dest-> memset(dest->data,
!                         charmap_dest->mapped_character(ascii_space),
!                         dest->capacity);
    // Make the first character of the destination equal to our converted
    // character:
    if( ch > -1 && charsout == 1 )
      {
!     charmap_dest->putch(converted_char, dest->data, size_t(0));
      }
    }
  
*************** __gg__current_date(cblc_field_t *dest)
*** 1278,1287 ****
  
    char retval[DATE_STRING_BUFFER_SIZE];
    timespec_to_string(retval, tp);
!   __gg__convert_encoding(PTRCAST(char, retval),
!                          DEFAULT_SOURCE_ENCODING,
!                          dest->encoding);
!   string_to_dest(dest, retval);
    }
  
  extern "C"
--- 1300,1315 ----
  
    char retval[DATE_STRING_BUFFER_SIZE];
    timespec_to_string(retval, tp);
! 
!   size_t bytes_converted;
!   char *converted = __gg__miconverter(__gg__console_encoding,
!                                       dest->encoding,
!                                       retval,
!                                       strlen(retval),
!                                       &bytes_converted);
!   __gg__field_from_string(dest, 0, dest->capacity, converted, bytes_converted);
!   __gg__adjust_dest_size(dest, bytes_converted);
!   free(converted);
    }
  
  extern "C"
*************** __gg__formatted_current_date( cblc_field
*** 1524,1552 ****
    charmap_t *charmap_from = __gg__get_charmap(from);
    charmap_t *charmap_to   = __gg__get_charmap(to);
  
!   int dest_space = charmap_to->mapped_character(ascii_space);
!   int format_Z   = charmap_from->mapped_character(ascii_Z);
  
    // Establish the destination, and set it to spaces
    char *d    = PTRCAST(char, dest->data);
    const char *dend = d + dest->capacity;
!   memset(d, dest_space, dest->capacity);
  
    // Establish the formatting string:
    const char *format     = PTRCAST(char, (input->data+input_offset));
    const char *format_end = format + input_size;
  
    bool is_zulu = false;
- 
    const char *p = format;
    while( p < format_end )
      {
!     int ch = *p++;
!     if( ch == format_Z )
        {
        is_zulu = true;
        break;
        }
      }
  
    struct cbl_timespec ts = {};
--- 1552,1581 ----
    charmap_t *charmap_from = __gg__get_charmap(from);
    charmap_t *charmap_to   = __gg__get_charmap(to);
  
!   cbl_char_t dest_space = charmap_to->mapped_character(ascii_space);
!   cbl_char_t format_Z   = charmap_from->mapped_character(ascii_Z);
!   cbl_char_t format_z   = charmap_from->mapped_character(ascii_z);
  
    // Establish the destination, and set it to spaces
    char *d    = PTRCAST(char, dest->data);
    const char *dend = d + dest->capacity;
!   charmap_to->memset(d, dest_space, dest->capacity);
  
    // Establish the formatting string:
    const char *format     = PTRCAST(char, (input->data+input_offset));
    const char *format_end = format + input_size;
  
    bool is_zulu = false;
    const char *p = format;
    while( p < format_end )
      {
!     cbl_char_t ch = charmap_from->getch(p, size_t(0));
!     if( ch == format_Z || ch == format_z)
        {
        is_zulu = true;
        break;
        }
+     p += charmap_from->stride();
      }
  
    struct cbl_timespec ts = {};
*************** __gg__formatted_current_date( cblc_field
*** 1574,1582 ****
    // Convert seconds west of UTC to minutes east of UTC
    ctm.tz_offset = -timezone/60;
  
!   char achftime[64];
    get_all_time(dest, achftime, ctm);
    ftime_replace(d, dend, format, format_end, charmap_from, achftime);
    }
  
  extern "C"
--- 1603,1612 ----
    // Convert seconds west of UTC to minutes east of UTC
    ctm.tz_offset = -timezone/60;
  
!   char achftime[256];
    get_all_time(dest, achftime, ctm);
    ftime_replace(d, dend, format, format_end, charmap_from, achftime);
+   return;
    }
  
  extern "C"
*************** __gg__formatted_date(cblc_field_t *dest,
*** 1586,1607 ****
                       size_t arg1_offset,
                       size_t arg1_size,
                 const cblc_field_t *arg2, // integer date
!                      size_t arg2_offset,
                       size_t arg2_size)
    {
    // FUNCTION FORMATTED-DATE
  
-   cbl_encoding_t from = arg1->encoding;
    cbl_encoding_t to   = dest->encoding;
!   charmap_t *charmap_from = __gg__get_charmap(from);
    charmap_t *charmap_to   = __gg__get_charmap(to);
  
!   int dest_space = charmap_to->mapped_character(ascii_space);
  
    // Establish the destination, and set it to spaces
    char *d    = PTRCAST(char, dest->data);
    const char *dend = d + dest->capacity;
!   memset(d, dest_space, dest->capacity);
  
    // Establish the formatting string:
    char *format     = PTRCAST(char, (arg1->data+arg1_offset));
--- 1616,1638 ----
                       size_t arg1_offset,
                       size_t arg1_size,
                 const cblc_field_t *arg2, // integer date
!                      size_t arg2_offset,  
                       size_t arg2_size)
    {
    // FUNCTION FORMATTED-DATE
  
    cbl_encoding_t to   = dest->encoding;
!   cbl_encoding_t from = arg1->encoding;
! 
    charmap_t *charmap_to   = __gg__get_charmap(to);
+   charmap_t *charmap_from = __gg__get_charmap(from);
  
!   cbl_char_t dest_space = charmap_to->mapped_character(ascii_space);
  
    // Establish the destination, and set it to spaces
    char *d    = PTRCAST(char, dest->data);
    const char *dend = d + dest->capacity;
!   charmap_to->memset(d, dest_space, dest->capacity);
  
    // Establish the formatting string:
    char *format     = PTRCAST(char, (arg1->data+arg1_offset));
*************** __gg__formatted_date(cblc_field_t *dest,
*** 1611,1621 ****
  
    populate_ctm_from_date(ctm, arg2, arg2_offset, arg2_size);
  
!   char achftime[64];
    get_all_time(dest, achftime, ctm);
    if( __gg__exception_code )
      {
!     memset(d, dest_space, dend-d);
      }
    else
      {
--- 1642,1652 ----
  
    populate_ctm_from_date(ctm, arg2, arg2_offset, arg2_size);
  
!   char achftime[256];
    get_all_time(dest, achftime, ctm);
    if( __gg__exception_code )
      {
!      charmap_to->memset(d, dest_space, dend-d);
      }
    else
      {
*************** __gg__formatted_datetime( cblc_field_t *
*** 1671,1677 ****
      convert_to_zulu(ctm);
      }
  
!   char achftime[64];
    get_all_time(dest, achftime, ctm);
    if( __gg__exception_code )
      {
--- 1702,1708 ----
      convert_to_zulu(ctm);
      }
  
!   char achftime[256];
    get_all_time(dest, achftime, ctm);
    if( __gg__exception_code )
      {
*************** __gg__formatted_time( cblc_field_t *dest
*** 1710,1716 ****
    // Establish the destination, and set it to spaces
    char *d          = PTRCAST(char, dest->data);
    const char *dend = d + dest->capacity;
!   memset(d, dest_space, dest->capacity);
  
    // Establish the formatting string:
    char *format     = PTRCAST(char, (par1->data+par1_o));
--- 1741,1747 ----
    // Establish the destination, and set it to spaces
    char *d          = PTRCAST(char, dest->data);
    const char *dend = d + dest->capacity;
!   charmap_to->memset(d, dest_space, dest->capacity);
  
    // Establish the formatting string:
    char *format     = PTRCAST(char, (par1->data+par1_o));
*************** __gg__formatted_time( cblc_field_t *dest
*** 1734,1744 ****
      convert_to_zulu(ctm);
      }
  
!   char achftime[64];
    get_all_time(dest, achftime, ctm);
    if( __gg__exception_code )
      {
!     memset(d, dest_space, dend-d);
      }
    else
      {
--- 1765,1775 ----
      convert_to_zulu(ctm);
      }
  
!   char achftime[256];
    get_all_time(dest, achftime, ctm);
    if( __gg__exception_code )
      {
!     charmap_to->memset(d, dest_space, dend-d);
      }
    else
      {
*************** __gg__max(cblc_field_t *dest,
*** 2066,2071 ****
--- 2097,2150 ----
      }
    }
  
+ static void
+ change_case( cblc_field_t *dest,
+        const cblc_field_t *input,
+              size_t        input_offset,
+              size_t        input_size,
+              std::wint_t (changer)( std::wint_t ch )
+              )
+   {
+   cbl_encoding_t enc_to   = dest->encoding;
+   cbl_encoding_t enc_from = input->encoding;
+   cbl_encoding_t enc_work = DEFAULT_32_ENCODING;
+ 
+   // In order to handle any input encoding, we convert to UTF32:
+   size_t converted_bytes;
+   const char *converted = __gg__iconverter(enc_from,
+                                            enc_work,
+                                            input->data+input_offset,
+                                            input_size,
+                                            &converted_bytes);
+   // Make a copy of it to prevent the static nature of iconverter from causing
+   // trouble:
+   cbl_char_t *duped = 
+           static_cast<cbl_char_t *>(__gg__memdup(converted, converted_bytes));
+   cbl_char_t *pend = duped + converted_bytes / width_of_utf32;
+ 
+   // Use the designated case changer:
+   std::transform(duped, pend, duped,
+                  [&changer](cbl_char_t c) { return changer(c); });
+ 
+   // Convert that modified string to the destination encoding:
+   converted = __gg__iconverter(enc_work,
+                                enc_to,
+                                duped,
+                                converted_bytes,
+                                &converted_bytes);
+   free(duped);
+ 
+   char *duped2 = static_cast<char *>(__gg__memdup(converted, converted_bytes));
+   __gg__field_from_string(dest,
+                           0,
+                           dest->capacity,
+                           duped2,
+                           converted_bytes);
+   free(duped2);
+   __gg__adjust_dest_size(dest, converted_bytes);
+   }
+ 
+ 
  extern "C"
  void
  __gg__lower_case( cblc_field_t *dest,
*************** __gg__lower_case( cblc_field_t *dest,
*** 2073,2099 ****
                    size_t        input_offset,
                    size_t        input_size)
    {
!   cbl_encoding_t from = input->encoding;
!   cbl_encoding_t to   = dest->encoding;
!   charmap_t *charmap_dest = __gg__get_charmap(to);
  
!   size_t dest_length = dest->capacity;
!   size_t source_length = input_size;
!   size_t length = std::min(dest_length, source_length);
!   memset( dest->data,
!           charmap_dest->mapped_character(ascii_space),
!           dest_length);
!   memcpy(dest->data, input->data+input_offset, length);
!   __gg__convert_encoding_length(PTRCAST(char, dest->data),
!                                 length,
!                                 from,
!                                 DEFAULT_SOURCE_ENCODING);
!   std::transform(dest->data, dest->data + dest_length, dest->data,
!                  [](unsigned char c) { return std::tolower(c); });
!   __gg__convert_encoding_length(PTRCAST(char, dest->data),
!                                 length,
!                                 DEFAULT_SOURCE_ENCODING,
!                                 to);
    }
  
  extern "C"
--- 2152,2168 ----
                    size_t        input_offset,
                    size_t        input_size)
    {
!   return change_case(dest, input, input_offset, input_size, std::towlower);
!   }
  
! extern "C"
! void
! __gg__upper_case( cblc_field_t *dest,
!             const cblc_field_t *input,
!                   size_t        input_offset,
!                   size_t        input_size)
!   {
!   return change_case(dest, input, input_offset, input_size, std::towupper);
    }
  
  extern "C"
*************** numval( cblc_field_t *dest,
*** 2401,2407 ****
                                     PTRCAST(char, input->data + input_offset),
                                     input_size,
                                     &nbytes);
!   const char *pend = p + input_size;
  
    int errpos = 0;
    __int128 retval = 0;
--- 2470,2476 ----
                                     PTRCAST(char, input->data + input_offset),
                                     input_size,
                                     &nbytes);
!   const char *pend = p + nbytes;
  
    int errpos = 0;
    __int128 retval = 0;
*************** numval_c( cblc_field_t *dest,
*** 2702,2708 ****
                                    &nbytes);
    char *pstart = strdup(converted);
    massert(pstart);
!   char *pend   = pstart + src_size;
    char *p      = pstart;
  
    GCOB_FP128 retval = 0;
--- 2771,2777 ----
                                    &nbytes);
    char *pstart = strdup(converted);
    massert(pstart);
!   char *pend   = pstart + nbytes;
    char *p      = pstart;
  
    GCOB_FP128 retval = 0;
*************** __gg__trim( cblc_field_t *dest,
*** 3447,3453 ****
    cbl_encoding_t from = arg1->encoding;
    cbl_encoding_t to   = dest->encoding;
    charmap_t *charmap = __gg__get_charmap(to);
!   int mapped_space = charmap->mapped_character(ascii_space);
  
    int rdigits;
    __int128 type = __gg__binary_value_from_qualified_field(&rdigits,
--- 3516,3523 ----
    cbl_encoding_t from = arg1->encoding;
    cbl_encoding_t to   = dest->encoding;
    charmap_t *charmap = __gg__get_charmap(to);
!   int stride = charmap->stride();
!   cbl_char_t mapped_space = charmap->mapped_character(ascii_space);
  
    int rdigits;
    __int128 type = __gg__binary_value_from_qualified_field(&rdigits,
*************** __gg__trim( cblc_field_t *dest,
*** 3466,3471 ****
--- 3536,3543 ----
              "be an intermediate alphanumeric\n");
      abort();
      }
+ 
+   // What is this all about?
    dest->capacity = dest->offset;
  
    // Make a copy of the input:
*************** __gg__trim( cblc_field_t *dest,
*** 3476,3502 ****
    // Convert it to the destination encoding
    __gg__convert_encoding_length(copy, arg1_size, from, to);
  
- 
    // No matter what, we want to find the leftmost non-space and the
    // rightmost non-space:
  
    char *left  = copy;
!   char *right = left + arg1_size-1;
  
    // Find left and right: the first and last non-spaces
    while( left <= right )
      {
!     if( *left != mapped_space && *right != mapped_space )
        {
        break;
        }
!     if( *left == mapped_space )
        {
!       left += 1;
        }
!     if( *right == mapped_space )
        {
!       right -= 1;
        }
      }
    if( type == LEADING )
--- 3548,3576 ----
    // Convert it to the destination encoding
    __gg__convert_encoding_length(copy, arg1_size, from, to);
  
    // No matter what, we want to find the leftmost non-space and the
    // rightmost non-space:
  
    char *left  = copy;
!   char *right = left + arg1_size-stride;
  
    // Find left and right: the first and last non-spaces
    while( left <= right )
      {
!     cbl_char_t cleft  = charmap->getch(left,  (size_t)0);
!     cbl_char_t cright = charmap->getch(right, (size_t)0);
! 
!     if( cleft != mapped_space && cright != mapped_space )
        {
        break;
        }
!     if( cleft == mapped_space )
        {
!       left += stride;
        }
!     if( cright == mapped_space )
        {
!       right -= stride;
        }
      }
    if( type == LEADING )
*************** __gg__trim( cblc_field_t *dest,
*** 3517,3540 ****
      // When the arg1 input string was empty, we want left to be right+1.
      // The left/right loop can sometimes end up with left equal to right+2.
      // That needs to be fixed:
!     left = right+1;
      }
  
!   size_t ncount = right+1 - left;
    __gg__adjust_dest_size(dest, ncount);
  
!   char *dest_left  = PTRCAST(char, dest->data);
!   char *dest_right = dest_left + dest->capacity - 1;
!   const char *dest_end   = dest_left + dest->capacity;
! 
!   while( dest_left <= dest_right && left <= right )
!     {
!     *dest_left++ = *left++;
!     }
!   while(dest_left < dest_end)
!     {
!     *dest_left++ = mapped_space;
!     }
    }
  
  #if HAVE_INITSTATE_R && HAVE_SRANDOM_R && HAVE_RANDOM_R
--- 3591,3603 ----
      // When the arg1 input string was empty, we want left to be right+1.
      // The left/right loop can sometimes end up with left equal to right+2.
      // That needs to be fixed:
!     left = right+stride;
      }
  
!   size_t ncount = right+stride - left;
    __gg__adjust_dest_size(dest, ncount);
  
!   memmove(dest->data, left, ncount);
    }
  
  #if HAVE_INITSTATE_R && HAVE_SRANDOM_R && HAVE_RANDOM_R
*************** __gg__reverse(cblc_field_t *dest,
*** 3632,3665 ****
    cbl_encoding_t from = input->encoding;
    cbl_encoding_t to   = dest->encoding;
  
!   size_t dest_length = dest->capacity;
!   size_t source_length = input_size;
!   size_t length = std::min(dest_length, source_length);
  
!   // Make a copy of the input
!   char *copy = static_cast<char *>(malloc(length));
!   massert(copy);
!   memcpy(copy, input->data+input_offset, length);
  
    // Convert the input to the destination encoding
!   __gg__convert_encoding_length(copy,
!                                 length,
!                                 from,
!                                 to);
! 
!   // Set the destination to all spaces
!   charmap_t *charmap = __gg__get_charmap(to);
!   memset(dest->data, charmap->mapped_character(ascii_space), dest_length);
!   for(size_t i=0; i<length; i++)
!     {
!     dest->data[i] = copy[source_length-1-i];
!     }
!   if( (dest->attr & intermediate_e) )
      {
!     dest->capacity = std::min(dest_length, source_length);
      }
! 
!   free(copy);
    }
  
  extern "C"
--- 3695,3723 ----
    cbl_encoding_t from = input->encoding;
    cbl_encoding_t to   = dest->encoding;
  
!   charmap_t *charmap = __gg__get_charmap(to);
!   size_t stride = charmap->stride();
  
!   size_t dest_length = dest->capacity;
  
    // Convert the input to the destination encoding
!   size_t bytes_converted;
!   const char *converted = __gg__iconverter(from,
!                                            to,
!                                            input->data+input_offset,
!                                            input_size,
!                                            &bytes_converted);
!   // copy over characters from the end of the copy to the beginning of dest:
!   size_t i_from = bytes_converted - stride;
!   size_t i_to = 0;
!   while( i_from < bytes_converted && i_to < dest_length )
      {
!     cbl_char_t ch = charmap->getch(converted, i_from);
!     charmap->putch(ch, dest->data+dest->offset, i_to);
!     i_from -= stride;
!     i_to   += stride;
      }
!   __gg__adjust_dest_size(dest, i_to);
    }
  
  extern "C"
*************** __gg__test_day_yyyyddd( cblc_field_t *de
*** 3894,3929 ****
  
  extern "C"
  void
- __gg__upper_case( cblc_field_t *dest,
-             const cblc_field_t *input,
-                   size_t        input_offset,
-                   size_t        input_size)
-   {
-   cbl_encoding_t from = input->encoding;
-   cbl_encoding_t to   = dest->encoding;
-   charmap_t *charmap_dest = __gg__get_charmap(to);
- 
-   size_t dest_length = dest->capacity;
-   size_t source_length = input_size;
-   size_t length = std::min(dest_length, source_length);
-   memset( dest->data,
-           charmap_dest->mapped_character(ascii_space),
-           dest_length);
-   memcpy(dest->data, input->data+input_offset, length);
-   __gg__convert_encoding_length(PTRCAST(char, dest->data),
-                                 length,
-                                 from,
-                                 DEFAULT_SOURCE_ENCODING);
-   std::transform(dest->data, dest->data + dest_length, dest->data,
-                  [](unsigned char c) { return std::toupper(c); });
-   __gg__convert_encoding_length(PTRCAST(char, dest->data),
-                                 length,
-                                 DEFAULT_SOURCE_ENCODING,
-                                 to);
-   }
- 
- extern "C"
- void
  __gg__variance( cblc_field_t *dest,
                  size_t        ncount)
    {
--- 3952,3957 ----
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4552,4594 ****
                size_t par2_offset,
                size_t par2_size)
    {
!   // Establish the formatting string:
!   char *format     = PTRCAST(char, (par1->data+par1_offset));
!   char *format_end = format + par1_size;
  
!   // Establish the string to be checked:
!   char *source     = PTRCAST(char, (par2->data+par2_offset));
!   char *source_end = source + par2_size;
  
!   charmap_t *charmap_format = __gg__get_charmap(par1->encoding);
!   charmap_t *charmap_checked = __gg__get_charmap(par2->encoding);
!   int checked_space = charmap_checked->mapped_character(ascii_space);
!   int source_plus  = charmap_checked->mapped_character(ascii_plus);
!   int source_minus = charmap_checked->mapped_character(ascii_minus);
!   int source_zero  = charmap_checked->mapped_character(ascii_zero);
  
!   int format_space  = charmap_format->mapped_character(ascii_space);
!   int format_T      = charmap_format->mapped_character(ascii_T      );
!   int format_colon  = charmap_format->mapped_character(ascii_colon  );
!   int format_plus   = charmap_format->mapped_character(ascii_plus   );
!   int format_minus  = charmap_format->mapped_character(ascii_minus  );
!   int format_W      = charmap_format->mapped_character(ascii_W      );
!   int format_Z      = charmap_format->mapped_character(ascii_Z      );
!   int format_z      = charmap_format->mapped_character(ascii_z      );
!   int format_s      = charmap_format->mapped_character(ascii_s      );
!   int format_m      = charmap_format->mapped_character(ascii_m      );
!   int format_h      = charmap_format->mapped_character(ascii_h      );
!   int format_w      = charmap_format->mapped_character(ascii_w      );
!   int format_Y      = charmap_format->mapped_character(ascii_Y      );
!   int format_M      = charmap_format->mapped_character(ascii_M      );
!   int format_D      = charmap_format->mapped_character(ascii_D      );
!   int format_zero   = charmap_format->mapped_character(ascii_zero   );
!   char decimal_point
!                 = charmap_format->mapped_character(__gg__get_decimal_point());
  
    // Let's eliminate trailing spaces...
!   trim_trailing_spaces(format, format_end, format_space);
!   trim_trailing_spaces(source, source_end, checked_space);
  
    bool in_offset = false;
    bool in_nanoseconds = false;
--- 4580,4611 ----
                size_t par2_offset,
                size_t par2_size)
    {
!   // It turns out to be just easier to convert the strings to ASCII space to
!   // do the conversion of par2 against the format in par1:
!   charmap_t *charmap = __gg__get_charmap(DEFAULT_SOURCE_ENCODING);
  
!   size_t bytes_converted;
!   char *par1_c = __gg__miconverter(par1->encoding,
!                                            DEFAULT_SOURCE_ENCODING,
!                                            par1->data+par1_offset,
!                                            par1_size,
!                                            &bytes_converted);
!   char *format = par1_c;
!   char *format_end = format + bytes_converted;
  
!   char *par2_c = __gg__miconverter(par2->encoding,
!                                            DEFAULT_SOURCE_ENCODING,
!                                            par2->data+par2_offset,
!                                            par2_size,
!                                            &bytes_converted);
!   char *source = par2_c;
!   char *source_end = source + bytes_converted;
  
!   char decimal_point = __gg__get_decimal_point();
  
    // Let's eliminate trailing spaces...
!   trim_trailing_spaces(format, format_end, ascii_space);
!   trim_trailing_spaces(source, source_end, ascii_space);
  
    bool in_offset = false;
    bool in_nanoseconds = false;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4605,4614 ****
      {
      unsigned char ch = *format;
  
!     if(    ch == format_T
!            || ch == format_colon
!            || ch == format_minus
!            || ch == format_W)
        {
        // These are just formatting characters.  They need to be duplicated,
        // but are otherwise ignored.
--- 4622,4631 ----
      {
      unsigned char ch = *format;
  
!     if(    ch == ascii_T
!            || ch == ascii_colon
!            || ch == ascii_minus
!            || ch == ascii_W)
        {
        // These are just formatting characters.  They need to be duplicated,
        // but are otherwise ignored.
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4620,4653 ****
        goto proceed;
        }
  
!     if( ch == format_plus )
        {
        // This flags a following hhmm offset.  It needs to match a '+' or '-'
!       if(    (unsigned char)*source != source_plus
!           && (unsigned char)*source != source_minus
!           && (unsigned char)*source != source_zero)
          {
          break;
          }
!       if( (unsigned char)*source == format_zero )
          {
          // The next four characters have to be zeroes
!         if( (unsigned char)source[1] != format_zero )
            {
            retval += 1;
            break;
            }
!         if( (unsigned char)source[2] != format_zero )
            {
            retval += 2;
            break;
            }
!         if( (unsigned char)source[3] != format_zero )
            {
            retval += 3;
            break;
            }
!         if( (unsigned char)source[4] != format_zero )
            {
            retval += 4;
            break;
--- 4637,4670 ----
        goto proceed;
        }
  
!     if( ch == ascii_plus )
        {
        // This flags a following hhmm offset.  It needs to match a '+' or '-'
!       if(    (unsigned char)*source != ascii_plus
!           && (unsigned char)*source != ascii_minus
!           && (unsigned char)*source != ascii_zero)
          {
          break;
          }
!       if( (unsigned char)*source == ascii_zero )
          {
          // The next four characters have to be zeroes
!         if( (unsigned char)source[1] != ascii_zero )
            {
            retval += 1;
            break;
            }
!         if( (unsigned char)source[2] != ascii_zero )
            {
            retval += 2;
            break;
            }
!         if( (unsigned char)source[3] != ascii_zero )
            {
            retval += 3;
            break;
            }
!         if( (unsigned char)source[4] != ascii_zero )
            {
            retval += 4;
            break;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4671,4679 ****
        goto proceed;
        }
  
!     if( ch == format_Y )
        {
!       errpos = gets_year(source, source_end, charmap_checked, ctm);
        if( errpos > 0 )
          {
          retval += errpos - 1;
--- 4688,4696 ----
        goto proceed;
        }
  
!     if( ch == ascii_Y )
        {
!       errpos = gets_year(source, source_end, charmap, ctm);
        if( errpos > 0 )
          {
          retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4683,4691 ****
        goto proceed;
        }
  
!     if( ch == format_M )
        {
!       errpos = gets_month(source, source_end, charmap_checked, ctm);
        if( errpos > 0 )
          {
          retval += errpos - 1;
--- 4700,4708 ----
        goto proceed;
        }
  
!     if( ch == ascii_M )
        {
!       errpos = gets_month(source, source_end, charmap, ctm);
        if( errpos > 0 )
          {
          retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4695,4707 ****
        goto proceed;
        }
  
!     if( ch == format_D )
        {
        // We have three possibilities: DDD, DD, and D
!       if( (unsigned char)format[1] != format_D )
          {
          // A singleton 'D' is a day-of-week
!         errpos = gets_day_of_week(source, source_end, charmap_checked, ctm);
          if( errpos > 0)
            {
            retval += errpos - 1;
--- 4712,4724 ----
        goto proceed;
        }
  
!     if( ch == ascii_D )
        {
        // We have three possibilities: DDD, DD, and D
!       if( (unsigned char)format[1] != ascii_D )
          {
          // A singleton 'D' is a day-of-week
!         errpos = gets_day_of_week(source, source_end, charmap, ctm);
          if( errpos > 0)
            {
            retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4709,4718 ****
            }
          bump = 1;
          }
!       else if( (unsigned char)format[2] != format_D )
          {
          // This is DD, for day-of-month
!         errpos = gets_day(source, source_end, charmap_checked, ctm);
          if( errpos > 0)
            {
            retval += errpos - 1;
--- 4726,4735 ----
            }
          bump = 1;
          }
!       else if( (unsigned char)format[2] != ascii_D )
          {
          // This is DD, for day-of-month
!         errpos = gets_day(source, source_end, charmap, ctm);
          if( errpos > 0)
            {
            retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4724,4730 ****
          {
          // Arriving here means that it is DDD, for day-of-year
          // This is DD, for day-of-month
!         errpos = gets_day_of_year(source, source_end, charmap_checked, ctm);
          if( errpos > 0)
            {
            retval += errpos - 1;
--- 4741,4747 ----
          {
          // Arriving here means that it is DDD, for day-of-year
          // This is DD, for day-of-month
!         errpos = gets_day_of_year(source, source_end, charmap, ctm);
          if( errpos > 0)
            {
            retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4735,4743 ****
        goto proceed;
        }
  
!     if( ch == format_w )
        {
!       errpos = gets_week(source, source_end, charmap_checked, ctm);
        if( errpos > 0 )
          {
          retval += errpos - 1;
--- 4752,4760 ----
        goto proceed;
        }
  
!     if( ch == ascii_w )
        {
!       errpos = gets_week(source, source_end, charmap, ctm);
        if( errpos > 0 )
          {
          retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4747,4755 ****
        goto proceed;
        }
  
!     if( ch == format_h )
        {
!       errpos = gets_hours(source, source_end, charmap_checked, ctm, in_offset);
        if( errpos > 0 )
          {
          retval += errpos - 1;
--- 4764,4772 ----
        goto proceed;
        }
  
!     if( ch == ascii_h )
        {
!       errpos = gets_hours(source, source_end, charmap, ctm, in_offset);
        if( errpos > 0 )
          {
          retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4759,4767 ****
        goto proceed;
        }
  
!     if( ch == format_m )
        {
!       errpos = gets_minutes(source, source_end, charmap_checked, ctm, in_offset);
        if( errpos > 0 )
          {
          retval += errpos - 1;
--- 4776,4784 ----
        goto proceed;
        }
  
!     if( ch == ascii_m )
        {
!       errpos = gets_minutes(source, source_end, charmap, ctm, in_offset);
        if( errpos > 0 )
          {
          retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4771,4779 ****
        goto proceed;
        }
  
!     if( ch == format_s && !in_nanoseconds )
        {
!       errpos = gets_seconds(source, source_end, charmap_checked, ctm);
        if( errpos > 0 )
          {
          retval += errpos - 1;
--- 4788,4796 ----
        goto proceed;
        }
  
!     if( ch == ascii_s && !in_nanoseconds )
        {
!       errpos = gets_seconds(source, source_end, charmap, ctm);
        if( errpos > 0 )
          {
          retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4783,4789 ****
        goto proceed;
        }
  
!     if( ch == format_s && in_nanoseconds )
        {
        // Peel off digits to the right of the decimal point one at a time
        errpos = gets_nanoseconds(format,
--- 4800,4806 ----
        goto proceed;
        }
  
!     if( ch == ascii_s && in_nanoseconds )
        {
        // Peel off digits to the right of the decimal point one at a time
        errpos = gets_nanoseconds(format,
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4791,4798 ****
                                  source,
                                  source_end,
                                  ctm,
!                                 charmap_format,
!                                 charmap_checked);
        if( errpos > 0 )
          {
          retval += errpos - 1;
--- 4808,4815 ----
                                  source,
                                  source_end,
                                  ctm,
!                                 charmap,
!                                 charmap);
        if( errpos > 0 )
          {
          retval += errpos - 1;
*************** fill_cobol_tm(cobol_tm &ctm,
*** 4802,4812 ****
        goto proceed;
        }
  
!     if( ch == format_Z || ch == format_z )
        {
        // This has to be the end of the road
!       if(    (unsigned char)source[0] != format_Z
!           && (unsigned char)source[0] != format_z )
          {
          retval += 0;
          break;
--- 4819,4829 ----
        goto proceed;
        }
  
!     if( ch == ascii_Z || ch == ascii_z )
        {
        // This has to be the end of the road
!       if(    (unsigned char)source[0] != ascii_Z
!           && (unsigned char)source[0] != ascii_z )
          {
          retval += 0;
          break;
*************** proceed:
*** 4829,4837 ****
      {
      // This means we processed the entire format string without seeing an error
      retval = 0;
- 
      // Otherwise, either the format or source was too short
      }
    return retval;
    }
  
--- 4846,4855 ----
      {
      // This means we processed the entire format string without seeing an error
      retval = 0;
      // Otherwise, either the format or source was too short
      }
+   free(par1_c);
+   free(par2_c);
    return retval;
    }
  
*************** __gg__seconds_from_formatted_time(cblc_f
*** 4914,4920 ****
      }
    else
      {
!     retval = (double)(ctm.hh * 3600 + ctm.mm * 60 + ctm.ss) + ctm.nanoseconds/1000000000.;
      }
    __gg__double_to_target( dest,
                            retval,
--- 4932,4939 ----
      }
    else
      {
!     retval = (double)(ctm.hh * 3600 + ctm.mm * 60 + ctm.ss)
!                       + ctm.nanoseconds/1000000000.;
      }
    __gg__double_to_target( dest,
                            retval,
*************** __gg__hex_of(cblc_field_t *dest,
*** 4928,4943 ****
               size_t field_offset,
               size_t field_size)
    {
!   charmap_t *charmap = __gg__get_charmap(dest->encoding);
    static const char hex[17] = "0123456789ABCDEF";
!   size_t bytes = field_size;
!   __gg__adjust_dest_size(dest, 2*bytes);
!   for(size_t i=0; i<bytes; i++)
      {
      unsigned char byte = (field->data+field_offset)[i];
!     dest->data[2*i  ] = charmap->mapped_character(hex[byte>>4]);
!     dest->data[2*i+1] = charmap->mapped_character(hex[byte&0xF]);
      }
    }
  
  extern "C"
--- 4947,4980 ----
               size_t field_offset,
               size_t field_size)
    {
!   // We are going to build the hex string up here, in ascii, and convert to the
!   // the destination encoding at the end.
! 
    static const char hex[17] = "0123456789ABCDEF";
! 
!   // Dest size is two hex characters per input byte.
!   size_t build_size = 2 * field_size;
! 
!   // Build up the hex string in ascii:
!   char *build = static_cast<char *>(malloc(build_size));
!   massert(build);
!   for(size_t i=0; i<field_size; i++)
      {
      unsigned char byte = (field->data+field_offset)[i];
!     build[2*i  ] = hex[byte>>4];
!     build[2*i+1] = hex[byte&0xF];
      }
+   // Convert the hex string to the destination encoding:
+   size_t converted_bytes;
+   const char *converted = __gg__iconverter(DEFAULT_SOURCE_ENCODING,
+                                            dest->encoding,
+                                            build,
+                                            build_size,
+                                            &converted_bytes);
+   // And put it into place:
+   __gg__adjust_dest_size(dest, converted_bytes);
+   memcpy(dest->data, converted, converted_bytes);
+   free(build);
    }
  
  extern "C"
*************** __gg__numval_f( cblc_field_t *dest,
*** 5249,5259 ****
                                    &nbytes);
    GCOB_FP128 value = 0;
    const char *data     = converted;
!   const char *data_end = data + source_size;
  
    int error = floating_format_tester( data,
                                        data_end);
!   if( error || source_size >= 256 )
      {
      exception_raise(ec_argument_function_e);
      }
--- 5286,5296 ----
                                    &nbytes);
    GCOB_FP128 value = 0;
    const char *data     = converted;
!   const char *data_end = data + nbytes;
  
    int error = floating_format_tester( data,
                                        data_end);
!   if( error || nbytes >= 256 )
      {
      exception_raise(ec_argument_function_e);
      }
*************** __gg__test_numval_f(cblc_field_t *dest,
*** 5296,5302 ****
                                    &nbytes);
  
    const char *data     = converted;
!   const char *data_end = data + source_size;
    int error = floating_format_tester( data,
                                        data_end);
    __gg__int128_to_field(dest,
--- 5333,5339 ----
                                    &nbytes);
  
    const char *data     = converted;
!   const char *data_end = data + nbytes;
    int error = floating_format_tester( data,
                                        data_end);
    __gg__int128_to_field(dest,
*************** __gg__locale_date(cblc_field_t *dest,
*** 5711,5721 ****
      strcpy(ach, nl_langinfo(D_FMT));
      strftime(ach, sizeof(ach), nl_langinfo(D_FMT), &tm);
      }
!   __gg__convert_encoding(ach,
!                          DEFAULT_SOURCE_ENCODING,
!                          dest->encoding);
!   memcpy(dest->data, ach, strlen(ach));
!   __gg__adjust_dest_size(dest, strlen(ach));
    }
  
  extern "C"
--- 5748,5762 ----
      strcpy(ach, nl_langinfo(D_FMT));
      strftime(ach, sizeof(ach), nl_langinfo(D_FMT), &tm);
      }
!   size_t bytes_converted;
!   char *converted = __gg__miconverter(__gg__console_encoding,
!                                       dest->encoding,
!                                       ach,
!                                       strlen(ach),
!                                       &bytes_converted);
!   __gg__field_from_string(dest, 0, dest->capacity, converted, bytes_converted);
!   __gg__adjust_dest_size(dest, bytes_converted);
!   free(converted);
    }
  
  extern "C"
*************** __gg__locale_time(cblc_field_t *dest,
*** 5749,5759 ****
      strftime(ach, sizeof(ach), nl_langinfo(T_FMT), &tm);
      }
  
!   __gg__convert_encoding(ach,
!                          DEFAULT_SOURCE_ENCODING,
!                          dest->encoding);
!   memcpy(dest->data, ach, strlen(ach));
!   __gg__adjust_dest_size(dest, strlen(ach));
    }
  
  extern "C"
--- 5790,5804 ----
      strftime(ach, sizeof(ach), nl_langinfo(T_FMT), &tm);
      }
  
!   size_t bytes_converted;
!   char *converted = __gg__miconverter(__gg__console_encoding,
!                                       dest->encoding,
!                                       ach,
!                                       strlen(ach),
!                                       &bytes_converted);
!   __gg__field_from_string(dest, 0, dest->capacity, converted, bytes_converted);
!   __gg__adjust_dest_size(dest, bytes_converted);
!   free(converted);
    }
  
  extern "C"
*************** __gg__locale_time_from_seconds( cblc_fie
*** 5788,5797 ****
      tm.tm_sec    = seconds % 100;
      strftime(ach, sizeof(ach), nl_langinfo(T_FMT), &tm);
      }
! 
!   __gg__convert_encoding(ach,
!                          DEFAULT_SOURCE_ENCODING,
!                          dest->encoding);
!   memcpy(dest->data, ach, strlen(ach));
!   __gg__adjust_dest_size(dest, strlen(ach));
    }
--- 5833,5845 ----
      tm.tm_sec    = seconds % 100;
      strftime(ach, sizeof(ach), nl_langinfo(T_FMT), &tm);
      }
!   size_t bytes_converted;
!   char *converted = __gg__miconverter(__gg__console_encoding,
!                                       dest->encoding,
!                                       ach,
!                                       strlen(ach),
!                                       &bytes_converted);
!   __gg__field_from_string(dest, 0, dest->capacity, converted, bytes_converted);
!   __gg__adjust_dest_size(dest, bytes_converted);
!   free(converted);
    }
diff -Nrcpad gcc-16-20260111/libgcobol/libgcobol.cc gcc-16-20260118/libgcobol/libgcobol.cc
*** gcc-16-20260111/libgcobol/libgcobol.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/libgcobol.cc	Sun Jan 18 22:32:15 2026
***************
*** 38,43 ****
--- 38,44 ----
  #include <string>
  #include <unordered_map>
  #include <vector>
+ #include <cwctype>
  
  #include <dirent.h>
  #include <dlfcn.h>
***************
*** 75,80 ****
--- 76,95 ----
  #include "exceptl.h"
  #include "stringbin.h"
  
+ #define NO_RDIGITS (0)
+ 
+ // Forward reference:
+ extern "C"
+ int
+ __gg__move( cblc_field_t        *fdest,
+             size_t               dest_offset,
+             size_t               dest_size,
+             cblc_field_t        *fsource,
+             size_t               source_offset,
+             size_t               source_size,
+             int                  source_flags,
+             cbl_round_t          rounded );
+ 
  
  /* BSD extension.  */
  #if !defined(LOG_PERROR)
*************** int         __gg__rdigits
*** 140,146 ****
  int         __gg__nop                         = 0    ;
  int         __gg__main_called                 = 0    ;
  void       *__gg__entry_label                 = NULL ;
- cbl_encoding_t __gg__console_encoding         = no_encoding_e    ;
  
  // During SORT operations, we don't want the end-of-file condition, which
  // happens as a matter of course, from setting the EOF exception condition.
--- 155,160 ----
*************** void       *__gg__entry_location = NULL;
*** 234,239 ****
--- 248,256 ----
  // nested PERFORM PROC statements.
  void       *__gg__exit_address = NULL;
  
+ // This is the encoding used for sorting tables and files
+ static cbl_encoding_t encoding_for_sort;
+ 
  /*
   * ec_status_t represents the runtime exception condition status for
   * any statement.  There are 4 states:
*************** struct program_state
*** 466,471 ****
--- 483,490 ----
    cbl_encoding_t rt_display_encoding;
    cbl_encoding_t rt_national_encoding;
    char *rt_program_name;
+   cbl_char_t rt_working_init;
+   cbl_char_t rt_local_init;
  
    program_state() : rt_currency_signs(256)
      {
*************** struct program_state
*** 483,488 ****
--- 502,509 ----
      rt_quote_character      = ascii_dquote  ;    // Change this with APOST
      rt_low_value_character  = DEGENERATE_LOW_VALUE ;
      rt_high_value_character = DEGENERATE_HIGH_VALUE ;
+     rt_working_init         = NOT_A_CHARACTER       ;
+     rt_local_init           = NOT_A_CHARACTER       ;
  
      // Set all the currency_sign pointers to NULL:
  
*************** struct program_state
*** 507,512 ****
--- 528,535 ----
      rt_national_encoding    = ps.rt_national_encoding     ;
      rt_collation            = ps.rt_collation             ;
      rt_program_name         = ps.rt_program_name          ;
+     rt_working_init         = ps.rt_working_init          ;
+     rt_local_init           = ps.rt_local_init            ;
      }
    };
  
*************** __gg__pop_program_state()
*** 675,716 ****
    __gg__display_encoding     = program_states.back().rt_display_encoding     ;
    __gg__national_encoding    = program_states.back().rt_national_encoding    ;
    __gg__currency_signs       = program_states.back().rt_currency_signs       ;
    }
  
  static
! int
! cstrncmp(   char const * const left_,
!             char const * const right_,
!             size_t count)
    {
!   const char *left  = left_;
!   const char *right = right_;
!   // This is the version of strncmp() that uses the current collation
  
!   // It also is designed to handle strings with embedded NUL characters, so
!   // it treats NULs like any other characters.
!   int retval = 0;
!   while( count-- )
      {
!     unsigned char chl = *left++;
!     unsigned char chr = *right++;
!     retval = chl - chr;
!     if( retval )
        {
        break;
        }
      }
    return retval;
    }
  
  extern "C"
! void
! __gg__decimal_point_is_comma()
    {
!   program_states.back().rt_decimal_point      = ascii_comma ;
!   program_states.back().rt_decimal_separator  = ascii_period ;
!   __gg__decimal_point     = ascii_comma ;
!   __gg__decimal_separator = ascii_period ;
    }
  
  extern "C"
--- 698,1163 ----
    __gg__display_encoding     = program_states.back().rt_display_encoding     ;
    __gg__national_encoding    = program_states.back().rt_national_encoding    ;
    __gg__currency_signs       = program_states.back().rt_currency_signs       ;
+   __gg__working_init         = program_states.back().rt_working_init         ;
+   __gg__local_init           = program_states.back().rt_local_init           ;
+ 
+   }
+ 
+ extern "C"
+ void
+ __gg__decimal_point_is_comma()
+   {
+   program_states.back().rt_decimal_point      = ascii_comma ;
+   program_states.back().rt_decimal_separator  = ascii_period ;
+   __gg__decimal_point     = ascii_comma ;
+   __gg__decimal_separator = ascii_period ;
+   }
+ 
+ static __int128
+ edited_to_binary( const cblc_field_t *field,
+                   char *ps_,
+                   int length,
+                   int *rdigits)
+   {
+   charmap_t *charmap = __gg__get_charmap(field->encoding);
+ 
+   const unsigned char *ps = const_cast<const unsigned char *>(PTRCAST(unsigned char, ps_));
+   // This routine is used for converting NumericEdited strings to
+   // binary.
+ 
+   // Numeric edited strings can have all kinds of crap in them: spaces,
+   // slashes, dollar signs...you name it.  It might have a minus sign at
+   // the beginning or end, or it might have CR or DB at the end.
+ 
+   // We are going to look for a minus sign, D (or d) and use that to flag the
+   // result as negative.  We are going to look for a decimal point and count up
+   // the numerical digits to the right of it.  And we are going to pretend
+   // that nothing else matters.
+ 
+   int hyphen = 0;
+   *rdigits = 0;
+ 
+   // index into the ps string
+   int index = 0;
+ 
+   // Create a delta_r for counting digits to the right of
+   // any decimal point.  If and when we encounter a decimal point,
+   // we'll set this to one, otherwise it'll stay zero.
+   int delta_r = 0;
+ 
+   __int128 result = 0;
+ 
+   // We need to check the last two characters.  If CR or DB, then the result
+   // is negative:
+   if( length >= 2)
+     {
+     if(         ((ps[length-2]&0xFF) == charmap->mapped_character(ascii_D)
+               || (ps[length-2]&0xFF) == charmap->mapped_character(ascii_d))
+             &&  ((ps[length-1]&0xFF) == charmap->mapped_character(ascii_B)
+               || (ps[length-1]&0xFF) == charmap->mapped_character(ascii_b)) )
+       {
+       hyphen = 1;
+       }
+     else if(    ((ps[length-2]&0xFF) == charmap->mapped_character(ascii_C)
+               || (ps[length-2]&0xFF) == charmap->mapped_character(ascii_c))
+             &&  ((ps[length-1]&0xFF) == charmap->mapped_character(ascii_R)
+               || (ps[length-1]&0xFF) == charmap->mapped_character(ascii_r)) )
+       {
+       hyphen = 1;
+       }
+     }
+ 
+   while( index < length )
+     {
+     unsigned char ch = ps[index++] & 0xFF;
+     if( ch == charmap->mapped_character(__gg__decimal_point) )
+       {
+       delta_r = 1;
+       continue;
+       }
+     if( ch == charmap->mapped_character(ascii_minus)  )
+       {
+       hyphen = 1;
+       continue;
+       }
+ 
+     if(  charmap->mapped_character(ascii_0) <= ch
+       && ch <= charmap->mapped_character(ascii_9) )
+       {
+       result *= 10;
+       // In both EBCDIC and ASCII, this works:
+       result += ch & 0x0F ;
+       *rdigits += delta_r ;
+       continue;
+       }
+     }
+ 
+   if( hyphen )
+     {
+     result = -result;
+     }
+   return result;
    }
  
  static
! __int128
! big_endian_to_binary_signed(
!   const unsigned char *psource,
!   int   capacity
! )
    {
!   // This subroutine takes a big-endian value of "capacity" bytes and
!   // converts it to a signed INT128.  The highest order bit of the big-endian
!   // value determines whether or not the highest-order bits of the INT128
!   // return value are off or on.
  
!   __int128 retval;
!   if( *psource >= 128 )
      {
!     retval = -1;
!     }
!   else
!     {
!     retval = 0;
!     }
! 
!   // move the bytes of psource into retval, flipping them end-to-end
!   unsigned char *dest = PTRCAST(unsigned char, &retval);
!   while(capacity > 0)
!     {
!     *dest++ = psource[--capacity];
!     }
!   return retval;
!   }
! 
! static
! __int128
! little_endian_to_binary_signed(
!   const unsigned char *psource,
!   int capacity
! )
!   {
!   // This subroutine takes a little-endian value of "capacity" bytes and
!   // converts it to a signed INT128.  The highest order bit of the little-endian
!   // value determines whether or not the highest-order bits of the INT128
!   // return value are off or on.
! 
!   __int128 result;
! 
!   // Set all the bits of the result based on the sign of the source:
!   if( psource[capacity-1] >= 128 )
!     {
!     result = -1;
!     }
!   else
!     {
!     result = 0;
!     }
! 
!   // Copy the low-order bytes into place:
!   memcpy(&result, psource, capacity);
!   return result;
!   }
! 
! static
! __int128
! little_endian_to_binary_unsigned(
!   const unsigned char *psource,
!   int capacity
! )
!   {
!   __int128 result = 0;
! 
!   // Copy the low-order bytes into place:
!   memcpy(&result, psource, capacity);
!   return result;
!   }
! 
! static
! __int128
! big_endian_to_binary_unsigned(
!   const unsigned char *psource,
!   int   capacity
! )
!   {
!   // This subroutine takes an unsigned big-endian value of "capacity" bytes and
!   // converts it to an INT128.
! 
!   __int128 retval = 0 ;
! 
!   // move the bytes of psource into retval, flipping them end-to-end
!   unsigned char *dest = PTRCAST(unsigned char, &retval);
!   while(capacity > 0)
!     {
!     *dest++ = psource[--capacity];
!     }
!   return retval;
!   }
! 
! static
! __int128
! get_binary_value_local(  int                 *rdigits,
!                          const cblc_field_t  *resolved_var,
!                          unsigned char       *resolved_location,
!                          size_t               resolved_length)
!   {
!   __int128 retval = 0;
! 
!   switch( resolved_var->type )
!     {
!     case FldLiteralA :
!       fprintf(stderr, "%s(): is trying to handle a FldLiteralA\n", __func__);
!       abort();
!       break;
! 
!     case FldGroup :
!     case FldAlphanumeric :
!       // Read the data area as a dirty string:
!       retval = __gg__dirty_to_binary(
!                         PTRCAST(const char, resolved_location),
!                         resolved_var->encoding,
!                         resolved_length,
!                         rdigits );
!       break;
! 
!     case FldNumericDisplay:
        {
+       *rdigits = resolved_var->rdigits;
+       if( resolved_location[resolved_length-1] == DEGENERATE_HIGH_VALUE )
+         {
+         // This is a degenerate case, which violates the language
+         // specification, but nonetheless seems to be a thing.  By
+         // default, HIGH-VALUE is usually assumed to be 0xFF.  This is
+         // not necessarily true; HIGH-VALUE can be changed by the
+         // SPECIAL-NAMES ALPHABET clause.  Furthermore, by definition,
+         // HIGH-VALUE applies *only* to text literals.  However, there
+         // seems to be code out in the universe that wants to be able
+         // to compare NumericDisplay values that have been set to
+         // HIGH-VALUE.  Consider, for example, code that reads from
+         // a disk file which sets the input field to HIGH-VALUE upon
+         // an end-of-file condition.
+ 
+         // This code detects that particular condition, and sets the
+         // resulting binary number to the maximum possible positive
+         // value.
+ 
+         // Turn all the bits on
+         memset( &retval, 0xFF, sizeof(retval) );
+ 
+         // Make it positive by turning off the highest order bit:
+         (PTRCAST(unsigned char, &retval))[sizeof(retval)-1] = 0x3F;
+         }
+       else
+         {
+         const charmap_t *charmap = __gg__get_charmap(resolved_var->encoding);
+         int stride = charmap->stride();
+         unsigned char *digits;
+         unsigned char *sign_byte_location;
+         int ndigits;
+         if( resolved_var->attr & signable_e )
+           {
+           // Pick up the sign byte, and force our value to be positive
+           if(   (resolved_var->attr  & separate_e )
+              && (resolved_var->attr  & leading_e  ) )
+             {
+             // LEADING SEPARATE
+             digits             = resolved_location+stride;
+             sign_byte_location = resolved_location;
+             ndigits = resolved_length - stride;
+             }
+           else if(    (resolved_var->attr & separate_e)
+                   && !(resolved_var->attr & leading_e ) )
+             {
+             // TRAILING SEPARATE
+             digits             = resolved_location;
+             sign_byte_location = resolved_location + resolved_length - stride;
+             ndigits = resolved_length - stride;
+             }
+           else if( (resolved_var->attr & leading_e) )
+             {
+             // LEADING
+             digits             = resolved_location;
+             sign_byte_location = resolved_location;
+             ndigits = resolved_length;
+             }
+           else // if( !(resolved_var->attr & leading_e) )
+             {
+             // TRAILING
+             digits             = resolved_location;
+             sign_byte_location = resolved_location + resolved_length - stride;
+             ndigits = resolved_length;
+             }
+           }
+         else
+           {
+           digits             = resolved_location;
+           sign_byte_location = resolved_location;
+           ndigits = resolved_length;
+           }
+         ndigits /= stride;
+         retval = __gg__numeric_display_to_binary(sign_byte_location,
+                                                  digits,
+                                                  ndigits,
+                                                  resolved_var->encoding);
+         }
+       break;
+       }
+ 
+     case FldNumericEdited :
+       retval = edited_to_binary(resolved_var,
+                                 PTRCAST(char, resolved_location),
+                                 resolved_length,
+                                 rdigits);
+       break;
+ 
+     case FldNumericBinary :
+       if( resolved_var->attr & signable_e)
+         {
+         retval = big_endian_to_binary_signed(
+                         PTRCAST(const unsigned char, resolved_location),
+                         resolved_length);
+         }
+       else
+         {
+         retval = big_endian_to_binary_unsigned(
+                         PTRCAST(const unsigned char, resolved_location),
+                         resolved_length);
+         }
+       *rdigits = resolved_var->rdigits;
+       break;
+ 
+     case FldLiteralN:
+       {
+       if( resolved_var->attr & signable_e)
+         {
+         retval = little_endian_to_binary_signed(resolved_var->data,
+                                                 resolved_var->capacity);
+         }
+       else
+         {
+         retval = little_endian_to_binary_unsigned(resolved_var->data,
+                                                   resolved_var->capacity);
+         }
+       *rdigits = resolved_var->rdigits;
+       break;
+       }
+ 
+     case FldNumericBin5:
+     case FldIndex:
+     case FldPointer:
+       if( resolved_var->attr & signable_e)
+         {
+         retval = little_endian_to_binary_signed(
+                       PTRCAST(const unsigned char, resolved_location),
+                       resolved_length);
+         }
+       else
+         {
+         retval = little_endian_to_binary_unsigned(
+                       PTRCAST(const unsigned char, resolved_location),
+                       resolved_length);
+         }
+       *rdigits = resolved_var->rdigits;
+       break;
+ 
+     case FldPacked:
+       {
+       *rdigits = resolved_var->rdigits;
+       retval = __gg__packed_to_binary(resolved_location,
+                                       resolved_length);
        break;
        }
      }
+ 
+   if( resolved_var->attr & scaled_e )
+     {
+     // Here's where we handle a P-scaled number.
+ 
+     if( resolved_var->rdigits >= 0)
+       {
+       // We might be dealing with a source with a PICTURE string of
+       // PPPPPP999, which means retval is a three-digit number
+       // and resolved_var->rdigits is +6.  That means we need to divide retval
+       // by 10**9, and we need to make rdigits 9
+       *rdigits = resolved_var->digits + resolved_var->rdigits;
+       }
+     else
+       {
+       // We have a source with a PIC string like 999PPPPPP, which is
+       // a capacity of 3 and a resolved_var->rdigits of -6.  We need to multiply
+       // retval by +6, and make rdigits zero:
+       retval *= __gg__power_of_ten( -resolved_var->rdigits );
+       *rdigits = 0;
+       }
+     }
+ 
+   return retval;
+   }
+ 
+ static uint32_t
+ get_init_value(cblc_field_t *field)
+   {
+   uint32_t retval = 0;
+   cbl_figconst_t figconst = (cbl_figconst_t)(field->attr & FIGCONST_MASK);
+   if( figconst )
+     {
+     switch(figconst)
+       {
+       case normal_value_e :
+         // This is not possible, it says here in the fine print.
+         abort();
+         break;
+       case low_value_e    :
+         retval = __gg__low_value_character;
+         break;
+       case zero_value_e   :
+         retval = ascii_zero;
+         break;
+       case space_value_e  :
+         retval = ascii_space;
+         break;
+       case quote_value_e  :
+         retval = __gg__quote_character;
+         break;
+       case high_value_e   :
+         retval = __gg__high_value_character;
+         break;
+       case null_value_e:
+         retval = 0x00;
+         break;
+       }
+     }
+   else
+     {
+     int rdigits;
+     retval = get_binary_value_local(&rdigits,
+                                     field,
+                                     field->data,
+                                     field->capacity
+                                     );
+     }
    return retval;
    }
  
  extern "C"
! void __gg__initialization_values( uint32_t wsclear,
!                                   cblc_field_t *working_init,
!                                   cblc_field_t *local_init)
    {
!   __gg__wsclear = wsclear;
!   __gg__working_init = NOT_A_CHARACTER;
!   __gg__local_init   = NOT_A_CHARACTER;
! 
!   if( working_init )
!     {
!     __gg__working_init = get_init_value(working_init);
!     }
!   if( local_init )
!     {
!     __gg__local_init = get_init_value(local_init);
!     }
!   program_states.back().rt_working_init = __gg__working_init;
!   program_states.back().rt_local_init   = __gg__local_init;
    }
  
  extern "C"
*************** int128_to_field(cblc_field_t   *var,
*** 1473,1526 ****
            {
            case FldGroup:
            case FldAlphanumeric:
              // This is sort of a Hail Mary play.  We aren't supposed to do this
              // conversion if rdigits is non-zero.  But we shouldn't have gotten
!             // here if rdigits is non-zero.  So, we'll just go with the flow.
  
              // Note that sending a signed value to an alphanumeric strips off
              // any plus or minus signs.
              memset(location, 0, length);
              size_error = __gg__binary_to_string_encoded(
                                             PTRCAST(char, location),
                                             length > MAX_FIXED_POINT_DIGITS
                                                      ? MAX_FIXED_POINT_DIGITS
!                                                     : length,
                                             value,
                                             var->encoding);
              break;
  
            case FldNumericDisplay:
              if( var->attr & signable_e )
                {
                charmap_t *charmap = __gg__get_charmap(var->encoding);
  
                // Things get exciting when a numeric-display value is signable
  
                if( var->attr & separate_e )
                  {
                  // Whether positive or negative, a sign there will be:
!                 char sign_ch = is_negative ?
                                  charmap->mapped_character(ascii_minus)
                                : charmap->mapped_character(ascii_plus)  ;
                  if( var->attr & leading_e )
                    {
                    // The sign character goes into the first location
                    size_error =
!                     __gg__binary_to_string_encoded(PTRCAST(char, location+1),
!                                                     length-1,
!                                                     value,
!                                                     var->encoding);
!                   location[0] = sign_ch;
                    }
                  else
                    {
                    // The sign character goes into the last location
                    size_error =
                      __gg__binary_to_string_encoded(PTRCAST(char, location),
!                                                     length-1,
                                                      value,
                                                      var->encoding);
!                   location[length-1] = sign_ch;
                    }
                  }
                else
--- 1920,1980 ----
            {
            case FldGroup:
            case FldAlphanumeric:
+             {
              // This is sort of a Hail Mary play.  We aren't supposed to do this
              // conversion if rdigits is non-zero.  But we shouldn't have gotten
!             // here if rdigits is non-zero.  But we're here, so we'll do the
!             // best we can in case somebody came up with a dialect that allows
!             // the attempt.
  
              // Note that sending a signed value to an alphanumeric strips off
              // any plus or minus signs.
              memset(location, 0, length);
+             const charmap_t *charmap = __gg__get_charmap(var->encoding);
              size_error = __gg__binary_to_string_encoded(
                                             PTRCAST(char, location),
                                             length > MAX_FIXED_POINT_DIGITS
                                                      ? MAX_FIXED_POINT_DIGITS
!                                                     : length/charmap->stride(),
                                             value,
                                             var->encoding);
              break;
+             }
  
            case FldNumericDisplay:
              if( var->attr & signable_e )
                {
                charmap_t *charmap = __gg__get_charmap(var->encoding);
+               int stride = charmap->stride();
  
                // Things get exciting when a numeric-display value is signable
  
                if( var->attr & separate_e )
                  {
                  // Whether positive or negative, a sign there will be:
!                 cbl_char_t sign_ch = is_negative ?
                                  charmap->mapped_character(ascii_minus)
                                : charmap->mapped_character(ascii_plus)  ;
                  if( var->attr & leading_e )
                    {
                    // The sign character goes into the first location
                    size_error =
!                      __gg__binary_to_string_encoded(
!                                                 PTRCAST(char, location+stride),
!                                                 var->digits,
!                                                 value,
!                                                 var->encoding);
!                   charmap->putch(sign_ch, location, (size_t)0);
                    }
                  else
                    {
                    // The sign character goes into the last location
                    size_error =
                      __gg__binary_to_string_encoded(PTRCAST(char, location),
!                                                     var->digits,
                                                      value,
                                                      var->encoding);
!                   charmap->putch(sign_ch, location, length-stride);
                    }
                  }
                else
*************** int128_to_field(cblc_field_t   *var,
*** 1534,1540 ****
                  // First, convert the binary value to the correct-length string
                  size_error =
                    __gg__binary_to_string_encoded(PTRCAST(char, location),
!                                                   length,
                                                    value,
                                                    var->encoding);
  
--- 1988,1994 ----
                  // First, convert the binary value to the correct-length string
                  size_error =
                    __gg__binary_to_string_encoded(PTRCAST(char, location),
!                                                   var->digits,
                                                    value,
                                                    var->encoding);
  
*************** int128_to_field(cblc_field_t   *var,
*** 1546,1554 ****
                    // If all of the digits are zero, then the result is zero, and
                    // we have to kill the is_negative flag:
                    is_negative = false;
!                   for(size_t i=0; i<length; i++)
                      {
!                     if( location[i] != charmap->mapped_character(ascii_0) )
                        {
                        is_negative = true;
                        break;
--- 2000,2010 ----
                    // If all of the digits are zero, then the result is zero, and
                    // we have to kill the is_negative flag:
                    is_negative = false;
!                   size_t index = 0;
!                   while(index<length)
                      {
!                     if( charmap->getch(location, &index)
!                                         != charmap->mapped_character(ascii_0) )
                        {
                        is_negative = true;
                        break;
*************** int128_to_field(cblc_field_t   *var,
*** 1557,1566 ****
                    }
  
                  unsigned char *sign_location =
!                   var->attr & leading_e ? location : location + length - 1;
! 
!                 *sign_location = charmap->set_digit_negative(*sign_location,
!                                                              is_negative);
                  }
                }
              else
--- 2013,2025 ----
                    }
  
                  unsigned char *sign_location =
!                   var->attr & leading_e ? location
!                                         : location + length - stride;
!                 cbl_char_t sign_digit = charmap->getch(sign_location,
!                                                        (size_t)0);
!                 sign_digit = charmap->set_digit_negative(sign_digit,
!                                                          is_negative);
!                 charmap->putch(sign_digit, sign_location, (size_t)0);
                  }
                }
              else
*************** int128_to_field(cblc_field_t   *var,
*** 1568,1574 ****
                // It's a simple positive number
                size_error = __gg__binary_to_string_encoded(
                                                      PTRCAST(char, location),
!                                                     length,
                                                      value,
                                                      var->encoding);
                }
--- 2027,2033 ----
                // It's a simple positive number
                size_error = __gg__binary_to_string_encoded(
                                                      PTRCAST(char, location),
!                                                     var->digits,
                                                      value,
                                                      var->encoding);
                }
*************** int128_to_field(cblc_field_t   *var,
*** 1580,1586 ****
              charmap_t *charmap = __gg__get_charmap(var->encoding);
              if( value == 0 && (var->attr & blank_zero_e) )
                {
!               memset(location, charmap->mapped_character(ascii_space), length);
                }
              else
                {
--- 2039,2045 ----
              charmap_t *charmap = __gg__get_charmap(var->encoding);
              if( value == 0 && (var->attr & blank_zero_e) )
                {
!               charmap->memset(location, charmap->mapped_character(ascii_space), length);
                }
              else
                {
*************** int128_to_field(cblc_field_t   *var,
*** 1605,1611 ****
                                       DEFAULT_SOURCE_ENCODING,
                                       var->encoding,
                                       PTRCAST(char, location),
!                                      var->capacity,
                                       &outlength);
                memcpy(location, converted, outlength);
                }
--- 2064,2070 ----
                                       DEFAULT_SOURCE_ENCODING,
                                       var->encoding,
                                       PTRCAST(char, location),
!                                      var->capacity/charmap->stride(),
                                       &outlength);
                memcpy(location, converted, outlength);
                }
*************** int128_to_field(cblc_field_t   *var,
*** 1735,2131 ****
      }
    }
  
! static __int128
! edited_to_binary( const cblc_field_t *field,
!                   char *ps_,
!                   int length,
!                   int *rdigits)
!   {
!   charmap_t *charmap = __gg__get_charmap(field->encoding);
! 
!   const unsigned char *ps = const_cast<const unsigned char *>(PTRCAST(unsigned char, ps_));
!   // This routine is used for converting NumericEdited strings to
!   // binary.
! 
!   // Numeric edited strings can have all kinds of crap in them: spaces,
!   // slashes, dollar signs...you name it.  It might have a minus sign at
!   // the beginning or end, or it might have CR or DB at the end.
! 
!   // We are going to look for a minus sign, D (or d) and use that to flag the
!   // result as negative.  We are going to look for a decimal point and count up
!   // the numerical digits to the right of it.  And we are going to pretend
!   // that nothing else matters.
! 
!   int hyphen = 0;
!   *rdigits = 0;
! 
!   // index into the ps string
!   int index = 0;
! 
!   // Create a delta_r for counting digits to the right of
!   // any decimal point.  If and when we encounter a decimal point,
!   // we'll set this to one, otherwise it'll stay zero.
!   int delta_r = 0;
! 
!   __int128 result = 0;
! 
!   // We need to check the last two characters.  If CR or DB, then the result
!   // is negative:
!   if( length >= 2)
!     {
!     if(         ((ps[length-2]&0xFF) == charmap->mapped_character(ascii_D)
!               || (ps[length-2]&0xFF) == charmap->mapped_character(ascii_d))
!             &&  ((ps[length-1]&0xFF) == charmap->mapped_character(ascii_B)
!               || (ps[length-1]&0xFF) == charmap->mapped_character(ascii_b)) )
!       {
!       hyphen = 1;
!       }
!     else if(    ((ps[length-2]&0xFF) == charmap->mapped_character(ascii_C)
!               || (ps[length-2]&0xFF) == charmap->mapped_character(ascii_c))
!             &&  ((ps[length-1]&0xFF) == charmap->mapped_character(ascii_R)
!               || (ps[length-1]&0xFF) == charmap->mapped_character(ascii_r)) )
!       {
!       hyphen = 1;
!       }
!     }
! 
!   while( index < length )
!     {
!     unsigned char ch = ps[index++] & 0xFF;
!     if( ch == charmap->mapped_character(__gg__decimal_point) )
!       {
!       delta_r = 1;
!       continue;
!       }
!     if( ch == charmap->mapped_character(ascii_minus)  )
!       {
!       hyphen = 1;
!       continue;
!       }
! 
!     if(  charmap->mapped_character(ascii_0) <= ch
!       && ch <= charmap->mapped_character(ascii_9) )
!       {
!       result *= 10;
!       // In both EBCDIC and ASCII, this works:
!       result += ch & 0x0F ;
!       *rdigits += delta_r ;
!       continue;
!       }
!     }
! 
!   if( hyphen )
!     {
!     result = -result;
!     }
!   return result;
!   }
! 
! static
! __int128
! big_endian_to_binary_signed(
!   const unsigned char *psource,
!   int   capacity
! )
!   {
!   // This subroutine takes a big-endian value of "capacity" bytes and
!   // converts it to a signed INT128.  The highest order bit of the big-endian
!   // value determines whether or not the highest-order bits of the INT128
!   // return value are off or on.
! 
!   __int128 retval;
!   if( *psource >= 128 )
!     {
!     retval = -1;
!     }
!   else
!     {
!     retval = 0;
!     }
! 
!   // move the bytes of psource into retval, flipping them end-to-end
!   unsigned char *dest = PTRCAST(unsigned char, &retval);
!   while(capacity > 0)
!     {
!     *dest++ = psource[--capacity];
!     }
!   return retval;
!   }
! 
! static
! __int128
! little_endian_to_binary_signed(
!   const unsigned char *psource,
!   int capacity
! )
!   {
!   // This subroutine takes a little-endian value of "capacity" bytes and
!   // converts it to a signed INT128.  The highest order bit of the little-endian
!   // value determines whether or not the highest-order bits of the INT128
!   // return value are off or on.
! 
!   __int128 result;
! 
!   // Set all the bits of the result based on the sign of the source:
!   if( psource[capacity-1] >= 128 )
!     {
!     result = -1;
!     }
!   else
!     {
!     result = 0;
!     }
! 
!   // Copy the low-order bytes into place:
!   memcpy(&result, psource, capacity);
!   return result;
!   }
! 
! static
! __int128
! little_endian_to_binary_unsigned(
!   const unsigned char *psource,
!   int capacity
! )
!   {
!   __int128 result = 0;
! 
!   // Copy the low-order bytes into place:
!   memcpy(&result, psource, capacity);
!   return result;
!   }
  
! static
! __int128
! big_endian_to_binary_unsigned(
!   const unsigned char *psource,
!   int   capacity
! )
    {
!   // This subroutine takes an unsigned big-endian value of "capacity" bytes and
!   // converts it to an INT128.
! 
!   __int128 retval = 0 ;
! 
!   // move the bytes of psource into retval, flipping them end-to-end
!   unsigned char *dest = PTRCAST(unsigned char, &retval);
!   while(capacity > 0)
!     {
!     *dest++ = psource[--capacity];
!     }
!   return retval;
    }
  
! static
! __int128
! get_binary_value_local(  int                 *rdigits,
!                          const cblc_field_t  *resolved_var,
!                          unsigned char       *resolved_location,
!                          size_t               resolved_length)
    {
!   __int128 retval = 0;
! 
!   switch( resolved_var->type )
!     {
!     case FldLiteralA :
!       fprintf(stderr, "%s(): is trying to handle a FldLiteralA\n", __func__);
!       abort();
!       break;
! 
!     case FldGroup :
!     case FldAlphanumeric :
!       // Read the data area as a dirty string:
!       retval = __gg__dirty_to_binary(
!                         PTRCAST(const char, resolved_location),
!                         resolved_var->encoding,
!                         resolved_length,
!                         rdigits );
!       break;
! 
!     case FldNumericDisplay:
!       {
!       *rdigits = resolved_var->rdigits;
!       if( resolved_location[resolved_length-1] == DEGENERATE_HIGH_VALUE )
!         {
!         // This is a degenerate case, which violates the language
!         // specification, but nonetheless seems to be a thing.  By
!         // default, HIGH-VALUE is usually assumed to be 0xFF.  This is
!         // not necessarily true; HIGH-VALUE can be changed by the
!         // SPECIAL-NAMES ALPHABET clause.  Furthermore, by definition,
!         // HIGH-VALUE applies *only* to text literals.  However, there
!         // seems to be code out in the universe that wants to be able
!         // to compare NumericDisplay values that have been set to
!         // HIGH-VALUE.  Consider, for example, code that reads from
!         // a disk file which sets the input field to HIGH-VALUE upon
!         // an end-of-file condition.
! 
!         // This code detects that particular condition, and sets the
!         // resulting binary number to the maximum possible positive
!         // value.
! 
!         // Turn all the bits on
!         memset( &retval, 0xFF, sizeof(retval) );
! 
!         // Make it positive by turning off the highest order bit:
!         (PTRCAST(unsigned char, &retval))[sizeof(retval)-1] = 0x3F;
!         }
!       else
!         {
!         unsigned char *digits;
!         unsigned char *sign_byte_location;
!         int ndigits;
!         if( resolved_var->attr & signable_e )
!           {
!           // Pick up the sign byte, and force our value to be positive
!           if(   (resolved_var->attr  & separate_e )
!              && (resolved_var->attr  & leading_e  ) )
!             {
!             // LEADING SEPARATE
!             digits             = resolved_location+1;
!             sign_byte_location = resolved_location;
!             ndigits = resolved_length - 1;
!             }
!           else if(    (resolved_var->attr & separate_e)
!                   && !(resolved_var->attr & leading_e ) )
!             {
!             // TRAILING SEPARATE
!             digits             = resolved_location;
!             sign_byte_location = resolved_location + resolved_length - 1;
!             ndigits = resolved_length - 1;
!             }
!           else if( (resolved_var->attr & leading_e) )
!             {
!             // LEADING
!             digits             = resolved_location;
!             sign_byte_location = resolved_location;
!             ndigits = resolved_length;
!             }
!           else // if( !(resolved_var->attr & leading_e) )
!             {
!             // TRAILING
!             digits             = resolved_location;
!             sign_byte_location = resolved_location + resolved_length - 1;
!             ndigits = resolved_length;
!             }
!           }
!         else
!           {
!           digits             = resolved_location;
!           sign_byte_location = resolved_location;
!           ndigits = resolved_length;
!           }
!         retval = __gg__numeric_display_to_binary(sign_byte_location,
!                                                  digits,
!                                                  ndigits,
!                                                  resolved_var->encoding);
!         }
!       break;
!       }
! 
!     case FldNumericEdited :
!       retval = edited_to_binary(resolved_var,
!                                 PTRCAST(char, resolved_location),
!                                 resolved_length,
!                                 rdigits);
!       break;
! 
!     case FldNumericBinary :
!       if( resolved_var->attr & signable_e)
!         {
!         retval = big_endian_to_binary_signed(
!                         PTRCAST(const unsigned char, resolved_location),
!                         resolved_length);
!         }
!       else
!         {
!         retval = big_endian_to_binary_unsigned(
!                         PTRCAST(const unsigned char, resolved_location),
!                         resolved_length);
!         }
!       *rdigits = resolved_var->rdigits;
!       break;
! 
!     case FldLiteralN:
!       {
!       if( resolved_var->attr & signable_e)
!         {
!         retval = little_endian_to_binary_signed(resolved_var->data,
!                                                 resolved_var->capacity);
!         }
!       else
!         {
!         retval = little_endian_to_binary_unsigned(resolved_var->data,
!                                                   resolved_var->capacity);
!         }
!       *rdigits = resolved_var->rdigits;
!       break;
!       }
! 
!     case FldNumericBin5:
!     case FldIndex:
!     case FldPointer:
!       if( resolved_var->attr & signable_e)
!         {
!         retval = little_endian_to_binary_signed(
!                       PTRCAST(const unsigned char, resolved_location),
!                       resolved_length);
!         }
!       else
!         {
!         retval = little_endian_to_binary_unsigned(
!                       PTRCAST(const unsigned char, resolved_location),
!                       resolved_length);
!         }
!       *rdigits = resolved_var->rdigits;
!       break;
! 
!     case FldPacked:
!       {
!       *rdigits = resolved_var->rdigits;
!       retval = __gg__packed_to_binary(resolved_location,
!                                       resolved_length);
!       break;
!       }
!     }
! 
!   if( resolved_var->attr & scaled_e )
!     {
!     // Here's where we handle a P-scaled number.
  
!     if( resolved_var->rdigits >= 0)
!       {
!       // We might be dealing with a source with a PICTURE string of
!       // PPPPPP999, which means retval is a three-digit number
!       // and resolved_var->rdigits is +6.  That means we need to divide retval
!       // by 10**9, and we need to make rdigits 9
!       *rdigits = resolved_var->digits + resolved_var->rdigits;
!       }
!     else
!       {
!       // We have a source with a PIC string like 999PPPPPP, which is
!       // a capacity of 3 and a resolved_var->rdigits of -6.  We need to multiply
!       // retval by +6, and make rdigits zero:
!       retval *= __gg__power_of_ten( -resolved_var->rdigits );
!       *rdigits = 0;
!       }
!     }
  
!   return retval;
    }
  
! #pragma GCC diagnostic ignored "-Wformat-overflow"
! 
! static time_t
! cobol_time()
    {
!   struct cbl_timespec tp;
!   __gg__clock_gettime(&tp);
!   return tp.tv_sec;
    }
  
  extern "C"
! char *
! __gg__get_date_yymmdd(const cblc_field_t *field)
    {
    char ach[32];
  
--- 2194,2251 ----
      }
    }
  
! #pragma GCC diagnostic ignored "-Wformat-overflow"
  
! static time_t
! cobol_time()
    {
!   struct cbl_timespec tp;
!   __gg__clock_gettime(&tp);
!   return tp.tv_sec;
    }
  
! extern "C"
! void
! __gg__field_from_string(cblc_field_t *field,
!                         size_t field_o,
!                         size_t field_s,
!                   const char *string,
!                         size_t string_length)
    {
!   // Warning:  field_from_string uses charmap_t, so you can't safely feed it
!   // the results of __gg__iconverter without copying them.
  
!   // The string has to be in the field->encoding.  It's legitimate for
!   // string_length to be less than field_s; we will right fill with spaces. And
!   // it can be greater than field_s, in which case __gg__move will truncate.
  
!   cblc_field_t source = {};
!   source.type = FldAlphanumeric;
!   source.encoding = field->encoding;
!   source.data = reinterpret_cast<unsigned char *>
!                                                 (const_cast<char *>(string)),
!   source.capacity = string_length;
!   __gg__move(  field, field_o, field_s,
!               &source, source.offset, source.capacity,
!               0, truncation_e );
    }
  
! static void
! field_from_ascii(cblc_field_t *field, char *psz)
    {
!   cblc_field_t source = {};
!   source.type = FldAlphanumeric;
!   source.capacity = strlen(psz);
!   source.data = reinterpret_cast<unsigned char *>(psz);
!   source.encoding = __gg__console_encoding;
!   __gg__move(  field, field->offset, field->capacity,
!              &source, source.offset, source.capacity,
!              0, truncation_e );
    }
  
  extern "C"
! void
! __gg__get_date_yymmdd(cblc_field_t *field)
    {
    char ach[32];
  
*************** __gg__get_date_yymmdd(const cblc_field_t
*** 2137,2178 ****
            local->tm_year  % 100,
            local->tm_mon+1 % 100,
            local->tm_mday  % 100 );
!   size_t charsout;
!   const char *converted = __gg__iconverter(__gg__console_encoding,
!                                            field->encoding,
!                                            ach,
!                                            strlen(ach),
!                                            &charsout);
!   return strdup(converted);
    }
  
  extern "C"
! char *
! __gg__get_date_yyyymmdd(const cblc_field_t *field)
    {
    char ach[32];
- 
    time_t t = cobol_time();
    const struct tm *local = localtime(&t);
- 
    sprintf(ach,
            "%4.4d%2.2d%2.2d",
            local->tm_year + 1900,
            local->tm_mon+1,
            local->tm_mday);
! 
!   size_t charsout;
!   const char *converted = __gg__iconverter(__gg__console_encoding,
!                                            field->encoding,
!                                            ach,
!                                            strlen(ach),
!                                            &charsout);
!   return strdup(converted);
    }
  
  extern "C"
! char *
! __gg__get_date_yyddd(const cblc_field_t *field)
    {
    char ach[32];
  
--- 2257,2283 ----
            local->tm_year  % 100,
            local->tm_mon+1 % 100,
            local->tm_mday  % 100 );
!   field_from_ascii(field, ach);
    }
  
  extern "C"
! void
! __gg__get_date_yyyymmdd(cblc_field_t *field)
    {
    char ach[32];
    time_t t = cobol_time();
    const struct tm *local = localtime(&t);
    sprintf(ach,
            "%4.4d%2.2d%2.2d",
            local->tm_year + 1900,
            local->tm_mon+1,
            local->tm_mday);
!   field_from_ascii(field, ach);
    }
  
  extern "C"
! void
! __gg__get_date_yyddd(cblc_field_t *field)
    {
    char ach[32];
  
*************** __gg__get_date_yyddd(const cblc_field_t
*** 2183,2201 ****
            "%2.2d%3.3d",
            local->tm_year % 100,
            local->tm_yday+1);
! 
!   size_t charsout;
!   const char *converted = __gg__iconverter(__gg__console_encoding,
!                                            field->encoding,
!                                            ach,
!                                            strlen(ach),
!                                            &charsout);
!   return strdup(converted);
    }
  
  extern "C"
! char *
! __gg__get_yyyyddd(const cblc_field_t *field)
    {
    char ach[32];
  
--- 2288,2299 ----
            "%2.2d%3.3d",
            local->tm_year % 100,
            local->tm_yday+1);
!   field_from_ascii(field, ach);
    }
  
  extern "C"
! void
! __gg__get_yyyyddd(cblc_field_t *field)
    {
    char ach[32];
  
*************** __gg__get_yyyyddd(const cblc_field_t *fi
*** 2206,2224 ****
            "%4.4d%3.3d",
            local->tm_year + 1900,
            local->tm_yday+1);
! 
!   size_t charsout;
!   const char *converted = __gg__iconverter(__gg__console_encoding,
!                                            field->encoding,
!                                            ach,
!                                            strlen(ach),
!                                            &charsout);
!   return strdup(converted);
    }
  
  extern "C"
! char *
! __gg__get_date_dow(const cblc_field_t *field)
    {
    char ach[32];
  
--- 2304,2315 ----
            "%4.4d%3.3d",
            local->tm_year + 1900,
            local->tm_yday+1);
!   field_from_ascii(field, ach);
    }
  
  extern "C"
! void
! __gg__get_date_dow(cblc_field_t *field)
    {
    char ach[32];
  
*************** __gg__get_date_dow(const cblc_field_t *f
*** 2228,2241 ****
    sprintf(ach,
            "%1.1d",
            local->tm_wday == 0 ? 7 : local->tm_wday);
! 
!   size_t charsout;
!   const char *converted = __gg__iconverter(__gg__console_encoding,
!                                            field->encoding,
!                                            ach,
!                                            strlen(ach),
!                                            &charsout);
!   return strdup(converted);
    }
  
  static int
--- 2319,2325 ----
    sprintf(ach,
            "%1.1d",
            local->tm_wday == 0 ? 7 : local->tm_wday);
!   field_from_ascii(field, ach);
    }
  
  static int
*************** __gg__clock_gettime(struct cbl_timespec
*** 2334,2344 ****
    }
  
  extern "C"
! char *
! __gg__get_date_hhmmssff(const cblc_field_t *field)
    {
    char ach[32];
- 
    struct cbl_timespec tv;
    __gg__clock_gettime(&tv);
  
--- 2418,2427 ----
    }
  
  extern "C"
! void
! __gg__get_date_hhmmssff(cblc_field_t *field)
    {
    char ach[32];
    struct cbl_timespec tv;
    __gg__clock_gettime(&tv);
  
*************** __gg__get_date_hhmmssff(const cblc_field
*** 2359,2381 ****
            tm.tm_min,
            tm.tm_sec,
            hundredths);
  
!   size_t charsout;
!   const char *converted = __gg__iconverter(__gg__console_encoding,
!                                            field->encoding,
!                                            ach,
!                                            strlen(ach),
!                                            &charsout);
!   return strdup(converted);
    }
  
  extern "C"
  int
  __gg__setop_compare(
!   const char *candidate,
!   int capacity,
!   char *domain,
!   cbl_encoding_t domain_encoding)
    {
    // This routine is called to compare the characters of 'candidate'
    // against the list of character pairs in 'domain'
--- 2442,2495 ----
            tm.tm_min,
            tm.tm_sec,
            hundredths);
+   field_from_ascii(field, ach);
+   }
  
! static
! uint32_t collation_position( cbl_char_t ch )
!   {
!   uint32_t retval;
!   if( (ch & 0xFFFFFF00) == 0x00000000 )
!     {
!     // The character fits into the current DISPLAY collation
!     retval = collated(ch);
!     }
!   else
!     {
!     // It doesn't fit, so use the character value itself
!     retval = ch;
!     }
!   return retval;
    }
  
+ static cbl_char_t
+ uber_compare(cbl_char_t ch_left, cbl_char_t ch_right)
+   {
+   if( ((ch_left | ch_right) & 0xFFFFFF00) == 0x00000000 )
+     {
+     // This is where collation is going to have to be fixed for multi-byte
+     // encodings.  For now, if both characters fit into 0xFF, then we will
+     // use the current collation.  Otherwise, we just compare them
+ 
+     // Both characters fit into the current DISPLAY codeset, so assume we
+     // are using the DISPLAY collation:
+     ch_left  = collated(ch_left);
+     ch_right = collated(ch_right);
+     }
+   else
+     {
+     // Just compare the raw characters.
+     }
+   cbl_char_t retval = ch_left - ch_right;
+   return retval;
+   }
+ 
+ 
  extern "C"
  int
  __gg__setop_compare(
!   const cblc_field_t *candidate_field,
!   char *domain)
    {
    // This routine is called to compare the characters of 'candidate'
    // against the list of character pairs in 'domain'
*************** __gg__setop_compare(
*** 2385,2407 ****
    int h;
    char *d;
  
!   /*  At the present writing, the domain was created in "source code" space,
!       meaning that 'A' comes through as 0x41 no matter what the
!       domain->encoding.  Until Jim gets around to providing me with target
!       values from the parser, we're doing the conversion here. */
  
!   charmap_t *charmap = __gg__get_charmap(domain_encoding);
  
!   for(int i=0; i<capacity; i++)
      {
!     int ch = (*candidate++ & 0xFF);
      d = domain;
      while(*d)
        {
        retval = 0;
        // We are decoding hexadecimal numbers, either in pairs,
        // or singletons:  "20/30 " or "20 ".  The final one is
!       // terminated with '\0'
  
        // See the comments in genapi.cc::get_class_condition_string
        // to see how this string was encoded.
--- 2499,2532 ----
    int h;
    char *d;
  
!   /* The domain was created by converting characters to their UTF32
!      equivalents and then turning that information to hex.  Numerical values,
!      which represent collation positions, are flagged as negative values.
  
!      In order to compare the apples in candidate to the UTF32 values in the
!      domain, we need to convert the candidate to UTF32 as well: */
  
!   const charmap_t *charmap = __gg__get_charmap(DEFAULT_32_ENCODING);
! 
!   size_t nbytes_converted;
!   const char *candidate = __gg__iconverter(candidate_field->encoding,
!                                             DEFAULT_32_ENCODING,
!                                             candidate_field->data,
!                                             candidate_field->capacity,
!                                             &nbytes_converted);
!   const char *candidate_end = candidate + nbytes_converted;
!   while(candidate < candidate_end)
      {
!     cbl_char_t ch = charmap->getch(candidate, size_t(0));
!     candidate += charmap->stride();
!     int collation_pos = collation_position(ch);
      d = domain;
      while(*d)
        {
        retval = 0;
        // We are decoding hexadecimal numbers, either in pairs,
        // or singletons:  "20/30 " or "20 ".  The final one is
!       // terminated with ' \0'
  
        // See the comments in genapi.cc::get_class_condition_string
        // to see how this string was encoded.
*************** __gg__setop_compare(
*** 2409,2415 ****
--- 2534,2548 ----
        l = (int)strtoll(d, reinterpret_cast<char **>(&d), 16);
        if( l < 0 )
          {
+         // This is a collation position, as given in the COBOL program. Make
+         // it positive, and subtract 1 from it to make it the same space
+         // as the collation table:
          l = -l;
+         l -= 1;
+         }
+       else
+         {
+ 
          }
        h = l;
        if( *d == '/' )
*************** __gg__setop_compare(
*** 2418,2424 ****
--- 2551,2559 ----
          h = (int)strtoll(d, reinterpret_cast<char **>(&d), 16);
          if( h < 0 )
            {
+           // This is a collation position; make it the same as
            h = -h;
+           h -= 1;
            }
          }
        else if( *d == ' ' )
*************** __gg__setop_compare(
*** 2426,2434 ****
          d += 1;
          }
  
!       l = charmap->mapped_character(l);
!       h = charmap->mapped_character(h);
!       if( ch >= l && ch <= h )
          {
          // This character is acceptable
          retval = 1;
--- 2561,2567 ----
          d += 1;
          }
  
!       if( collation_pos >= l && collation_pos <= h )
          {
          // This character is acceptable
          retval = 1;
*************** __gg__dirty_to_binary(const char *dirty,
*** 2551,2563 ****
    // MAX_FIXED_POINT_DIGITS
  
    charmap_t *charmap    = __gg__get_charmap(encoding);
!   int mapped_minus          = charmap->mapped_character(ascii_minus);
!   int mapped_plus           = charmap->mapped_character(ascii_plus);
!   int mapped_decimal_point  = charmap->mapped_character(__gg__decimal_point);
!   int mapped_0              = charmap->mapped_character(ascii_0);
!   int mapped_9              = charmap->mapped_character(ascii_9);
!   int mapped_E              = charmap->mapped_character(ascii_E);
!   int mapped_e              = charmap->mapped_character(ascii_e);
  
    __int128 retval = 0;
  
--- 2684,2698 ----
    // MAX_FIXED_POINT_DIGITS
  
    charmap_t *charmap    = __gg__get_charmap(encoding);
!   int stride = charmap->stride();
! 
!   cbl_char_t mapped_minus          = charmap->mapped_character(ascii_minus);
!   cbl_char_t mapped_plus           = charmap->mapped_character(ascii_plus);
!   cbl_char_t mapped_decimal_point  = charmap->mapped_character(__gg__decimal_point);
!   cbl_char_t mapped_0              = charmap->mapped_character(ascii_0);
!   cbl_char_t mapped_9              = charmap->mapped_character(ascii_9);
!   cbl_char_t mapped_E              = charmap->mapped_character(ascii_E);
!   cbl_char_t mapped_e              = charmap->mapped_character(ascii_e);
  
    __int128 retval = 0;
  
*************** __gg__dirty_to_binary(const char *dirty,
*** 2571,2581 ****
    int delta_r = 0;
  
    // We now loop over the remaining input characters:
!   unsigned char ch = '\0';
  
!   if(length-- > 0)
      {
!     ch = *dirty++;
      if( ch == mapped_minus )
        {
        hyphen = 1;
--- 2706,2718 ----
    int delta_r = 0;
  
    // We now loop over the remaining input characters:
!   cbl_char_t ch = '\0';
!   size_t chindex = 0;
  
!   if(length > 0)
      {
!     length -= stride;
!     ch = charmap->getch(dirty, &chindex);
      if( ch == mapped_minus )
        {
        hyphen = 1;
*************** __gg__dirty_to_binary(const char *dirty,
*** 2606,2614 ****
        }
      }
  
!   while( length-- > 0 )
      {
!     ch = *dirty++;
      if( ch == mapped_decimal_point && delta_r == 0 )
        {
        // This is the first decimal point we've seen, so we
--- 2743,2752 ----
        }
      }
  
!   while( length > 0 )
      {
!     length -= stride;
!     ch = charmap->getch(dirty, &chindex);
      if( ch == mapped_decimal_point && delta_r == 0 )
        {
        // This is the first decimal point we've seen, so we
*************** __gg__dirty_to_binary(const char *dirty,
*** 2642,2663 ****
      int exponent_sign = 1;
      if( length > 0  )
        {
!       ch = *dirty;
        if( ch == mapped_plus)
          {
!         length -= 1;
!         dirty += 1;
          }
        else if( ch == mapped_minus )
          {
          exponent_sign = -1;
!         length -= 1;
!         dirty += 1;
          }
        }
!     while(length-- > 0)
        {
!       ch = *dirty++;
        if(    ch < mapped_0
            || ch > mapped_9 )
          {
--- 2780,2802 ----
      int exponent_sign = 1;
      if( length > 0  )
        {
!       ch = charmap->getch(dirty, chindex);
        if( ch == mapped_plus)
          {
!         length -= stride;
!         dirty += stride;
          }
        else if( ch == mapped_minus )
          {
          exponent_sign = -1;
!         length -= stride;
!         dirty += stride;
          }
        }
!     while(length > 0)
        {
!       length -= stride;
!       ch = charmap->getch(dirty, &chindex);
        if(    ch < mapped_0
            || ch > mapped_9 )
          {
*************** __gg__dirty_to_float( const char *dirty,
*** 2730,2758 ****
    int delta_r = 0;
  
    // We now loop over the remaining input characters:
!   unsigned char ch = '\0';
  
    charmap_t *charmap = __gg__get_charmap(field->encoding);
  
    if(length-- > 0)
      {
!     ch = *dirty++;
!     if( ch == charmap->mapped_character(ascii_minus) )
        {
        hyphen = 1;
        }
!     else if( ch == charmap->mapped_character(ascii_plus) )
        {
        // A plus sign is okay
        }
!     else if( ch == charmap->mapped_character(__gg__decimal_point) )
        {
        delta_r = 1;
        }
!     else if(   ch >= charmap->mapped_character(ascii_0)
!             && ch <= charmap->mapped_character(ascii_9) )
        {
!       retval = ch - charmap->mapped_character(ascii_0) ;
        }
      else
        {
--- 2869,2905 ----
    int delta_r = 0;
  
    // We now loop over the remaining input characters:
!   cbl_char_t ch = '\0';
  
    charmap_t *charmap = __gg__get_charmap(field->encoding);
+   cbl_char_t mapped_minus  = charmap->mapped_character(ascii_minus);
+   cbl_char_t mapped_plus   = charmap->mapped_character(ascii_plus);
+   cbl_char_t mapped_decimal = charmap->mapped_character(__gg__decimal_point);
+   cbl_char_t mapped_0       = charmap->mapped_character(ascii_0);
+   cbl_char_t mapped_9       = charmap->mapped_character(ascii_9);
+   cbl_char_t mapped_E       = charmap->mapped_character(ascii_E);
+   cbl_char_t mapped_e       = charmap->mapped_character(ascii_e);
  
+   size_t index = 0;
    if(length-- > 0)
      {
!     ch = charmap->getch(dirty, &index);
!     if( ch == mapped_minus )
        {
        hyphen = 1;
        }
!     else if( ch == mapped_plus )
        {
        // A plus sign is okay
        }
!     else if( ch == mapped_decimal )
        {
        delta_r = 1;
        }
!     else if(   ch >= mapped_0
!             && ch <= mapped_9 )
        {
!       retval = ch & 0x0F ;
        }
      else
        {
*************** __gg__dirty_to_float( const char *dirty,
*** 2766,2805 ****
  
    while( length-- > 0 )
      {
!     ch = *dirty++;
!     if( ch == charmap->mapped_character(__gg__decimal_point) && delta_r == 0 )
        {
        // This is the first decimal point we've seen, so we
        // can start counting rdigits:
        delta_r = 1;
        continue;
        }
!     if(   ch < charmap->mapped_character(ascii_0)
!        || ch > charmap->mapped_character(ascii_9) )
        {
        // When we hit something that isn't a digit, then we are done
        break;
        }
      retval *= 10;
!     retval += ch - charmap->mapped_character(ascii_0) ;
      rdigits += delta_r;
      }
  
    // Let's check for an exponent:
    int exponent = 0;
!   if(    ch == charmap->mapped_character(ascii_E)
!       || ch == charmap->mapped_character(ascii_e)  )
      {
      int exponent_sign = 1;
      if( length > 0  )
        {
!       ch = *dirty;
!       if( ch == charmap->mapped_character(ascii_plus) )
          {
          length -= 1;
          dirty += 1;
          }
!       else if (ch == charmap->mapped_character(ascii_minus) )
          {
          exponent_sign = -1;
          length -= 1;
--- 2913,2952 ----
  
    while( length-- > 0 )
      {
!     ch = charmap->getch(dirty, &index);
!     if( ch == mapped_decimal && delta_r == 0 )
        {
        // This is the first decimal point we've seen, so we
        // can start counting rdigits:
        delta_r = 1;
        continue;
        }
!     if(   ch < mapped_0
!        || ch > mapped_9 )
        {
        // When we hit something that isn't a digit, then we are done
        break;
        }
      retval *= 10;
!     retval += ch & 0x0F ;
      rdigits += delta_r;
      }
  
    // Let's check for an exponent:
    int exponent = 0;
!   if(    ch == mapped_E
!       || ch == mapped_e )
      {
      int exponent_sign = 1;
      if( length > 0  )
        {
!       ch = charmap->getch(dirty, &index);
!       if( ch == mapped_plus )
          {
          length -= 1;
          dirty += 1;
          }
!       else if(ch == mapped_minus )
          {
          exponent_sign = -1;
          length -= 1;
*************** __gg__dirty_to_float( const char *dirty,
*** 2808,2822 ****
        }
      while(length-- > 0)
        {
!       ch = *dirty++;
!       if(   ch < charmap->mapped_character(ascii_0)
!          || ch > charmap->mapped_character(ascii_9) )
          {
          // When we hit something that isn't a digit, then we are done
          break;
          }
        exponent *= 10;
!       exponent += ch - charmap->mapped_character(ascii_0) ;
        }
      exponent *= exponent_sign;
      }
--- 2955,2969 ----
        }
      while(length-- > 0)
        {
!       ch = charmap->getch(dirty, &index);
!       if(   ch < mapped_0
!          || ch > mapped_9 )
          {
          // When we hit something that isn't a digit, then we are done
          break;
          }
        exponent *= 10;
!       exponent += ch & 0x0F ;
        }
      exponent *= exponent_sign;
      }
*************** format_for_display_internal(char **dest,
*** 2926,2932 ****
  
    // The routine returns the cbl_encoding_t of the result.
  
!   cbl_encoding_t retval = var->encoding;
  
    int source_rdigits = var->rdigits;
  
--- 3073,3079 ----
  
    // The routine returns the cbl_encoding_t of the result.
  
!   cbl_encoding_t enc_dest = var->encoding;
  
    int source_rdigits = var->rdigits;
  
*************** format_for_display_internal(char **dest,
*** 2940,2971 ****
    if( address_of )
      {
      // Assume that DISPLAY OF ADDRESS OF should be what's expected:
! 
!     __gg__realloc_if_necessary(dest, dest_size, 2*sizeof(void *) + 1);
  
      sprintf(  *dest,
                "0x%*.*lx",
                (int)(2*sizeof(void *)),
                (int)(2*sizeof(void *)),
                (unsigned long)actual_location);
!     retval = __gg__console_encoding;
      goto done;
      }
  
    switch( var->type )
      {
      case FldLiteralA:
      case FldGroup:
      case FldAlphanumeric:
      case FldNumericEdited:
      case FldAlphaEdited:
        {
!       __gg__realloc_if_necessary(dest, dest_size, actual_length+1);
  
        cbl_figconst_t figconst = (cbl_figconst_t)(var->attr & FIGCONST_MASK);
        if( figconst )
          {
!         charmap_t *charmap = __gg__get_charmap(retval);
          int figconst_char  = charmap->figconst_character(figconst);
          memset(*dest, figconst_char, actual_length);
          (*dest)[actual_length] = NULLCH;
--- 3087,3153 ----
    if( address_of )
      {
      // Assume that DISPLAY OF ADDRESS OF should be what's expected:
!     const charmap_t *charmap = __gg__get_charmap(enc_dest);
!     __gg__realloc_if_necessary(dest,
!                                dest_size,
!                                2*sizeof(void *) + charmap->stride());
  
      sprintf(  *dest,
                "0x%*.*lx",
                (int)(2*sizeof(void *)),
                (int)(2*sizeof(void *)),
                (unsigned long)actual_location);
!     enc_dest = __gg__console_encoding;
      goto done;
      }
  
    switch( var->type )
      {
      case FldLiteralA:
+       {
+       charmap_t *charmap = __gg__get_charmap(enc_dest);
+       __gg__realloc_if_necessary(dest,
+                                  dest_size,
+                                  actual_length+charmap->stride());
+ 
+       cbl_figconst_t figconst = (cbl_figconst_t)(var->attr & FIGCONST_MASK);
+       if( figconst )
+         {
+         charmap = __gg__get_charmap(enc_dest);
+         int figconst_char  = charmap->figconst_character(figconst);
+         memset(*dest, figconst_char, actual_length);
+         (*dest)[actual_length] = NULLCH;
+         }
+       else
+         {
+         if( actual_location )
+           {
+           memcpy(*dest, actual_location, actual_length);
+           }
+         else
+           {
+           fprintf(stderr, "attempting to display a NULL pointer in %s\n", var->name);
+           abort();
+           }
+         (*dest)[actual_length] = NULLCH;
+         }
+       break;
+       }
+ 
      case FldGroup:
      case FldAlphanumeric:
      case FldNumericEdited:
      case FldAlphaEdited:
        {
!       charmap_t *charmap = __gg__get_charmap(enc_dest);
!       __gg__realloc_if_necessary(dest,
!                                  dest_size,
!                                  actual_length+charmap->stride());
  
        cbl_figconst_t figconst = (cbl_figconst_t)(var->attr & FIGCONST_MASK);
        if( figconst )
          {
!         charmap = __gg__get_charmap(enc_dest);
          int figconst_char  = charmap->figconst_character(figconst);
          memset(*dest, figconst_char, actual_length);
          (*dest)[actual_length] = NULLCH;
*************** format_for_display_internal(char **dest,
*** 2988,2998 ****
  
      case FldNumericDisplay:
        {
        if( var_is_refmod(var) )
          {
          // Because we are dealing with a refmod, we just output those
          // characters.
!         __gg__realloc_if_necessary(dest, dest_size, actual_length+1);
          memcpy((*dest), actual_location, actual_length);
          (*dest)[actual_length] = NULLCH;
          break;
--- 3170,3183 ----
  
      case FldNumericDisplay:
        {
+       charmap_t *charmap = __gg__get_charmap(enc_dest);
        if( var_is_refmod(var) )
          {
          // Because we are dealing with a refmod, we just output those
          // characters.
!         __gg__realloc_if_necessary(dest,
!                                    dest_size,
!                                    actual_length+charmap->stride());
          memcpy((*dest), actual_location, actual_length);
          (*dest)[actual_length] = NULLCH;
          break;
*************** format_for_display_internal(char **dest,
*** 3030,3044 ****
          // This buffer is larger than can validly be needed
          unsigned char converted[128];
          size_t outlength;
!         retval = DEFAULT_SOURCE_ENCODING;
          const char *mapped = __gg__iconverter(
                                    var->encoding,
!                                   retval,
                                    PTRCAST(char, actual_location),
                                    actual_length,
                                    &outlength);
          memcpy(converted, mapped, outlength);
!         charmap_t *charmap = __gg__get_charmap(retval);
  
          // converted[] is now an ASCII version of the value in memory.  We are
          // going to "validate" the characters, which might be garbage.
--- 3215,3229 ----
          // This buffer is larger than can validly be needed
          unsigned char converted[128];
          size_t outlength;
!         enc_dest = DEFAULT_SOURCE_ENCODING;
          const char *mapped = __gg__iconverter(
                                    var->encoding,
!                                   enc_dest,
                                    PTRCAST(char, actual_location),
                                    actual_length,
                                    &outlength);
          memcpy(converted, mapped, outlength);
!         charmap = __gg__get_charmap(enc_dest);
  
          // converted[] is now an ASCII version of the value in memory.  We are
          // going to "validate" the characters, which might be garbage.
*************** format_for_display_internal(char **dest,
*** 3052,3058 ****
          bool is_negative;
          int index = 0;  // This is the running index into our output destination
  
-         std::ptrdiff_t signoffset;
          switch(signtype)
            {
            case 0:
--- 3237,3242 ----
*************** format_for_display_internal(char **dest,
*** 3062,3075 ****
              // not signable
              signloc  = converted;
              digits   = converted;
!             digits_e = converted + actual_length;
              is_negative = false;
              break;
            case 4:
              // internal trailing
!             signloc  = converted + actual_length-1;
              digits   = converted;
!             digits_e = converted + actual_length;
              /*  In ascii, negative is indicated by turning bit 0x40 on.
                  In ebcdic, by turning bit 0x20 off.  In both cases, the result
                  is outside of the range '0' through '9'.  Working this way is
--- 3246,3264 ----
              // not signable
              signloc  = converted;
              digits   = converted;
!             digits_e = converted + outlength;
              is_negative = false;
              break;
            case 4:
+             {
              // internal trailing
!             const charmap_t *charmap_from = __gg__get_charmap(var->encoding);
!             cbl_char_t original_sign_digit =
!                 charmap_from->getch(actual_location,
!                                     actual_length - charmap_from->stride());
!             signloc  = converted + outlength-1;
              digits   = converted;
!             digits_e = converted + outlength;
              /*  In ascii, negative is indicated by turning bit 0x40 on.
                  In ebcdic, by turning bit 0x20 off.  In both cases, the result
                  is outside of the range '0' through '9'.  Working this way is
*************** format_for_display_internal(char **dest,
*** 3078,3109 ****
                  variable's memory.  I am not overly concerned.
              */
              is_negative = *signloc > ascii_9 || *signloc < ascii_0;
!             signoffset = signloc-converted;
!             *signloc = charmap->mapped_character(ascii_0)
!                                         + (actual_location[signoffset] & 0x0F);
              break;
            case 5:
              // internal leading
              signloc  = converted;
              digits   = converted;
!             digits_e = converted + actual_length;
              is_negative = *signloc > ascii_9 || *signloc < ascii_0;
!             signoffset = signloc-converted;
!             *signloc = charmap->mapped_character(ascii_0)
!                                         + (actual_location[signoffset] & 0x0F);
              break;
            case 6:
              // separate trailing
!             signloc  = converted + actual_length-1;
              digits   = converted;
!             digits_e = converted + actual_length-1;
              is_negative = *signloc == ascii_minus;
              break;
            case 7:
              // separate leading
              signloc  = converted;
              digits   = converted+1;
!             digits_e = converted + actual_length;
              is_negative = *signloc == ascii_minus;
              break;
            }
--- 3267,3301 ----
                  variable's memory.  I am not overly concerned.
              */
              is_negative = *signloc > ascii_9 || *signloc < ascii_0;
!             *signloc = ascii_0 + (original_sign_digit & 0x0F);
              break;
+             }
            case 5:
+             {
              // internal leading
+             const charmap_t *charmap_from = __gg__get_charmap(var->encoding);
+             cbl_char_t original_sign_digit =
+                 charmap_from->getch(actual_location,
+                                     (size_t)0);
              signloc  = converted;
              digits   = converted;
!             digits_e = converted + outlength;
              is_negative = *signloc > ascii_9 || *signloc < ascii_0;
!             *signloc = ascii_0 + (original_sign_digit & 0x0F);
              break;
+             }
            case 6:
              // separate trailing
!             signloc  = converted + outlength-1;
              digits   = converted;
!             digits_e = converted + outlength-1;
              is_negative = *signloc == ascii_minus;
              break;
            case 7:
              // separate leading
              signloc  = converted;
              digits   = converted+1;
!             digits_e = converted + outlength;
              is_negative = *signloc == ascii_minus;
              break;
            }
*************** format_for_display_internal(char **dest,
*** 3139,3144 ****
--- 3331,3337 ----
              break;
            case 6:
              // separate trailing
+             // We'll stick on the trailing sign character later
              break;
            case 7:
              // separate leading
*************** format_for_display_internal(char **dest,
*** 3260,3267 ****
          }
  
        char ach[128];
!       retval = DEFAULT_SOURCE_ENCODING;
!       charmap_t *charmap = __gg__get_charmap(retval);
  
        __gg__binary_to_string_ascii(ach, digits, value);
  
--- 3453,3460 ----
          }
  
        char ach[128];
!       enc_dest = DEFAULT_SOURCE_ENCODING;
!       charmap_t *charmap = __gg__get_charmap(enc_dest);
  
        __gg__binary_to_string_ascii(ach, digits, value);
  
*************** format_for_display_internal(char **dest,
*** 3317,3323 ****
        sprintf(ach, "%lu", (unsigned long)value);
        __gg__realloc_if_necessary(dest, dest_size, strlen(ach)+1);
        strcpy(*dest, ach);
!       retval = __gg__console_encoding;
        }
      break;
  
--- 3510,3516 ----
        sprintf(ach, "%lu", (unsigned long)value);
        __gg__realloc_if_necessary(dest, dest_size, strlen(ach)+1);
        strcpy(*dest, ach);
!       enc_dest = __gg__console_encoding;
        }
      break;
  
*************** format_for_display_internal(char **dest,
*** 3336,3342 ****
          memset(*dest, 0, retsize);
          strcpy(*dest, "<LEVEL88>");
          }
!       retval = __gg__console_encoding;
        break;
        }
  
--- 3529,3535 ----
          memset(*dest, 0, retsize);
          strcpy(*dest, "<LEVEL88>");
          }
!       enc_dest = __gg__console_encoding;
        break;
        }
  
*************** format_for_display_internal(char **dest,
*** 3354,3360 ****
                  (int)(2*sizeof(void *)),
                  (int)(2*sizeof(void *)),
                  (unsigned long)value);
!       retval = __gg__console_encoding;
        break;
        }
  
--- 3547,3553 ----
                  (int)(2*sizeof(void *)),
                  (int)(2*sizeof(void *)),
                  (unsigned long)value);
!       enc_dest = __gg__console_encoding;
        break;
        }
  
*************** format_for_display_internal(char **dest,
*** 3488,3494 ****
            break;
            }
          }
!       retval = __gg__console_encoding;
        break;
        }
  
--- 3681,3687 ----
            break;
            }
          }
!       enc_dest = __gg__console_encoding;
        break;
        }
  
*************** format_for_display_internal(char **dest,
*** 3502,3508 ****
  
    if( (var->attr & scaled_e) && var->type != FldNumericDisplay )
      {
!     charmap_t *charmap = __gg__get_charmap(retval);
  
      static size_t buffer_size = MINIMUM_ALLOCATION_SIZE;
      static char  *buffer = static_cast<char *>(malloc(buffer_size));
--- 3695,3701 ----
  
    if( (var->attr & scaled_e) && var->type != FldNumericDisplay )
      {
!     charmap_t *charmap = __gg__get_charmap(enc_dest);
  
      static size_t buffer_size = MINIMUM_ALLOCATION_SIZE;
      static char  *buffer = static_cast<char *>(malloc(buffer_size));
*************** format_for_display_internal(char **dest,
*** 3569,3674 ****
      }
  
    done:
!   if( retval == custom_encoding_e )
      {
      fprintf(stderr, "Bum encoding in format_for_display_internal\n");
      abort();
      }
!   return retval;
    }
  
  static int
  compare_88( const char    *list,
              const char    *list_e,
              bool           fig_const,
!       const cblc_field_t  *conditional,
!             unsigned char *conditional_location,
!             int            conditional_length)
    {
!   charmap_t *charmap = __gg__get_charmap(conditional->encoding);
!   int list_len = (int)(list_e-list);
    int test_len;
    char *test;
    if( fig_const )
      {
!     // We are working with a figurative constant
  
      test = static_cast<char *>(malloc(conditional_length));
      massert(test);
      test_len = conditional_length;
      // This is where we handle the zero-length strings that
      // nonetheless can magically be expanded into figurative
      // constants:
  
!     int ch = charmap->mapped_character(ascii_space);
      // Check for the strings starting with 0xFF whose second character
      // indicates a figurative constant:
!     if( list[0] == ascii_Z )
        {
        ch = charmap->mapped_character(ascii_0);
        }
!     else if( list[0] == ascii_H )
        {
        ch = charmap->high_value_character();
        }
!     else if( list[0] == ascii_Q )
        {
        ch = charmap->quote_character();
        }
!     else if( list[0] == ascii_L )
        {
        ch = charmap->low_value_character();
        }
!     memset( test, ch, conditional_length );
      }
    else if( list_len < conditional_length )
      {
!     // 'list' is too short; we have to right-fill with spaces:
      test = static_cast<char *>(malloc(conditional_length));
      massert(test);
      test_len = conditional_length;
!     memset(test, charmap->mapped_character(ascii_space), conditional_length);
      memcpy(test, list, list_len);
      }
    else
      {
      test = static_cast<char *>(malloc(list_len));
      massert(test);
      test_len = list_len;
      memcpy(test, list, list_len);
      }
  
!   int cmpval;
! 
!   if( test[0] == NULLCH && conditional_location[0] == 0)
!     {
!     cmpval = 0;
!     }
!   else
!     {
!     cmpval = cstrncmp (test,
!                       PTRCAST(char, conditional_location),
!                       conditional_length);
  
! //    if( cmpval == 0 && (int)strlen(test) != conditional_length )
!     if( cmpval == 0 && test_len != conditional_length )
!       {
!       // When strncmp returns 0, the actual smaller string is the
!       // the shorter of the two:
!       cmpval = test_len - conditional_length;
!       }
!     }
  
    free(test);
  
-   if( cmpval < 0 )
-     {
-     cmpval = -1;
-     }
-   else if(cmpval > 0)
-     {
-     cmpval = +1;
-     }
    return cmpval;
    }
  
--- 3762,3890 ----
      }
  
    done:
!   if( enc_dest == custom_encoding_e )
      {
      fprintf(stderr, "Bum encoding in format_for_display_internal\n");
      abort();
      }
!   return enc_dest;
    }
  
  static int
  compare_88( const char    *list,
              const char    *list_e,
              bool           fig_const,
!       const cblc_field_t  *conditional_,
!       const unsigned char *conditional_location_,
!             int            conditional_length_)
    {
!   int cmpval;
! 
!   // We know that list through list_e are characters in UTF32 encoding.
!   size_t list_len = list_e-list;
! 
!   // We need to convert the conditional to be UTF32 as well:
!   charmap_t *charmap = __gg__get_charmap(DEFAULT_32_ENCODING);
!   size_t stride = charmap->stride();
!   cbl_char_t mapped_space = charmap->mapped_character(ascii_space);
! 
!   // First, convert the conditional to UTF32
!   size_t conditional_length=0;
!   char * conditional_i = __gg__miconverter(
!                                 conditional_->encoding,
!                                 DEFAULT_32_ENCODING,
!                                 conditional_location_,
!                                 conditional_length_,
!                                 &conditional_length);
!   const char *conditional = conditional_i;
! 
!   // Now we want to trim away trailing spaces from the conditional, leaving
!   // just one so that we don't get down to an empty string.
!   while( conditional_length > stride)
!     {
!     cbl_char_t ch = charmap->getch(conditional, conditional_length - stride);
!     if( ch != mapped_space )
!       {
!       break;
!       }
!     conditional_length -= stride;
!     }
! 
!   // We have conditional_length bytes at conditional.  Create a test area that
!   // we will compare against conditional:
! 
    int test_len;
    char *test;
    if( fig_const )
      {
!     // The 'list' is a figurative constant, so we need to create a test
!     // buffer that is all the character designated by the figurative constant.
  
      test = static_cast<char *>(malloc(conditional_length));
      massert(test);
      test_len = conditional_length;
+ 
      // This is where we handle the zero-length strings that
      // nonetheless can magically be expanded into figurative
      // constants:
  
!     // We default to space, since we know that the figurative constant is
!     // S, Z, H, Q, or L
!     cbl_char_t ch = charmap->mapped_character(ascii_space);
      // Check for the strings starting with 0xFF whose second character
      // indicates a figurative constant:
!     cbl_char_t char_0 = charmap->getch(list, (size_t)0);
!     if( char_0 == charmap->mapped_character(ascii_Z) )
        {
        ch = charmap->mapped_character(ascii_0);
        }
!     else if( char_0 == charmap->mapped_character(ascii_H) )
        {
        ch = charmap->high_value_character();
        }
!     else if( char_0 == charmap->mapped_character(ascii_Q) )
        {
        ch = charmap->quote_character();
        }
!     else if( char_0 == charmap->mapped_character(ascii_L) )
        {
        ch = charmap->low_value_character();
        }
!     // The test location is full of the figurative constant
!     charmap->memset( test, ch, conditional_length );
      }
    else if( list_len < conditional_length )
      {
!     // 'list' element is too short; we have to right-fill with spaces:
      test = static_cast<char *>(malloc(conditional_length));
      massert(test);
      test_len = conditional_length;
!     // Copy over the shorty string from 'list'
      memcpy(test, list, list_len);
+     // Right fill with spaces:
+     charmap->memset(test+list_len,
+                     charmap->mapped_character(ascii_space),
+                     conditional_length-list_len);
      }
    else
      {
+     // list_len is >= conditional length.  Presumably the parser ensured that
+     // the list element couldn't be bigger than the maximum condition length,
+     // we we'll truncate at list_len:
      test = static_cast<char *>(malloc(list_len));
      massert(test);
      test_len = list_len;
      memcpy(test, list, list_len);
      }
  
!   // At this point we have conditional and test, and they both have at least
!   // test_len bytes.
  
!   cmpval = memcmp(test, conditional, test_len);
  
    free(test);
+   free(conditional_i);
  
    return cmpval;
    }
  
*************** get_float128( const cblc_field_t *field,
*** 3697,3736 ****
      }
    else if( field->type == FldLiteralN )
      {
!     if( __gg__decimal_point == '.' )
        {
!       size_t charsout;
!       char *converted = __gg__iconverter(field->encoding,
!                                          DEFAULT_SOURCE_ENCODING,
!                                          field->initial,
!                                          strlen(field->initial),
!                                          &charsout);
!       retval = strtofp128(converted, NULL);
!       }
!     else
        {
!       // We need to replace any commas with periods
!       static size_t size = 128;
!       static char *buffer = static_cast<char *>(malloc(size));
!       while( strlen(field->initial)+1 > size )
          {
!         size *= 2;
!         buffer = static_cast<char *>(malloc(size));
          }
!       massert(buffer);
!       strcpy(buffer, field->initial);
!       char *p = strchr(buffer, ',');
!       if(p)
          {
!         *p = '.';
          }
-       retval = strtofp128(buffer, NULL);
        }
!     }
!   else
!     {
!     fprintf(stderr, "What's all this then?\n");
!     abort();
      }
    return retval;
    }
--- 3913,3979 ----
      }
    else if( field->type == FldLiteralN )
      {
!     union
        {
!       __int128 i128;
!       uint64_t u64;
!       uint32_t u32;
!       uint16_t u16;
!       uint8_t  u8 ;
!       int64_t  i64;
!       int32_t  i32;
!       int16_t  i16;
!       int8_t   i8 ;
!       };
!     i128 = 0;
!     memcpy(&i128, field->data, field->capacity);
! 
!     if( field->attr & signable_e )
        {
!       switch(field->capacity)
          {
!         case 16:
!           retval = i128;
!           break;
!         case 8:
!           retval = i64;
!           break;
!         case 4:
!           retval = i32;
!           break;
!         case 2:
!           retval = i16;
!           break;
!         case 1:
!           retval = i8;
!           break;
          }
!       }
!     else
!       {
!       switch(field->capacity)
          {
!         case 16:
!           retval = i128;
!           break;
!         case 8:
!           retval = u64;
!           break;
!         case 4:
!           retval = u32;
!           break;
!         case 2:
!           retval = u16;
!           break;
!         case 1:
!           retval = u8;
!           break;
          }
        }
!     if( field->rdigits )
!       {
!       retval /= __gg__power_of_ten( field->rdigits );
!       }
      }
    return retval;
    }
*************** compare_field_class(const cblc_field_t
*** 3746,3753 ****
    __int128 value;
    int rdigits;
  
!   // list->initial points to a superstring: a double-null terminated
!   // string containing pairs of strings.  We are looking for equality.
  
    switch( conditional->type )
      {
--- 3989,4000 ----
    __int128 value;
    int rdigits;
  
!   charmap_t *charmap32 = __gg__get_charmap(DEFAULT_32_ENCODING);
!   int stride32 = charmap32->stride();
!   cbl_char_t mapped_F = charmap32->mapped_character(ascii_F);
!   cbl_char_t mapped_Z = charmap32->mapped_character(ascii_Z);
! 
!   // We are disassembling strings that have the form <length><flag><value>
  
    switch( conditional->type )
      {
*************** compare_field_class(const cblc_field_t
*** 3762,3795 ****
                                        conditional,
                                        conditional_location,
                                        conditional_length);
!       const char *walker = list->initial;
        while(*walker)
          {
!         char   left_flag;
          size_t left_len;
!         char * left;
  
!         char   right_flag;
          size_t right_len;
!         char * right;
  
          char *pend;
-         left_len = strtoull(walker, &pend, 10);
-         left_flag = *pend;
-         left = pend+1;
  
!         right = left + left_len;
!         right_len = strtoull(right, &pend, 10);
!         right_flag = *pend;
!         right = pend+1;
  
!         walker = right + right_len;
  
          int left_rdigits;
          int right_rdigits;
  
          __int128 left_value;
!         if( left_flag == 'F' && left[0] == 'Z' )
            {
            left_value = 0;
            left_rdigits = 0;
--- 4009,4044 ----
                                        conditional,
                                        conditional_location,
                                        conditional_length);
!       char *walker = list->initial;
        while(*walker)
          {
!         cbl_char_t left_flag;
          size_t left_len;
!         char *left;
  
!         cbl_char_t right_flag;
          size_t right_len;
!         char *right;
  
          char *pend;
  
!         left_len = charmap32->strtoull(walker, &pend, 10);
!         left_flag = charmap32->getch(pend, (size_t)0);
!         left = pend+stride32;
  
!         right = left + left_len*stride32;
!         right_len = charmap32->strtoull(right, &pend, 10);
!         right_flag = charmap32->getch(pend, (size_t)0);
!         right = pend+stride32;
! 
!         walker = right + right_len*stride32;
  
          int left_rdigits;
          int right_rdigits;
  
          __int128 left_value;
!         cbl_char_t left_0 = charmap32->getch(left, size_t(0));
!         if( left_flag == mapped_F && left_0 == mapped_Z )
            {
            left_value = 0;
            left_rdigits = 0;
*************** compare_field_class(const cblc_field_t
*** 3798,3810 ****
            {
            left_value = __gg__dirty_to_binary(
                                    left,
!                                   conditional->encoding,
!                                   left_len,
                                    &left_rdigits);
            }
  
          __int128 right_value;
!         if( right_flag == 'F' && right[0] == 'Z' )
            {
            right_value = 0;
            right_rdigits = 0;
--- 4047,4060 ----
            {
            left_value = __gg__dirty_to_binary(
                                    left,
!                                   DEFAULT_32_ENCODING,
!                                   left_len*stride32,
                                    &left_rdigits);
            }
  
          __int128 right_value;
!         cbl_char_t right_0 = charmap32->getch(right, size_t(0));
!         if( right_flag == ascii_F && right_0 == mapped_Z )
            {
            right_value = 0;
            right_rdigits = 0;
*************** compare_field_class(const cblc_field_t
*** 3813,3820 ****
            {
            right_value = __gg__dirty_to_binary(
                                     right,
!                                    conditional->encoding,
!                                    right_len,
                                     &right_rdigits);
            }
  
--- 4063,4070 ----
            {
            right_value = __gg__dirty_to_binary(
                                     right,
!                                    DEFAULT_32_ENCODING,
!                                    right_len*stride32,
                                     &right_rdigits);
            }
  
*************** compare_field_class(const cblc_field_t
*** 3847,3852 ****
--- 4097,4104 ----
      case FldAlphanumeric:
      case FldLiteralA:
        {
+       // This is an alphanumeric comparison.  The list is in UTF32, so we
+       // are going to have to convert the conditional to UTF32.
        char *walker = list->initial;
        while(*walker)
          {
*************** compare_field_class(const cblc_field_t
*** 3861,3878 ****
  
          char *pend;
  
          first = walker;
!         first_len = strtoull(first, &pend, 10);
!         fig1 = *pend == 'F';
!         first = pend+1;
!         first_e = first + first_len;
  
          last = first_e;
  
!         last_len = strtoull(last, &pend, 10);
!         fig2 = *pend == 'F';
!         last = pend+1;
!         last_e = last + last_len;
  
          walker = last_e;
  
--- 4113,4134 ----
  
          char *pend;
  
+         cbl_char_t ch;
+ 
          first = walker;
!         first_len = charmap32->strtoull(first, &pend, 10);
!         ch = charmap32->getch(pend, (size_t)0);
!         fig1 = ch == mapped_F;
!         first = pend+stride32;
!         first_e = first + first_len*stride32;
  
          last = first_e;
  
!         last_len = charmap32->strtoull(last, &pend, 10);
!         ch = charmap32->getch(pend, (size_t)0);
!         fig2 = ch == mapped_F;
!         last = pend+stride32;
!         last_e = last + last_len*stride32;
  
          walker = last_e;
  
*************** compare_field_class(const cblc_field_t
*** 3910,3941 ****
  
      case FldFloat:
        {
        GCOB_FP128 fp128 = get_float128(conditional, conditional_location) ;
!       const char *walker = list->initial;
        while(*walker)
          {
!         char   left_flag;
          size_t left_len;
          char * left;
  
!         char   right_flag;
          size_t right_len;
          char * right;
  
          char *pend;
!         left_len = strtoull(walker, &pend, 10);
!         left_flag = *pend;
!         left = pend+1;
  
!         right = left + left_len;
!         right_len = strtoull(right, &pend, 10);
!         right_flag = *pend;
!         right = pend+1;
  
!         walker = right + right_len;
  
          GCOB_FP128 left_value;
!         if( left_flag == ascii_F && left[0] == ascii_Z )
            {
            left_value = 0;
            }
--- 4166,4203 ----
  
      case FldFloat:
        {
+       // We need a fake field to hold the encoding for the
+       // __gg__dirty_to_float() routine.
+       cblc_field_t fakir;
+       fakir.encoding = DEFAULT_32_ENCODING;
+ 
        GCOB_FP128 fp128 = get_float128(conditional, conditional_location) ;
!       char *walker = list->initial;
        while(*walker)
          {
!         cbl_char_t   left_flag;
          size_t left_len;
          char * left;
  
!         cbl_char_t   right_flag;
          size_t right_len;
          char * right;
  
          char *pend;
!         left_len = charmap32->strtoull(walker, &pend, 10);
!         left_flag = charmap32->getch(pend, (size_t)0);
!         left = pend+stride32;
  
!         right = left + left_len*stride32;
!         right_len = charmap32->strtoull(right, &pend, 10);
!         right_flag = charmap32->getch(pend, (size_t)0);
!         right = pend+stride32;
  
!         walker = right + right_len*stride32;
  
          GCOB_FP128 left_value;
!         if( left_flag == mapped_F
!             && charmap32->getch(left, (size_t)0) == mapped_Z )
            {
            left_value = 0;
            }
*************** compare_field_class(const cblc_field_t
*** 3943,3953 ****
            {
            left_value = __gg__dirty_to_float(left,
                                              left_len,
!                                             conditional);
            }
  
          GCOB_FP128 right_value;
!         if( right_flag == 'F' && right[0] == 'Z' )
            {
            right_value = 0;
            }
--- 4205,4216 ----
            {
            left_value = __gg__dirty_to_float(left,
                                              left_len,
!                                             &fakir);
            }
  
          GCOB_FP128 right_value;
!         if( right_flag == mapped_F
!             && charmap32->getch(right, (size_t)0) == mapped_Z )
            {
            right_value = 0;
            }
*************** compare_field_class(const cblc_field_t
*** 3955,3961 ****
            {
            right_value = __gg__dirty_to_float( right,
                                                right_len,
!                                               conditional);
            }
  
          if( left_value <= fp128 && fp128 <= right_value )
--- 4218,4224 ----
            {
            right_value = __gg__dirty_to_float( right,
                                                right_len,
!                                               &fakir);
            }
  
          if( left_value <= fp128 && fp128 <= right_value )
*************** local_is_alpha(int type, bool address_of
*** 4036,4137 ****
    return retval;
    }
  
  static
  int
! compare_strings(const char   *left_string,
!                 size_t        left_length,
!                 bool          left_all,
!                 const char   *right_string,
!                 size_t        right_length,
!                 bool          right_all,
!                 cbl_encoding_t encoding)
    {
    int retval = 0;
!   size_t i = 0;
  
    if( right_all && right_length > left_length )
      {
!     // In the rubber-bandy ALL situation, and the ALL is longer than the
!     // fixed side, we just compare the characters of the fixed side:
      right_length = left_length;
      }
  
    if( left_all && left_length > right_length )
      {
      left_length = right_length;
      }
  
!   while( !retval && i<left_length && i<right_length )
      {
!     unsigned int chl = collated((unsigned char)left_string[i]);
!     unsigned int chr = collated((unsigned char)right_string[i]);
!     retval = chl - chr;
!     i += 1;
      }
  
    // We need to space-extend the shorter value.  That's because
    // "Bob" is equal to "Bob     "
    if( !right_all )
      {
!     charmap_t *charmap = __gg__get_charmap(encoding);
!     while( !retval && i<left_length )
        {
!       retval = collated((unsigned char)left_string[i])
!                - collated(charmap->mapped_character(ascii_space));
!       i += 1;
        }
      }
    else
      {
      // In an ALL situation where the ALL is shorter than the fixed side, we
      // wrap around the ALL characters
!     while( !retval && i<left_length )
        {
!       retval = collated((unsigned char)left_string[i])
!                - collated((unsigned char)right_string[i%right_length]);
!       i += 1;
        }
      }
  
    if( !left_all )
      {
!     charmap_t *charmap = __gg__get_charmap(encoding);
!     while( !retval && i<right_length )
        {
!       retval = collated(charmap->mapped_character(ascii_space))
!                - collated((unsigned char)right_string[i]);
!       i += 1;
        }
      }
    else
      {
!     if( left_length > right_length )
!       {
!       left_length = right_length;
!       }
!     while( !retval && i<right_length )
        {
!       retval = collated((unsigned char)left_string[i%left_length])
!                - collated((unsigned char)right_string[i]);
!       i += 1;
        }
      }
    return retval;
    }
  
  extern "C"
  int
! __gg__compare_2(cblc_field_t *left_side,
!                 unsigned char   *left_location,
!                 size_t  left_length,
!                 int     left_attr,
!                 int     left_flags,
!                 cblc_field_t *right_side,
!                 unsigned char   *right_location,
!                 size_t  right_length,
!                 int     right_attr,
!                 int     right_flags,
!                 int     second_time_through)
    {
    // First order of business:  If right_side is a FldClass, pass that off
    // to the speciality squad:
--- 4299,4511 ----
    return retval;
    }
  
+ static void
+ interconvert( char **allocated_left,
+               char **allocated_right,
+               char **left_string,
+               char **right_string,
+               size_t *left_length,
+               size_t *right_length,
+               cbl_encoding_t *encoding_left,
+               cbl_encoding_t *encoding_right)
+   {
+   // This routine looks at two encodings and decides what do to about comparing
+   // apples to apples.
+   *allocated_left  = nullptr;
+   *allocated_right = nullptr;
+ 
+   bool convert_left_to_right = false;
+   bool convert_right_to_left = false;
+ 
+   size_t converted_length;
+   const char *converted;
+   if( *encoding_left == *encoding_right )
+     {
+     // This is both the most-seen situation, and, happily, the easiest to
+     // handle.  We just do nothing.
+     }
+   else if(   *encoding_left  == __gg__national_encoding
+           || *encoding_right == __gg__national_encoding )
+     {
+     // The encodings are different, but at least one is the national encoding.
+     // Convert the other one to be national as well:
+     if( *encoding_left != __gg__national_encoding )
+       {
+       convert_left_to_right = true;
+       }
+     else
+       {
+       convert_right_to_left = true;
+       }
+     }
+   else
+     {
+     // We have two different encodings, and neither of them are national.  This
+     // can happen when a file descriptor has a specific codeset that doesn't
+     // match the national codeset.  We will convert the narrower to the wider;
+     // if they are both the same width we will pick one arbitrarily.
+     const charmap_t *charmap_left  = __gg__get_charmap(*encoding_left);
+     const charmap_t *charmap_right = __gg__get_charmap(*encoding_right);
+     if( charmap_right->stride() >= charmap_left->stride() )
+       {
+       convert_left_to_right = true;
+       }
+     else
+       {
+       convert_right_to_left = true;
+       }
+     }
+ 
+   if( convert_left_to_right )
+     {
+     // Convert the left side to the right encoding
+     converted = __gg__iconverter(*encoding_left,
+                                  *encoding_right,
+                                  *left_string,
+                                  *left_length,
+                                  &converted_length);
+     *encoding_left = *encoding_right ;
+     *allocated_left = static_cast<char *>(malloc(converted_length));
+     massert(*allocated_left);
+     *left_string = *allocated_left;
+     *left_length = converted_length;
+     memcpy(*left_string, converted, *left_length);
+     }
+   if( convert_right_to_left )
+     {
+     // Convert the right side to the left_encoding
+     converted = __gg__iconverter(*encoding_right,
+                                  *encoding_left,
+                                  *right_string,
+                                  *right_length,
+                                  &converted_length);
+     *encoding_right = *encoding_left ;
+     *allocated_right = static_cast<char *>(malloc(converted_length));
+     massert(*allocated_right);
+     *right_string = *allocated_right;
+     *right_length = converted_length;
+     memcpy(right_string, converted, *right_length);
+     }
+   }
+ 
  static
  int
! compare_strings(char   *left_string,
!                 size_t  left_length,
!                 bool    left_all,
!                 char   *right_string,
!                 size_t  right_length,
!                 bool    right_all,
!                 cbl_encoding_t encoding_left,
!                 cbl_encoding_t encoding_right)
    {
+   // This routine compares two strings.  It sounds innocent enough, right? But
+   // we have to deal with different encodings.  It's not clear what the rules
+   // are, or should be, and collation is just a mess.  We are going to be
+   // playing Whac-A-Mole with this routine, possibly until the end of time.
+ 
+   char *allocated_left  = nullptr;
+   char *allocated_right = nullptr;
+ 
+   interconvert(&allocated_left,
+                &allocated_right,
+                &left_string,
+                &right_string,
+                &left_length,
+                &right_length,
+                &encoding_left,
+                &encoding_right);
+ 
+   charmap_t *charmap_left  = __gg__get_charmap(encoding_left);
+   charmap_t *charmap_right = __gg__get_charmap(encoding_right);
+ 
    int retval = 0;
!   size_t index_left  = 0;
!   size_t index_right = 0;
  
    if( right_all && right_length > left_length )
      {
!     // If the right side is ALL, and is longer than the left side, we just
!     // compare the matching characters.
      right_length = left_length;
      }
  
    if( left_all && left_length > right_length )
      {
+     // If the left side is ALL, and is longer than the right side, we just
+     // compare the matching characters.
      left_length = right_length;
      }
  
!   while( !retval && index_left<left_length && index_right<right_length )
      {
!     cbl_char_t ch_left  = charmap_left->getch(left_string, &index_left);
!     cbl_char_t ch_right = charmap_right->getch(right_string, &index_right);
!     retval = uber_compare(ch_left, ch_right);
      }
  
    // We need to space-extend the shorter value.  That's because
    // "Bob" is equal to "Bob     "
    if( !right_all )
      {
!     while( !retval && index_left<left_length )
        {
!       cbl_char_t ch_left  = charmap_left->getch(left_string, &index_left);
!       cbl_char_t ch_right = charmap_right->mapped_character(ascii_space);
!       retval = uber_compare(ch_left, ch_right);
        }
      }
    else
      {
      // In an ALL situation where the ALL is shorter than the fixed side, we
      // wrap around the ALL characters
!     while( !retval && index_left<left_length )
        {
!       index_right %= right_length;
!       cbl_char_t ch_left  = charmap_left->getch(left_string, &index_left);
!       cbl_char_t ch_right = charmap_right->getch(right_string, &index_right);
!       retval = uber_compare(ch_left, ch_right);
        }
      }
  
    if( !left_all )
      {
!     while( !retval && index_right<right_length )
        {
!       cbl_char_t ch_left  = charmap_left->mapped_character(ascii_space);
!       cbl_char_t ch_right = charmap_right->getch(right_string, &index_right);
!       retval = uber_compare(ch_left, ch_right);
        }
      }
    else
      {
!     while( !retval && index_right<right_length )
        {
!       index_left %= left_length;
!       cbl_char_t ch_left  = charmap_left->mapped_character(ascii_space);
!       cbl_char_t ch_right = charmap_right->getch(right_string, &index_right);
!       retval = uber_compare(ch_left, ch_right);
        }
      }
+ 
+   free(allocated_right);
+   free(allocated_left);
    return retval;
    }
  
  extern "C"
  int
! __gg__compare_2(cblc_field_t  *left_side,
!                 unsigned char *left_location,
!                 size_t         left_length,
!                 uint64_t       left_attr,
!                 int            left_flags,
!                 cblc_field_t  *right_side,
!                 unsigned char *right_location,
!                 size_t         right_length,
!                 uint64_t       right_attr,
!                 int            right_flags,
!                 int            second_time_through)
    {
    // First order of business:  If right_side is a FldClass, pass that off
    // to the speciality squad:
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4160,4175 ****
    cbl_encoding_t encoding_right = right_side->encoding;
    charmap_t *charmap_left  = __gg__get_charmap(encoding_left);
    charmap_t *charmap_right = __gg__get_charmap(encoding_right);
  
    // Figure out if we have any figurative constants
    cbl_figconst_t left_figconst  = (cbl_figconst_t)(left_attr  & FIGCONST_MASK);
    cbl_figconst_t right_figconst = (cbl_figconst_t)(right_attr & FIGCONST_MASK);
  
!   unsigned int fig_left  = 0;
!   unsigned int fig_right = 0;
  
!   fig_left  = charmap_left->figconst_character(left_figconst);
!   fig_right = charmap_right->figconst_character(right_figconst);
  
    // We have four high-level conditions to consider depending on whether
    // left and/or right are figurative constants:
--- 4534,4556 ----
    cbl_encoding_t encoding_right = right_side->encoding;
    charmap_t *charmap_left  = __gg__get_charmap(encoding_left);
    charmap_t *charmap_right = __gg__get_charmap(encoding_right);
+   int stride = charmap_left->stride();
  
    // Figure out if we have any figurative constants
    cbl_figconst_t left_figconst  = (cbl_figconst_t)(left_attr  & FIGCONST_MASK);
    cbl_figconst_t right_figconst = (cbl_figconst_t)(right_attr & FIGCONST_MASK);
  
!   cbl_char_t fig_left  = 0;
!   cbl_char_t fig_right = 0;
  
!   if( left_figconst )
!     {
!     fig_left  = charmap_left->figconst_character(left_figconst);
!     }
!   if( right_figconst )
!     {
!     fig_right = charmap_right->figconst_character(right_figconst);
!     }
  
    // We have four high-level conditions to consider depending on whether
    // left and/or right are figurative constants:
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4180,4186 ****
    if( left_figconst && right_figconst )
      {
      // We are comparing two figurative constants
!     retval = collated(fig_left) - collated(fig_right);
      compare = true;
      goto fixup_retval;
      }
--- 4561,4567 ----
    if( left_figconst && right_figconst )
      {
      // We are comparing two figurative constants
!     retval = uber_compare(fig_left, fig_right);
      compare = true;
      goto fixup_retval;
      }
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4211,4224 ****
        case quote_value_e:
        case space_value_e:
          retval = 0;
!         for(size_t i=0; i<left_length; i++)
            {
!           // The right side is a figurative constant.  Compare the left side
!           // to the appropriate constant.
!           unsigned int fig_of_left =
                               charmap_left->figconst_character(right_figconst);
!           retval = collated((unsigned int)left_location[i])
!                    - collated(fig_of_left);
            if( retval )
              {
              break;
--- 4592,4606 ----
        case quote_value_e:
        case space_value_e:
          retval = 0;
!         for(size_t i=0; i<left_length; i+=stride)
            {
!           // The right side is a figurative constant.  Compare data from the
!           // left side to the figurative constant from the right converted to
!           // the left encoding:
!           cbl_char_t fig_of_right =
                               charmap_left->figconst_character(right_figconst);
!           cbl_char_t left_ch = charmap_left->getch(left_location, i);
!           retval = uber_compare(left_ch, fig_of_right);
            if( retval )
              {
              break;
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4271,4282 ****
            default:
              // We are comparing a alphanumeric string to ZEROES
              retval = 0;
!             for(size_t i=0; i<left_length; i++)
                {
!               unsigned int fig_of_left =
                               charmap_left->figconst_character(right_figconst);
!               retval = collated((unsigned int)left_location[i])
!                        - collated(fig_of_left);
                if( retval )
                  {
                  break;
--- 4653,4664 ----
            default:
              // We are comparing a alphanumeric string to ZEROES
              retval = 0;
!             for(size_t i=0; i<left_length; i+=stride)
                {
!               unsigned int fig_of_right =
                               charmap_left->figconst_character(right_figconst);
!               cbl_char_t ch_left = charmap_left->getch(left_location, i);
!               retval = uber_compare(ch_left, fig_of_right);
                if( retval )
                  {
                  break;
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4300,4320 ****
      if(    local_is_alpha(left_side->type,  left_address_of)
          && local_is_alpha(right_side->type, right_address_of) )
        {
!       if( encoding_left != encoding_right )
          {
!         fprintf(stderr, "We don't yet know how to compare strings of different encodings\n");
!         fprintf(stderr, "Let Dubner and Lowden of cobolworx know about this\n");
!         abort();
          }
- 
        retval = compare_strings(   reinterpret_cast<char *>(left_location),
                                    left_length,
                                    left_all,
                                    reinterpret_cast<char *>(right_location),
                                    right_length,
                                    right_all,
!                                   encoding_left
!                                   );
  
        compare = true;
        goto fixup_retval;
--- 4682,4699 ----
      if(    local_is_alpha(left_side->type,  left_address_of)
          && local_is_alpha(right_side->type, right_address_of) )
        {
!       if( (left_side->attr | right_side->attr) & hex_encoded_e )
          {
!         encoding_left = encoding_right = iconv_CP1252_e;
          }
        retval = compare_strings(   reinterpret_cast<char *>(left_location),
                                    left_length,
                                    left_all,
                                    reinterpret_cast<char *>(right_location),
                                    right_length,
                                    right_all,
!                                   encoding_left,
!                                   encoding_right );
  
        compare = true;
        goto fixup_retval;
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4344,4382 ****
  
          if( right_side->type == FldLiteralN)
            {
            // In order to do the comparision, we need the value from the
            // literal to be the same flavor as the left side:
-           // We need to replace any commas with periods
-           static size_t size = 128;
-           static char *buffer = static_cast<char *>(malloc(size));
-           while( strlen(right_side->initial)+1 > size )
-             {
-             size *= 2;
-             buffer = static_cast<char *>(malloc(size));
-             }
-           massert(buffer);
-           strcpy(buffer, right_side->initial);
- 
-           if( __gg__decimal_point == ',' )
-             {
-             // We are operating in DECIMAL IS COMMA mode, so we need to
-             // replace any commas with periods.
-             char *p = strchr(buffer, ',');
-             if(p)
-               {
-               *p = '.';
-               }
-             }
- 
-           // buffer[] now contains the right-side string we want to convert
-           // to one of the floating-point types.  We want them to be the
-           // same size:
            switch(left_side->capacity)
              {
              case 4:
                {
                _Float32 left_value4  = *PTRCAST(_Float32, left_location);
!               _Float32 right_value4 = strtof(buffer, NULL);
                retval = 0;
                retval = left_value4 < right_value4 ? -1 : retval;
                retval = left_value4 > right_value4 ?  1 : retval;
--- 4723,4737 ----
  
          if( right_side->type == FldLiteralN)
            {
+           right_value = get_float128(right_side, right_location);
            // In order to do the comparision, we need the value from the
            // literal to be the same flavor as the left side:
            switch(left_side->capacity)
              {
              case 4:
                {
                _Float32 left_value4  = *PTRCAST(_Float32, left_location);
!               _Float32 right_value4 = (_Float32)right_value;
                retval = 0;
                retval = left_value4 < right_value4 ? -1 : retval;
                retval = left_value4 > right_value4 ?  1 : retval;
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4385,4391 ****
              case 8:
                {
                _Float64 left_value8  = *PTRCAST(_Float64, left_location);
!               _Float64 right_value8 = strtod(buffer, NULL);
                retval = 0;
                retval = left_value8 < right_value8 ? -1 : retval;
                retval = left_value8 > right_value8 ?  1 : retval;
--- 4740,4746 ----
              case 8:
                {
                _Float64 left_value8  = *PTRCAST(_Float64, left_location);
!               _Float64 right_value8 = (_Float64)right_value;
                retval = 0;
                retval = left_value8 < right_value8 ? -1 : retval;
                retval = left_value8 > right_value8 ?  1 : retval;
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4396,4402 ****
                //_Float128 left_value  = *(_Float128 *)left_location;
                GCOB_FP128 left_value16;
                memcpy(&left_value16, left_location, 16);
!               GCOB_FP128 right_value16 = strtofp128(buffer, NULL);
                retval = 0;
                retval = left_value16 < right_value16 ? -1 : retval;
                retval = left_value16 > right_value16 ?  1 : retval;
--- 4751,4757 ----
                //_Float128 left_value  = *(_Float128 *)left_location;
                GCOB_FP128 left_value16;
                memcpy(&left_value16, left_location, 16);
!               GCOB_FP128 right_value16 = right_value;
                retval = 0;
                retval = left_value16 < right_value16 ? -1 : retval;
                retval = left_value16 > right_value16 ?  1 : retval;
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4484,4496 ****
  
        if( right_refmod )
          {
          retval = compare_strings(   reinterpret_cast<char *>(left_location),
                                      left_length,
                                      left_all,
                                      reinterpret_cast<char *>(right_location),
                                      right_length,
                                      right_all,
!                                     left_side->encoding);
          compare = true;
          goto fixup_retval;
          }
--- 4839,4856 ----
  
        if( right_refmod )
          {
+         if( (left_side->attr | right_side->attr) & hex_encoded_e )
+           {
+           encoding_left = encoding_right = iconv_CP1252_e;
+           }
          retval = compare_strings(   reinterpret_cast<char *>(left_location),
                                      left_length,
                                      left_all,
                                      reinterpret_cast<char *>(right_location),
                                      right_length,
                                      right_all,
!                                     left_side->encoding,
!                                     right_side->encoding );
          compare = true;
          goto fixup_retval;
          }
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4521,4527 ****
                                                           right_location,
                                                           right_length,
                                                           0);
! 
        if( encoding_formatted != encoding_left )
          {
          // The encodings are not the same.  We need to convert the right_string
--- 4881,4887 ----
                                                           right_location,
                                                           right_length,
                                                           0);
!       size_t right_string_length = strlen(right_string);
        if( encoding_formatted != encoding_left )
          {
          // The encodings are not the same.  We need to convert the right_string
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4530,4538 ****
          const char *converted = __gg__iconverter(encoding_formatted,
                                                   encoding_left,
                                                   right_string,
!                                                  strlen(right_string),
                                                   &outsize);
          memcpy(right_string, converted, outsize);
          }
  
        // There is a tricky aspect to comparing an alphanumeric to
--- 4890,4899 ----
          const char *converted = __gg__iconverter(encoding_formatted,
                                                   encoding_left,
                                                   right_string,
!                                                  right_string_length,
                                                   &outsize);
          memcpy(right_string, converted, outsize);
+         right_string_length = outsize;
          }
  
        // There is a tricky aspect to comparing an alphanumeric to
*************** __gg__compare_2(cblc_field_t *left_side,
*** 4543,4572 ****
        // considered a "pseudo-move", and the rule for moving a negative
        // number to an alphanumeric is that negative signs get stripped off
  
!       if(    *left_location == charmap_left->mapped_character(ascii_plus)
!           || *left_location == charmap_left->mapped_character(ascii_minus)  )
          {
!         left_location += 1;
!         left_length -= 1;
          }
  
!       const char *right_fixed;
!       if(  *right_string == charmap_right->mapped_character(ascii_plus)
!         || *right_string == charmap_right->mapped_character(ascii_minus)  )
          {
!         right_fixed = right_string + 1;
          }
        else
          {
          right_fixed = right_string;
          }
  
        retval = compare_strings(   reinterpret_cast<char *>(left_location),
                                    left_length,
                                    left_all,
                                    right_fixed,
!                                   strlen(right_fixed),
                                    right_all,
                                    encoding_left);
        compare = true;
        goto fixup_retval;
--- 4904,4941 ----
        // considered a "pseudo-move", and the rule for moving a negative
        // number to an alphanumeric is that negative signs get stripped off
  
!       cbl_char_t left_ch = charmap_left->getch(left_location, size_t(0));
!       if(    left_ch == charmap_left->mapped_character(ascii_plus)
!           || left_ch == charmap_left->mapped_character(ascii_minus)  )
          {
!         left_location += charmap_left->stride();
!         left_length -= charmap_left->stride();
          }
  
!       char *right_fixed;
!       cbl_char_t right_ch = charmap_right->getch(right_string, size_t(0));
!       if(  right_ch == charmap_right->mapped_character(ascii_plus)
!         || right_ch == charmap_right->mapped_character(ascii_minus)  )
          {
!         right_fixed = right_string + charmap_right->stride();
!         right_string_length -= charmap_right->stride();
          }
        else
          {
          right_fixed = right_string;
          }
  
+       if( (left_side->attr | right_side->attr) & hex_encoded_e )
+         {
+         encoding_left = encoding_right = iconv_CP1252_e;
+         }
        retval = compare_strings(   reinterpret_cast<char *>(left_location),
                                    left_length,
                                    left_all,
                                    right_fixed,
!                                   right_string_length,
                                    right_all,
+                                   encoding_left,
                                    encoding_left);
        compare = true;
        goto fixup_retval;
*************** struct for_sort_table
*** 4704,4710 ****
  static for_sort_table sorter;
  
  static int
! compare_two_records(unsigned char *range1, unsigned char *range2)
    {
    int retval = 0;
  
--- 5073,5080 ----
  static for_sort_table sorter;
  
  static int
! compare_two_records(unsigned char *range1,
!                     unsigned char *range2)
    {
    int retval = 0;
  
*************** compare_two_records(unsigned char *range
*** 4724,4729 ****
--- 5094,5100 ----
      field2.data = range2
                    + field2.offset
                    - sorter.base;
+     field1.encoding = field2.encoding = encoding_for_sort;
  
      // We handle descending by swapping the data sources:
      if( !sorter.ascending[i] )
*************** __gg__sort_table( const cblc_field_t
*** 4826,4831 ****
--- 5197,5204 ----
      next_record += record_size;
      }
  
+   encoding_for_sort = table->encoding;
+ 
    // Sort it
    sort_contents(contents,
                  offsets,
*************** init_var_both(cblc_field_t  *var,
*** 4876,4883 ****
                unsigned char *qual_data,
                int            flag_bits)
    {
-   //fprintf(stderr, "CALLED WITH %s 0x%x\n", var->name, flag_bits);
- 
    if( flag_bits & JUST_ONCE_BIT && var->attr & initialized_e )
      {
      return;
--- 5249,5254 ----
*************** init_var_both(cblc_field_t  *var,
*** 4894,4901 ****
        && var->type != FldLiteralA
        && var->type != FldLiteralN )
      {
-     //fprintf(stderr, "ABORTING on %2.2d %s %d\n", var->level, var->name, var->type);
-     //abort();
      var->data = static_cast<unsigned char *>(malloc(var->capacity));
      }
  
--- 5265,5270 ----
*************** init_var_both(cblc_field_t  *var,
*** 4915,5000 ****
      initialize_program_state();
      }
  
!   char *local_initial = as_initial(var->initial);
! 
!   if( var->level == LEVEL88 )
!     {
!     // We need to convert the options to the var->encoding
! 
!     size_t buffer_size = 4;
!     char *buffer = static_cast<char *>(malloc(buffer_size));
! 
!     size_t index = 0;
! 
!     const cblc_field_t *parent = var->parent;
!     switch(parent->type)
!       {
!       case FldGroup:
!       case FldAlphanumeric:
!         {
!         char *walker = local_initial;
!         while(*walker)
!           {
!           static size_t first_size = MINIMUM_ALLOCATION_SIZE;
!           static char *first = static_cast<char *>(malloc(first_size));
!           static size_t last_size = MINIMUM_ALLOCATION_SIZE;
!           static char *last = static_cast<char *>(malloc(last_size));
!           if( strlen(walker)+1 > first_size )
!             {
!             first_size = strlen(walker)+1;
!             first = static_cast<char *>(realloc(first, first_size));
!             }
!           if( (*walker & 0xFF) == 0xFF )
!             {
!             // I don't recall what 0xFF means, and I neglected to comment it
!             // the first time through.  Probably means numerical values follow.
!             strcpy(first, walker);
!             }
!           else
!             {
!             strcpy(first, walker);
!             __gg__convert_encoding( first,
!                                     DEFAULT_SOURCE_ENCODING,
!                                     var->encoding);
!             }
!           walker += strlen(first) + 1;
! 
!           if( strlen(walker)+1 > last_size )
!             {
!             last_size = strlen(walker)+1;
!             last = static_cast<char *>(realloc(last, last_size));
!             }
!           if( (*walker & 0xFF) == 0xFF )
!             {
!             strcpy(last, walker);
!             }
!           else
!             {
!            __gg__convert_encoding( last,
!                                    DEFAULT_SOURCE_ENCODING,
!                                    var->encoding);
!             }
!           walker += strlen(last) + 1;
!           while(index + strlen(first) + strlen(last) + 3 > buffer_size)
!             {
!             buffer_size *= 2;
!             buffer = static_cast<char *>(realloc(buffer, buffer_size));
!             }
!           strcpy(buffer+index, first);
!           index += strlen(first) + 1;
!           strcpy(buffer+index, last);
!           index += strlen(last) + 1;
!           }
!         buffer[index++] = 0;
!         break;
!         }
!       }
!     if( index > 0 )
!       {
!       buffer = static_cast<char *>(realloc(buffer, index));
!       local_initial = buffer;
!       }
!     }
  
    // Next order of business: When the variable was allocated in
    // parser_symbol_add(), only LEVEL 01 variables had memory allocated.  All
--- 5284,5290 ----
      initialize_program_state();
      }
  
!   const char *local_initial = as_initial(var->initial);
  
    // Next order of business: When the variable was allocated in
    // parser_symbol_add(), only LEVEL 01 variables had memory allocated.  All
*************** init_var_both(cblc_field_t  *var,
*** 5131,5161 ****
      switch( var->type )
        {
        case FldGroup:
        case FldAlphanumeric:
        case FldAlphaEdited:
        case FldNumericEdited:
        case FldLiteralA:
          {
-         // Any initialization values were converted to single-byte-coding in the
-         // right codeset during parser_symbol_add()
          if( var->initial )
            {
            memcpy(outer_location, var->initial, var->capacity);
            }
          else
            {
            if( !defaultbyte_in_play )
              {
!             charmap_t *charmap = __gg__get_charmap(var->encoding);
!             memset(  outer_location,
!                      charmap->mapped_character(ascii_space),
!                      capacity );
              }
            else
              {
!             memset(  outer_location,
!                      defaultbyte,
!                      capacity );
              }
            }
          break;
--- 5421,5466 ----
      switch( var->type )
        {
        case FldGroup:
+         {
+         if( var->initial )
+           {
+           memcpy(outer_location, var->initial, var->capacity);
+           }
+         break;
+         }
+ 
        case FldAlphanumeric:
        case FldAlphaEdited:
        case FldNumericEdited:
        case FldLiteralA:
          {
          if( var->initial )
            {
            memcpy(outer_location, var->initial, var->capacity);
            }
          else
            {
+           charmap_t *charmap = __gg__get_charmap(var->encoding);
            if( !defaultbyte_in_play )
              {
!             cbl_char_t initialization_character = ascii_space;
!             if( var->attr & linkage_e && __gg__local_init != NOT_A_CHARACTER )
!               {
!               initialization_character = __gg__local_init;
!               }
!             if( !(var->attr & linkage_e) && __gg__working_init != NOT_A_CHARACTER )
!               {
!               initialization_character = __gg__working_init;
!               }
!             charmap->memset(outer_location,
!                             charmap->mapped_character(initialization_character),
!                             capacity );
              }
            else
              {
!             charmap->memset(outer_location,
!                             defaultbyte,
!                             capacity );
              }
            }
          break;
*************** init_var_both(cblc_field_t  *var,
*** 5171,5200 ****
            }
          else
            {
            if( !defaultbyte_in_play )
              {
!             charmap_t *charmap = __gg__get_charmap(var->encoding);
!             memset(  outer_location,
!                      charmap->mapped_character(ascii_zero),
!                      capacity );
              if( (var->attr & signable_e) && (var->attr & separate_e) )
                {
                if( var->attr & leading_e )
                  {
!                 outer_location[0] = charmap->mapped_character(ascii_plus);
                  }
                else
                  {
!                 outer_location[var->capacity-1] =
!                                         charmap->mapped_character(ascii_plus);
                  }
                }
              }
            else
              {
!             memset(  outer_location,
!                      defaultbyte,
!                      capacity );
              }
            }
          break;
--- 5476,5511 ----
            }
          else
            {
+           cbl_char_t init_zero = ascii_zero;
+           cbl_char_t init_plus = ascii_plus;
+ 
+           charmap_t *charmap = __gg__get_charmap(var->encoding);
            if( !defaultbyte_in_play )
              {
!             charmap->memset( outer_location,
!                              charmap->mapped_character(init_zero),
!                              capacity );
              if( (var->attr & signable_e) && (var->attr & separate_e) )
                {
                if( var->attr & leading_e )
                  {
!                 charmap->putch(charmap->mapped_character(init_plus),
!                                outer_location,
!                                size_t(0));
                  }
                else
                  {
!                 charmap->putch(charmap->mapped_character(init_plus),
!                                outer_location,
!                                var->capacity-charmap->stride());
                  }
                }
              }
            else
              {
!             charmap->memset(outer_location,
!                             defaultbyte,
!                             capacity );
              }
            }
          break;
*************** extern "C"
*** 5301,5311 ****
  void
  __gg__initialize_variable_clean(cblc_field_t *var, int flag_bits)
    {
- //  if( var->type == FldLiteralA )
- //    {
- //    fprintf(stderr, "BAZINGA!\n");
- //    }
- 
    init_var_both(  var,
                    var->data,
                    flag_bits);
--- 5612,5617 ----
*************** alpha_to_alpha_move_from_location(cblc_f
*** 5380,5386 ****
          memmove(to + (dest_length-count),
                  from,
                  count);
!         memset(to, charmap->mapped_character(ascii_space), dest_length-count);
          }
        }
      else
--- 5686,5694 ----
          memmove(to + (dest_length-count),
                  from,
                  count);
!         charmap->memset(to,
!                         charmap->mapped_character(ascii_space),
!                         dest_length-count);
          }
        }
      else
*************** alpha_to_alpha_move_from_location(cblc_f
*** 5412,5425 ****
          memmove(to,
                  from,
                  count);
!         memset( to + count,
!                 charmap->mapped_character(ascii_space),
!                 dest_length-count);
          }
        }
      }
    }
  
  static void
  alpha_to_alpha_move(cblc_field_t *dest,
                      size_t dest_offset,
--- 5720,5747 ----
          memmove(to,
                  from,
                  count);
!         charmap->memset(to + count,
!                         charmap->mapped_character(ascii_space),
!                         dest_length-count);
          }
        }
      }
    }
  
+ extern "C"
+ void *
+ __gg__memdup(const void *p, size_t size)
+   {
+   void *retval = nullptr;
+   if(size)
+     {
+     retval = malloc(size);
+     massert(retval);
+     memcpy(retval, p, size);
+     }
+   return retval;
+   }
+ 
  static void
  alpha_to_alpha_move(cblc_field_t *dest,
                      size_t dest_offset,
*************** alpha_to_alpha_move(cblc_field_t *dest,
*** 5434,5477 ****
    size_t outlength;
    if(dest->encoding == source->encoding)
      {
      outlength = source_size;
      }
    else
      {
      // Before calling the mover, we need to convert the source to the
      // destination encoding:
-     static size_t bufsize = 0;
-     static char *buffer = nullptr;
- 
-     // Supposing we might someday want to convert to UCS-4, then we need four
-     // output bytes for each input SBC character.  This is a dumb way of
-     // thinking about it.  By rights we should be calculating the worst case
-     // dest size as (source_size / min_bytes_per_source_position) times the
-     // max_bytes_per_dest_position.
- 
-     // But that's work for another day.  This is harmless, if perhaps a bit
-     // wasteful of memory.
- 
-     size_t needed = 4 * source_size;
-     if( needed > bufsize )
-       {
-       bufsize = needed;
-       buffer = static_cast<char *>(realloc(buffer, bufsize));
-       massert(buffer);
-       }
- 
      source_location = __gg__iconverter( source->encoding,
                                          dest->encoding,
                                          source_location,
                                          source_size,
                                          &outlength);
      }
    alpha_to_alpha_move_from_location(dest,
                                      dest_offset,
                                      dest_size,
!                                     source_location,
                                      outlength,
                                      source_move_all);
    }
  
  extern "C"
--- 5756,5782 ----
    size_t outlength;
    if(dest->encoding == source->encoding)
      {
+     // we don't need to bother calling __gg__iconverter
      outlength = source_size;
      }
    else
      {
      // Before calling the mover, we need to convert the source to the
      // destination encoding:
      source_location = __gg__iconverter( source->encoding,
                                          dest->encoding,
                                          source_location,
                                          source_size,
                                          &outlength);
      }
+   char *duped = static_cast<char *>(__gg__memdup(source_location, outlength));
    alpha_to_alpha_move_from_location(dest,
                                      dest_offset,
                                      dest_size,
!                                     duped,
                                      outlength,
                                      source_move_all);
+   free(duped);
    }
  
  extern "C"
*************** __gg__move( cblc_field_t        *fdest,
*** 5506,5513 ****
--- 5811,5842 ----
    __int128 value;
    int rdigits;
  
+   charmap_t *charmap = __gg__get_charmap(fdest->encoding);
+   int stride = charmap->stride();
    cbl_figconst_t source_figconst =
                          (cbl_figconst_t)(fsource->attr & FIGCONST_MASK);
+   int special_char = 0; // quiets cppcheck
+   if( source_figconst == low_value_e )
+     {
+     special_char = charmap->low_value_character();
+     }
+   else if( source_figconst == high_value_e )
+     {
+     special_char = charmap->high_value_character();
+     }
+   else if( source_figconst == quote_value_e )
+     {
+     special_char = charmap->quote_character();
+     }
+   else if( source_figconst == space_value_e )
+     {
+     special_char = charmap->mapped_character(ascii_space);
+     }
+   else if( source_figconst == zero_value_e )
+     {
+     special_char = charmap->mapped_character(ascii_zero);
+     }
+ 
    cbl_field_type_t dest_type   = (cbl_field_type_t)fdest->type;
    cbl_field_type_t source_type = (cbl_field_type_t)fsource->type;
  
*************** __gg__move( cblc_field_t        *fdest,
*** 5533,5540 ****
          ||  fdest->type == FldFloat )
          )
      {
-     charmap_t *charmap_dest = __gg__get_charmap(fdest->encoding);
- 
      // Regardless of what you see below, as time went on it became clear that
      // high-value and low-value required special processing in order to cope
      // with code.  Or, at least, to cope with legacy tests.
--- 5862,5867 ----
*************** __gg__move( cblc_field_t        *fdest,
*** 5550,5576 ****
       *  other than QUOTE or QUOTES, to a numeric item is an archaic feature of
       *  standard COBOL and its use should be avoided
       */
! 
!     int special_char = 0; // quiets cppcheck
!     if( source_figconst == low_value_e )
!       {
!       special_char = charmap_dest->low_value_character();
!       }
!     else if( source_figconst == high_value_e )
!       {
!       special_char = charmap_dest->high_value_character();
!       }
!     else if( source_figconst == quote_value_e )
!       {
!       special_char = charmap_dest->quote_character();
!       }
!     else if( source_figconst == space_value_e )
!       {
!       special_char = charmap_dest->mapped_character(ascii_space);
!       }
!     memset( fdest->data + dest_offset,
!             special_char,
!             dest_size);
      }
    else
      {
--- 5877,5885 ----
       *  other than QUOTE or QUOTES, to a numeric item is an archaic feature of
       *  standard COBOL and its use should be avoided
       */
!     charmap->memset( fdest->data + dest_offset,
!                           special_char,
!                           dest_size);
      }
    else
      {
*************** __gg__move( cblc_field_t        *fdest,
*** 5590,5595 ****
--- 5899,5905 ----
            case FldPacked:
            case FldNumericBin5:
            case FldGroup:
+           case FldLiteralA:
              {
              // This is a little bold, but non-alphabetics will never
              // have the rjust_e or MOVE_ALL bits on, so it's safe
*************** __gg__move( cblc_field_t        *fdest,
*** 5629,5642 ****
            case FldAlphanumeric:
            case FldNumericEdited:
            case FldAlphaEdited:
              // This is an ordinary alpha-to-alpha move:
!             alpha_to_alpha_move(fdest,
!                                 dest_offset,
!                                 dest_size,
!                                 fsource,
!                                 source_offset,
!                                 source_size,
!                                 !!(source_flags & REFER_T_MOVE_ALL));
              break;
  
            case FldNumericDisplay:
--- 5939,5962 ----
            case FldAlphanumeric:
            case FldNumericEdited:
            case FldAlphaEdited:
+           case FldLiteralA:
              // This is an ordinary alpha-to-alpha move:
!             if( source_figconst )
!               {
!               charmap->memset( fdest->data + dest_offset,
!                                     special_char,
!                                     dest_size);
!               }
!             else
!               {
!               alpha_to_alpha_move(fdest,
!                                   dest_offset,
!                                   dest_size,
!                                   fsource,
!                                   source_offset,
!                                   source_size,
!                                   !!(source_flags & REFER_T_MOVE_ALL));
!               }
              break;
  
            case FldNumericDisplay:
*************** __gg__move( cblc_field_t        *fdest,
*** 5659,5670 ****
                // alphanumeric.  We ignore any sign bit, and just
                // move the characters:
  
-               charmap_t *charmap = __gg__get_charmap(fdest->encoding);
- 
                size_t source_digits
!                 = fsource->digits
!                   + ( fsource->rdigits < 0
!                       ? -fsource->rdigits : 0) ;
  
                // Pick up the absolute value of the source
                value = __gg__binary_value_from_qualified_field(&rdigits,
--- 5979,5987 ----
                // alphanumeric.  We ignore any sign bit, and just
                // move the characters:
  
                size_t source_digits
!                 = fsource->digits + ( fsource->rdigits < 0
!                                       ? -fsource->rdigits : 0) ;
  
                // Pick up the absolute value of the source
                value = __gg__binary_value_from_qualified_field(&rdigits,
*************** __gg__move( cblc_field_t        *fdest,
*** 5683,5689 ****
  
                if( !(fdest->attr & rjust_e) )
                  {
!                 min_length = std::min(  source_digits,
                                          dest_size);
                  memmove(fdest->data + dest_offset, ach, min_length);
                  if( min_length < dest_size )
--- 6000,6006 ----
  
                if( !(fdest->attr & rjust_e) )
                  {
!                 min_length = std::min(  source_digits*stride,
                                          dest_size);
                  memmove(fdest->data + dest_offset, ach, min_length);
                  if( min_length < dest_size )
*************** __gg__move( cblc_field_t        *fdest,
*** 5691,5712 ****
                    // min_length is smaller than dest_length, so we
                    // have to space-fill the excess bytes in the
                    // destination:
!                   memset( fdest->data + dest_offset + min_length,
!                           charmap->mapped_character(ascii_space),
!                           dest_size - min_length );
                    }
                  }
                else
                  {
                  // Destination is right-justified, so things are
                  // slightly more complex
!                 if( source_digits >= dest_size )
                    {
                    // We need to truncate the source data on the
                    // left:
                    memmove(
                      fdest->data + dest_offset,
!                     ach + (source_digits - dest_size),
                      dest_size );
                    }
                  else
--- 6008,6029 ----
                    // min_length is smaller than dest_length, so we
                    // have to space-fill the excess bytes in the
                    // destination:
!                   charmap->memset(fdest->data + dest_offset + min_length ,
!                                   charmap->mapped_character(ascii_space),
!                                   dest_size - min_length );
                    }
                  }
                else
                  {
                  // Destination is right-justified, so things are
                  // slightly more complex
!                 if( source_digits*stride >= dest_size )
                    {
                    // We need to truncate the source data on the
                    // left:
                    memmove(
                      fdest->data + dest_offset,
!                     ach + (source_digits*stride - dest_size),
                      dest_size );
                    }
                  else
*************** __gg__move( cblc_field_t        *fdest,
*** 5714,5725 ****
                    // We need to move the shorty source string to
                    // the right side of the destination, and space-fill
                    //  the prefix:
!                   memmove(fdest->data + dest_offset + (dest_size - source_digits),
                            ach,
!                           source_digits );
!                   memset( fdest->data + dest_offset,
!                           charmap->mapped_character(ascii_space),
!                           dest_size - source_digits);
                    }
                  }
                }
--- 6031,6043 ----
                    // We need to move the shorty source string to
                    // the right side of the destination, and space-fill
                    //  the prefix:
!                   memmove(fdest->data
!                             + dest_offset + (dest_size - source_digits*stride),
                            ach,
!                           source_digits*stride );
!                   charmap->memset( fdest->data + dest_offset,
!                                   charmap->mapped_character(ascii_space),
!                                   dest_size - source_digits*stride);
                    }
                  }
                }
*************** __gg__move( cblc_field_t        *fdest,
*** 5741,5747 ****
                }
              else
                {
-               charmap_t *charmap_dest = __gg__get_charmap(fdest->encoding);
                char ach[128];
  
                // Turn the integer source into a value:
--- 6059,6064 ----
*************** __gg__move( cblc_field_t        *fdest,
*** 5770,5802 ****
  
                if( fsource->attr & intermediate_e )
                  {
-                 charmap_t *charmap_src = __gg__get_charmap(fsource->encoding);
                  while(source_size > 1)  // This ensures we leave one '0'
                    {
!                   if( *(pach+1) == '\0' )
                      {
                      break;
                      }
!                   if( ((*pach)&0xFF) != charmap_src->mapped_character(ascii_0))
                      {
                      break;
                      }
!                   pach += 1;
                    source_size -= 1;
                    }
                  }
  
                if( !(fdest->attr & rjust_e) )
                  {
!                 min_length = std::min(  source_size,
                                          dest_size);
                  memmove(fdest->data+dest_offset, pach, min_length);
                  if( min_length < dest_size )
                    {
                    // min_length is smaller than dest_length, so we have to
                    // space-fill the excess bytes in the destination:
!                   memset( fdest->data+dest_offset + min_length,
!                           charmap_dest->mapped_character(ascii_space),
                            dest_size - min_length );
                    }
                  }
--- 6087,6120 ----
  
                if( fsource->attr & intermediate_e )
                  {
                  while(source_size > 1)  // This ensures we leave one '0'
                    {
!                   cbl_char_t ch = charmap->getch(pach, stride);
!                   if( ch == '\0' )
                      {
                      break;
                      }
!                   ch = charmap->getch(pach, size_t(0));
!                   if( ch != charmap->mapped_character(ascii_0))
                      {
                      break;
                      }
!                   pach += stride;
                    source_size -= 1;
                    }
                  }
  
                if( !(fdest->attr & rjust_e) )
                  {
!                 min_length = std::min(  source_size*stride,
                                          dest_size);
                  memmove(fdest->data+dest_offset, pach, min_length);
                  if( min_length < dest_size )
                    {
                    // min_length is smaller than dest_length, so we have to
                    // space-fill the excess bytes in the destination:
!                   charmap->memset( fdest->data+dest_offset + min_length,
!                           charmap->mapped_character(ascii_space),
                            dest_size - min_length );
                    }
                  }
*************** __gg__move( cblc_field_t        *fdest,
*** 5815,5826 ****
                    {
                    // We need to move the shorty source string to the
                    // right side of the destination, and space-fill the prefix:
!                   memmove(fdest->data+dest_offset + (dest_size - source_size),
                            pach,
!                           source_size );
!                   memset(fdest->data+dest_offset,
!                          charmap_dest->mapped_character(ascii_space),
!                          (dest_size - source_size));
                    }
                  }
                }
--- 6133,6145 ----
                    {
                    // We need to move the shorty source string to the
                    // right side of the destination, and space-fill the prefix:
!                   memmove(fdest->data+dest_offset +
!                               (dest_size - source_size*stride),
                            pach,
!                           source_size*stride );
!                   charmap->memset(fdest->data+dest_offset,
!                          charmap->mapped_character(ascii_space),
!                          (dest_size - source_size*stride));
                    }
                  }
                }
*************** __gg__move( cblc_field_t        *fdest,
*** 5828,5834 ****
  
            case FldIndex:
              {
-             charmap_t *charmap_dest = __gg__get_charmap(fdest->encoding);
              char ach[128];
  
              // Turn the integer source into a value:
--- 6147,6152 ----
*************** __gg__move( cblc_field_t        *fdest,
*** 5836,5843 ****
                                                              fsource,
                                                              source_offset,
                                                              source_size);
!             sprintf(ach, "%lu", (unsigned long)value);
! 
              char *pach = ach;
  
              if( !(fdest->attr & rjust_e) )
--- 6154,6164 ----
                                                              fsource,
                                                              source_offset,
                                                              source_size);
!             // Turn the integer value into a string:
!             __gg__binary_to_string_encoded(ach,
!                                            source_size,
!                                            value,
!                                            fdest->encoding);
              char *pach = ach;
  
              if( !(fdest->attr & rjust_e) )
*************** __gg__move( cblc_field_t        *fdest,
*** 5849,5856 ****
                  {
                  // min_length is smaller than dest_length, so we have to
                  // space-fill the excess bytes in the destination:
!                 memset( fdest->data+dest_offset + min_length,
!                         charmap_dest->mapped_character(ascii_space),
                          dest_size - min_length );
                  }
                }
--- 6170,6177 ----
                  {
                  // min_length is smaller than dest_length, so we have to
                  // space-fill the excess bytes in the destination:
!                 charmap->memset( fdest->data+dest_offset + min_length,
!                         charmap->mapped_character(ascii_space),
                          dest_size - min_length );
                  }
                }
*************** __gg__move( cblc_field_t        *fdest,
*** 5872,5878 ****
                          pach,
                          source_size );
                  memset(fdest->data+dest_offset,
!                        charmap_dest->mapped_character(ascii_space),
                         (dest_size - source_size));
                  }
                }
--- 6193,6199 ----
                          pach,
                          source_size );
                  memset(fdest->data+dest_offset,
!                        charmap->mapped_character(ascii_space),
                         (dest_size - source_size));
                  }
                }
*************** __gg__move( cblc_field_t        *fdest,
*** 5888,5894 ****
  
        case FldNumericBinary:
          {
-         charmap_t *charmap_dest = __gg__get_charmap(fdest->encoding);
          switch( source_type )
            {
            case FldGroup:
--- 6209,6214 ----
*************** __gg__move( cblc_field_t        *fdest,
*** 5899,5905 ****
                // min_length is smaller than dest_length, so we have to
                // space-fill the excess bytes in the destination:
                memset( fdest->data+dest_offset + min_length,
!                       charmap_dest->mapped_character(ascii_space),
                        dest_size - min_length );
                }
              fdest->attr &= ~FIGCONST_MASK;
--- 6219,6225 ----
                // min_length is smaller than dest_length, so we have to
                // space-fill the excess bytes in the destination:
                memset( fdest->data+dest_offset + min_length,
!                       charmap->mapped_character(ascii_space),
                        dest_size - min_length );
                }
              fdest->attr &= ~FIGCONST_MASK;
*************** __gg__move( cblc_field_t        *fdest,
*** 6037,6043 ****
          {
          // Bin5 and Index are treated with no truncation, as if they were
          // trunc_bin_e.  The other types aren't subject to truncation.
-         charmap_t *charmap_dest = __gg__get_charmap(fdest->encoding);
          switch( source_type )
            {
            case FldGroup:
--- 6357,6362 ----
*************** __gg__move( cblc_field_t        *fdest,
*** 6048,6054 ****
                // min_length is smaller than dest_length, so we have to
                // space-fill the excess bytes in the destination:
                memset( fdest->data+dest_offset + min_length,
!                       charmap_dest->mapped_character(ascii_space),
                        dest_size - min_length );
                }
              break;
--- 6367,6373 ----
                // min_length is smaller than dest_length, so we have to
                // space-fill the excess bytes in the destination:
                memset( fdest->data+dest_offset + min_length,
!                       charmap->mapped_character(ascii_space),
                        dest_size - min_length );
                }
              break;
*************** __gg__move( cblc_field_t        *fdest,
*** 6121,6127 ****
  
        case FldAlphaEdited:
          {
-         charmap_t *charmap_dest = __gg__get_charmap(fdest->encoding);
          switch( source_type )
            {
            case FldGroup:
--- 6440,6445 ----
*************** __gg__move( cblc_field_t        *fdest,
*** 6132,6138 ****
                // min_length is smaller than dest_length, so we have to
                // space-fill the excess bytes in the destination:
                memset( fdest->data+dest_offset + min_length,
!                       charmap_dest->mapped_character(ascii_space),
                        dest_size - min_length );
                }
              break;
--- 6450,6456 ----
                // min_length is smaller than dest_length, so we have to
                // space-fill the excess bytes in the destination:
                memset( fdest->data+dest_offset + min_length,
!                       charmap->mapped_character(ascii_space),
                        dest_size - min_length );
                }
              break;
*************** __gg__move( cblc_field_t        *fdest,
*** 6176,6182 ****
                                          display_string_length);
  
              int fc_char = __gg__fc_char(fsource);
!             if( fc_char > -1 )
                {
                memset(display_string, fc_char, dest_size);
                __gg__convert_encoding_length(display_string,
--- 6494,6500 ----
                                          display_string_length);
  
              int fc_char = __gg__fc_char(fsource);
!             if( fc_char != NOT_A_CHARACTER )
                {
                memset(display_string, fc_char, dest_size);
                __gg__convert_encoding_length(display_string,
*************** __gg__move( cblc_field_t        *fdest,
*** 6213,6218 ****
--- 6531,6537 ----
          switch( source_type )
            {
            case FldAlphanumeric:
+           case FldGroup:
              {
              // Converting alphanumeric to float means first converting to
              // ascii:
*************** __gg__sort_workfile(cblc_file_t    *work
*** 6539,6544 ****
--- 6858,6865 ----
                      size_t         *ascending,
                      int             duplicates)
    {
+   encoding_for_sort = workfile->encoding;
+ 
    // We are going to read the records of workfile into memory.  We keep offsets
    // into the memory buffer, and then we'll sort those offsets according to the
    // things they point to.
*************** __gg__sort_workfile(cblc_file_t    *work
*** 6553,6558 ****
--- 6874,6881 ----
    size_t bytes_read;
    size_t bytes_to_write;
  
+   const charmap_t *charmap = __gg__get_charmap(workfile->encoding);
+ 
    sv_suppress_eof_ec = true;
    for(;;)
      {
*************** __gg__sort_workfile(cblc_file_t    *work
*** 6561,6569 ****
      if( workfile->record_length )
        {
        int rdigits;
!       bytes_read = (size_t) __gg__binary_value_from_field(
!                                               &rdigits,
!                                               workfile->record_length);
        }
      else
        {
--- 6884,6893 ----
      if( workfile->record_length )
        {
        int rdigits;
!       // The record length is reported in character positions:
!       bytes_read = charmap->stride() * (size_t) __gg__binary_value_from_field(
!                                                   &rdigits,
!                                                   workfile->record_length);
        }
      else
        {
*************** __gg__sort_workfile(cblc_file_t    *work
*** 6616,6623 ****
      if(    workfile->record_area_min != workfile->record_area_max
          && workfile->record_length )
        {
        __gg__int128_to_field(workfile->record_length,
!                             bytes_to_write,
                              0,
                              truncation_e,
                              NULL);
--- 6940,6949 ----
      if(    workfile->record_area_min != workfile->record_area_max
          && workfile->record_length )
        {
+       // Set the number of bytes to write, remembering that record_length is
+       // in characters, not bytes:
        __gg__int128_to_field(workfile->record_length,
!                             bytes_to_write/charmap->stride(),
                              0,
                              truncation_e,
                              NULL);
*************** __gg__merge_files( cblc_file_t   *workfi
*** 6650,6655 ****
--- 6976,6983 ----
  
    // Then we will begin.
  
+   encoding_for_sort = workfile->encoding;
+ 
    sorter.nkeys     = nkeys;
    sorter.keys      = keys;
    sorter.ascending = ascending;
*************** __gg__merge_files( cblc_file_t   *workfi
*** 6720,6726 ****
          {
          // The prior winner is bigger than the current winner, which means that
          // the input files were not in order.  This is a run-time error.
- 
          exception_raise(ec_sort_merge_sequence_e);
          abort();
          }
--- 7048,7053 ----
*************** __gg__merge_files( cblc_file_t   *workfi
*** 6759,6764 ****
--- 7086,7094 ----
    free(prior_winner);
    }
  
+ typedef std::vector<cbl_char_t>::const_iterator char_it_c ;
+ typedef std::vector<cbl_char_t>::iterator       char_it   ;
+ 
  static const char *
  funky_find( const char *piece,
              const char *piece_end,
*************** funky_find( const char *piece,
*** 6787,6792 ****
--- 7117,7158 ----
    return retval;
    }
  
+ static char_it_c
+ funky_find_wide( char_it_c needle,
+                  char_it_c needle_end,    // Actually end+1
+                  char_it_c haystack,
+                  char_it_c haystack_end,  // Actually end+1
+                  char_it_c notfound)
+   {
+   // We are looking for the needle in the haystack
+ 
+   char_it_c retval = notfound;
+ 
+   size_t length_of_piece = needle_end - needle;
+   if(length_of_piece == 0)
+     {
+     __gg__abort("funky_find_wide() length_of_piece shouldn't be zero");
+     }
+ 
+   haystack_end -= length_of_piece;
+ 
+   while( haystack <= haystack_end )
+     {
+     // Compare the memory at needle to the memory at haystack
+     if( memcmp( &(*needle),
+                 &(*haystack),
+                 length_of_piece*sizeof(cbl_char_t)) == 0 )
+       {
+       // They are the same; return where needle was found
+       retval = haystack;
+       break;
+       }
+     // Not found; move to the next location in the haystach
+     haystack += 1;
+     }
+   return retval;
+   }
+ 
  static const char *
  funky_find_backward(const char *piece,
                      const char *piece_end,
*************** funky_find_backward(const char *piece,
*** 6815,6829 ****
    return retval;
    }
  
  typedef struct normalized_operand
    {
    // These are the characters of the string.  When the field is NumericDisplay
    // any leading or trailing +/- characters are removed, and any embedded
    // minus bits are removed.
    std::string the_characters;
!   size_t offset;  // Usually zero.  One when there is a leading sign.
    size_t length;  // Usually the same as the original.  But it is one less
!   //              // than the original when there is a trailing sign.
    } normalized_operand;
  
  typedef struct comparand
--- 7181,7238 ----
    return retval;
    }
  
+ static char_it_c
+ funky_find_wide_backward( char_it_c needle,
+                  char_it_c needle_end,    // Actually end+1
+                  char_it_c haystack,
+                  char_it_c haystack_end,  // Actually end+1
+                  char_it_c notfound)
+   {
+   // We are looking for the needle in the haystack
+ 
+   char_it_c retval = notfound;
+ 
+   size_t length_of_piece = needle_end - needle;
+   if(length_of_piece == 0)
+     {
+     __gg__abort("funky_find_wide_backward() length_of_piece shouldn't be zero");
+     }
+ 
+   haystack_end -= length_of_piece;
+ 
+   while( haystack <= haystack_end )
+     {
+     if( memcmp( &(*needle),
+                 &(*haystack_end),
+                 length_of_piece*sizeof(cbl_char_t)) == 0 )
+       {
+       // They are the same; return where needle was found
+       retval = haystack_end;
+       break;
+       }
+     // Not found; move to the next location in the haystack
+     haystack_end -= 1;
+     }
+   return retval;
+   }
+ 
  typedef struct normalized_operand
    {
    // These are the characters of the string.  When the field is NumericDisplay
    // any leading or trailing +/- characters are removed, and any embedded
    // minus bits are removed.
+ 
+   // In order for INSPECT to handle things like UTF-8, which often has
+   // multi-byte codepoints, and UTF-16, which sometimes has multi-pair
+   // codepoints we are going to convert everything to UTF-32 for internal
+   // calculations and searches.
    std::string the_characters;
!   std::vector<cbl_char_t>the_vectorxxxx;
! 
!   // offset and length are maintained in characters, not bytes
!   size_t offset;  // Usually zero.  Increased by one for leading separate sign.
    size_t length;  // Usually the same as the original.  But it is one less
!   //              // than the original when there is a trailing separate sign.
    } normalized_operand;
  
  typedef struct comparand
*************** typedef struct comparand
*** 6834,6839 ****
--- 7243,7250 ----
    normalized_operand identifier_5; // The replacement, for FORMAT 2
    const char *alpha; // The start location within normalized_id_1
    const char *omega; // The end+1 location within normalized_id_1
+   char_it_c     alpha_it;   // The start location within normalized_id_1
+   char_it_c     omega_it;   // The end+1 location within normalized_id_1
    size_t leading_count;
    bool leading;
    bool first;
*************** normalize_id( const cblc_field_t *field,
*** 6857,6862 ****
--- 7268,7276 ----
  
    if( field )
      {
+     charmap_t *charmap = __gg__get_charmap(encoding);
+ 
+     // This is the old-style byte-based assumption
      const unsigned char *data = field->data + field_o;
      cbl_figconst_t figconst
        = (cbl_figconst_t)(field->attr & FIGCONST_MASK);
*************** normalize_id( const cblc_field_t *field,
*** 6879,6889 ****
            retval.offset = 1;
            }
          }
!       for( size_t i=retval.offset; i<retval.length; i++ )
          {
-         charmap_t *charmap = __gg__get_charmap(field->encoding);
          // Because we are dealing with a NumericDisplay that might have
!         // the minus bit turned on, we need to mask it off
          retval.the_characters += charmap->set_digit_negative(data[i], false);
          }
        }
--- 7293,7303 ----
            retval.offset = 1;
            }
          }
!       for( size_t i=retval.offset; i<retval.length; i+=1 )
          {
          // Because we are dealing with a NumericDisplay that might have
!         // the minus bit turned on, we will to mask it off as we copy the
!         // input characters over to retval:
          retval.the_characters += charmap->set_digit_negative(data[i], false);
          }
        }
*************** normalize_id( const cblc_field_t *field,
*** 6892,6907 ****
        // We are set up to create the_characters;
        if( figconst == normal_value_e )
          {
!         for( size_t i=retval.offset; i<retval.length; i++ )
            {
            retval.the_characters += data[i];
            }
          }
        else
          {
-         charmap_t *charmap = __gg__get_charmap(encoding);
          char ch =  charmap->figconst_character(figconst);
!         for( size_t i=retval.offset; i<retval.length; i++ )
            {
            retval.the_characters += ch;
            }
--- 7306,7320 ----
        // We are set up to create the_characters;
        if( figconst == normal_value_e )
          {
!         for( size_t i=retval.offset; i<retval.length; i+=1 )
            {
            retval.the_characters += data[i];
            }
          }
        else
          {
          char ch =  charmap->figconst_character(figconst);
!         for( size_t i=retval.offset; i<retval.length; i+=1 )
            {
            retval.the_characters += ch;
            }
*************** normalize_id( const cblc_field_t *field,
*** 6914,6919 ****
--- 7327,7438 ----
      retval.offset = 0;
      retval.length = 0;
      }
+ 
+   if( field )
+     {
+     cbl_encoding_t source_encoding = field->encoding;
+     const charmap_t *charmap_source = __gg__get_charmap(source_encoding);
+     charmap_t *charmap = __gg__get_charmap(encoding);
+     int stride = charmap->stride();
+ 
+     const unsigned char *data = field->data + field_o;
+     cbl_figconst_t figconst = (cbl_figconst_t)(field->attr & FIGCONST_MASK);
+     if( figconst == normal_value_e )
+       {
+       retval.offset = 0;
+       retval.length = field_s / stride;
+ 
+       if( field->type == FldNumericDisplay )
+         {
+         // The value is NumericDisplay, so we might need to adjust the offset
+         // and length:
+         if( field->attr & separate_e )
+           {
+           // Because the sign is a separate plus or minus, the length
+           // gets reduced by one:
+           retval.length = field_s - 1;
+           if( field->attr & leading_e )
+             {
+             // Because the sign character is LEADING, we increase the
+             // offset by one
+             retval.offset = 1;
+             }
+           }
+         }
+       // We are ready to convert from the input to UTF32
+       size_t converted_characters;
+       const char *converted = __gg__iconverter(source_encoding,
+                                                DEFAULT_32_ENCODING,
+                                                data+retval.offset * stride,
+                                                retval.length * stride,
+                                                &converted_characters);
+       // We are ready to copy the characters over:
+       for( size_t i=0; i<converted_characters; i+=width_of_utf32 )
+         {
+         // Because we are dealing with a NumericDisplay that might have
+         // the minus bit turned on, we will to mask it off as we copy the
+         // input characters over to retval:
+         cbl_char_t ch = charmap->getch(converted, i);
+         if( field->type == FldNumericDisplay )
+           {
+           if( charmap_source->is_like_ebcdic() )
+             {
+             // In EBCDIC, a flagged negative digit 0xF0 through 0xF9 becomes
+             // 0xD0 through 0xD9.  Those represent the characters
+             // "}JKLMNOPQR", which, now that we are in UTF32 space, don't have
+             // the right bit pattern to be fixed with set_digit_negative().
+             // So, we fix it separately with this table:  Note that location
+             // 0x7D, which is ASCII '{', becomes 0x30 '0'.  See also that
+             // locations 0x4A through 0x52 become 0x31 through 0x39.
+             static const uint8_t fixit[256] =
+               {
+               0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x80, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+               0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x81, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+               0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x82, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+               0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x83, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
+               0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x84, 0x49, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,
+               0x37, 0x38, 0x39, 0x53, 0x54, 0x55, 0x56, 0x57, 0x85, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+               0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x86, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+               0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x87, 0x79, 0x7a, 0x7b, 0x7c, 0x30, 0x7e, 0x7f,
+               0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+               0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x89, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+               0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0x8a, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+               0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0x8b, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+               0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0x8c, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+               0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0x8d, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+               0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0x8e, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+               0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0x8f, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
+               };
+             ch = fixit[ch & 0xFF];
+             }
+           else
+             {
+             ch = charmap->set_digit_negative(ch, false);
+             }
+           }
+         retval.the_vectorxxxx.push_back(ch);
+         }
+       }
+     else
+       {
+       // We need to fill the field with a figurative constant:
+       // We are set up to create the_characters;
+       charmap_t *charmap32 = __gg__get_charmap(DEFAULT_32_ENCODING);
+       char ch =  charmap32->figconst_character(figconst);
+       for( size_t i=retval.offset; i<retval.length; i+=1 )
+         {
+         retval.the_characters += ch;
+         retval.the_vectorxxxx.push_back(ch);
+         }
+       }
+     }
+   else
+     {
+     // There is no field, so leave the_characters empty.
+     retval.offset = 0;
+     retval.length = 0;
+     }
+ 
    return retval;
    }
  
*************** static void
*** 6921,6932 ****
--- 7440,7461 ----
  match_lengths(      normalized_operand &id_target,
                      const normalized_operand &id_source)
    {
+   // This routine gets called when id_source is a figurative constant and
+   // we need the target to be the same length as the source
+ 
    char ch = id_target.the_characters[0];
    id_target.the_characters.clear();
    for(size_t i=0; i<id_source.length; i++)
      {
      id_target.the_characters += ch;
      }
+ 
+   cbl_char_t wch = id_target.the_vectorxxxx[0];
+   id_target.the_vectorxxxx.clear();
+   for(size_t i=0; i<id_source.length; i++)
+     {
+     id_target.the_vectorxxxx.push_back(wch);
+     }
    id_target.length = id_source.length;
    }
  
*************** static void
*** 6934,6940 ****
  the_alpha_and_omega(const normalized_operand &id_before,
                      const normalized_operand &id_after,
                      const char *          &alpha,
!                     const char *          &omega)
    {
    /*  The 2023 ISO description of the AFTER and BEFORE phrases of the INSPECT
        statement is, in a word, garbled.
--- 7463,7472 ----
  the_alpha_and_omega(const normalized_operand &id_before,
                      const normalized_operand &id_after,
                      const char *          &alpha,
!                     const char *          &omega,
!                     char_it_c             &alpha_it,
!                     char_it_c             &omega_it,
!                     char_it_c              notfound)
    {
    /*  The 2023 ISO description of the AFTER and BEFORE phrases of the INSPECT
        statement is, in a word, garbled.
*************** the_alpha_and_omega(const normalized_ope
*** 6983,6988 ****
--- 7515,7532 ----
        omega = found;
        // If not found, we just leave omega alone.
        }
+ 
+     char_it_c omega_found = funky_find_wide(id_before.the_vectorxxxx.begin(),
+                                             id_before.the_vectorxxxx.end(),
+                                             alpha_it,
+                                             omega_it,
+                                             notfound );
+     if( omega_found != notfound )
+       {
+       // We found id_before within alpha/omega, so reduce omega
+       // to the found location.
+       omega_it = omega_found;
+       }
      }
  
    if( id_after.length )
*************** the_alpha_and_omega(const normalized_ope
*** 7006,7021 ****
        // because no characters will qualify.
        alpha = omega;
        }
      }
    }
  
  static void
  the_alpha_and_omega_backward( const normalized_operand &id_before,
                                const normalized_operand &id_after,
                                const char *          &alpha,
!                               const char *          &omega)
    {
!   /*  Not unlike the_alpha_and_omega(), but for handling BACKWARD.
  
        "xyzxyzBEFORExyzxyzAFTERxyzxyzxyzxyzBEFORExyzxyzAFTERxyzxyz"
                                                  ^     ^
--- 7550,7588 ----
        // because no characters will qualify.
        alpha = omega;
        }
+ 
+     char_it_c omega_found = funky_find_wide(id_after.the_vectorxxxx.begin(),
+                                             id_after.the_vectorxxxx.end(),
+                                             alpha_it,
+                                             omega_it,
+                                             notfound );
+     if( omega_found != notfound)
+       {
+       // We found id_after in the alpha/omega segment.  We update alpha
+       // be the character after the id_after substring.
+       alpha_it = omega_found + (end-start);
+       }
+     else
+       {
+       // We didn't find the id_after string, so we set the alpha to be
+       // omega.  That means that no tally or replace operation will take
+       // because no characters will qualify.
+       alpha_it = omega_it;
+       }
      }
+ 
    }
  
  static void
  the_alpha_and_omega_backward( const normalized_operand &id_before,
                                const normalized_operand &id_after,
                                const char *          &alpha,
!                               const char *          &omega,
!                               char_it_c             &alpha_it,
!                               char_it_c             &omega_it,
!                               char_it_c              notfound)
    {
!   /*  Like the_alpha_and_omega(), but for handling BACKWARD.
  
        "xyzxyzBEFORExyzxyzAFTERxyzxyzxyzxyzBEFORExyzxyzAFTERxyzxyz"
                                                  ^     ^
*************** the_alpha_and_omega_backward( const norm
*** 7039,7047 ****
        {
        // We found id_before within id_1, so change alpha to the character just
        // to the right of BEFORE.  Otherwise, we will leave alpha alone, so that
!       // it stays at the beginning of id_1
        alpha = found + id_before.length;
        }
      }
  
    if( id_after.length )
--- 7606,7628 ----
        {
        // We found id_before within id_1, so change alpha to the character just
        // to the right of BEFORE.  Otherwise, we will leave alpha alone, so that
!       // it stays at the beginning of id_1. That's because if you can't find
!       // id_before, it's as if there were no BEFORE phrase.
        alpha = found + id_before.length;
        }
+ 
+     char_it_c omega_found = funky_find_wide_backward(id_before.the_vectorxxxx.begin(),
+                                             id_before.the_vectorxxxx.end(),
+                                             alpha_it,
+                                             omega_it,
+                                             notfound );
+     if( omega_found != notfound )
+       {
+       // We found id_before within id_1, so change alpha to the character just
+       // to the right of BEFORE.  Otherwise, we will leave alpha alone, so that
+       // it stays at the beginning of id_1
+       alpha_it = omega_found + id_before.length;
+       }
      }
  
    if( id_after.length )
*************** the_alpha_and_omega_backward( const norm
*** 7061,7067 ****
        {
        // If the AFTER isn't found, we need to adjust things so that nothing
        // happens.
!       omega = id_1;
        }
      }
    }
--- 7642,7666 ----
        {
        // If the AFTER isn't found, we need to adjust things so that nothing
        // happens.
!       omega = alpha;
!       }
! 
!     char_it_c omega_found = funky_find_wide_backward(id_after.the_vectorxxxx.begin(),
!                                             id_after.the_vectorxxxx.end(),
!                                             alpha_it,
!                                             omega_it,
!                                             notfound );
!     if( omega_found != notfound)
!       {
!       // We found id_after in id_1.  We update omega to be
!       // at that location.
!       omega_it = omega_found;
!       }
!     else
!       {
!       // If the AFTER isn't found, we need to adjust things so that nothing
!       // happens.
!       omega_it = alpha_it;
        }
      }
    }
*************** inspect_backward_format_1(const size_t i
*** 7143,7152 ****
            next_comparand.omega
              = next_comparand.alpha + normalized_id_1.length;
  
!           the_alpha_and_omega_backward( normalized_id_4_before,
!                                         normalized_id_4_after,
!                                         next_comparand.alpha,
!                                         next_comparand.omega);
            comparands.push_back(next_comparand);
            break;
            }
--- 7742,7758 ----
            next_comparand.omega
              = next_comparand.alpha + normalized_id_1.length;
  
!           next_comparand.alpha_it = normalized_id_1.the_vectorxxxx.begin();
!           next_comparand.omega_it = normalized_id_1.the_vectorxxxx.end();
! 
!           the_alpha_and_omega_backward(normalized_id_4_before,
!                               normalized_id_4_after,
!                               next_comparand.alpha,
!                               next_comparand.omega,
!                               next_comparand.alpha_it,
!                               next_comparand.omega_it,
!                               normalized_id_1.the_vectorxxxx.end());
! 
            comparands.push_back(next_comparand);
            break;
            }
*************** inspect_backward_format_1(const size_t i
*** 7193,7202 ****
              normalized_operand normalized_id_4_after
                = normalize_id(id4_after, id4_after_o, id4_after_s, id1->encoding);
  
!             the_alpha_and_omega_backward( normalized_id_4_before,
!                                           normalized_id_4_after,
!                                           next_comparand.alpha,
!                                           next_comparand.omega);
              next_comparand.leading = true;
              next_comparand.leading_count = 0;
              comparands.push_back(next_comparand);
--- 7799,7815 ----
              normalized_operand normalized_id_4_after
                = normalize_id(id4_after, id4_after_o, id4_after_s, id1->encoding);
  
!             next_comparand.alpha_it = normalized_id_1.the_vectorxxxx.begin();
!             next_comparand.omega_it = normalized_id_1.the_vectorxxxx.end();
! 
!             the_alpha_and_omega_backward(normalized_id_4_before,
!                                 normalized_id_4_after,
!                                 next_comparand.alpha,
!                                 next_comparand.omega,
!                                 next_comparand.alpha_it,
!                                 next_comparand.omega_it,
!                                 normalized_id_1.the_vectorxxxx.end());
! 
              next_comparand.leading = true;
              next_comparand.leading_count = 0;
              comparands.push_back(next_comparand);
*************** inspect_backward_format_1(const size_t i
*** 7212,7243 ****
    // We are now set up to accomplish the data flow described
    // in the language specification.  We loop through the
    // the character positions in normalized_id_1:
!   const char *leftmost  = normalized_id_1.the_characters.c_str();
!   const char *rightmost = leftmost + normalized_id_1.length;
!   const char *the_end_of_the_world = rightmost;
  
    while( leftmost < rightmost )
      {
      rightmost -= 1;
      // We look at the rightmost position.  If that position is within the
      // alpha-to-omega qualified range, we check all possible matches:
  
      for(size_t k=0; k<comparands.size(); k++)
        {
!       if( rightmost < comparands[k].alpha )
          {
          // This can't be a match, because rightmost is
          // to the left of the comparand's alpha.
          continue;
          }
!       if( rightmost + comparands[k].identifier_3.length > comparands[k].omega )
          {
          // This can't be a match, because the rightmost
          // character of the comparand falls to the right
          // of the comparand's omega
          continue;
          }
!       if( rightmost + comparands[k].identifier_3.length > the_end_of_the_world )
          {
          // This can't be a match, because the rightmost character of the
          // comparand falls past the new edge of id_1 established by a prior
--- 7825,7859 ----
    // We are now set up to accomplish the data flow described
    // in the language specification.  We loop through the
    // the character positions in normalized_id_1:
!   char_it_c leftmost  = normalized_id_1.the_vectorxxxx.begin();
!   char_it_c rightmost = leftmost + normalized_id_1.length;
!   char_it_c the_end_of_the_world = rightmost;
  
    while( leftmost < rightmost )
      {
+     size_t rightmost_delta = 0;
      rightmost -= 1;
      // We look at the rightmost position.  If that position is within the
      // alpha-to-omega qualified range, we check all possible matches:
  
      for(size_t k=0; k<comparands.size(); k++)
        {
!       if( rightmost < comparands[k].alpha_it )
          {
          // This can't be a match, because rightmost is
          // to the left of the comparand's alpha.
          continue;
          }
!       if( rightmost + comparands[k].identifier_3.length >
!                                                        comparands[k].omega_it )
          {
          // This can't be a match, because the rightmost
          // character of the comparand falls to the right
          // of the comparand's omega
          continue;
          }
!       if( rightmost + comparands[k].identifier_3.length >
!                                                         the_end_of_the_world )
          {
          // This can't be a match, because the rightmost character of the
          // comparand falls past the new edge of id_1 established by a prior
*************** inspect_backward_format_1(const size_t i
*** 7253,7259 ****
          {
          for(size_t m=0; m<comparands[k].identifier_3.length; m++)
            {
!           if( comparands[k].identifier_3.the_characters[m] != rightmost[m] )
              {
              possible_match = false;
              break;
--- 7869,7875 ----
          {
          for(size_t m=0; m<comparands[k].identifier_3.length; m++)
            {
!           if( comparands[k].identifier_3.the_vectorxxxx[m] != rightmost[m] )
              {
              possible_match = false;
              break;
*************** inspect_backward_format_1(const size_t i
*** 7295,7306 ****
              if( comparands[k].leading )
                {
                if( rightmost + comparands[k].identifier_3.length
!                                                         == comparands[k].omega)
                  {
                  // This means that the match here is just the latest of a
                  // string of LEADING matches that started at .omega
                  comparands[k].leading_count += 1;
                  match = true;
                  }
                }
              break;
--- 7911,7925 ----
              if( comparands[k].leading )
                {
                if( rightmost + comparands[k].identifier_3.length
!                                                      == comparands[k].omega_it)
                  {
                  // This means that the match here is just the latest of a
                  // string of LEADING matches that started at .omega
                  comparands[k].leading_count += 1;
                  match = true;
+                 comparands[k].omega_it -= comparands[k].identifier_3.length;
+                 the_end_of_the_world = rightmost;
+                 rightmost_delta = comparands[k].identifier_3.length-1;
                  }
                }
              break;
*************** inspect_backward_format_1(const size_t i
*** 7314,7320 ****
              // all of the possible matches from here leftward to the alpha have
              // to be true as well:
  
!             if( (rightmost - comparands[k].alpha )
                      % comparands[k].identifier_3.length == 0 )
                {
                // The remaining number of characters is correct for a match.
--- 7933,7939 ----
              // all of the possible matches from here leftward to the alpha have
              // to be true as well:
  
!             if( (rightmost - comparands[k].alpha_it )
                      % comparands[k].identifier_3.length == 0 )
                {
                // The remaining number of characters is correct for a match.
*************** inspect_backward_format_1(const size_t i
*** 7322,7334 ****
  
                // Assume a match until we learn otherwise:
                match = true;
!               const char *local_left = rightmost;
                local_left -= comparands[k].identifier_3.length;
!               while( local_left >= comparands[k].alpha )
                  {
                  for(size_t m=0; m<comparands[k].identifier_3.length; m++)
                    {
!                   if( comparands[k].identifier_3.the_characters[m]
                        != local_left[m] )
                      {
                      // We have a mismatched character, so no trailing match is
--- 7941,7953 ----
  
                // Assume a match until we learn otherwise:
                match = true;
!               char_it_c local_left = rightmost;
                local_left -= comparands[k].identifier_3.length;
!               while( local_left >= comparands[k].alpha_it )
                  {
                  for(size_t m=0; m<comparands[k].identifier_3.length; m++)
                    {
!                   if( comparands[k].identifier_3.the_vectorxxxx[m]
                        != local_left[m] )
                      {
                      // We have a mismatched character, so no trailing match is
*************** inspect_backward_format_1(const size_t i
*** 7350,7360 ****
            // Bump the result counter
            id_2_results[comparands[k].id_2_index].result += 1;
  
!           // Because we are scanning from right to left, we have to drag
!           // the goalpost along with us to ensure that following
!           // comparisions don't spill over into the characters we just matched.
            the_end_of_the_world = rightmost;
  
            break;
            }
          }
--- 7969,7981 ----
            // Bump the result counter
            id_2_results[comparands[k].id_2_index].result += 1;
  
!           // We have a match here at rightmost, so we need to set the end of
!           // the world here
            the_end_of_the_world = rightmost;
  
+           // Adjust rightmost by the additional characters in a BACKWARD
+           // LEADING search:
+           rightmost -= rightmost_delta;
            break;
            }
          }
*************** __gg__inspect_format_1(int backward, siz
*** 7423,7429 ****
    cblc_index += 1;
    // normalize it, according to the language specification.
    normalized_operand normalized_id_1
!                                     = normalize_id(id1, id1_o, id1_s, id1->encoding);
  
    std::vector<comparand> comparands;
  
--- 8044,8050 ----
    cblc_index += 1;
    // normalize it, according to the language specification.
    normalized_operand normalized_id_1
!                              = normalize_id(id1, id1_o, id1_s, id1->encoding);
  
    std::vector<comparand> comparands;
  
*************** __gg__inspect_format_1(int backward, siz
*** 7480,7489 ****
            next_comparand.omega
              = next_comparand.alpha + normalized_id_1.length;
  
            the_alpha_and_omega(normalized_id_4_before,
                                normalized_id_4_after,
                                next_comparand.alpha,
!                               next_comparand.omega);
            comparands.push_back(next_comparand);
            break;
            }
--- 8101,8117 ----
            next_comparand.omega
              = next_comparand.alpha + normalized_id_1.length;
  
+           next_comparand.alpha_it = normalized_id_1.the_vectorxxxx.begin();
+           next_comparand.omega_it = normalized_id_1.the_vectorxxxx.end();
+ 
            the_alpha_and_omega(normalized_id_4_before,
                                normalized_id_4_after,
                                next_comparand.alpha,
!                               next_comparand.omega,
!                               next_comparand.alpha_it,
!                               next_comparand.omega_it,
!                               normalized_id_1.the_vectorxxxx.end());
! 
            comparands.push_back(next_comparand);
            break;
            }
*************** __gg__inspect_format_1(int backward, siz
*** 7527,7532 ****
--- 8155,8163 ----
              next_comparand.omega
                = next_comparand.alpha + normalized_id_1.length;
  
+             next_comparand.alpha_it = normalized_id_1.the_vectorxxxx.begin();
+             next_comparand.omega_it = normalized_id_1.the_vectorxxxx.end();
+ 
              normalized_operand normalized_id_4_before
                = normalize_id(id4_before, id4_before_o, id4_before_s, id1->encoding);
  
*************** __gg__inspect_format_1(int backward, siz
*** 7536,7542 ****
              the_alpha_and_omega(normalized_id_4_before,
                                  normalized_id_4_after,
                                  next_comparand.alpha,
!                                 next_comparand.omega);
              next_comparand.leading = true;
              next_comparand.leading_count = 0;
              comparands.push_back(next_comparand);
--- 8167,8177 ----
              the_alpha_and_omega(normalized_id_4_before,
                                  normalized_id_4_after,
                                  next_comparand.alpha,
!                                 next_comparand.omega,
!                                 next_comparand.alpha_it,
!                                 next_comparand.omega_it,
!                                 normalized_id_1.the_vectorxxxx.end());
! 
              next_comparand.leading = true;
              next_comparand.leading_count = 0;
              comparands.push_back(next_comparand);
*************** __gg__inspect_format_1(int backward, siz
*** 7552,7559 ****
    // We are now set up to accomplish the data flow described
    // in the language specification.  We loop through the
    // the character positions in normalized_id_1:
!   const char *leftmost  = normalized_id_1.the_characters.c_str();
!   const char *rightmost = leftmost + normalized_id_1.length;
  
    while( leftmost < rightmost )
      {
--- 8187,8194 ----
    // We are now set up to accomplish the data flow described
    // in the language specification.  We loop through the
    // the character positions in normalized_id_1:
!   char_it_c leftmost  = normalized_id_1.the_vectorxxxx.begin();
!   char_it_c rightmost = leftmost + normalized_id_1.length;
  
    while( leftmost < rightmost )
      {
*************** __gg__inspect_format_1(int backward, siz
*** 7562,7574 ****
  
      for(size_t k=0; k<comparands.size(); k++)
        {
!       if( leftmost < comparands[k].alpha )
          {
          // This can't be a match, because leftmost is
          // to the left of the comparand's alpha.
          continue;
          }
!       if( leftmost + comparands[k].identifier_3.length > comparands[k].omega )
          {
          // This can't be a match, because the rightmost
          // character of the comparand falls to the right
--- 8197,8209 ----
  
      for(size_t k=0; k<comparands.size(); k++)
        {
!       if( leftmost < comparands[k].alpha_it )
          {
          // This can't be a match, because leftmost is
          // to the left of the comparand's alpha.
          continue;
          }
!       if( leftmost + comparands[k].identifier_3.length > comparands[k].omega_it )
          {
          // This can't be a match, because the rightmost
          // character of the comparand falls to the right
*************** __gg__inspect_format_1(int backward, siz
*** 7584,7590 ****
          {
          for(size_t m=0; m<comparands[k].identifier_3.length; m++)
            {
!           if( comparands[k].identifier_3.the_characters[m] != leftmost[m] )
              {
              possible_match = false;
              break;
--- 8219,8225 ----
          {
          for(size_t m=0; m<comparands[k].identifier_3.length; m++)
            {
!           if( comparands[k].identifier_3.the_vectorxxxx[m] != leftmost[m] )
              {
              possible_match = false;
              break;
*************** __gg__inspect_format_1(int backward, siz
*** 7630,7639 ****
              //  2) leftmost / (length_of_comparand ) = current_count
              //
              // I get chills every time I look at that.
              if( comparands[k].leading )
                {
                // So far, so good.
!               size_t count = (leftmost - comparands[k].alpha)
                                / comparands[k].identifier_3.length;
                if( count == comparands[k].leading_count )
                  {
--- 8265,8275 ----
              //  2) leftmost / (length_of_comparand ) = current_count
              //
              // I get chills every time I look at that.
+ 
              if( comparands[k].leading )
                {
                // So far, so good.
!               size_t count = ((leftmost - comparands[k].alpha_it))
                                / comparands[k].identifier_3.length;
                if( count == comparands[k].leading_count )
                  {
*************** __gg__inspect_format_1(int backward, siz
*** 7654,7660 ****
              // all of the possible matches from here to the omega have to be
              // true as well:
  
!             if( (comparands[k].omega-leftmost)
                      % comparands[k].identifier_3.length == 0 )
                {
                // The remaining number of characters is correct for a match.
--- 8290,8296 ----
              // all of the possible matches from here to the omega have to be
              // true as well:
  
!             if( (comparands[k].omega_it-leftmost)
                      % comparands[k].identifier_3.length == 0 )
                {
                // The remaining number of characters is correct for a match.
*************** __gg__inspect_format_1(int backward, siz
*** 7662,7674 ****
  
                // Assume a match until we learn otherwise:
                match = true;
!               const char *local_left = leftmost;
                local_left += comparands[k].identifier_3.length;
!               while( local_left < comparands[k].omega )
                  {
                  for(size_t m=0; m<comparands[k].identifier_3.length; m++)
                    {
!                   if( comparands[k].identifier_3.the_characters[m]
                        != local_left[m] )
                      {
                      // We have a mismatched character, so no trailing match is
--- 8298,8310 ----
  
                // Assume a match until we learn otherwise:
                match = true;
!               char_it_c local_left = leftmost;
                local_left += comparands[k].identifier_3.length;
!               while( match && local_left < comparands[k].omega_it )
                  {
                  for(size_t m=0; m<comparands[k].identifier_3.length; m++)
                    {
!                   if( comparands[k].identifier_3.the_vectorxxxx[m]
                        != local_left[m] )
                      {
                      // We have a mismatched character, so no trailing match is
*************** __gg__inspect_format_1(int backward, siz
*** 7713,7719 ****
  
    // Add our results to the identifier_2 values:
  
- 
    for(size_t i = 0; i<id_2_results.size(); i++)
      {
      int rdigits;
--- 8349,8354 ----
*************** inspect_backward_format_2(const size_t i
*** 7809,7818 ****
          next_comparand.omega
            = next_comparand.alpha + normalized_id_1.length;
  
!         the_alpha_and_omega_backward( normalized_id_4_before,
!                                       normalized_id_4_after,
!                                       next_comparand.alpha,
!                                       next_comparand.omega);
          comparands.push_back(next_comparand);
          break;
          }
--- 8444,8461 ----
          next_comparand.omega
            = next_comparand.alpha + normalized_id_1.length;
  
!         next_comparand.alpha_it = normalized_id_1.the_vectorxxxx.begin();
!         next_comparand.omega_it = normalized_id_1.the_vectorxxxx.end();
! 
!         the_alpha_and_omega_backward(normalized_id_4_before,
!                             normalized_id_4_after,
!                             next_comparand.alpha,
!                             next_comparand.omega,
!                             next_comparand.alpha_it,
!                             next_comparand.omega_it,
!                             normalized_id_1.the_vectorxxxx.end());
! 
! 
          comparands.push_back(next_comparand);
          break;
          }
*************** inspect_backward_format_2(const size_t i
*** 7877,7886 ****
            normalized_operand normalized_id_4_after
              = normalize_id(id4_after, id4_after_o, id4_after_s, id1->encoding);
  
!           the_alpha_and_omega_backward( normalized_id_4_before,
!                                         normalized_id_4_after,
!                                         next_comparand.alpha,
!                                         next_comparand.omega);
            next_comparand.leading = true;
            next_comparand.leading_count = 0;
            next_comparand.first   = true;
--- 8520,8536 ----
            normalized_operand normalized_id_4_after
              = normalize_id(id4_after, id4_after_o, id4_after_s, id1->encoding);
  
!           next_comparand.alpha_it = normalized_id_1.the_vectorxxxx.begin();
!           next_comparand.omega_it = normalized_id_1.the_vectorxxxx.end();
! 
!           the_alpha_and_omega_backward(normalized_id_4_before,
!                               normalized_id_4_after,
!                               next_comparand.alpha,
!                               next_comparand.omega,
!                               next_comparand.alpha_it,
!                               next_comparand.omega_it,
!                               normalized_id_1.the_vectorxxxx.end());
! 
            next_comparand.leading = true;
            next_comparand.leading_count = 0;
            next_comparand.first   = true;
*************** inspect_backward_format_2(const size_t i
*** 7890,7914 ****
        }
      }
  
!   const char *leftmost  = normalized_id_1.the_characters.c_str();
!   const char *rightmost = leftmost + normalized_id_1.length;
!   const char *the_end_of_the_world = rightmost;
  
    while( leftmost < rightmost )
      {
      rightmost -= 1;
      // We look at the rightmost position.  If that position is within the
      // alpha-to-omega qualified range, we check all possible matches:
  
      for(size_t k=0; k<comparands.size(); k++)
        {
!       if( rightmost < comparands[k].alpha )
          {
          // This can't be a match, because rightmost is
          // to the left of the comparand's alpha.
          continue;
          }
!       if( rightmost + comparands[k].identifier_3.length > comparands[k].omega )
          {
          // This can't be a match, because the rightmost
          // character of the comparand falls to the right
--- 8540,8568 ----
        }
      }
  
!   // We can now look through normalized_id_1 and replace characters:
! 
!   char_it_c leftmost  = normalized_id_1.the_vectorxxxx.begin();
!   char_it_c rightmost = leftmost + normalized_id_1.length;
!   char_it_c the_end_of_the_world = rightmost;
  
    while( leftmost < rightmost )
      {
+     size_t rightmost_delta = 0;
+ 
      rightmost -= 1;
      // We look at the rightmost position.  If that position is within the
      // alpha-to-omega qualified range, we check all possible matches:
  
      for(size_t k=0; k<comparands.size(); k++)
        {
!       if( rightmost < comparands[k].alpha_it )
          {
          // This can't be a match, because rightmost is
          // to the left of the comparand's alpha.
          continue;
          }
!       if( rightmost + comparands[k].identifier_3.length > comparands[k].omega_it )
          {
          // This can't be a match, because the rightmost
          // character of the comparand falls to the right
*************** inspect_backward_format_2(const size_t i
*** 7931,7937 ****
          {
          for(size_t m=0; m<comparands[k].identifier_3.length; m++)
            {
!           if( comparands[k].identifier_3.the_characters[m] != rightmost[m] )
              {
              possible_match = false;
              break;
--- 8585,8591 ----
          {
          for(size_t m=0; m<comparands[k].identifier_3.length; m++)
            {
!           if( comparands[k].identifier_3.the_vectorxxxx[m] != rightmost[m] )
              {
              possible_match = false;
              break;
*************** inspect_backward_format_2(const size_t i
*** 7973,7986 ****
              if( comparands[k].leading )
                {
                if(   rightmost
!                   + comparands[k].identifier_3.length
!                   + comparands[k].leading_count
!                     == comparands[k].omega)
                  {
                  // This means that the match here is just the latest of a
                  // string of LEADING matches that started at .omega
                  comparands[k].leading_count += 1;
                  match = true;
                  }
                }
              break;
--- 8627,8640 ----
              if( comparands[k].leading )
                {
                if(   rightmost
!                   + comparands[k].identifier_3.length * (comparands[k].leading_count +1)
!                     == comparands[k].omega_it)
                  {
                  // This means that the match here is just the latest of a
                  // string of LEADING matches that started at .omega
                  comparands[k].leading_count += 1;
                  match = true;
+                 rightmost_delta = comparands[k].identifier_3.length-1;
                  }
                }
              break;
*************** inspect_backward_format_2(const size_t i
*** 7994,8000 ****
              // all of the possible matches from here leftward to the alpha have
              // to be true as well:
  
!             if( (rightmost - comparands[k].alpha )
                      % comparands[k].identifier_3.length == 0 )
                {
                // The remaining number of characters is correct for a match.
--- 8648,8654 ----
              // all of the possible matches from here leftward to the alpha have
              // to be true as well:
  
!             if( (rightmost - comparands[k].alpha_it )
                      % comparands[k].identifier_3.length == 0 )
                {
                // The remaining number of characters is correct for a match.
*************** inspect_backward_format_2(const size_t i
*** 8002,8014 ****
  
                // Assume a match until we learn otherwise:
                match = true;
!               const char *local_left = rightmost;
                local_left -= comparands[k].identifier_3.length;
!               while( local_left >= comparands[k].alpha )
                  {
                  for(size_t m=0; m<comparands[k].identifier_3.length; m++)
                    {
!                   if( comparands[k].identifier_3.the_characters[m]
                        != local_left[m] )
                      {
                      // We have a mismatched character, so no trailing match is
--- 8656,8668 ----
  
                // Assume a match until we learn otherwise:
                match = true;
!               char_it_c local_left = rightmost;
                local_left -= comparands[k].identifier_3.length;
!               while( local_left >= comparands[k].alpha_it )
                  {
                  for(size_t m=0; m<comparands[k].identifier_3.length; m++)
                    {
!                   if( comparands[k].identifier_3.the_vectorxxxx[m]
                        != local_left[m] )
                      {
                      // We have a mismatched character, so no trailing match is
*************** inspect_backward_format_2(const size_t i
*** 8031,8048 ****
            // with the characters from normalized_id_5
            //fprintf(stderr, "Rule: %ld %p %s\n", k+1, rightmost, rightmost);
  
!           size_t index = rightmost - normalized_id_1.the_characters.c_str();
            for( size_t l = 0;
                 l < comparands[k].identifier_5.length;
                 l++ )
              {
!             char ch = comparands[k].identifier_5.
!                       the_characters[l];
!             normalized_id_1.the_characters[index++] = ch;
              }
  
            the_end_of_the_world = rightmost;
! 
            break;
            }
          }
--- 8685,8702 ----
            // with the characters from normalized_id_5
            //fprintf(stderr, "Rule: %ld %p %s\n", k+1, rightmost, rightmost);
  
!           size_t index = rightmost - normalized_id_1.the_vectorxxxx.begin();
            for( size_t l = 0;
                 l < comparands[k].identifier_5.length;
                 l++ )
              {
!             cbl_char_t ch = comparands[k].identifier_5.
!                       the_vectorxxxx[l];
!             normalized_id_1.the_vectorxxxx[index++] = ch;
              }
  
            the_end_of_the_world = rightmost;
!           rightmost -= rightmost_delta;
            break;
            }
          }
*************** inspect_backward_format_2(const size_t i
*** 8054,8089 ****
      }
  
    // Here is where we take the characters from normalized_id_1 and put them
!   // back into identifier_1.  There is some special processing to make sure
!   // an embedded sign in a NumericDisplay survives the processing.
    unsigned char *id1_data = id1->data + id1_o;
!   int index_dest = normalized_id_1.offset;
!   if( id1->type == FldNumericDisplay )
!     {
!     for(size_t i=0; i<normalized_id_1.length; i++)
!       {
!       charmap_t *charmap = __gg__get_charmap(id1->encoding);
!       id1_data[index_dest] = normalized_id_1.the_characters[i];
!       if( charmap->is_digit_negative(normalized_id_1.the_characters[i]) )
!         {
!         id1_data[index_dest]
!                   = charmap->set_digit_negative(id1_data[index_dest], true);
!         }
!       else
!         {
!         id1_data[index_dest]
!                   = charmap->set_digit_negative(id1_data[index_dest], false);
!         }
!       index_dest += 1;
!       }
!     }
!   else
!     {
!     for(size_t i=0; i<normalized_id_1.length; i++)
!       {
!       id1_data[index_dest++] = normalized_id_1.the_characters[i];
!       }
!     }
    return;
    }
  
--- 8708,8736 ----
      }
  
    // Here is where we take the characters from normalized_id_1 and put them
!   // back into identifier_1.
! 
!   charmap_t *charmap = __gg__get_charmap(id1->encoding);
!   // Wastefully prefill id_1 with spaces in case the processing resulted in a
!   // string shorter than the original.  (There is always the possiblity that
!   // a UTF-8 or UTF-16 codeset pair got replaced with a single character.) Do
!   // this before calling __gg__converter, because both mapped_character and
!   // __gg__iconverter use the same static buffer.
    unsigned char *id1_data = id1->data + id1_o;
!   charmap->memset(id1_data, charmap->mapped_character(ascii_space), id1_s);
! 
!   // We've been working in UTF32; we convert back to the original id1 encoding.
!   size_t bytes_converted;
!   const char *converted = __gg__iconverter( DEFAULT_32_ENCODING,
!                                          id1->encoding,
!                                          normalized_id_1.the_vectorxxxx.data(),
!                                          normalized_id_1.length*width_of_utf32,
!                                          &bytes_converted) ;
!   // And move those characters into place in id_1:
!   memcpy(id1_data,
!          converted,
!          std::min(bytes_converted, id1_s));
! 
    return;
    }
  
*************** __gg__inspect_format_2(int backward, siz
*** 8106,8126 ****
    size_t        id1_s = __gg__treeplet_1s[cblc_index];
    cblc_index += 1;
  
- #if 0
-   fprintf(stderr, "%s:%d: '%.*s' id1_o %zu, id1_s %zu\n", __func__, __LINE__, 
-           int(id1_s), (char*)id1->data, id1_o, id1_s);
- #endif
-   
    // normalize it, according to the language specification.
    normalized_operand normalized_id_1
                                     = normalize_id(id1, id1_o, id1_s, id1->encoding);
! #if 0
!   fprintf(stderr, "%s:%d: normalized_id_1 '%s' offset %zu, length %zu\n", __func__, __LINE__, 
!           normalized_id_1.the_characters.c_str(),
!           normalized_id_1.offset, 
!           normalized_id_1.length );
! #endif
!   
    std::vector<comparand> comparands;
  
    // Pick up the count of operations:
--- 8753,8762 ----
    size_t        id1_s = __gg__treeplet_1s[cblc_index];
    cblc_index += 1;
  
    // normalize it, according to the language specification.
    normalized_operand normalized_id_1
                                     = normalize_id(id1, id1_o, id1_s, id1->encoding);
! 
    std::vector<comparand> comparands;
  
    // Pick up the count of operations:
*************** __gg__inspect_format_2(int backward, siz
*** 8171,8180 ****
          next_comparand.omega
            = next_comparand.alpha + normalized_id_1.length;
  
          the_alpha_and_omega(normalized_id_4_before,
                              normalized_id_4_after,
                              next_comparand.alpha,
!                             next_comparand.omega);
          comparands.push_back(next_comparand);
          break;
          }
--- 8807,8822 ----
          next_comparand.omega
            = next_comparand.alpha + normalized_id_1.length;
  
+         next_comparand.alpha_it = normalized_id_1.the_vectorxxxx.begin();
+         next_comparand.omega_it = normalized_id_1.the_vectorxxxx.end();
+ 
          the_alpha_and_omega(normalized_id_4_before,
                              normalized_id_4_after,
                              next_comparand.alpha,
!                             next_comparand.omega,
!                             next_comparand.alpha_it,
!                             next_comparand.omega_it,
!                             normalized_id_1.the_vectorxxxx.end());
          comparands.push_back(next_comparand);
          break;
          }
*************** __gg__inspect_format_2(int backward, siz
*** 8245,8254 ****
            normalized_operand normalized_id_4_after
              = normalize_id(id4_after, id4_after_o, id4_after_s, id1->encoding);
  
            the_alpha_and_omega(normalized_id_4_before,
                                normalized_id_4_after,
                                next_comparand.alpha,
!                               next_comparand.omega);
            next_comparand.leading = true;
            next_comparand.leading_count = 0;
            next_comparand.first   = true;
--- 8887,8903 ----
            normalized_operand normalized_id_4_after
              = normalize_id(id4_after, id4_after_o, id4_after_s, id1->encoding);
  
+           next_comparand.alpha_it = normalized_id_1.the_vectorxxxx.begin();
+           next_comparand.omega_it = normalized_id_1.the_vectorxxxx.end();
+ 
            the_alpha_and_omega(normalized_id_4_before,
                                normalized_id_4_after,
                                next_comparand.alpha,
!                               next_comparand.omega,
!                               next_comparand.alpha_it,
!                               next_comparand.omega_it,
!                               normalized_id_1.the_vectorxxxx.end());
! 
            next_comparand.leading = true;
            next_comparand.leading_count = 0;
            next_comparand.first   = true;
*************** __gg__inspect_format_2(int backward, siz
*** 8261,8270 ****
    // We are now set up to accomplish the data flow described
    // in the language specification.  We loop through the
    // the character positions in normalized_id_1:
!   const char *leftmost
!     = normalized_id_1.the_characters.c_str();
!   const char *rightmost
!     = leftmost + normalized_id_1.length;
  
    while( leftmost < rightmost )
      {
--- 8910,8917 ----
    // We are now set up to accomplish the data flow described
    // in the language specification.  We loop through the
    // the character positions in normalized_id_1:
!   char_it_c leftmost  = normalized_id_1.the_vectorxxxx.begin();
!   char_it_c rightmost = leftmost + normalized_id_1.length;
  
    while( leftmost < rightmost )
      {
*************** __gg__inspect_format_2(int backward, siz
*** 8273,8286 ****
  
      for(size_t k=0; k<comparands.size(); k++)
        {
!       if( leftmost < comparands[k].alpha )
          {
          // This can't be a match, because leftmost is
          // to the left of the comparand's alpha.
          continue;
          }
        if( leftmost + comparands[k].identifier_3.length
!           > comparands[k].omega )
          {
          // This can't be a match, because the rightmost
          // character of the comparand falls to the right
--- 8920,8933 ----
  
      for(size_t k=0; k<comparands.size(); k++)
        {
!       if( leftmost < comparands[k].alpha_it )
          {
          // This can't be a match, because leftmost is
          // to the left of the comparand's alpha.
          continue;
          }
        if( leftmost + comparands[k].identifier_3.length
!           > comparands[k].omega_it )
          {
          // This can't be a match, because the rightmost
          // character of the comparand falls to the right
*************** __gg__inspect_format_2(int backward, siz
*** 8295,8301 ****
          {
          for(size_t m=0; m<comparands[k].identifier_3.length; m++)
            {
!           if( comparands[k].identifier_3.the_characters[m]
                != leftmost[m] )
              {
              possible_match = false;
--- 8942,8948 ----
          {
          for(size_t m=0; m<comparands[k].identifier_3.length; m++)
            {
!           if( comparands[k].identifier_3.the_vectorxxxx[m]
                != leftmost[m] )
              {
              possible_match = false;
*************** __gg__inspect_format_2(int backward, siz
*** 8346,8352 ****
              if( comparands[k].leading )
                {
                // So far, so good.
!               size_t count = (leftmost - comparands[k].alpha)
                                / comparands[k].identifier_3.length;
                if( count == comparands[k].leading_count )
                  {
--- 8993,8999 ----
              if( comparands[k].leading )
                {
                // So far, so good.
!               size_t count = (leftmost - comparands[k].alpha_it)
                                / comparands[k].identifier_3.length;
                if( count == comparands[k].leading_count )
                  {
*************** __gg__inspect_format_2(int backward, siz
*** 8367,8373 ****
              // all of the possible matches from here to the omega have to be
              // true as well:
  
!             if( (comparands[k].omega-leftmost)
                      % comparands[k].identifier_3.length == 0 )
                {
                // The remaining number of characters is correct for a match.
--- 9014,9020 ----
              // all of the possible matches from here to the omega have to be
              // true as well:
  
!             if( (comparands[k].omega_it-leftmost)
                      % comparands[k].identifier_3.length == 0 )
                {
                // The remaining number of characters is correct for a match.
*************** __gg__inspect_format_2(int backward, siz
*** 8375,8387 ****
  
                // Assume a match until we learn otherwise:
                match = true;
!               const char *local_left = leftmost;
                local_left += comparands[k].identifier_3.length;
!               while( local_left < comparands[k].omega )
                  {
                  for(size_t m=0; m<comparands[k].identifier_3.length; m++)
                    {
!                   if( comparands[k].identifier_3.the_characters[m]
                        != local_left[m] )
                      {
                      // We have a mismatched character, so no trailing match is
--- 9022,9034 ----
  
                // Assume a match until we learn otherwise:
                match = true;
!               char_it_c local_left = leftmost;
                local_left += comparands[k].identifier_3.length;
!               while( local_left < comparands[k].omega_it )
                  {
                  for(size_t m=0; m<comparands[k].identifier_3.length; m++)
                    {
!                   if( comparands[k].identifier_3.the_vectorxxxx[m]
                        != local_left[m] )
                      {
                      // We have a mismatched character, so no trailing match is
*************** __gg__inspect_format_2(int backward, siz
*** 8403,8416 ****
            // with the characters from normalized_id_5
  
            size_t index = leftmost
!                          - normalized_id_1.the_characters.c_str();
            for( size_t l = 0;
                 l < comparands[k].identifier_5.length;
                 l++ )
              {
              char ch = comparands[k].identifier_5.
!                       the_characters[l];
!             normalized_id_1.the_characters[index++] = ch;
              }
            // Adjust the leftmost pointer to point to
            // the rightmost character of the matched
--- 9050,9063 ----
            // with the characters from normalized_id_5
  
            size_t index = leftmost
!                          - normalized_id_1.the_vectorxxxx.begin();
            for( size_t l = 0;
                 l < comparands[k].identifier_5.length;
                 l++ )
              {
              char ch = comparands[k].identifier_5.
!                       the_vectorxxxx[l];
!             normalized_id_1.the_vectorxxxx[index++] = ch;
              }
            // Adjust the leftmost pointer to point to
            // the rightmost character of the matched
*************** __gg__inspect_format_2(int backward, siz
*** 8430,8504 ****
      }
  
    // Here is where we take the characters from normalized_id_1 and put them
!   // back into identifier_1.  There is some special processing to make sure
!   // an embedded sign in a NumericDisplay survives the processing.
    unsigned char *id1_data = id1->data + id1_o;
!   int index_dest = normalized_id_1.offset;
!   if( id1->type == FldNumericDisplay )
!     {
!     for(size_t i=0; i<normalized_id_1.length; i++)
!       {
!       charmap_t *charmap = __gg__get_charmap(id1->encoding);
!       id1_data[index_dest] = normalized_id_1.the_characters[i];
!       if( charmap->is_digit_negative(normalized_id_1.the_characters[i]) )
!         {
!         id1_data[index_dest]
!                     = charmap->set_digit_negative(id1_data[index_dest], true);
!         }
!       else
!         {
!         id1_data[index_dest]
!                     = charmap->set_digit_negative(id1_data[index_dest], false);
!         }
!       index_dest += 1;
!       }
!     }
!   else
!     {
!     for(size_t i=0; i<normalized_id_1.length; i++)
!       {
!       id1_data[index_dest++] = normalized_id_1.the_characters[i];
!       }
!     }
    return;
    }
  
! static char *
! normalize_for_inspect_format_4( size_t        *dest_size,
!                           const cblc_field_t  *var,
!                                 size_t         var_offset,
!                                 size_t         var_size,
!                                 cbl_encoding_t encoding)
    {
!   // Returns a malloced pointer; the caller needs to free it.
!   char *retval;
!   retval = static_cast<char *>(malloc(var_size+1));
    if(var)
      {
      cbl_figconst_t figconst =
                        static_cast<cbl_figconst_t>(var->attr & FIGCONST_MASK);
      if( figconst )
        {
        // Build up an var_size array of figconst characters
!       charmap_t *charmap = __gg__get_charmap(encoding);
!       char figchar = '\0';
        switch( figconst )
          {
          case low_value_e   :
!           figchar = charmap->low_value_character();
            break;
          case zero_value_e  :
!           figchar = charmap->mapped_character(ascii_0);
            break;
          case space_value_e :
!           figchar = charmap->mapped_character(ascii_space);
            break;
          case quote_value_e :
!           figchar = charmap->quote_character();
            break;
          case high_value_e  :
!           figchar = charmap->high_value_character();
            break;
          case null_value_e:
            break;
          default:
--- 9077,9178 ----
      }
  
    // Here is where we take the characters from normalized_id_1 and put them
!   // back into identifier_1.
! 
!   charmap_t *charmap = __gg__get_charmap(id1->encoding);
!   // Wastefully prefill id_1 with spaces in case the processing resulted in a
!   // string shorter than the original.  (There is always the possiblity that
!   // a UTF-8 or UTF-16 codeset pair got replaced with a single character.) Do
!   // this before calling __gg__converter, because both mapped_character and
!   // __gg__iconverter use the same static buffer.
    unsigned char *id1_data = id1->data + id1_o;
!   charmap->memset(id1_data, charmap->mapped_character(ascii_space), id1_s);
! 
!   // We've been working in UTF32; we convert back to the original id1 encoding.
!   size_t bytes_converted;
!   const char *converted = __gg__iconverter( DEFAULT_32_ENCODING,
!                                          id1->encoding,
!                                          normalized_id_1.the_vectorxxxx.data(),
!                                          normalized_id_1.length*width_of_utf32,
!                                          &bytes_converted) ;
!   // And move those characters into place in id_1:
!   memcpy(id1_data,
!          converted,
!          std::min(bytes_converted, id1_s));
    return;
    }
  
! static std::u32string
! normalize_for_inspect_format_4(const cblc_field_t  *var,
!                                 size_t              var_offset,
!                                 size_t              var_size,
!                                 cbl_encoding_t      source_encoding)
    {
!   std::u32string retval;
    if(var)
      {
+     const charmap_t *charmap_var = __gg__get_charmap(source_encoding);
+     charmap_t *charmap32 = __gg__get_charmap(DEFAULT_32_ENCODING);
+ 
      cbl_figconst_t figconst =
                        static_cast<cbl_figconst_t>(var->attr & FIGCONST_MASK);
+     // We have a corner case to deal with:
+     if( strcmp(var->name, "NULLS") == 0 )
+       {
+       figconst = null_value_e;
+       }
+ 
      if( figconst )
        {
        // Build up an var_size array of figconst characters
!       cbl_char_t figchar = '\0';
        switch( figconst )
          {
          case low_value_e   :
!           figchar = charmap32->low_value_character();
            break;
          case zero_value_e  :
!           figchar = charmap32->mapped_character(ascii_0);
            break;
          case space_value_e :
!           figchar = charmap32->mapped_character(ascii_space);
            break;
          case quote_value_e :
!           figchar = charmap32->quote_character();
            break;
          case high_value_e  :
!           {
!           if( __gg__high_value_character == DEFAULT_HIGH_VALUE_8 )
!             {
!             // See the comments where these constants are defined.
!             if(charmap_var->stride() == 1)
!               {
!               if(charmap_var->is_like_ebcdic())
!                 {
!                 // This maps back to 0xFF in CP1140
!                 figchar = EBCDIC_HIGH_VALUE_32;
!                 }
!               else
!                 {
!                 // This maps back to 0xFF in CP1252
!                 figchar = ASCII_HIGH_VALUE_32;
!                 }
!               }
!             else if(charmap_var->stride() == 2)
!               {
!               figchar = UTF16_HIGH_VALUE_32;
!               }
!             else
!               {
!               figchar = UTF32_HIGH_VALUE_32;
!               }
!             }
!           else
!             {
!             figchar = charmap32->mapped_character(__gg__high_value_character);
!             }
            break;
+           }
          case null_value_e:
            break;
          default:
*************** normalize_for_inspect_format_4( size_t
*** 8506,8532 ****
            abort();
            break;
          }
!       memset(retval, figchar, var_size);
!       retval[var_size] = '\0';
        }
      else
        {
!       // It's not a figurative constant, so convert var to the target encoding.
!       memcpy(retval,
!              __gg__iconverter(var->encoding,
!                               encoding,
!                               PTRCAST(char, var->data) + var_offset,
                                var_size,
!                               dest_size),
!              var_size);
!       retval[var_size] = '\0';
        }
      }
-   else
-     {
-     retval = nullptr;
-     *dest_size = 0;
-     }
    return retval;
    }
  
--- 9180,9206 ----
            abort();
            break;
          }
!       retval.push_back(figchar);
        }
      else
        {
!       // It's not a figurative constant, so convert var to UTF32.
!       size_t converted_bytes;
!       const char *converted = __gg__iconverter(
!                               var->encoding,
!                               DEFAULT_32_ENCODING,
!                               var->data + var_offset,
                                var_size,
!                               &converted_bytes);
!       void *duped = __gg__memdup(converted, converted_bytes);
!       for(size_t i=0; i<converted_bytes; i+=width_of_utf32)
!         {
!         cbl_char_t ch = charmap32->getch(duped, i);
!         retval.push_back(ch);
!         }
!       free(duped);
        }
      }
    return retval;
    }
  
*************** __gg__inspect_format_4( int backward,
*** 8560,8568 ****
    // constant.
  
    cbl_figconst_t figconst_original =
!                             static_cast<cbl_figconst_t>(original->attr & FIGCONST_MASK);
    cbl_figconst_t figconst_replacement =
!                             static_cast<cbl_figconst_t>(replacement->attr & FIGCONST_MASK);
    int figswitch = (figconst_original ? 2 : 0) + (figconst_replacement ? 1 : 0);
    switch( figswitch )
      {
--- 9234,9242 ----
    // constant.
  
    cbl_figconst_t figconst_original =
!                 static_cast<cbl_figconst_t>(original->attr & FIGCONST_MASK);
    cbl_figconst_t figconst_replacement =
!                 static_cast<cbl_figconst_t>(replacement->attr & FIGCONST_MASK);
    int figswitch = (figconst_original ? 2 : 0) + (figconst_replacement ? 1 : 0);
    switch( figswitch )
      {
*************** __gg__inspect_format_4( int backward,
*** 8570,8579 ****
        // Neither are figconst; we leave the sizes alone
        break;
      case 1:
!       // Only replacement is figconst, so we make its size the same as the
!       // original.  This will cause CONVERTING "ABC" TO ZERO to be the same as
        //                            CONVERTING "ABC" TO "000"
!       replacement_size = original_size;
        break;
      case 2:
        // Only original is figconst.  Set the size to one.  (This is necessary
--- 9244,9253 ----
        // Neither are figconst; we leave the sizes alone
        break;
      case 1:
!       // Only replacement is figconst, so we make its size -1
!       // This will cause CONVERTING "ABC" TO ZERO to be the same as
        //                            CONVERTING "ABC" TO "000"
!       replacement_size = (size_t)(-1LL);
        break;
      case 2:
        // Only original is figconst.  Set the size to one.  (This is necessary
*************** __gg__inspect_format_4( int backward,
*** 8598,8745 ****
      after_size = 1;
      }
  
-   size_t psz_input_size      ;
-   size_t psz_original_size   ;
-   size_t psz_replacement_size;
-   size_t psz_after_size      ;
-   size_t psz_before_size     ;
- 
    bool all = (replacement_size == (size_t)(-1LL));
    if( all )
      {
      // A replacement_size of -1 means that the statement is something like
      // INSPECT XYZ CONVERTING "abcxyz" to ALL "?"  That means replacement is
      // a single character.  We need to convert it to the target encoding.
!     replacement_size = 1;
      }
  
!   char *psz_input       = normalize_for_inspect_format_4(&psz_input_size      , input      , input_offset      , input_size      , input->encoding);
!   char *psz_original    = normalize_for_inspect_format_4(&psz_original_size   , original   , original_offset   , original_size   , input->encoding);
!   char *psz_replacement = normalize_for_inspect_format_4(&psz_replacement_size, replacement, replacement_offset, replacement_size, input->encoding);
!   char *psz_after       = normalize_for_inspect_format_4(&psz_after_size      , after      , after_offset      , after_size      , input->encoding);
!   char *psz_before      = normalize_for_inspect_format_4(&psz_before_size     , before     , before_offset     , before_size     , input->encoding);
  
    if( all )
      {
!     // We now expand the single-byte replacement to be the same length as
      // original.
!     psz_replacement_size = psz_original_size;
!     psz_replacement = static_cast<char *>(realloc(psz_replacement, psz_replacement_size));
!     memset(psz_replacement, psz_replacement[0], psz_replacement_size);
      }
  
!   // Use a simple map to make this O(N), rather than an O(N-squared),
    // computational complexity
!   static const unsigned char map_init[256] =
!     {
!     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
!     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
!     0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
!     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
!     0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
!     0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
!     0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
!     0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
!     0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
!     0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
!     0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
!     0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
!     0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
!     0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
!     0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
!     0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
!     };
!   unsigned char map[256];
! 
!   // Initialize the map to a one-to-one correspondence.
!   memcpy(map, map_init, 256);
  
    // The rule is, if the same character appears more than once in the
    // original (which is identifier-6), then the first occurrence of the
    // matching character in replacement is used.  So, we create the map
    // backwards.  The one closest to zero will win.
!   for(size_t i=original_size-1; i<original_size; i--)
      {
!     map[ (unsigned char )psz_original[i] ] = (unsigned char )psz_replacement[i];
      }
  
!   char *pstart = NULL;
!   const char *pend = NULL;
!   if( backward )
      {
!     if( before_size )
        {
!       size_t nfound = std::string(psz_input).rfind(psz_before);
!       if( nfound == std::string::npos )
          {
!         // The BEFORE string isn't in the input, so we will scan from
!         // the leftmost character
!         pstart = psz_input;
          }
        else
          {
!         pstart = psz_input + nfound;
!         if( !pstart )
!           {
!           pstart = psz_input;
!           }
!         pstart += before_size;
          }
        }
!     else
        {
!       pstart = psz_input;
        }
! 
!     if( after_size )
        {
!       size_t nfound = std::string(psz_input).rfind(psz_after);
!       if( nfound == std::string::npos )
          {
!         nfound = input_size;
          }
-       pend = psz_input + nfound;
-       }
-     if( !pend )
-       {
-       pend = psz_input+input_size;
        }
      }
    else
      {
!     if( after_size )
        {
!       pstart = strstr(psz_input, psz_after);
        }
!     if( !pstart )
        {
!       pstart = psz_input;
        }
!     pstart += after_size;
! 
!     if( before_size )
        {
!       pend = strstr(psz_input, psz_before);
        }
!     if( !pend )
        {
!       pend = psz_input + input_size;
        }
      }
! 
!   while(pstart && pstart < pend)
      {
!     *pstart = map[(unsigned char)*pstart];
!     pstart += 1;
      }
  
!   memcpy(input->data+input_offset, psz_input, input_size);
  
!   free(psz_input       );
!   free(psz_original    );
!   free(psz_replacement );
!   free(psz_after       );
!   free(psz_before      );
    }
  
  static void
--- 9272,9454 ----
      after_size = 1;
      }
  
    bool all = (replacement_size == (size_t)(-1LL));
    if( all )
      {
      // A replacement_size of -1 means that the statement is something like
      // INSPECT XYZ CONVERTING "abcxyz" to ALL "?"  That means replacement is
      // a single character.  We need to convert it to the target encoding.
!     const charmap_t * charmap = __gg__get_charmap(input->encoding);
!     replacement_size = charmap->stride();
      }
  
!   std::u32string str_input       = normalize_for_inspect_format_4(input      , input_offset      , input_size      , input->encoding);
!   std::u32string str_original    = normalize_for_inspect_format_4(original   , original_offset   , original_size   , input->encoding);
!   std::u32string str_replacement = normalize_for_inspect_format_4(replacement, replacement_offset, replacement_size, input->encoding);
!   std::u32string str_after       = normalize_for_inspect_format_4(after      , after_offset      , after_size      , input->encoding);
!   std::u32string str_before      = normalize_for_inspect_format_4(before     , before_offset     , before_size     , input->encoding);
  
    if( all )
      {
!     // We now expand the single-character replacement to be the same length as
      // original.
!     cbl_char_t ch = str_replacement[0];
!     str_replacement.clear();
!     for(size_t i=0; i<str_original.size(); i++)
!       {
!       str_replacement.push_back(ch);
!       }
      }
  
!   // Use a  map to make this O(N), rather than an O(N-squared),
    // computational complexity
!   std::unordered_map<cbl_char_t, cbl_char_t>map;
!   typedef std::unordered_map<cbl_char_t, cbl_char_t>::const_iterator map_it_t ;
  
    // The rule is, if the same character appears more than once in the
    // original (which is identifier-6), then the first occurrence of the
    // matching character in replacement is used.  So, we create the map
    // backwards.  The one closest to zero will win.
!   for(size_t i=str_original.size()-1; i<str_original.size(); i--)
      {
!     map[str_original[i]] = str_replacement[i];
      }
  
!   size_t leftmost_i;   // Leftmost index to replace at.
!   size_t rightmost_i;  // Rightmost+1 index to replace at.
! 
!   if( !backward )
      {
!     // This is a forward conversion.  We look for the first instance
!     // of str_after from the left.  And then we look for the first instance
!     // of str_before after that.  When there is no str_before, we move the
!     // rightmost limit to the end of str_input, as if there were no BEFORE
!     // phrase:
! 
!     if( str_after.empty() )
        {
!       // There is no AFTER phrase, so we start from the left.
!       leftmost_i = 0;
!       }
!     else
!       {
!       size_t nfound = str_input.find(str_after);
!       if( nfound != std::u32string::npos )
          {
!         // Move the left limit to one character past the found element
!         leftmost_i = nfound + str_after.size();
          }
        else
          {
!         // We didn't find the after phrase, so we move the left limit to the
!         // end of input, which means nothing will be replaced
!         leftmost_i = str_input.size();
          }
        }
! 
!     // At this point, leftmost_i has been set to something.  Look for the
!     // BEFORE phrase somewhere to the right of it:
! 
!     if( str_before.empty() )
        {
!       // There is no BEFORE phrase, so set rightmost to the end of the input
!       rightmost_i = str_input.size();
        }
!     else
        {
!       // Look for BEFORE to the right of leftmost_i:
!       size_t nfound = str_input.find(str_before, leftmost_i);
!       if( nfound != std::u32string::npos )
          {
!         // We found the BEFORE phrase.
!         rightmost_i = nfound;
!         }
!       else
!         {
!         // We didn't find the BEFORE phrase; IOS says to treat this situation
!         // as if there were no BEFORE phrase
!         rightmost_i = str_input.size();
          }
        }
      }
    else
      {
!     // We are doing a BACKWARD conversion.  So, we look for the AFTER phrase
!     // and use that to establish the rightmost limit.  And we look for the
!     // BEFORE to the left of AFTER phrase and use that to establish the
!     // leftmost limit
! 
!     if( str_after.empty() )
        {
!       // There is no AFTER phrase, so we set the rightmost limit to the end
!       // of the input:
!       rightmost_i = str_input.size();
        }
!     else
        {
!       // Start from the right and look for AFTER
!       size_t nfound = str_input.rfind(str_after, str_input.size());
!       if( nfound != std::u32string::npos )
!         {
!         // We found str_after, so its location becomes rightmost
!         rightmost_i = nfound;
!         }
!       else
!         {
!         // We didn't find str_after, so we move rightmost all the way to the
!         // left, so that nothing will ever be found.
!         rightmost_i = 0;
!         }
        }
!     // rightmost_i has been established, so now look for BEFORE to the left
!     // of it
!     if( str_before.empty() )
        {
!       // There is no str_before, so the left limit is all the way to the left
!       leftmost_i = 0;
        }
!     else
        {
!       size_t nfound = str_input.rfind(str_before, rightmost_i);
!       if( nfound != std::u32string::npos )
!         {
!         // We found BEFORE, so we put the left limit just to the right of
!         // where we found it:
!         leftmost_i = nfound + str_before.size();
!         }
!       else
!         {
!         // Not finding the BEFORE phrase is the same as the BEFORE phrase
!         // not having been specified:
!         leftmost_i = 0;
!         }
        }
      }
!   // leftmost_i and rightmost_i have been established.  Do the conversion of
!   // characters inside those limits:
!   for(size_t i=leftmost_i; i<rightmost_i; i++)
      {
!     cbl_char_t ch = str_input[i];
!     map_it_t cvt = map.find(ch);
!     if( cvt != map.end() )
!       {
!       str_input[i] = cvt->second;
!       }
      }
  
!   // We now take the converted str_input, and put it back into id_1:
  
!   size_t bytes_converted;
!   const char *converted = __gg__iconverter(DEFAULT_32_ENCODING,
!                                            input->encoding,
!                                            str_input.data(),
!                                            str_input.size()*width_of_utf32,
!                                            &bytes_converted) ;
! 
!   // And move those characters into place in input:
!   memcpy(input->data + input_offset,
!          converted,
!          std::min(bytes_converted, input_size));
    }
  
  static void
*************** move_string(cblc_field_t *field,
*** 8810,8816 ****
            // Get the charmap after the move, because it can mess with the
            // static 'to' buffer.
            charmap_t *charmap = __gg__get_charmap(field->encoding);
!           memset(to, charmap->mapped_character(ascii_space), dest_length-count);
            }
          else
            {
--- 9519,9525 ----
            // Get the charmap after the move, because it can mess with the
            // static 'to' buffer.
            charmap_t *charmap = __gg__get_charmap(field->encoding);
!           charmap->memset(to, charmap->mapped_character(ascii_space), dest_length-count);
            }
          else
            {
*************** static char *
*** 8871,8886 ****
  brute_force_trim(char *str, cbl_encoding_t encoding)
    {
    charmap_t *charmap = __gg__get_charmap(encoding);
  
    char *retval = str;
!   while( *retval == charmap->mapped_character(ascii_space) )
      {
!     retval += 1;
      }
!   char *p = retval + strlen(retval)-1;
!   while( p > retval && *p == charmap->mapped_character(ascii_space) )
      {
!     *p-- = NULLCH;
      }
    return retval;
    }
--- 9580,9601 ----
  brute_force_trim(char *str, cbl_encoding_t encoding)
    {
    charmap_t *charmap = __gg__get_charmap(encoding);
+   int stride = charmap->stride();
  
    char *retval = str;
! 
!   while(   charmap->getch(retval, size_t(0))
!         == charmap->mapped_character(ascii_space) )
      {
!     retval += stride;
      }
!   char *p = retval + strlen(retval)-stride;
!   while(    p > retval
!         && (   charmap->getch(p, size_t(0))
!             == charmap->mapped_character(ascii_space)) )
      {
!     charmap->putch(NULLCH, p, size_t(0));
!     p -= stride;
      }
    return retval;
    }
*************** __gg__string(const size_t integers[])
*** 8909,8954 ****
    size_t index_cblc = 0 ;
  
    // Pick up the target
!   const cblc_field_t *tgt   = ref[index_cblc];
  
!   // Pick up the target encoding, which we assume controls all the parameters
    cbl_encoding_t tgt_encoding = tgt->encoding;
    charmap_t *charmap = __gg__get_charmap(tgt_encoding);
! 
!   char figlow[2]   = {(char)__gg__low_value_character, 0x00};
!   char fighigh[2]  = {(char)__gg__high_value_character, 0x00};
!   char figzero[2]  = {(char)charmap->mapped_character(ascii_zero), 0x00};
!   char figquote[2] = {(char)charmap->mapped_character(__gg__quote_character), 0x00};
!   char figspace[2] = {(char)charmap->mapped_character(ascii_space), 0x00};
  
    // Pick up the rest of the parameters
    size_t tgt_o              = ref_o[index_cblc];
    size_t tgt_s              = ref_s[index_cblc];
    index_cblc += 1;
    char  *dest         = reinterpret_cast<char *>(tgt->data + tgt_o);
!   ssize_t dest_length = tgt_s;
  
    // Skip over the index of POINTER:
    index_cblc += 1;
  
    // Pick up the pointer, if any
!   ssize_t pointer = 0;
    if( ref[INDEX_OF_POINTER] )
      {
      int rdigits;
!     pointer = (size_t)__gg__binary_value_from_qualified_field(
                                                      &rdigits,
                                                      ref  [INDEX_OF_POINTER],
                                                      ref_o[INDEX_OF_POINTER],
                                                      ref_s[INDEX_OF_POINTER]
                                                      );
!     pointer -= 1;
      }
  
-   int overflow = 0;
- 
    // Make sure that the destination pointer is within the destination
!   if( pointer >= 0 || pointer < dest_length )
      {
      // We are go for looping through identifier-2 values:
  
--- 9624,9669 ----
    size_t index_cblc = 0 ;
  
    // Pick up the target
!   const cblc_field_t *tgt = ref[index_cblc];
  
!   // Pick up the target encoding, which according to the ISO specification
!   // controls all the parameters.
    cbl_encoding_t tgt_encoding = tgt->encoding;
    charmap_t *charmap = __gg__get_charmap(tgt_encoding);
!   int stride = charmap->stride();
  
    // Pick up the rest of the parameters
    size_t tgt_o              = ref_o[index_cblc];
    size_t tgt_s              = ref_s[index_cblc];
    index_cblc += 1;
+ 
    char  *dest         = reinterpret_cast<char *>(tgt->data + tgt_o);
!   size_t dest_length = tgt_s/stride;
  
    // Skip over the index of POINTER:
    index_cblc += 1;
  
    // Pick up the pointer, if any
!   size_t pointer = 0;
!   int overflow = 0;
    if( ref[INDEX_OF_POINTER] )
      {
      int rdigits;
!     int p  = (size_t)__gg__binary_value_from_qualified_field(
                                                      &rdigits,
                                                      ref  [INDEX_OF_POINTER],
                                                      ref_o[INDEX_OF_POINTER],
                                                      ref_s[INDEX_OF_POINTER]
                                                      );
!     if( p<0 )
!       {
!       overflow = 1;
!       }
!     pointer = p - 1;
      }
  
    // Make sure that the destination pointer is within the destination
!   if( pointer < dest_length )
      {
      // We are go for looping through identifier-2 values:
  
*************** __gg__string(const size_t integers[])
*** 8959,9061 ****
  
      for( size_t i=0; i<N; i++ )
        {
        size_t M = integers[index_int++];
  
        // Pick up the identifier_2 DELIMITED BY value
!       const cblc_field_t *id2   = ref[index_cblc];
!       size_t              id2_o = ref_o[index_cblc];
!       size_t              id2_s = ref_s[index_cblc];
        index_cblc += 1;
  
-       char *piece;
-       const char *piece_end;
-       cbl_figconst_t figconst = (cbl_figconst_t) ( id2
-                                   ? (id2->attr & FIGCONST_MASK)
-                                   : 0 );
-       switch(figconst)
-         {
-         case low_value_e:
-           piece = figlow;
-           piece_end = piece + 1;
-           break;
-         case zero_value_e:
-           piece = figzero;
-           piece_end = piece + 1;
-           break;
-         case space_value_e:
-           piece = figspace;
-           piece_end = piece + 1;
-           break;
-         case quote_value_e:
-           piece = figquote;
-           piece_end = piece + 1;
-           break;
-         case high_value_e:
-           piece = fighigh;
-           piece_end = piece + 1;
-           break;
-         default:
-           piece = id2 ? reinterpret_cast<char *>(id2->data + id2_o) : NULL;
-           piece_end = id2 ? piece + id2_s : NULL;
-           break;
-         }
- 
        for(size_t j=0; j<M; j++)
          {
!         // Pick up the next identifier-1 source string:
!         const cblc_field_t *id1 = ref[index_cblc];
!         size_t id1_o = ref_o[index_cblc];
!         size_t id1_s = ref_s[index_cblc];
          index_cblc += 1;
  
!         const char *whole = id1 ? reinterpret_cast<char *>(id1->data + id1_o): NULL ;
!         const char *whole_end = id1 ? whole + id1_s : NULL;
! 
!         // As usual, we need to cope with figurative constants:
!         figconst = (cbl_figconst_t) ( id1 ? (id1->attr & FIGCONST_MASK) : 0 );
!         switch( figconst )
            {
!           case low_value_e:
!             whole = figlow;
!             whole_end = whole + 1;
!             break;
!           case zero_value_e:
!             whole = figzero;
!             whole_end = whole + 1;
!             break;
!           case space_value_e:
!             whole = figspace;
!             whole_end = whole + 1;
!             break;
!           case quote_value_e:
!             whole = figquote;
!             whole_end = whole + 1;
!             break;
!           case high_value_e:
!             whole = fighigh;
!             whole_end = whole + 1;
!             break;
!           default:
!             break;
            }
! 
!         if(piece)
            {
!           const char *found = funky_find(   piece, piece_end,
!                                             whole, whole_end);
!           if(found)
              {
!             whole_end = found;
              }
            }
!         while(whole < whole_end)
            {
!           if(pointer >= dest_length)
              {
!             overflow = 1;
!             break;
              }
!           dest[pointer++] = *whole++;
            }
          if( overflow )
            {
--- 9674,9742 ----
  
      for( size_t i=0; i<N; i++ )
        {
+       // Pick up the number of M identifier-1 values for this list of
+       // identifier-2 values:
        size_t M = integers[index_int++];
  
        // Pick up the identifier_2 DELIMITED BY value
!       std::u32string str_id2 = normalize_for_inspect_format_4(
!                                                         ref[index_cblc],
!                                                         ref_o[index_cblc],
!                                                         ref_s[index_cblc],
!                                                         tgt_encoding);
        index_cblc += 1;
  
        for(size_t j=0; j<M; j++)
          {
!         // Pick up the next id-1 source string for the current id-2 delimiter
!         std::u32string str_id1 = normalize_for_inspect_format_4(
!                                                         ref[index_cblc],
!                                                         ref_o[index_cblc],
!                                                         ref_s[index_cblc],
!                                                         tgt_encoding);
          index_cblc += 1;
  
!         size_t nfound;
!         if( str_id2.size() == 0 )
            {
!           // No given delimiter means DELIMITED BY SIZE
!           nfound = str_id1.size();
            }
!         else
            {
!           // We have an id2, so we look for it inside id1
!           nfound = str_id1.find(str_id2);
!           if( nfound == std::u32string::npos )
              {
!             nfound = str_id1.size();
              }
            }
! 
! 
            {
!           // We have found id2 inside id1 at location nfound.
! 
!           // Convert the UTF32 to the original encoding:
!           size_t bytes_converted;
!           char *converted = __gg__miconverter(DEFAULT_32_ENCODING,
!                                               tgt_encoding,
!                                               str_id1.data(),
!                                               nfound*width_of_utf32,
!                                               &bytes_converted );
!           size_t k = 0;
!           while(k < nfound)
              {
!             if( pointer >= dest_length )
!               {
!               overflow = 1;
!               break;
!               }
!             cbl_char_t ch = charmap->getch(converted, k*stride);
!             charmap->putch(ch, dest, pointer*stride);
!             k += 1;
!             pointer += 1;
              }
!           free(converted);
            }
          if( overflow )
            {
*************** display_both(cblc_field_t  *field,
*** 9149,9154 ****
--- 9830,9837 ----
                                              display_string,
                                              conversion_length,
                                              &outlength);
+   // Trim off the trailing null, if present.
+   outlength = strlen(converted);
    write(file_descriptor,
          converted,
          outlength);
*************** __gg__display_string( int            fil
*** 9210,9215 ****
--- 9893,9900 ----
                                            str,
                                            length,
                                            &outlength);
+   // Trim off trailing NUL, if present.
+   outlength = strlen(converted);
    write( file_descriptor,
           converted,
           outlength);
*************** __gg__bitwise_op( cblc_field_t *tgt,
*** 9924,9963 ****
      }
    }
  
- /*
-  * Because this variable is static, the contructor runs before main and is
-  * guaranted to run.
-  */
- static class rt_encoding_t
-   {
-   const char *ctype, *lc_ctype;
-   public:
-   rt_encoding_t() : ctype( setlocale(LC_CTYPE, "") )
-     {
-     lc_ctype =  nl_langinfo(CODESET);
-     // Let's learn what the computer is using for the console:
-     // We need to establish the codeset used by the system console:
-   __gg__console_encoding = use_locale();
- 
-     if( getenv("CODESET") )
-       {
-       fprintf(stderr, "%s:%d: ctype=%s,lc_ctype=%s\n", __func__, __LINE__,
-               ctype? ctype : "error" , lc_ctype);
-       }
-     }
-   cbl_encoding_t use_locale() const
-     {
-     auto encoding = strstr(ctype, "UTF-8") ?
-       iconv_UTF_8_e : __gg__encoding_iconv_type(lc_ctype);
-     if( getenv("CODESET") )
-       {
-       fprintf(stderr, "%s:%d: console encoding is '%s'\n", __func__, __LINE__,
-               __gg__encoding_iconv_name(encoding) );
-       }
-     return encoding;
-     }
-   } rt_encoding;
- 
  extern "C"
  void
  __gg__onetime_initialization( )
--- 10609,10614 ----
*************** static int
*** 10003,10008 ****
--- 10654,10660 ----
  is_numeric_display_numeric(cblc_field_t *field, size_t offset, size_t size)
    {
    charmap_t *charmap = __gg__get_charmap(field->encoding);
+   int stride = charmap->stride();
  
    int retval = 1;
    bool signable = !!(field->attr & signable_e);
*************** is_numeric_display_numeric(cblc_field_t
*** 10015,10036 ****
    if( leading && separate && signable )
      {
      // First character must be +/-
      if(     digits < digits_e
!         || (   *digits != charmap->mapped_character(ascii_plus)
!             && *digits !=  charmap->mapped_character(ascii_minus)) )
        {
        retval = 0;
        }
!     digits += 1;
      }
  
    if( !leading && separate && signable )
      {
      // Last character must be +/-
!     digits_e -= 1;
      if(     digits < digits_e
!         || (   *digits_e != charmap->mapped_character(ascii_plus)
!             && *digits_e !=  charmap->mapped_character(ascii_minus)) )
        {
        retval = 0;
        }
--- 10667,10690 ----
    if( leading && separate && signable )
      {
      // First character must be +/-
+     cbl_char_t ch = charmap->getch(digits, size_t(0));
      if(     digits < digits_e
!         || (   ch != charmap->mapped_character(ascii_plus)
!             && ch !=  charmap->mapped_character(ascii_minus)) )
        {
        retval = 0;
        }
!     digits += stride;
      }
  
    if( !leading && separate && signable )
      {
      // Last character must be +/-
!     digits_e -= stride;
!     cbl_char_t ch = charmap->getch(digits_e, size_t(0));
      if(     digits < digits_e
!         || (   ch != charmap->mapped_character(ascii_plus)
!             && ch !=  charmap->mapped_character(ascii_minus)) )
        {
        retval = 0;
        }
*************** is_numeric_display_numeric(cblc_field_t
*** 10038,10047 ****
  
    if( leading && !separate && signable )
      {
!     // The first character is allowed to have a sign bit.
      if( digits < digits_e )
        {
!       unsigned char first_char = (unsigned char)*digits;
        first_char = charmap->set_digit_negative(first_char, false);
        if(  first_char < charmap->mapped_character(ascii_0)
          || first_char > charmap->mapped_character(ascii_9))
--- 10692,10702 ----
  
    if( leading && !separate && signable )
      {
!     // The first character is allowed to have a sign bit. Let's make sure that
!     // making that first digit unsigned leaves us with zero through nine:
      if( digits < digits_e )
        {
!       cbl_char_t first_char = charmap->getch(digits, size_t(0));
        first_char = charmap->set_digit_negative(first_char, false);
        if(  first_char < charmap->mapped_character(ascii_0)
          || first_char > charmap->mapped_character(ascii_9))
*************** is_numeric_display_numeric(cblc_field_t
*** 10058,10064 ****
      if( digits < digits_e )
        {
        digits_e -= 1;
!       unsigned char final_char = (unsigned char)*digits_e;
        final_char = charmap->set_digit_negative(final_char, false);
        if(   final_char<charmap->mapped_character(ascii_0)
           || final_char>charmap->mapped_character(ascii_9) )
--- 10713,10719 ----
      if( digits < digits_e )
        {
        digits_e -= 1;
!       cbl_char_t final_char = charmap->getch(digits, size_t(0));
        final_char = charmap->set_digit_negative(final_char, false);
        if(   final_char<charmap->mapped_character(ascii_0)
           || final_char>charmap->mapped_character(ascii_9) )
*************** is_alpha_a_number(const cblc_field_t *fi
*** 10163,10175 ****
                    size_t size)
    {
    charmap_t *charmap = __gg__get_charmap(field->encoding);
!   int mapped_0 = charmap->mapped_character(ascii_0);
!   int mapped_9 = charmap->mapped_character(ascii_9);
    int retval = 1;
!   const unsigned char *bytes = (field->data + offset);
!   for( size_t i=0; i<size; i++ )
      {
!     unsigned char ch = bytes[i];
      if(    (ch < mapped_0)
          || (ch > mapped_9) )
        {
--- 10818,10830 ----
                    size_t size)
    {
    charmap_t *charmap = __gg__get_charmap(field->encoding);
!   cbl_char_t mapped_0 = charmap->mapped_character(ascii_0);
!   cbl_char_t mapped_9 = charmap->mapped_character(ascii_9);
    int retval = 1;
!   size_t i = offset;
!   while(i < size)
      {
!     cbl_char_t ch = charmap->getch(field->data, &i);
      if(    (ch < mapped_0)
          || (ch > mapped_9) )
        {
*************** is_alpha_a_number(const cblc_field_t *fi
*** 10180,10185 ****
--- 10835,10907 ----
    return retval;
    }
  
+ static int
+ classify_numeric_type(cblc_field_t *field,
+                       size_t offset,
+                       size_t size)
+   {
+   int retval = 1;
+   switch( field->type )
+     {
+     case FldNumericEdited:
+       retval = is_numeric_edited_numeric(field, offset, size);
+       break;
+     case FldNumericDisplay:
+       retval = is_numeric_display_numeric(field, offset, size);
+       break;
+     case FldPacked:
+       retval = is_packed_numeric(field, offset, size);
+       break;
+     case FldGroup:
+     case FldAlphanumeric:
+     case FldAlphaEdited:
+       retval = is_alpha_a_number(field, offset, size);
+       break;
+ 
+     case FldNumericBinary:
+     case FldNumericBin5:
+       // These need to checked for fitting into field->digits
+       break;
+ 
+     default:
+       fprintf(stderr,
+               "We need code for %s numeric type %d\n",
+               field->name,
+               field->type);
+       abort();
+       break;
+     }
+   return retval;
+   }
+ 
+ static int
+ classify_alphabetic_type( const cblc_field_t *field,
+                           size_t offset,
+                           size_t size,
+                           int (checker)( std::wint_t ch ))
+   {
+   int retval = 1;
+   charmap_t *charmap = __gg__get_charmap(DEFAULT_32_ENCODING);
+   cbl_char_t space = charmap->mapped_character(ascii_space);
+   size_t nbytes_converted;
+   const char *converted = __gg__iconverter(field->encoding,
+                                            DEFAULT_32_ENCODING,
+                                            field->data+offset,
+                                            size,
+                                            &nbytes_converted);
+   size_t i=0;
+   while( i < nbytes_converted )
+     {
+     cbl_char_t ch = charmap->getch(converted, &i);
+     if( !checker(ch) && ch != space )
+       {
+       retval = 0;
+       break;
+       }
+     }
+   return retval;
+   }
+ 
  extern "C"
  int
  __gg__classify( classify_t type,
*************** __gg__classify( classify_t type,
*** 10188,10358 ****
                  size_t size)
    {
    // The default answer is TRUE
!   int retval = 1;
! 
!   const unsigned char *alpha = reinterpret_cast<unsigned char *>(field->data+offset);
! 
!   size_t str_length = size;
! 
!   const unsigned char *omega = alpha + str_length;
  
!   if(alpha >= omega)
      {
!     // If there is nothing there, then it can't be TRUE.  Can it?
      retval = 0;
      }
! 
!   unsigned char ch;
!   switch(type)
      {
!     case ClassNumericType:
        {
!       switch( field->type )
!         {
!         case FldNumericEdited:
!           retval = is_numeric_edited_numeric(field, offset, size);
!           break;
!         case FldNumericDisplay:
!           retval = is_numeric_display_numeric(field, offset, size);
!           break;
!         case FldPacked:
!           retval = is_packed_numeric(field, offset, size);
!           break;
!         case FldGroup:
!         case FldAlphanumeric:
!         case FldAlphaEdited:
!           retval = is_alpha_a_number(field, offset, size);
!           break;
! 
!         case FldNumericBinary:
!         case FldNumericBin5:
!           // These need to checked for fitting into field->digits
!           break;
! 
!         default:
!           fprintf(stderr,
!                   "We need code for %s numeric type %d\n",
!                   field->name,
!                   field->type);
!           abort();
!           break;
!         }
! 
!       break;
!       }
  
!     case ClassAlphabeticType:
!       {
!       charmap_t *charmap = __gg__get_charmap(field->encoding);
!       int mapped_space = charmap->mapped_character(ascii_space);
!       int mapped_A = charmap->mapped_character(ascii_A);
!       int mapped_I = charmap->mapped_character(ascii_I);
!       int mapped_J = charmap->mapped_character(ascii_J);
!       int mapped_R = charmap->mapped_character(ascii_R);
!       int mapped_S = charmap->mapped_character(ascii_S);
!       int mapped_Z = charmap->mapped_character(ascii_Z);
!       int mapped_a = charmap->mapped_character(ascii_a);
!       int mapped_i = charmap->mapped_character(ascii_i);
!       int mapped_j = charmap->mapped_character(ascii_j);
!       int mapped_r = charmap->mapped_character(ascii_r);
!       int mapped_s = charmap->mapped_character(ascii_s);
!       int mapped_z = charmap->mapped_character(ascii_z);
!       while(alpha < omega)
!         {
!         ch = (*alpha++)&0xFF;
!         if( ch == mapped_space )
!           {
!           continue;
!           }
!         // If necessary, this could be sped up with the creation of
!         // appropriate mapping tables.
  
!         // The oddball construction of this if() statement is a consequence of
!         // EBCDIC.  Because of peculiarities going all the back to the encoding
!         // of characters on IBM cards, where it wasn't a good idea to have too
!         // many consecutive punches in a column because it would weaken the card
!         // to the point where its structural integrity might be threatened, the
!         // coding for the letter of the alphabet are not contiguous.
!         if(!(   (    ch >= mapped_A && ch <= mapped_I)
!                 ||  (ch >= mapped_J && ch <= mapped_R)
!                 ||  (ch >= mapped_S && ch <= mapped_Z)
!                 ||  (ch >= mapped_a && ch <= mapped_i)
!                 ||  (ch >= mapped_j && ch <= mapped_r)
!                 ||  (ch >= mapped_s && ch <= mapped_z) ) )
!           {
!           // The character is not alphabetic
!           retval = 0;
!           break;
!           }
!         }
!       break;
!       }
  
!     case ClassLowerType:
!       {
!       charmap_t *charmap = __gg__get_charmap(field->encoding);
!       int mapped_space = charmap->mapped_character(ascii_space);
!       int mapped_a = charmap->mapped_character(ascii_a);
!       int mapped_i = charmap->mapped_character(ascii_i);
!       int mapped_j = charmap->mapped_character(ascii_j);
!       int mapped_r = charmap->mapped_character(ascii_r);
!       int mapped_s = charmap->mapped_character(ascii_s);
!       int mapped_z = charmap->mapped_character(ascii_z);
!       while(alpha < omega)
!         {
!         ch = *alpha++;
!         if( ch == mapped_space )
!           {
!           continue;
!           }
!         if(!(   (    ch >= mapped_a && ch <= mapped_i)
!                 ||  (ch >= mapped_j && ch <= mapped_r)
!                 ||  (ch >= mapped_s && ch <= mapped_z) ) )
!           {
!           retval = 0;
!           break;
!           }
!         }
!       break;
!       }
  
!     case ClassUpperType:
!       {
!       charmap_t *charmap = __gg__get_charmap(field->encoding);
!       int mapped_space = charmap->mapped_character(ascii_space);
!       int mapped_A = charmap->mapped_character(ascii_A);
!       int mapped_I = charmap->mapped_character(ascii_I);
!       int mapped_J = charmap->mapped_character(ascii_J);
!       int mapped_R = charmap->mapped_character(ascii_R);
!       int mapped_S = charmap->mapped_character(ascii_S);
!       int mapped_Z = charmap->mapped_character(ascii_Z);
!       while(alpha < omega)
!         {
!         ch = *alpha++;
!         if( ch == mapped_space )
!           {
!           continue;
!           }
!         if(!(   (    ch >= mapped_A && ch <= mapped_I)
!                 ||  (ch >= mapped_J && ch <= mapped_R)
!                 ||  (ch >= mapped_S && ch <= mapped_Z) ) )
!           {
!           retval = 0;
!           break;
!           }
!         }
!       break;
        }
- 
-     case ClassInvalidType:
-     case ClassDbcsType:
-     case ClassKanjiType:
-     default:
-       warnx("%s(): Don't know how to handle %s",
-             __func__,
-             classify_str(type));
-       abort();
-       break;
      }
  
    return retval;
--- 10910,10952 ----
                  size_t size)
    {
    // The default answer is TRUE
!   int retval;
  
!   if( size == 0 )
      {
!     // If there is nothing there, then it can't be TRUE.
      retval = 0;
      }
!   else
      {
!     switch(type)
        {
!       case ClassNumericType:
!         retval = classify_numeric_type(field, offset, size);
!         break;
  
!       case ClassAlphabeticType:
!         retval = classify_alphabetic_type(field, offset, size, std::iswalpha);
!         break;
  
!       case ClassLowerType:
!         retval = classify_alphabetic_type(field, offset, size, std::iswlower);
!         break;
  
!       case ClassUpperType:
!         retval = classify_alphabetic_type(field, offset, size, std::iswupper);
!         break;
  
!       case ClassInvalidType:
!       case ClassDbcsType:
!       case ClassKanjiType:
!       default:
!         warnx("%s(): Don't know how to handle %s",
!               __func__,
!               classify_str(type));
!         abort();
!         break;
        }
      }
  
    return retval;
*************** __gg__convert_encoding( char *psz,
*** 10365,10379 ****
                          cbl_encoding_t to )
    {
    // This does an in-place conversion of psz
    if( from > custom_encoding_e )
      {
      size_t charsout;
      const char *converted  = __gg__iconverter(from,
                                                to,
                                                psz,
!                                               strlen(psz),
                                                &charsout);
!     strcpy(psz, converted);
      }
    }
  
--- 10959,10976 ----
                          cbl_encoding_t to )
    {
    // This does an in-place conversion of psz
+   charmap_t *charmap_from = __gg__get_charmap(from);
+   const charmap_t *charmap = __gg__get_charmap(to);
    if( from > custom_encoding_e )
      {
      size_t charsout;
      const char *converted  = __gg__iconverter(from,
                                                to,
                                                psz,
!                                               charmap_from->strlen(psz),
                                                &charsout);
!     // Copy over the converted string, including the final NUL
!     memcpy(psz, converted, charsout + charmap->stride());
      }
    }
  
*************** accept_envar( cblc_field_t  *tgt,
*** 10406,10441 ****
                cbl_encoding_t encoding)
    {
    int retval = 1; // 1 means we couldn't find it
    if( psz_name )
      {
!     tgt_length = tgt_length  ? tgt_length  : tgt->capacity;
! 
!     // Pick up the environment variable name
!     char *env = strdup(psz_name);
!     massert(env);
  
      // Get rid of leading and trailing space characters:
!     char *trimmed_env = brute_force_trim( env,
!                                           encoding );
! 
!     // Convert the name to the console codeset:
!     __gg__convert_encoding( trimmed_env,
!                             encoding,
!                             DEFAULT_SOURCE_ENCODING);
  
!     // Pick up the environment variable, and convert it to the internal codeset
      const char *p = getenv(trimmed_env);
      if(p)
        {
!       retval = 0; // Okay
!       move_string(tgt, tgt_offset, tgt_length, p, DEFAULT_SOURCE_ENCODING);
        }
-     free(env);
      }
  
    if( retval == 1 )
      {
!     // Could't find it
      exception_raise(ec_argument_imp_environment_e);
      }
  
--- 11003,11051 ----
                cbl_encoding_t encoding)
    {
    int retval = 1; // 1 means we couldn't find it
+ 
    if( psz_name )
      {
!     charmap_t *charmap = __gg__get_charmap(encoding);
!     size_t psz_name_length = charmap->strlen(psz_name);
  
+     // convert psz_name to the console encoding:
+     size_t converted_length;
+     const char *converted = __gg__iconverter(encoding,
+                                        __gg__console_encoding,
+                                        psz_name,
+                                        psz_name_length,
+                                        &converted_length);
+     // Copy converted, because brute_force_trim uses charmap_t:
+     char *env = strdup(converted);
      // Get rid of leading and trailing space characters:
!     const char *trimmed_env = brute_force_trim( env,
!                                           __gg__console_encoding );
  
!     // Pick up the environment variable
      const char *p = getenv(trimmed_env);
+     free(env);
      if(p)
        {
!       retval = 0; // We found the environment variable:
!       // Convert it to the target encoding:
!       converted = __gg__iconverter(__gg__console_encoding,
!                                    tgt->encoding,
!                                    p,
!                                    strlen(p),
!                                    &converted_length);
!       __gg__field_from_string(tgt, tgt_offset, tgt_length,
!                               converted, converted_length);
!       }
!     else
!       {
!       // Leave the target unchanged, as per spec.
        }
      }
  
    if( retval == 1 )
      {
!     // Could't find that environment variable
      exception_raise(ec_argument_imp_environment_e);
      }
  
*************** __gg__accept_envar( cblc_field_t *tgt,
*** 10451,10460 ****
                      size_t        name_offset,
                      size_t        name_length)
    {
!   //  We need the name to be nul-terminated:
!   char *p = static_cast<char *>(malloc(name_length + 1));
    massert(p);
    memcpy(p, name->data+name_offset, name_length);
    p[name_length] = '\0';
    int retval = accept_envar(tgt,
                              tgt_offset,
--- 11061,11072 ----
                      size_t        name_offset,
                      size_t        name_length)
    {
!   // We need the name to be nul-terminated, so we will tack on four extra
!   // nulls to handle characters up to 32 bits wide
!   char *p = static_cast<char *>(malloc(name_length + width_of_utf32));
    massert(p);
    memcpy(p, name->data+name_offset, name_length);
+   memset(p + name_length, 0, width_of_utf32);
    p[name_length] = '\0';
    int retval = accept_envar(tgt,
                              tgt_offset,
*************** __gg__get_argc(cblc_field_t *dest, size_
*** 10600,10606 ****
    command_line_plan_b();
    char ach[128];
    sprintf(ach, "%d", stashed_argc);
!   move_string(dest, offset, length, ach, __gg__console_encoding);
    }
  
  extern "C"
--- 11212,11226 ----
    command_line_plan_b();
    char ach[128];
    sprintf(ach, "%d", stashed_argc);
!   size_t nbytes;
!   char *converted = __gg__miconverter(__gg__console_encoding,
!                                             dest->encoding,
!                                             ach,
!                                             strlen(ach),
!                                             &nbytes );
!   __gg__field_from_string(dest, offset, length, converted, nbytes);
!   __gg__adjust_dest_size(dest, nbytes);
!   free(converted);
    }
  
  extern "C"
*************** __gg__get_argv( cblc_field_t *dest,
*** 10635,10645 ****
      }
    else
      {
!     move_string(dest,
!                 dest_offset,
!                 dest_length,
!                 stashed_argv[N],
!                 DEFAULT_SOURCE_ENCODING);
      retcode = 0;  // Okay
      }
    return retcode;
--- 11255,11269 ----
      }
    else
      {
!     size_t nbytes;
!     char *converted = __gg__miconverter(__gg__console_encoding,
!                                         dest->encoding,
!                                         stashed_argv[N],
!                                         strlen(stashed_argv[N]),
!                                         &nbytes );
!     __gg__field_from_string(dest, dest_offset, dest_length, converted, nbytes);
!     __gg__adjust_dest_size(dest, nbytes);
!     free(converted);
      retcode = 0;  // Okay
      }
    return retcode;
*************** __gg__get_command_line( cblc_field_t *fi
*** 10676,10682 ****
    if( *retval )
      {
      flength = flength ? flength : field->capacity;
!     move_string(field, offset, flength, retval, __gg__console_encoding);
      retcode = 0; // Okay
      }
    else
--- 11300,11314 ----
    if( *retval )
      {
      flength = flength ? flength : field->capacity;
!     size_t nbytes;
!     char *converted = __gg__miconverter(__gg__console_encoding,
!                                         field->encoding,
!                                         retval,
!                                         strlen(retval),
!                                         &nbytes );
!     __gg__field_from_string(field, offset, flength, converted, nbytes);
!     __gg__adjust_dest_size(field, nbytes);
!     free(converted);
      retcode = 0; // Okay
      }
    else
*************** __gg__parser_set_conditional(cblc_field_
*** 10847,10853 ****
  
    cbl_figconst_t figconst = (cbl_figconst_t)figconst_;
  
!   unsigned char special = charmap->mapped_character(ascii_space);
    switch(figconst)
      {
      case space_value_e:
--- 11479,11485 ----
  
    cbl_figconst_t figconst = (cbl_figconst_t)figconst_;
  
!   cbl_char_t special = charmap->mapped_character(ascii_space);
    switch(figconst)
      {
      case space_value_e:
*************** __gg__parser_set_conditional(cblc_field_
*** 10868,10874 ****
      default:
        break;
      }
!   memset( var->data, special, var->capacity);
    }
  
  extern "C"
--- 11500,11506 ----
      default:
        break;
      }
!   charmap->memset( var->data, special, var->capacity);
    }
  
  extern "C"
*************** __gg__assign_value_from_stack(cblc_field
*** 11038,11044 ****
  
  extern "C"
  int
! __gg__literaln_alpha_compare(const char         *left_side,
                               const cblc_field_t *right,
                               size_t              offset,
                               size_t              length,
--- 11670,11676 ----
  
  extern "C"
  int
! __gg__literaln_alpha_compare(      char         *left_side,
                               const cblc_field_t *right,
                               size_t              offset,
                               size_t              length,
*************** __gg__literaln_alpha_compare(const char
*** 11050,11094 ****
      length = right->capacity;
      }
  
    retval = compare_strings(   left_side,
                                strlen(left_side),
                                false,
                                reinterpret_cast<char *>((right->data + offset)),
                                length,
                                !!(flags & REFER_T_MOVE_ALL),
!                               right->encoding);
!   return retval;
!   }
! 
! static char *
! string_in(      char *str,
!           const char *str_e,
!           const char *frag,
!           const char *frag_e)
!   {
!   // This simple routine could be improved.  Instead of using memcmp, we could
!   // use established, albeit complex, techniques of string searching:
! 
!   // Looking for "abcde" in "abcdabcde", for example.  One could notice that
!   // starting at the first 'a' results in a mismatch at the second 'a'.  There
!   // is thus no need to start the second search at the first 'b' in the searched
!   // string; one could jump ahead to the second 'a' and continue from there.
! 
!   // Feel free.  It won't matter in the real world; a program whose innermost
!   // loop is an UNSTRING is difficult to imagine.  But feel free.
! 
!   char *retval = NULL;
!   size_t nchars = frag_e - frag;
!   char *p = str;
!   while( p + nchars <= str_e )
!     {
!     if( memcmp(p, frag, nchars) == 0 )
!       {
!       retval = p;
!       break;
!       }
!     p += 1;
!     }
    return retval;
    }
  
--- 11682,11700 ----
      length = right->capacity;
      }
  
+   cbl_encoding_t right_encoding = right->encoding;
+   if( right->attr & hex_encoded_e )
+     {
+     right_encoding = iconv_CP1252_e;
+     }
    retval = compare_strings(   left_side,
                                strlen(left_side),
                                false,
                                reinterpret_cast<char *>((right->data + offset)),
                                length,
                                !!(flags & REFER_T_MOVE_ALL),
!                               right_encoding,
!                               right_encoding);
    return retval;
    }
  
*************** __gg__unstring( const cblc_field_t *id1,
*** 11137,11147 ****
    // Initialize the state variables
    int overflow = 0;
    int tally = 0;
!   int pointer = 1;
    size_t nreceiver;
!   char *left  = NULL;
!   char *right = NULL;
!   int previous_delimiter;
  
    if( id8  )
      {
--- 11743,11758 ----
    // Initialize the state variables
    int overflow = 0;
    int tally = 0;
!   size_t pointer = 1;
    size_t nreceiver;
!   size_t left;
!   size_t right;
! 
!   std::u32string str_id1;
!   std::vector<std::u32string> delimiters;
! 
!   const charmap_t *charmap_id1 = __gg__get_charmap(id1->encoding);
!   int stride_id1 = charmap_id1->stride();
  
    if( id8  )
      {
*************** __gg__unstring( const cblc_field_t *id1,
*** 11155,11164 ****
    if( id7 )
      {
      int rdigits;
!     pointer = (int)__gg__binary_value_from_qualified_field(&rdigits,
                                                           id7,
                                                           id7_o,
                                                           id7_s);
      }
  
    // As per the spec, if the string is zero-length; we are done.
--- 11766,11781 ----
    if( id7 )
      {
      int rdigits;
!     int p = (int)__gg__binary_value_from_qualified_field(&rdigits,
                                                           id7,
                                                           id7_o,
                                                           id7_s);
+     if( p < 1 )
+       {
+       overflow = 1;
+       goto done;
+       }
+     pointer = p;
      }
  
    // As per the spec, if the string is zero-length; we are done.
*************** __gg__unstring( const cblc_field_t *id1,
*** 11169,11214 ****
  
    // As per the spec, we have an overflow condition if pointer is out of
    // range:
!   if( pointer < 1 || pointer > (int)id1_s )
      {
      overflow = 1;
      goto done;
      }
  
!   left  = reinterpret_cast<char *>(id1->data+id1_o) + pointer-1;
!   right = reinterpret_cast<char *>(id1->data+id1_o) + id1_s;
  
    if( ndelimiteds == 0 )
      {
      // There are no DELIMITED BY identifier-2 values, so we just peel off
      // characters from identifier-1 and put them into each identifier-4:
!     for( size_t i=0; i<nreceivers; i++ )
        {
        if( left >= right )
          {
          break;
          }
!       size_t id_4_size = id4_s[i];
!       if( id4[i]->attr & separate_e )
          {
!         // The receiver is NumericDisplay with a separate signe
!         id_4_size = id4_s[i] - 1;
          }
  
!       // Make sure id_4_size doesn't move past the end of the universe
        if( left + id_4_size > right )
          {
          id_4_size = right - left;
          }
  
!       // Move the data into place:
!       move_string(id4[i],
!                   id4_o[i],
!                   id4_s[i],
!                   left,
!                   id1->encoding,
!                   id_4_size);
! 
        // Update the state variables:
        left += id_4_size;
        pointer += id_4_size;
--- 11786,11851 ----
  
    // As per the spec, we have an overflow condition if pointer is out of
    // range:
!   if( pointer > id1_s/stride_id1 )
      {
      overflow = 1;
      goto done;
      }
+   // pointer is one-based throughout; don't forget that
  
!   /* I thought long and hard about converting things to UTF32 for UNSTRING. It
!      was not obviously necessary.  But, darn it all, sooner or later somebody
!      is going to demand UTF-8 capability and I can't think of any obvious way
!      of being able to handle multibyte codepoints as single characters without
!      doing something like converting to UTF32.  */
  
+   str_id1 = normalize_for_inspect_format_4( id1,
+                                             id1_o,
+                                             id1_s,
+                                             id1->encoding);
+   left = pointer-1;
+   right = str_id1.size();
    if( ndelimiteds == 0 )
      {
      // There are no DELIMITED BY identifier-2 values, so we just peel off
      // characters from identifier-1 and put them into each identifier-4:
!     for( size_t receiver=0; receiver<nreceivers; receiver++ )
        {
        if( left >= right )
          {
+         // We have run out of input characters.
          break;
          }
!       // We will peel off enough characters to fit the receiving id4:
!       size_t id_4_size = id4_s[receiver]/stride_id1;
!       if( id4[receiver]->attr & separate_e )
          {
!         // The receiver is NumericDisplay with a separate sign, so, as per
!         // the spec, we reduce the size by one character.
!         id_4_size = id4_s[receiver] - 1;
          }
  
!       // Make sure id_4_size doesn't take us past the end of the universe
        if( left + id_4_size > right )
          {
          id_4_size = right - left;
          }
  
!       // Convert the specified str_id1 characters back to id1->encoding.
!       size_t bytes_converted;
!       const char *converted = __gg__iconverter(DEFAULT_32_ENCODING,
!                                                id1->encoding,
!                                                &str_id1[left],
!                                                (right-left)*width_of_utf32,
!                                                &bytes_converted );
!       char *duped = static_cast<char *>(__gg__memdup(converted, bytes_converted));
!       // Put the converted string into place:
!       __gg__field_from_string(id4[receiver],
!                         id4_o[receiver],
!                         id4_s[receiver],
!                         duped,
!                         bytes_converted);
!       free(duped);
        // Update the state variables:
        left += id_4_size;
        pointer += id_4_size;
*************** __gg__unstring( const cblc_field_t *id1,
*** 11219,11388 ****
  
    // Arriving here means there is some number of ndelimiteds
  
    nreceiver = 0;
-   previous_delimiter = -1;
    while( left < right )
      {
!     // Starting at 'left', see if we can find any of the delimiters
!     char *leftmost_delimiter = NULL;
!     int ifound = -1;
!     cbl_figconst_t figconst;
!     char achfigconst[1];
!     cbl_encoding_t fig_encoding;
      for( size_t i=0; i<ndelimiteds; i++ )
        {
!       fig_encoding = id1->encoding;
!       charmap_t *charmap = __gg__get_charmap(fig_encoding);
!       char *pfound;
!       figconst = (cbl_figconst_t)(id2[i]->attr  & FIGCONST_MASK);
! 
!       switch(figconst)
!         {
!         case low_value_e    :
!           achfigconst[0] = charmap->figconst_character(figconst);
!           pfound = string_in( left,
!                               right,
!                               achfigconst,
!                               achfigconst+1);
!           break;
! 
!         case zero_value_e   :
!           achfigconst[0] = charmap->figconst_character(figconst);
!           pfound = string_in( left,
!                               right,
!                               achfigconst,
!                               achfigconst+1);
!           break;
! 
!         case space_value_e  :
!           achfigconst[0] = charmap->figconst_character(figconst);
!           pfound = string_in( left,
!                               right,
!                               achfigconst,
!                               achfigconst+1);
!           break;
! 
!         case quote_value_e  :
!           achfigconst[0] = charmap->figconst_character(figconst);
!           pfound = string_in( left,
!                               right,
!                               achfigconst,
!                               achfigconst+1);
!           break;
! 
!         case high_value_e   :
!           achfigconst[0] = charmap->figconst_character(figconst);
!           pfound = string_in( left,
!                               right,
!                               achfigconst,
!                               achfigconst+1);
!           break;
! 
!         case normal_value_e :
!         default:
!           pfound = string_in( left,
!                               right,
!                               reinterpret_cast<char *>(id2[i]->data+id2_o[i]),
!                               reinterpret_cast<char *>((id2[i]->data+id2_o[i])
!                                                                  + id2_s[i]));
!           break;
!         }
! 
!       if( pfound )
          {
          // We found a delimiter
!         if( !leftmost_delimiter || pfound < leftmost_delimiter )
            {
!           ifound = i;
!           leftmost_delimiter = pfound;
            }
!         }
!       }
  
!     if(    ifound >= 0
!         && leftmost_delimiter == left
!         && ifound == previous_delimiter )
!       {
!       // We found another instance of an ALL delimiter.
!       // So, we just skip it.
!       left    += id2_s[previous_delimiter];
!       pointer += id2_s[previous_delimiter];
!       continue;
        }
  
-     // We did not re-find an ALL DELIMITER
-     previous_delimiter = -1;
- 
      // If we've used up all receivers, we bail at this point
      if( nreceiver >= nreceivers )
        {
        break;
        }
  
!     if( ifound >= 0 && all_flags[ifound] == ascii_1 )
!       {
!       // Arriving here means we found a new delimiter.
!       // If the ALL flag was on, set up to notice repeats
!       previous_delimiter = ifound;
!       }
! 
!     if( !leftmost_delimiter )
        {
        // We were unable to find a delimiter, so we eat up the remainder
        // of the sender:
!       leftmost_delimiter = right;
        }
  
      // Apply what we have learned to the next receiver:
  
!     size_t examined = leftmost_delimiter - left;
! 
!     // Move the data into place:
!     move_string(id4[nreceiver],
!                 id4_o[nreceiver],
!                 id4_s[nreceiver],
!                 left,
!                 id1->encoding,
!                 examined);
! 
!     // Update the left pointer
!     left = leftmost_delimiter;
!     if( ifound >= 0 )
!       {
!       // And skip over the delimiter
!       left += id2_s[ifound];
!       }
  
      if( id5[nreceiver] )
        {
!       if( ifound >= 0 )
          {
!         if( figconst )
!           {
!           move_string(id5[nreceiver],
!                       id5_o[nreceiver],
!                       id5_s[nreceiver],
!                       achfigconst,
!                       fig_encoding,
!                       1);
!           }
!         else
!           {
!           move_string(id5[nreceiver],
!                       id5_o[nreceiver],
!                       id5_s[nreceiver],
!                       reinterpret_cast<char *>(id2[ifound]->data+id2_o[ifound]),
!                       id2[ifound]->encoding,
!                       id2_s[ifound]);
!           }
          }
        else
          {
!         move_string(id5[nreceiver],
!                     id5_o[nreceiver],
!                     id5_s[nreceiver],
!                     "",
!                     DEFAULT_SOURCE_ENCODING);
          }
        }
  
--- 11856,11980 ----
  
    // Arriving here means there is some number of ndelimiteds
  
+   // Convert them to the same encoding as str_id1:
+   for( size_t i=0; i<ndelimiteds; i++ )
+     {
+     std::u32string delimiter
+         = normalize_for_inspect_format_4(id2[i],
+                                          id2_o[i],
+                                          id2_s[i],
+                                          id1->encoding);
+     delimiters.push_back(delimiter);
+     }
+ 
    nreceiver = 0;
    while( left < right )
      {
!     // Starting at 'left', see if we can find any of the delimiters.  For each
!     // 'left' position, we look through all of the delimiters,
! 
!     int    best_delimiter = -1;
!     size_t best_leftmost = right; // This is the location of the start of ALL
!     size_t best_location = right; // This is the location of the last of ALL
      for( size_t i=0; i<ndelimiteds; i++ )
        {
!       std::u32string str_id2 = delimiters[i];
!       size_t nfound = str_id1.find(str_id2, left);
!       if( nfound != std::u32string::npos )
          {
          // We found a delimiter
!         if( nfound > best_leftmost )
            {
!           // This delimiter lives to the right of the best one we found so far.
!           // Ignore it, and proceed to the next delimiter.
!           continue;
            }
!         // This delimiter is the leftmost we've seen so far:
!         best_delimiter = i;
!         best_leftmost  = nfound;
!         best_location  = nfound;
  
!         if( all_flags[i] == ascii_1 )
!           {
!           // This delimiter is flagged as ALL, so we need to see if we have
!           // a flock of them:
!           size_t next = nfound + str_id2.size() ;
!           while( str_id1.find(str_id2, next ) == next )
!             {
!             // We found another consecutive one at next:
!             best_location = next;
!             next += str_id2.size();
!             }
!           }
!         }
        }
  
      // If we've used up all receivers, we bail at this point
      if( nreceiver >= nreceivers )
        {
        break;
        }
  
!     if( best_delimiter == -1 )
        {
        // We were unable to find a delimiter, so we eat up the remainder
        // of the sender:
!       best_leftmost = right;
!       best_location = right;
        }
  
      // Apply what we have learned to the next receiver:
  
!     size_t examined = best_leftmost - left;
  
+     // Convert the data from left to leftmost_delimiter back to encoding of
+     // id1:
+     size_t bytes_converted;
+     const char *converted = __gg__iconverter(
+                            DEFAULT_32_ENCODING,
+                            id1->encoding,
+                            &str_id1[left],
+                            (best_leftmost-left)*width_of_utf32,
+                            &bytes_converted );
+     char *duped = static_cast<char *>(__gg__memdup(converted, bytes_converted));
+     // Put the converted string into place:
+     __gg__field_from_string(id4[nreceiver],
+                       id4_o[nreceiver],
+                       id4_s[nreceiver],
+                       duped,
+                       bytes_converted);
+     free(duped);
+     // Update the left edge
+     left = best_location + (best_delimiter > -1
+                             ? delimiters[best_delimiter].size()
+                             : 0) ;
      if( id5[nreceiver] )
        {
!       // The caller wants to know what the delimiter was:
!       if( best_delimiter > -1 )
          {
!         converted = __gg__iconverter(
!                              DEFAULT_32_ENCODING,
!                              id1->encoding,
!                              delimiters[best_delimiter].data(),
!                              delimiters[best_delimiter].size()*width_of_utf32,
!                              &bytes_converted );
!         duped = static_cast<char *>(__gg__memdup(converted, bytes_converted));
!         __gg__field_from_string(id5[nreceiver],
!                           id5_o[nreceiver],
!                           id5_s[nreceiver],
!                           duped,
!                           bytes_converted);
!         free(duped);
          }
        else
          {
!         // We didn't find a delimiter
!         __gg__field_from_string(id5[nreceiver],
!                           id5_o[nreceiver],
!                           id5_s[nreceiver],
!                           "",
!                           0);
          }
        }
  
*************** __gg__unstring( const cblc_field_t *id1,
*** 11400,11408 ****
      // Update the state variables:
      tally += 1;
      nreceiver += 1;
!     if( ifound >= 0 )
        {
!       pointer += examined + id2_s[ifound];
        }
      }
  
--- 11992,12000 ----
      // Update the state variables:
      tally += 1;
      nreceiver += 1;
!     if( best_delimiter > -1  )
        {
!       pointer = left+1 ;
        }
      }
  
*************** __gg__integer_from_float128(const cblc_f
*** 12023,12029 ****
    return (__int128)fvalue;
    }
  
- 
  extern "C"
  void
  __gg__adjust_dest_size(cblc_field_t *dest, size_t ncount)
--- 12615,12620 ----
*************** __gg__adjust_dest_size(cblc_field_t *des
*** 12032,12038 ****
      {
      if( dest->allocated < ncount )
        {
!       fprintf(stderr, "libgcobol.cc:__gg__adjust_dest_size(): Adjusting size upward is not possible.\n");
        abort();
  //      dest->allocated = ncount;
  //      dest->data = (unsigned char *)realloc(dest->data, ncount);
--- 12623,12631 ----
      {
      if( dest->allocated < ncount )
        {
!       fprintf(stderr, "libgcobol.cc:__gg__adjust_dest_size(): "
!                       "Adjusting %s size upward is not possible.\n",
!                       dest->name);
        abort();
  //      dest->allocated = ncount;
  //      dest->data = (unsigned char *)realloc(dest->data, ncount);
*************** __gg__just_mangle_name( const cblc_field
*** 12716,12722 ****
    // We need ach_name to be in ASCII:
    size_t charsout;
    const char *converted = __gg__iconverter(field->encoding,
!                                            DEFAULT_SOURCE_ENCODING,
                                             PTRCAST(char, field->data),
                                             length,
                                             &charsout);
--- 13309,13315 ----
    // We need ach_name to be in ASCII:
    size_t charsout;
    const char *converted = __gg__iconverter(field->encoding,
!                                            __gg__console_encoding,
                                             PTRCAST(char, field->data),
                                             length,
                                             &charsout);
*************** __gg__function_handle_from_name(int
*** 12812,12817 ****
--- 13405,13416 ----
                                             length,
                                             &charsout);
    memcpy(ach_name, converted, length);
+   char *p = strchr(ach_name, ascii_space);
+   if(p)
+     {
+     *p = '\0';
+     }
+   length = strlen(ach_name);
  
    // At this point we have a null-terminated ascii function name.
  
*************** get_the_byte(cblc_field_t *field)
*** 13122,13128 ****
      {
      // Get the encoded character associated with the figconst
      retval = __gg__fc_char(field);
!     if(retval == -1)
        {
        retval = (int)(unsigned char)__gg__get_integer_binary_value(field);
        }
--- 13721,13727 ----
      {
      // Get the encoded character associated with the figconst
      retval = __gg__fc_char(field);
!     if(retval == NOT_A_CHARACTER)
        {
        retval = (int)(unsigned char)__gg__get_integer_binary_value(field);
        }
*************** __gg__fc_char(const cblc_field_t *field)
*** 13726,13734 ****
    {
    // This returns the figconst character for a field, if the field->attr
    // indicates that the field is a figconst.  Otherwise, it comes back -1
!   int retval = -1;
    charmap_t *charmap = __gg__get_charmap(field->encoding);
    cbl_figconst_t figconst = (cbl_figconst_t)(field->attr & FIGCONST_MASK);
!   retval = charmap->figconst_character(figconst);
    return retval;
    }
--- 14325,14636 ----
    {
    // This returns the figconst character for a field, if the field->attr
    // indicates that the field is a figconst.  Otherwise, it comes back -1
!   int retval = NOT_A_CHARACTER;
    charmap_t *charmap = __gg__get_charmap(field->encoding);
    cbl_figconst_t figconst = (cbl_figconst_t)(field->attr & FIGCONST_MASK);
!   if( figconst )
!     {
!     retval = charmap->figconst_character(figconst);
!     }
    return retval;
    }
+ 
+ extern "C"
+ void
+ __gg__refer_from_string(cblc_field_t *field,
+                          size_t field_offset,
+                          size_t field_size,
+                    const char *string)
+   {
+   // 'string' has to be in the 'field' encoding.  Use this when the input
+   // might, or might not, be nul-terminated, and you don't want a
+   // nul-terminator in the data of the target field.
+   charmap_t *charmap = __gg__get_charmap(field->encoding);
+   size_t nbytes = charmap->strlen(string, field_size);
+   __gg__field_from_string(field, field_offset, field_size, string, nbytes);
+   }
+ 
+ extern "C"
+ void
+ __gg__refer_from_psz(cblc_field_t *field,
+                      size_t field_offset,
+                      size_t field_size,
+                const char *string)
+   {
+   // 'string' has to be in the 'field' encoding.  Use this when the input
+   // might, or might not, be nul-terminated, and you *do* want a
+   // nul-terminator in the data of the target field if there was one in the
+   // input.
+ 
+   // One typical use is processing returned values from external C-style
+   // functions, which often return nul-terminated strings.
+   charmap_t *charmap = __gg__get_charmap(field->encoding);
+   size_t nbytes = charmap->strlen(string, field_size);
+   __gg__field_from_string(field,
+                     field_offset,
+                     field_size,
+                     string,
+                     nbytes);
+   }
+ 
+ 
+ extern "C"
+ void
+ __gg__find_string(        cblc_field_t *dest,
+                     const cblc_field_t *haystack,
+                           size_t        haystack_o,
+                           size_t        haystack_s,
+                     const cblc_field_t *needle,
+                           size_t        needle_o,
+                           size_t        needle_s,
+                     const cblc_field_t *after,
+                           size_t        after_o,
+                           size_t        after_s,
+                           bool          last,
+                           bool          anycase)
+   {
+   int retval = 0;
+   cbl_encoding_t encoding = dest->encoding;
+   std::u32string str_id1 = normalize_for_inspect_format_4(
+                                                   haystack,
+                                                   haystack_o,
+                                                   haystack_s,
+                                                   encoding);
+   std::u32string str_id2 = normalize_for_inspect_format_4(
+                                                   needle,
+                                                   needle_o,
+                                                   needle_s,
+                                                   encoding);
+   if( !str_id1.empty() && !str_id2.empty() )
+     {
+     if( anycase )
+       {
+       std::transform( str_id1.begin(),
+                       str_id1.end(),
+                       str_id1.begin(),
+                       std::towlower);
+       std::transform( str_id2.begin(),
+                       str_id2.end(),
+                       str_id2.begin(),
+                       std::towlower);
+       }
+ 
+     // This is the count of how many to skip before returning an answer:
+     int after_count = 1;
+     size_t search_position;
+     if( last )
+       {
+       // We will search from right to left:
+       search_position = str_id1.size();
+       }
+     else
+       {
+       // We will search from left to right:
+       search_position = 0;
+       }
+ 
+     if( after )
+       {
+       int rdigits;
+       after_count = static_cast<int>(get_binary_value_local(&rdigits,
+                                                            after,
+                                                            after->data+after_o,
+                                                            after_s));
+       after_count += 1;
+       }
+     while( after_count-- >= 1 )
+       {
+       if( !last )
+         {
+         // We are searching from left to right
+         search_position = str_id1.find(str_id2, search_position);
+         if( search_position == std::u32string::npos )
+           {
+           // Alas, our search was fruitless
+           retval = 0;
+           break;
+           }
+         search_position += 1;
+         if( after_count == 0 )
+           {
+           // This was the find we were looking for!
+           // COBOL positions are 1-based positions, not zero-based offsets:
+           retval = search_position;
+           break;
+           }
+         }
+       else
+         {
+         // We are searching from right_to)left
+         search_position = str_id1.rfind(str_id2, search_position);
+         if( search_position == std::u32string::npos )
+           {
+           // Alas, our search was fruitless
+           break;
+           }
+         if( after_count == 0 )
+           {
+           // This was the find we were looking for!
+           // COBOL positions are 1-based positions, not zero-based offsets:
+           retval = search_position + 1;
+           break;
+           }
+         if( search_position == 0)
+           {
+           // There's no point in continuing the search leftwardsspast the
+           // left edge, and if we subtract 1 from the size_t search_position,
+           // we are not going to be happy with the result.
+           break;
+           }
+         search_position -= 1;
+         }
+       }
+     }
+   // Set the return value:
+   __gg__int128_to_field(dest,
+                         retval,
+                         NO_RDIGITS,
+                         truncation_e,
+                         NULL);
+   }
+ 
+ static
+ char *
+ convert_for_convert(      cbl_encoding_t dest_enc,
+                     const cblc_field_t *input,
+                           size_t        input_o,
+                           size_t        input_s,
+                           size_t       *nbytes)
+   {
+   // iconverter takes care of untranslateable characters.
+   char *retval = __gg__miconverter(input->encoding,
+                                    dest_enc,
+                                    input->data + input_o,
+                                    input_s,
+                                    nbytes);
+   return retval;
+   }
+ 
+ extern "C"
+ void
+ __gg__convert(cblc_field_t *dest,
+         const cblc_field_t *input,
+               size_t        input_o,
+               size_t        input_s,
+               int           /*source_format*/,
+               int           dest_format)
+   {
+   /* convert formulations: 
+    *  1. ANY to ALNUM HEX, or NAT HEX
+    *  2. HEX to BYTE
+    *  3. ALNUM to NAT, ALNUM HEX, or NAT HEX
+    *  4. NAT to ALNUM, ALNUM HEX, or NAT HEX
+    */
+ 
+   /* enum convert_type_t
+    *convert_alpha_e      = 0x01,
+    *convert_nat_e        = 0x02,
+    *convert_any_e        = 0x03, // i.e., both
+    *convert_byte_e       = 0x04,
+    *convert_hex_e        = 0x08, // may be combined with alpha or national
+    *convert_just_bit_e   = 0x10, 
+    *convert_just_e       = 0x18, // combined with HEX
+    *convert_rjust_bit_e  = 0x20, 
+    *convert_rjust_e      = 0x38, // combined with JUSTIFY
+    */
+   cbl_encoding_t tgt_enc = (dest_format & convert_nat_e) 
+                          ? __gg__national_encoding
+                          : __gg__display_encoding;
+   const charmap_t *charmap_tgt = __gg__get_charmap(tgt_enc);
+ 
+   charmap_t *charmap_dest = __gg__get_charmap(dest->encoding);
+   
+   if( dest_format & convert_hex_e )
+     {
+     size_t nbytes;
+     char *converted = convert_for_convert(tgt_enc,
+                                           input,
+                                           input_o,
+                                           input_s,
+                                           &nbytes);
+     // We output 'converted' as a stream of hexadecimal characters in the
+     // destination encoding:
+     size_t i = 0;
+     size_t d = 0;
+     while(i < nbytes && d < dest->capacity )
+       {
+       cbl_char_t byte = charmap_tgt->getch(converted, &i);
+       unsigned char hi = byte>>4;
+       hi += hi < 10 ? ascii_0 : ascii_A-10;
+       char lo = byte & 0x0F;
+       lo += lo < 10 ? ascii_0 : ascii_A-10;
+       charmap_dest->putch(charmap_dest->mapped_character(hi), dest->data, &d);
+       charmap_dest->putch(charmap_dest->mapped_character(lo), dest->data, &d);
+       }
+     free(converted);
+     __gg__adjust_dest_size(dest, d);
+     }
+   else if( dest_format == convert_byte_e )
+     {
+     // The input is a series of hexadecimal characters
+     size_t nbytes;
+     char *converted = __gg__miconverter( input->encoding,
+                                          iconv_CP1252_e,
+                                          input->data+input_o,
+                                          input_s,
+                                          &nbytes);
+     size_t i = 0;
+     size_t d = 0;
+     while(i < nbytes && d < dest->capacity )
+       {
+       // Each character is part of a string of hexadecimal digits.  So, the
+       // idea is that A1 should be turned into 1010.0001.  There is no
+       // guarantee that these characters actually are hexadecimal.
+       cbl_char_t nybble = charmap_tgt->getch(converted, &i);
+       if( nybble >= ascii_0 && nybble <= ascii_9 )
+         {
+         nybble -= ascii_0;
+         }
+       else if( nybble >= ascii_a && nybble <= ascii_f )
+         {
+         nybble -= ascii_a - 10;
+         }
+       else if( nybble >= ascii_A && nybble <= ascii_F )
+         {
+         nybble -= ascii_A - 10;
+         }
+       else
+         {
+         nybble = 0;
+         }
+ 
+       for(int j=0; j<4; j++)
+         {
+         if( nybble & 0x08 )
+           {
+           charmap_dest->putch(ascii_1, dest->data, &d);
+           }
+         else
+           {
+           charmap_dest->putch(ascii_0, dest->data, &d);
+           }
+         nybble <<= 1;
+         }
+       }
+     free(converted);
+     __gg__adjust_dest_size(dest, d);
+     }
+   else
+     {
+     size_t nbytes;
+     char *converted = convert_for_convert(dest->encoding,
+                                           input,
+                                           input_o,
+                                           input_s,
+                                           &nbytes);
+     size_t len = std::min(nbytes, dest->capacity);
+     memcpy(dest->data, converted, len);
+     free(converted);
+     __gg__adjust_dest_size(dest, len);
+     }
+   }
diff -Nrcpad gcc-16-20260111/libgcobol/libgcobol.h gcc-16-20260118/libgcobol/libgcobol.h
*** gcc-16-20260111/libgcobol/libgcobol.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/libgcobol.h	Sun Jan 18 22:32:15 2026
*************** extern "C" __int128 __gg__dirty_to_binar
*** 59,75 ****
  extern "C" __int128 __gg__binary_value_from_field(  int *rdigits,
                                                      cblc_field_t *var);
  
! extern "C" int __gg__compare_2( cblc_field_t *left_side,
!                                 unsigned char   *left_location,
!                                 size_t  left_length,
!                                 int     left_attr,
!                                 int     left_flags,
!                                 cblc_field_t *right_side,
!                                 unsigned char   *right_location,
!                                 size_t  right_length,
!                                 int     right_attr,
!                                 int     right_flags,
!                                 int     second_time_through);
  extern "C" void __gg__int128_to_field(cblc_field_t   *tgt,
                                        __int128        value,
                                        int             source_rdigits,
--- 59,75 ----
  extern "C" __int128 __gg__binary_value_from_field(  int *rdigits,
                                                      cblc_field_t *var);
  
! extern "C" int __gg__compare_2( cblc_field_t  *left_side,
!                                 unsigned char *left_location,
!                                 size_t         left_length,
!                                 uint64_t       left_attr,
!                                 int            left_flags,
!                                 cblc_field_t  *right_side,
!                                 unsigned char *right_location,
!                                 size_t         right_length,
!                                 uint64_t       right_attr,
!                                 int            right_flags,
!                                 int            second_time_through);
  extern "C" void __gg__int128_to_field(cblc_field_t   *tgt,
                                        __int128        value,
                                        int             source_rdigits,
*************** void __gg__convert_encoding_length(char
*** 144,147 ****
--- 144,160 ----
  
  const unsigned short *__gg__current_collation();
  
+ // Warning:  field_from_string uses charmap_t, so you can't safely feed it
+ // the results of __gg__iconverter without copying them.
+ extern "C"
+ void __gg__field_from_string( cblc_field_t *field,
+                               size_t field_o,
+                               size_t field_s,
+                         const char *string,
+                               size_t string_length);
+ extern "C"
+ void *__gg__memdup(const void *p, size_t size);
+ 
+ enum {width_of_utf32 = 4};
+ 
  #endif
diff -Nrcpad gcc-16-20260111/libgcobol/posix/bin/Makefile gcc-16-20260118/libgcobol/posix/bin/Makefile
*** gcc-16-20260111/libgcobol/posix/bin/Makefile	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/posix/bin/Makefile	Sun Jan 18 22:32:15 2026
***************
*** 1,18 ****
  #
  # Demonstrate how to generate a new COBOL binding from a man page. 
  #
  
  posix-mkdir.cbl:
! 	man 2 mkdir | ./scrape.awk | \
! 	../udf-gen -D mode_t=unsigned\ long  > $@~
  	@mv $@~ $@
  
  # ... or 
  
  posix-stat-many.scr:
! 	man 2 stat | col -b | ./scrape.awk > $@~
  	@mv $@~ $@
  
! .scr.cbl:
! 	./udf-gen -D mode_t=unsigned\ long  $^ > $@~
  	@mv $@~ $@
--- 1,37 ----
+ .SUFFIXES: .scr .cbl
+ 
+ ROOT = $(shell git rev-parse --show-toplevel)
+ 
  #
  # Demonstrate how to generate a new COBOL binding from a man page. 
  #
  
+ SCRAPE =  $(ROOT)/libgcobol/posix/bin/scrape.awk
+ UDF.GEN = $(ROOT)/libgcobol/posix/bin/udf-gen
+ 
+ posix-funcs:
+ 	test "$(FUNCS)"
+ 	for F in $(FUNCS); \
+ 		do man 2 $$F | col -b | $(SCRAPE) > posix-$$F.scr; \
+ 		$(MAKE) -f $(ROOT)/libgcobol/posix/bin/Makefile posix-$${F}.cbl; done
+ 
+ posix-$(FUNC).cbl:
+ 	man 2 $(FUNC) | col -b | $(SCRAPE) | \
+ 	$(UDF.GEN) -D mode_t=unsigned\ long  > $@~
+ 	@mv $@~ $@
+ 
  posix-mkdir.cbl:
! 	man 2 mkdir | col -b | $(SCRAPE) | \
! 	$(UDF.GEN) -D mode_t=unsigned\ long  > $@~
  	@mv $@~ $@
  
  # ... or 
  
  posix-stat-many.scr:
! 	man 2 stat | col -b | $(SCRAPE) > $@~
  	@mv $@~ $@
  
! %.cbl : %.scr
! 	test -s $^
! 	$(UDF.GEN) $(CPPFLAGS)  $^ > $@~
  	@mv $@~ $@
diff -Nrcpad gcc-16-20260111/libgcobol/posix/bin/scrape.awk gcc-16-20260118/libgcobol/posix/bin/scrape.awk
*** gcc-16-20260111/libgcobol/posix/bin/scrape.awk	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/posix/bin/scrape.awk	Sun Jan 18 22:32:15 2026
***************
*** 12,17 ****
--- 12,18 ----
    exit
  }
  
+ # Print lines that end in dots, a comma, a brace, or a semicolon.
  /SYNOPSIS/,/DESCRIPTION/ {
    if( /([.][.]|[{},;]) *$/ ) {
      print
diff -Nrcpad gcc-16-20260111/libgcobol/posix/bin/udf-gen gcc-16-20260118/libgcobol/posix/bin/udf-gen
*** gcc-16-20260111/libgcobol/posix/bin/udf-gen	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/posix/bin/udf-gen	Sun Jan 18 22:32:15 2026
***************
*** 30,35 ****
--- 30,36 ----
  
  import sys, os, getopt, re, copy
  from pycparser import c_parser, c_generator, c_ast, parse_file
+ from pycparser.plyparser import ParseError
  
  def starify(param):
      stars = ""
*************** for var in ('CPATH', 'C_INCLUDE_PATH'):
*** 283,289 ****
          cpp_args = ''
  
  def process(srcfile):
!     ast = parse_file(srcfile, use_cpp=True, cpp_args=cpp_args)
      # print(c_generator.CGenerator().visit(ast))
      v = VisitPrototypes()
      v.visit(ast)
--- 284,294 ----
          cpp_args = ''
  
  def process(srcfile):
!     try:
!         ast = parse_file(srcfile, use_cpp=True, cpp_args=cpp_args)
!     except ParseError as oops:
!         print(oops, file=sys.stderr)
!         sys.exit(1)
      # print(c_generator.CGenerator().visit(ast))
      v = VisitPrototypes()
      v.visit(ast)
diff -Nrcpad gcc-16-20260111/libgcobol/posix/cpy/psx-lseek.cpy gcc-16-20260118/libgcobol/posix/cpy/psx-lseek.cpy
*** gcc-16-20260111/libgcobol/posix/cpy/psx-lseek.cpy	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgcobol/posix/cpy/psx-lseek.cpy	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,14 ----
+         >> PUSH source format
+         >>SOURCE format is fixed
+ 
+       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+       *  This file is in the public domain.
+       *  Contributed by James K. Lowden of Cobolworx in November 2025.
+       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ 
+         >>DEFINE SEEK_SET      AS     2
+         >>DEFINE SEEK_CUR      AS     4
+         >>DEFINE SEEK_END      AS     8
+ 
+         >> POP source format
+ 
diff -Nrcpad gcc-16-20260111/libgcobol/posix/shim/lseek.cc gcc-16-20260118/libgcobol/posix/shim/lseek.cc
*** gcc-16-20260111/libgcobol/posix/shim/lseek.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgcobol/posix/shim/lseek.cc	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,31 ----
+ #include <sys/types.h>
+ #include <unistd.h>
+ 
+ #include <cassert>
+ #include <map>
+ 
+ #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
+ 
+ extern "C" {
+ 
+ off_t 
+ posix_lseek(int fd, off_t offset, int whence) {
+ 
+   static const std::map<int, int> whences {
+     { 2, SEEK_SET },
+     { 4, SEEK_CUR },
+     { 8, SEEK_END },
+   };    
+ 
+   /* 
+    * Map valid input whence value onto C standard library value. 
+    * Invalid values are passed through and rejected by lseek(2) per its documentation. 
+    * (The caller always needs to check for errors anyway.)
+    */
+   auto p = whences.find(whence);
+   if( p != whences.end() ) whence = p.second;
+ 
+   return lseek(fd, offset, whence);
+ }
+ 
+ } // extern "C"
diff -Nrcpad gcc-16-20260111/libgcobol/posix/udf/posix-lseek.cbl gcc-16-20260118/libgcobol/posix/udf/posix-lseek.cbl
*** gcc-16-20260111/libgcobol/posix/udf/posix-lseek.cbl	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/posix/udf/posix-lseek.cbl	Sun Jan 18 22:32:15 2026
***************
*** 11,22 ****
            01 Lk-fd PIC 9(8) Usage COMP.
            01 Lk-offset Binary-Long.
            01 Lk-whence Binary-Long.
          Procedure Division using
               By Value Lk-fd,
               By Value Lk-offset,
               By Value Lk-whence
               Returning Return-Value.
!           Call "lseek" using
               By Value Lk-fd,
               By Value Lk-offset,
               By Value Lk-whence
--- 11,25 ----
            01 Lk-fd PIC 9(8) Usage COMP.
            01 Lk-offset Binary-Long.
            01 Lk-whence Binary-Long.
+              88 SEEK-SET VALUE 2.
+              88 SEEK-CUR VALUE 4.
+              88 SEEK-END VALUE 8.
          Procedure Division using
               By Value Lk-fd,
               By Value Lk-offset,
               By Value Lk-whence
               Returning Return-Value.
!           Call "posix_lseek" using
               By Value Lk-fd,
               By Value Lk-offset,
               By Value Lk-whence
diff -Nrcpad gcc-16-20260111/libgcobol/posix/udf/posix-unlink.cbl gcc-16-20260118/libgcobol/posix/udf/posix-unlink.cbl
*** gcc-16-20260111/libgcobol/posix/udf/posix-unlink.cbl	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/posix/udf/posix-unlink.cbl	Sun Jan 18 22:32:15 2026
***************
*** 19,29 ****
               Returning Return-Value.
  
            Move Lk-pathname To Ws-pathname.
!           Inspect Ws-pathname 
!                   Replacing Trailing Space By Low-Value
  
            Inspect Backward Ws-pathname Replacing Leading Space, 
!       -      By Low-Value.
            Call "unlink" using
               By Reference Ws-pathname,
               Returning Return-Value.
--- 19,29 ----
               Returning Return-Value.
  
            Move Lk-pathname To Ws-pathname.
!       D   Inspect Ws-pathname 
!       D           Replacing Trailing Space By Low-Value
  
            Inspect Backward Ws-pathname Replacing Leading Space, 
!                                                       By Low-Value.
            Call "unlink" using
               By Reference Ws-pathname,
               Returning Return-Value.
diff -Nrcpad gcc-16-20260111/libgcobol/stringbin.cc gcc-16-20260118/libgcobol/stringbin.cc
*** gcc-16-20260111/libgcobol/stringbin.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/stringbin.cc	Sun Jan 18 22:32:15 2026
*************** __gg__binary_to_string_ascii(char *resul
*** 299,310 ****
  
  bool
  __gg__binary_to_string_encoded( char *result,
!                                 int digits,
                                  __int128 value,
                                  cbl_encoding_t encoding)
    {
!   charmap_t *charmap = __gg__get_charmap(encoding);
!   zero_char = charmap->mapped_character(ascii_0);
  
    // Note that this routine does not terminate the generated string with a
    // NUL.  This routine is sometimes used to generate a NumericDisplay string
--- 299,312 ----
  
  bool
  __gg__binary_to_string_encoded( char *result,
!                                 size_t digits,
                                  __int128 value,
                                  cbl_encoding_t encoding)
    {
!   // A non-zero retval means the number was too big to fit into the desired
!   // number of digits.
! 
!   zero_char = ascii_0;
  
    // Note that this routine does not terminate the generated string with a
    // NUL.  This routine is sometimes used to generate a NumericDisplay string
*************** __gg__binary_to_string_encoded( char *re
*** 317,324 ****
      value = -value;
      }
  
-   // A non-zero retval means the number was too big to fit into the desired
-   // number of digits:
    bool retval = !!(value / mask);
  
    // mask off the bottom digits to avoid garbage when value is too large
--- 319,324 ----
*************** __gg__binary_to_string_encoded( char *re
*** 328,334 ****
    combined.run = digits;
    combined.val128 = value;
    string_from_combined(combined);
!   memcpy(result, combined_string, digits);
    return retval;
    }
  
--- 328,340 ----
    combined.run = digits;
    combined.val128 = value;
    string_from_combined(combined);
!   size_t converted_bytes;
!   const char *converted = __gg__iconverter(DEFAULT_SOURCE_ENCODING,
!                                            encoding,
!                                            combined_string,
!                                            digits,
!                                            &converted_bytes);
!   memcpy(result, converted, converted_bytes);
    return retval;
    }
  
*************** __gg__binary_to_packed( unsigned char *r
*** 482,489 ****
  extern "C"
  __int128
  __gg__numeric_display_to_binary(unsigned char *signp,
!                           const unsigned char *psz,
!                                 int            n,
                                  cbl_encoding_t encoding)
    {
    /*  This is specific to numeric display values.
--- 488,495 ----
  extern "C"
  __int128
  __gg__numeric_display_to_binary(unsigned char *signp,
!                           const unsigned char *pdigits,
!                                 int            ndigits,
                                  cbl_encoding_t encoding)
    {
    /*  This is specific to numeric display values.
*************** __gg__numeric_display_to_binary(unsigned
*** 507,518 ****
    /*  We are assuming that 64-bit arithmetic is faster than 128-bit arithmetic,
        and so we build up a 128-bit result in three 64-bit pieces, and assemble
        them at the end.  */
  
    charmap_t *charmap = __gg__get_charmap(encoding);
!   unsigned char zero  = charmap->mapped_character(ascii_0);
!   unsigned char minus = charmap->mapped_character(ascii_minus);
  
!   bool is_ebcdic = (zero == 0xF0);
  
    static const uint8_t lookup[] =
      {
--- 513,525 ----
    /*  We are assuming that 64-bit arithmetic is faster than 128-bit arithmetic,
        and so we build up a 128-bit result in three 64-bit pieces, and assemble
        them at the end.  */
+   size_t digit_index = 0;
+   cbl_char_t ch;
  
    charmap_t *charmap = __gg__get_charmap(encoding);
!   cbl_char_t minus = charmap->mapped_character(ascii_minus);
  
!   bool is_ebcdic = charmap->is_like_ebcdic();
  
    static const uint8_t lookup[] =
      {
*************** __gg__numeric_display_to_binary(unsigned
*** 557,563 ****
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x40
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x50
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x60
!     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x70
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x80
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x90
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xa0
--- 564,570 ----
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x40
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x50
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x60
!     0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, // 0x70
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x80
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x90
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xa0
*************** __gg__numeric_display_to_binary(unsigned
*** 581,587 ****
    bool is_negative = false;
  
    // Pick up the original sign byte:
!   unsigned char sign_byte = *signp;
  
    const unsigned char *mapper;
    if( is_ebcdic )
--- 588,594 ----
    bool is_negative = false;
  
    // Pick up the original sign byte:
!   cbl_char_t sign_byte = charmap->getch(signp, (size_t)0);
  
    const unsigned char *mapper;
    if( is_ebcdic )
*************** __gg__numeric_display_to_binary(unsigned
*** 599,605 ****
      // forcing the zone to 0xF0.  Note that this is harmless if redundant, and
      // harmless as well if the data SIGN IS SEPARATE.  Whatever we do to this
      // byte will be undone at the end of the routine.
!     *signp |= 0xF0;
      }
    else
      {
--- 606,612 ----
      // forcing the zone to 0xF0.  Note that this is harmless if redundant, and
      // harmless as well if the data SIGN IS SEPARATE.  Whatever we do to this
      // byte will be undone at the end of the routine.
!     charmap->putch(sign_byte|0xF0, signp, (size_t)0);
      }
    else
      {
*************** __gg__numeric_display_to_binary(unsigned
*** 613,658 ****
        is_negative = true;
  
        // Make it a valid positive digit by turning the zone to 0x30
!       *signp &= 0x3F;
        }
      }
  
    // Digits 1 through 18 come from the bottom:
!   if( n <= 18 )
      {
!     count_bottom = n;
      count_middle = 0;
      count_top = 0;
      }
!   else if( n<= 36 )
      {
      count_bottom = 18;
!     count_middle = n - 18;
      count_top = 0;
      }
    else
      {
      count_bottom = 18;
      count_middle = 18;
!     count_top = n - 36;
      }
  
!   if( n & 1 )
      {
      // We are dealing with an odd number of digits
      if( count_top )
        {
!       top = mapper[*psz++];
        count_top -= 1;
        }
      else if( count_middle )
        {
!       middle = mapper[*psz++];
        count_middle -= 1;
        }
      else
        {
!       bottom = mapper[*psz++];
        count_bottom -= 1;
        }
      }
--- 620,668 ----
        is_negative = true;
  
        // Make it a valid positive digit by turning the zone to 0x30
!       charmap->putch(sign_byte&0x3F, signp, (size_t)0);
        }
      }
  
    // Digits 1 through 18 come from the bottom:
!   if( ndigits <= 18 )
      {
!     count_bottom = ndigits;
      count_middle = 0;
      count_top = 0;
      }
!   else if( ndigits<= 36 )
      {
      count_bottom = 18;
!     count_middle = ndigits - 18;
      count_top = 0;
      }
    else
      {
      count_bottom = 18;
      count_middle = 18;
!     count_top = ndigits - 36;
      }
  
!   if( ndigits & 1 )
      {
      // We are dealing with an odd number of digits
      if( count_top )
        {
!       ch = charmap->getch(pdigits, &digit_index);
!       top = mapper[ch];
        count_top -= 1;
        }
      else if( count_middle )
        {
!       ch = charmap->getch(pdigits, &digit_index);
!       middle = mapper[ch];
        count_middle -= 1;
        }
      else
        {
!       ch = charmap->getch(pdigits, &digit_index);
!       bottom = mapper[ch];
        count_bottom -= 1;
        }
      }
*************** __gg__numeric_display_to_binary(unsigned
*** 661,668 ****
  
    while( count_top )
      {
!     add_me  = mapper[*psz++] << 4;
!     add_me += mapper[*psz++];
      top *= 100 ;
      top += lookup[add_me];
      count_top -= 2;
--- 671,680 ----
  
    while( count_top )
      {
!     ch = charmap->getch(pdigits, &digit_index);
!     add_me  = mapper[ch] << 4;
!     ch = charmap->getch(pdigits, &digit_index);
!     add_me += mapper[ch];
      top *= 100 ;
      top += lookup[add_me];
      count_top -= 2;
*************** __gg__numeric_display_to_binary(unsigned
*** 670,677 ****
  
    while( count_middle )
      {
!     add_me  = mapper[*psz++] << 4;
!     add_me += mapper[*psz++];
      middle *= 100 ;
      middle += lookup[add_me];
      count_middle -= 2;
--- 682,691 ----
  
    while( count_middle )
      {
!     ch = charmap->getch(pdigits, &digit_index);
!     add_me  = mapper[ch] << 4;
!     ch = charmap->getch(pdigits, &digit_index);
!     add_me += mapper[ch];
      middle *= 100 ;
      middle += lookup[add_me];
      count_middle -= 2;
*************** __gg__numeric_display_to_binary(unsigned
*** 679,686 ****
  
    while( count_bottom )
      {
!     add_me  = mapper[*psz++] << 4;
!     add_me += mapper[*psz++];
      bottom *= 100 ;
      bottom += lookup[add_me];
      count_bottom -= 2;
--- 693,702 ----
  
    while( count_bottom )
      {
!     ch = charmap->getch(pdigits, &digit_index);
!     add_me  = mapper[ch] << 4;
!     ch = charmap->getch(pdigits, &digit_index);
!     add_me += mapper[ch];
      bottom *= 100 ;
      bottom += lookup[add_me];
      count_bottom -= 2;
*************** __gg__numeric_display_to_binary(unsigned
*** 700,706 ****
      }
  
    // Replace the original sign byte:
!   *signp = sign_byte; // cppcheck-suppress redundantAssignment
    return retval;
    }
  
--- 716,722 ----
      }
  
    // Replace the original sign byte:
!   charmap->putch(sign_byte, signp, (size_t)0);
    return retval;
    }
  
diff -Nrcpad gcc-16-20260111/libgcobol/stringbin.h gcc-16-20260118/libgcobol/stringbin.h
*** gcc-16-20260111/libgcobol/stringbin.h	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/stringbin.h	Sun Jan 18 22:32:15 2026
*************** bool __gg__binary_to_string_ascii(char *
*** 36,42 ****
                                    __int128 value);
  extern "C"
  bool __gg__binary_to_string_encoded(char *result,
!                                     int digits,
                                      __int128 value,
                                      cbl_encoding_t encoding);
  
--- 36,42 ----
                                    __int128 value);
  extern "C"
  bool __gg__binary_to_string_encoded(char *result,
!                                     size_t digits, // Desired digits
                                      __int128 value,
                                      cbl_encoding_t encoding);
  
diff -Nrcpad gcc-16-20260111/libgcobol/valconv.cc gcc-16-20260118/libgcobol/valconv.cc
*** gcc-16-20260111/libgcobol/valconv.cc	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgcobol/valconv.cc	Sun Jan 18 22:32:15 2026
*************** __gg__string_to_numeric_edited( char * c
*** 226,231 ****
--- 226,234 ----
    // We need to expand the picture string.  We assume that the caller left
    // enough room in dest to take the expanded picture string.
  
+   // Note that we do not put on a nul terminator, so if you need one, it's
+   // your job to put it there.
+ 
    int dlength = expand_picture(dest, picture);
  
    // At the present time, I am taking a liberty. In principle, a 'V'
diff -Nrcpad gcc-16-20260111/libgfortran/ChangeLog gcc-16-20260118/libgfortran/ChangeLog
*** gcc-16-20260111/libgfortran/ChangeLog	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgfortran/ChangeLog	Sun Jan 18 22:32:15 2026
***************
*** 1,3 ****
--- 1,15 ----
+ 2026-01-13  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR libfortran/123012
+ 	* io/list_read.c (read_character): Add new check after
+ 	get_string and provide better comments.
+ 
+ 2026-01-11  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+ 
+ 	PR libfortran/123012
+ 	* io/list_read.c (read_character): Add new check when no
+ 	quate is provided and the character string is digits only.
+ 
  2026-01-09  Thomas Koenig  <tkoenig@gcc.gnu.org>
  
  	* io/io.h: Change type of self to intptr_t.
diff -Nrcpad gcc-16-20260111/libgfortran/io/list_read.c gcc-16-20260118/libgfortran/io/list_read.c
*** gcc-16-20260111/libgfortran/io/list_read.c	Sun Jan 11 22:32:15 2026
--- gcc-16-20260118/libgfortran/io/list_read.c	Sun Jan 18 22:32:15 2026
*************** read_character (st_parameter_dt *dtp, in
*** 1314,1319 ****
--- 1314,1323 ----
  
  	CASE_SEPARATORS:
  	case EOF:
+ 	  /* At this point we have been reading a string of digits. Now we see
+ 	     the end of these digits without seeing the closing quote and not
+ 	     seeing the '*' for a repeat count.  When in namelist mode, if it
+ 	     was a string of digits it should have had the closing quote.  */
  	  if (dtp->u.p.namelist_mode)
  	    {
  	      snprintf (message, IOMSG_LEN, "Missing quote while reading item %d",
*************** read_character (st_parameter_dt *dtp, in
*** 1367,1372 ****
--- 1371,1386 ----
  
   get_string:
  
+   /* We could be at the beginning of a string or partially through a string
+      that began with all digits. Either way, the quote character for a namelist
+      read should have been set.  */
+   if (dtp->u.p.namelist_mode && (quote == ' '))
+     {
+       snprintf (message, IOMSG_LEN, "Missing quote while reading item %d",
+ 		dtp->u.p.item_count);
+       generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
+     }
+ 
    for (;;)
      {
        if ((c = next_char (dtp)) == EOF)
diff -Nrcpad gcc-16-20260111/libgomp/ChangeLog gcc-16-20260118/libgomp/ChangeLog
*** gcc-16-20260111/libgomp/ChangeLog	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/ChangeLog	Sun Jan 18 22:32:15 2026
***************
*** 1,3 ****
--- 1,187 ----
+ 2026-01-15  Josef Melcr  <josef.melcr@suse.com>
+ 
+ 	PR ipa/122852
+ 	* testsuite/libgomp.c/pr122852.c: New test.
+ 
+ 2026-01-14  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-std__unordered_map-concurrent-usm.C:
+ 	New.
+ 	* testsuite/libgomp.c++/target-std__unordered_multimap-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_multiset-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_set-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_map-concurrent.C:
+ 	Adjust.
+ 	* testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__unordered_set-concurrent.C:
+ 	Likewise.
+ 
+ 2026-01-14  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C:
+ 	New.
+ 	* testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_map-concurrent.C: Adjust.
+ 	* testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__flat_set-concurrent.C:
+ 	Likewise.
+ 
+ 2026-01-14  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/target-std__array-concurrent-usm.C:
+ 	'#define OMP_USM'.
+ 	* testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__list-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__span-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__map-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__set-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__vector-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__deque-concurrent-usm.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__array-concurrent.C: Comment.
+ 	* testsuite/libgomp.c++/target-std__bitset-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__deque-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__forward_list-concurrent.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__list-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__span-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__valarray-concurrent.C:
+ 	Likewise.
+ 	* testsuite/libgomp.c++/target-std__vector-concurrent.C: Likewise.
+ 	* testsuite/libgomp.c++/target-std__map-concurrent.C [OMP_USM]:
+ 	Fix up dynamic memory allocation.
+ 	* testsuite/libgomp.c++/target-std__multimap-concurrent.C
+ 	[OMP_USM]: Likewise.
+ 	* testsuite/libgomp.c++/target-std__multiset-concurrent.C
+ 	[OMP_USM]: Likewise.
+ 	* testsuite/libgomp.c++/target-std__set-concurrent.C [OMP_USM]:
+ 	Likewise.
+ 
+ 2026-01-14  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c-c++-common/map-arrayofstruct-2-usm.c: New.
+ 	* testsuite/libgomp.c-c++-common/map-arrayofstruct-3-usm.c:
+ 	Likewise.
+ 	* testsuite/libgomp.c-c++-common/struct-elem-5-usm.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/target-present-1-usm.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/target-present-2-usm.c: Likewise.
+ 	* testsuite/libgomp.c-c++-common/target-present-3-usm.c: Likewise.
+ 	* testsuite/libgomp.fortran/map-subarray-5-usm.f90: Likewise.
+ 	* testsuite/libgomp.fortran/map-subarray-6-usm.f90: Likewise.
+ 	* testsuite/libgomp.fortran/map-subarray-7-usm.f90: Likewise.
+ 	* testsuite/libgomp.fortran/target-allocatable-1-1-usm.f90:
+ 	Likewise.
+ 	* testsuite/libgomp.fortran/target-allocatable-1-2-usm.f90:
+ 	Likewise.
+ 	* testsuite/libgomp.fortran/target-enter-data-2-usm.F90: Likewise.
+ 	* testsuite/libgomp.fortran/target-present-1-usm.f90: Likewise.
+ 	* testsuite/libgomp.fortran/target-present-2-usm.f90: Likewise.
+ 	* testsuite/libgomp.fortran/target-present-3-usm.f90: Likewise.
+ 	* testsuite/libgomp.fortran/target-allocatable-1-1.f90: Adjust.
+ 	* testsuite/libgomp.fortran/target-allocatable-1-2.f90: Likewise.
+ 	* testsuite/libgomp.fortran/target-present-1.f90: Likewise.
+ 	* testsuite/libgomp.fortran/target-present-2.f90: Likewise.
+ 	* testsuite/libgomp.fortran/target-present-3.f90: Likewise.
+ 
+ 2026-01-13  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.fortran/map-alloc-comp-9-usm.f90: Require
+ 	working Unified Shared Memory to run the test.
+ 
+ 2026-01-13  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	* testsuite/libgomp.c++/examples-4/declare_target-2.C: Add
+ 	'-Wno-deprecated-openmp'.
+ 	* testsuite/libgomp.c/declare-variant-3-sm30.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm35.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm37.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm52.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm53.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm61.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm70.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm75.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm80.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-3-sm89.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx10-3-generic.c:
+ 	Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1030.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1031.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1032.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1033.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1034.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1035.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1036.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx11-generic.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1100.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1101.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1102.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1103.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1150.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1151.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1152.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx1153.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx9-4-generic.c:
+ 	Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx9-generic.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx900.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx902.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx904.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx906.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx908.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx909.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx90a.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx90c.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx942.c: Likewise.
+ 	* testsuite/libgomp.c/declare-variant-4-gfx950.c: Likewise.
+ 	* testsuite/libgomp.c/examples-4/async_target-2.c: Likewise.
+ 	* testsuite/libgomp.c/interop-hsa.c: Likewise.
+ 	* testsuite/libgomp.c/target-20.c: Likewise.
+ 	* testsuite/libgomp.c/target-simd-clone-1.c: Likewise.
+ 	* testsuite/libgomp.c/target-simd-clone-2.c: Likewise.
+ 	* testsuite/libgomp.c/target-simd-clone-3.c: Likewise.
+ 	* testsuite/libgomp.fortran/alloc-managed-1.f90: Likewise.
+ 	* testsuite/libgomp.fortran/target9.f90: Likewise.
+ 
+ 2026-01-13  Thomas Schwinge  <tschwinge@baylibre.com>
+ 
+ 	PR testsuite/123098
+ 	* testsuite/libgomp.oacc-c-c++-common/vred2d-128.c: Remove
+ 	'-Wno-deprecated-openmp'.
+ 
+ 2026-01-12  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+ 
+ 	PR c++/81337
+ 	* testsuite/libgomp.c++/target-cdtor-2.C: Skip on Solaris.
+ 	Fix comments.
+ 
  2026-01-06  supers1ngular  <supers1ngular@baylibre.com>
  
  	* testsuite/libgomp.fortran/pr84418-1.f90: Fix verbiage of
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm30.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm30.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm30.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm30.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_30 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm35.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm35.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm35.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm35.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_35 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm37.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm37.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm37.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm37.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_37 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm52.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm52.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm52.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm52.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_52 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm53.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm53.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm53.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm53.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_53 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm61.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm61.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm61.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm61.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_61 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm70.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm70.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm70.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm70.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_70 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm75.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm75.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm75.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm75.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_75 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm80.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm80.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm80.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm80.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_80 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm89.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm89.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-3-sm89.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-3-sm89.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_nvptx } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=nvptx-none } */
  /* { dg-additional-options "-foffload=-misa=sm_89 -foffload=-mptx=_" } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx10-3-generic.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx10-3-generic.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx10-3-generic.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx10-3-generic.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx10-3-generic } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1030.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1030.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1030.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1030.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1030 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1031.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1031.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1031.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1031.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1031 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1032.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1032.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1032.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1032.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1032 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1033.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1033.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1033.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1033.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1033 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1034.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1034.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1034.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1034.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1034 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1035.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1035.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1035.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1035.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1035 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1036.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1036.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1036.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1036.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1036 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx11-generic.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx11-generic.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx11-generic.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx11-generic.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx11-generic } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1100.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1100.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1100.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1100.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1100 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1101.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1101.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1101.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1101.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1101 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1102.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1102.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1102.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1102.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1102 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1103.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1103.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1103.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1103.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1103 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1150.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1150.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1150.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1150.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1150 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1151.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1151.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1151.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1151.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1151 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1152.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1152.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1152.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1152.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1152 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1153.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1153.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1153.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx1153.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx1153 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-4-generic.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-4-generic.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-4-generic.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-4-generic.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx9-4-generic } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-generic.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-generic.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-generic.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx9-generic.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx9-generic } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx900.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx900.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx900.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx900.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx900 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx902.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx902.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx902.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx902.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx902 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx904.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx904.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx904.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx904.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx904 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx906.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx906.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx906.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx906.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx906 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx908.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx908.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx908.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx908.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx908 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx909.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx909.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx909.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx909.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx909 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx90a.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx90a.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx90a.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx90a.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx90a } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx90c.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx90c.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx90c.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx90c.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx90c } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx942.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx942.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx942.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx942.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx942 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx950.c gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx950.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/declare-variant-4-gfx950.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/declare-variant-4-gfx950.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  /* { dg-additional-options -foffload=amdgcn-amdhsa } */
  /* { dg-additional-options -foffload=-march=gfx950 } */
  /* { dg-additional-options "-foffload=-fdump-tree-optimized" } */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/examples-4/async_target-2.c gcc-16-20260118/libgomp/testsuite/libgomp.c/examples-4/async_target-2.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/examples-4/async_target-2.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/examples-4/async_target-2.c	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,6 ----
  /* { dg-do run } */
  /* { dg-require-effective-target offload_device_nonshared_as } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  
  #include <omp.h>
  #include <stdlib.h>
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/interop-hsa.c gcc-16-20260118/libgomp/testsuite/libgomp.c/interop-hsa.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/interop-hsa.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/interop-hsa.c	Sun Jan 18 22:32:16 2026
***************
*** 2,7 ****
--- 2,8 ----
  /* { dg-require-effective-target offload_device_gcn }
     The 'asm' insert is valid for GCN only:
     { dg-additional-options -foffload=amdgcn-amdhsa } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  
  #include <stdio.h>
  #include <stdlib.h>
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/pr122852.c gcc-16-20260118/libgomp/testsuite/libgomp.c/pr122852.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/pr122852.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/pr122852.c	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,24 ----
+ /* { dg-do compile } */
+ /* { dg-require-effective-target fopenmp } */
+ /* { dg-options "-O2 -fopenmp" } */
+ 
+ int a, b, c;
+ 
+ static void
+ foo (int g)
+ {
+   int f = c ? c : 2;
+   if (c)
+     b = 3;
+   if (!g)
+     for (int d = 0; d < f; ++d)
+ #pragma omp parallel
+       while (a)
+ 	;
+ }
+ 
+ void
+ bar (void)
+ {
+   foo (1);
+ }
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/target-20.c gcc-16-20260118/libgomp/testsuite/libgomp.c/target-20.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/target-20.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/target-20.c	Sun Jan 18 22:32:16 2026
***************
*** 1,4 ****
--- 1,5 ----
  /* { dg-require-effective-target offload_device_nonshared_as } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  
  #include <stdlib.h>
  #include <assert.h>
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/target-simd-clone-1.c gcc-16-20260118/libgomp/testsuite/libgomp.c/target-simd-clone-1.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/target-simd-clone-1.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/target-simd-clone-1.c	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,6 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
  /* { dg-additional-options "-O2 -foffload-options=-fdump-ipa-simdclone-details" } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  
  /* Test that simd clones for the offload processor are generated for
     functions with "declare target" when enabled by default at -O2.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/target-simd-clone-2.c gcc-16-20260118/libgomp/testsuite/libgomp.c/target-simd-clone-2.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/target-simd-clone-2.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/target-simd-clone-2.c	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,6 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
  /* { dg-additional-options "-foffload-options=-fdump-ipa-simdclone-details -foffload-options=-fno-openmp-target-simd-clone" } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  
  /* Test that simd clones for the offload processor are not generated for
     functions with "declare target" when explicitly disabled.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c/target-simd-clone-3.c gcc-16-20260118/libgomp/testsuite/libgomp.c/target-simd-clone-3.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c/target-simd-clone-3.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c/target-simd-clone-3.c	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,6 ----
  /* { dg-do link { target { offload_target_amdgcn } } } */
  /* { dg-additional-options "-O2 -foffload-options=-fdump-ipa-simdclone-details" } */
+ /* { dg-additional-options -Wno-deprecated-openmp } */
  
  /* Test that device simd clones are not generated for functions with the host
     "declare target" clause only.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/examples-4/declare_target-2.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/examples-4/declare_target-2.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/examples-4/declare_target-2.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/examples-4/declare_target-2.C	Sun Jan 18 22:32:15 2026
***************
*** 1,5 ****
--- 1,6 ----
  // { dg-do run }
  // { dg-require-effective-target offload_device_nonshared_as }
+ // { dg-additional-options -Wno-deprecated-openmp }
  
  #include <stdlib.h>
  
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-cdtor-2.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-cdtor-2.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-cdtor-2.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-cdtor-2.C	Sun Jan 18 22:32:15 2026
***************
*** 1,10 ****
  /* Offloaded 'constructor' and 'destructor' functions, and C++ objects construction and destruction.  */
  
  /* { dg-require-effective-target init_priority } */
  
- /* { dg-additional-options -fdump-tree-optimized-raw-asmname }
-    { dg-additional-options -foffload-options=-fdump-tree-optimized-raw-asmname } */
- // { dg-additional-options "-Wno-deprecated-openmp" }
  #include <omp.h>
  #include <vector>
  
--- 1,12 ----
  /* Offloaded 'constructor' and 'destructor' functions, and C++ objects construction and destruction.  */
  
  /* { dg-require-effective-target init_priority } */
+ /* { dg-skip-if "PR c++/81337: destructor ordering" { *-*-solaris2* } } */
+ 
+ /* { dg-additional-options -fdump-tree-optimized-raw-asmname } */
+ /* { dg-additional-options -foffload-options=-fdump-tree-optimized-raw-asmname } */
+ /* { dg-additional-options "-Wno-deprecated-openmp" } */
  
  #include <omp.h>
  #include <vector>
  
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__array-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,7 ****
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__array-concurrent.C"
--- 1,7 ----
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__array-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__array-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 53,58 ****
--- 53,63 ----
        #pragma omp target map (from: ok)
  	{
  	  ok = validate (arr, data);
+ 
+ #ifdef OMP_USM
+ 	  /* (By construction) we're not allocating memory during device
+ 	     execution, so have nothing to clean up.  */
+ #endif
  #ifndef MEM_SHARED
  	  arr.~array ();
  #endif
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,6 ****
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__bitset-concurrent.C"
--- 1,6 ----
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__bitset-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__bitset-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 58,63 ****
--- 58,67 ----
  	  if (_set[i])
  	    sum += i;
  
+ #ifdef OMP_USM
+ 	/* (By construction) we're not allocating memory during device
+ 	   execution, so have nothing to clean up.  */
+ #endif
  #ifndef MEM_SHARED
        #pragma omp target
  	_set.~bitset ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,7 ****
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__deque-concurrent.C"
--- 1,7 ----
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__deque-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__deque-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 54,59 ****
--- 54,64 ----
        #pragma omp target map (from: ok)
  	{
  	  ok = validate (_deque, data);
+ 
+ #ifdef OMP_USM
+ 	  /* (By construction) we're not allocating memory during device
+ 	     execution, so have nothing to clean up.  */
+ #endif
  #ifndef MEM_SHARED
  	  _deque.~deque ();
  #endif
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-additional-options "-std=c++23" }
+ 
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ #define OMP_USM
+ #define MEM_SHARED
+ 
+ #include "target-std__flat_map-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_map-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 39,45 ****
--- 39,47 ----
    init (keys, true);
    init (data, false);
  
+ #ifndef MEM_SHARED
    #pragma omp target enter data map (to: keys[ :N], data[ :N]) map (alloc: _map)
+ #endif
  
    #pragma omp target
      {
*************** int main (void)
*** 55,66 ****
--- 57,78 ----
      for (int i = 0; i < N; ++i)
        sum += (long long) keys[i] * _map[keys[i]];
  
+ #ifdef OMP_USM
+   #pragma omp target
+     /* Restore the object into pristine state.  In particular, deallocate
+        any memory allocated during device execution, which otherwise, back
+        on the host, we'd SIGSEGV on, when attempting to deallocate during
+        destruction of the object.  */
+     __typeof__ (_map){}.swap (_map);
+ #endif
  #ifndef MEM_SHARED
    #pragma omp target
      _map.~flat_map ();
  #endif
  
+ #ifndef MEM_SHARED
    #pragma omp target exit data map (release: _map)
+ #endif
  
    bool ok = validate (sum, keys, data);
    return ok ? 0 : 1;
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-additional-options "-std=c++23" }
+ 
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ #define OMP_USM
+ #define MEM_SHARED
+ 
+ #include "target-std__flat_multimap-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_multimap-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 33,39 ****
--- 33,41 ----
    init (keys, KEY_MAX);
    init (data, RAND_MAX);
  
+ #ifndef MEM_SHARED
    #pragma omp target enter data map (to: keys[ :N], data[ :N]) map (alloc: _map)
+ #endif
  
    #pragma omp target
      {
*************** int main (void)
*** 54,65 ****
--- 56,77 ----
  	}
        }
  
+ #ifdef OMP_USM
+   #pragma omp target
+     /* Restore the object into pristine state.  In particular, deallocate
+        any memory allocated during device execution, which otherwise, back
+        on the host, we'd SIGSEGV on, when attempting to deallocate during
+        destruction of the object.  */
+     __typeof__ (_map){}.swap (_map);
+ #endif
  #ifndef MEM_SHARED
    #pragma omp target
      _map.~flat_multimap ();
  #endif
  
+ #ifndef MEM_SHARED
    #pragma omp target exit data map (release: _map)
+ #endif
  
    bool ok = validate (sum, keys, data);
    return ok ? 0 : 1;
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-additional-options "-std=c++23" }
+ 
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ #define OMP_USM
+ #define MEM_SHARED
+ 
+ #include "target-std__flat_multiset-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_multiset-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 34,40 ****
--- 34,42 ----
    srand (time (NULL));
    init (data);
  
+ #ifndef MEM_SHARED
    #pragma omp target data map (to: data[ :N]) map (alloc: set)
+ #endif
      {
        #pragma omp target
  	{
*************** int main (void)
*** 49,54 ****
--- 51,64 ----
  	for (int i = 0; i < MAX; ++i)
  	  sum += i * set.count (i);
  
+ #ifdef OMP_USM
+       #pragma omp target
+ 	/* Restore the object into pristine state.  In particular, deallocate
+ 	   any memory allocated during device execution, which otherwise, back
+ 	   on the host, we'd SIGSEGV on, when attempting to deallocate during
+ 	   destruction of the object.  */
+ 	__typeof__ (set){}.swap (set);
+ #endif
  #ifndef MEM_SHARED
        #pragma omp target
  	set.~flat_multiset ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,8 ----
+ // { dg-additional-options "-std=c++23" }
+ 
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ #define OMP_USM
+ #define MEM_SHARED
+ 
+ #include "target-std__flat_set-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__flat_set-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 40,46 ****
--- 40,48 ----
    srand (time (NULL));
    init (data);
  
+ #ifndef MEM_SHARED
    #pragma omp target data map (to: data[ :N]) map (alloc: _set)
+ #endif
      {
        #pragma omp target
  	{
*************** int main (void)
*** 56,61 ****
--- 58,71 ----
  	  if (_set.count (i) > 0)
  	    sum += i;
  
+ #ifdef OMP_USM
+       #pragma omp target
+ 	/* Restore the object into pristine state.  In particular, deallocate
+ 	   any memory allocated during device execution, which otherwise, back
+ 	   on the host, we'd SIGSEGV on, when attempting to deallocate during
+ 	   destruction of the object.  */
+ 	__typeof__ (_set){}.swap (_set);
+ #endif
  #ifndef MEM_SHARED
        #pragma omp target
  	_set.~flat_set ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,7 ****
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__forward_list-concurrent.C"
--- 1,7 ----
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__forward_list-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__forward_list-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 73,78 ****
--- 73,83 ----
        #pragma omp target map (from: ok)
  	{
  	  ok = validate (list, data);
+ 
+ #ifdef OMP_USM
+ 	  /* (By construction) we're not allocating memory during device
+ 	     execution, so have nothing to clean up.  */
+ #endif
  #ifndef MEM_SHARED
  	  list.~forward_list ();
  #endif
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__list-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,7 ****
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__list-concurrent.C"
--- 1,7 ----
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__list-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__list-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 73,78 ****
--- 73,83 ----
        #pragma omp target map (from: ok)
  	{
  	  ok = validate (_list, data);
+ 
+ #ifdef OMP_USM
+ 	  /* (By construction) we're not allocating memory during device
+ 	     execution, so have nothing to clean up.  */
+ #endif
  #ifndef MEM_SHARED
  	  _list.~list ();
  #endif
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__map-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,6 ****
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__map-concurrent.C"
--- 1,6 ----
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__map-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__map-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 56,61 ****
--- 56,69 ----
      for (int i = 0; i < N; ++i)
        sum += (long long) keys[i] * _map[keys[i]];
  
+ #ifdef OMP_USM
+   #pragma omp target
+     /* Restore the object into pristine state.  In particular, deallocate
+        any memory allocated during device execution, which otherwise, back
+        on the host, we'd SIGSEGV on, when attempting to deallocate during
+        destruction of the object.  */
+     __typeof__ (_map){}.swap (_map);
+ #endif
  #ifndef MEM_SHARED
    #pragma omp target
      _map.~map ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,6 ****
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__multimap-concurrent.C"
--- 1,6 ----
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__multimap-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__multimap-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 54,70 ****
  	for (auto it = range.first; it != range.second; ++it)
  	  sum += (long long) it->first * it->second;
        }
- #ifdef MEM_SHARED
-   /* Even with USM, memory allocated on the device (with _map.insert)
-      must be freed on the device.  */
-   if (omp_get_default_device () != omp_initial_device
-       && omp_get_default_device () != omp_get_num_devices ())
-     {
-       #pragma omp target
- 	_map.clear ();
-     }
- #endif
  
  #ifndef MEM_SHARED
    #pragma omp target
      _map.~multimap ();
--- 54,68 ----
  	for (auto it = range.first; it != range.second; ++it)
  	  sum += (long long) it->first * it->second;
        }
  
+ #ifdef OMP_USM
+   #pragma omp target
+     /* Restore the object into pristine state.  In particular, deallocate
+        any memory allocated during device execution, which otherwise, back
+        on the host, we'd SIGSEGV on, when attempting to deallocate during
+        destruction of the object.  */
+     __typeof__ (_map){}.swap (_map);
+ #endif
  #ifndef MEM_SHARED
    #pragma omp target
      _map.~multimap ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,6 ****
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__multiset-concurrent.C"
--- 1,6 ----
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__multiset-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__multiset-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 51,56 ****
--- 51,64 ----
  	for (int i = 0; i < MAX; ++i)
  	  sum += i * set.count (i);
  
+ #ifdef OMP_USM
+       #pragma omp target
+ 	/* Restore the object into pristine state.  In particular, deallocate
+ 	   any memory allocated during device execution, which otherwise, back
+ 	   on the host, we'd SIGSEGV on, when attempting to deallocate during
+ 	   destruction of the object.  */
+ 	__typeof__ (set){}.swap (set);
+ #endif
  #ifndef MEM_SHARED
        #pragma omp target
  	set.~multiset ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__set-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,6 ****
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__set-concurrent.C"
--- 1,6 ----
  /* { dg-require-effective-target omp_usm } */
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__set-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__set-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 57,62 ****
--- 57,70 ----
  	  if (_set.find (i) != _set.end ())
  	    sum += i;
  
+ #ifdef OMP_USM
+       #pragma omp target
+ 	/* Restore the object into pristine state.  In particular, deallocate
+ 	   any memory allocated during device execution, which otherwise, back
+ 	   on the host, we'd SIGSEGV on, when attempting to deallocate during
+ 	   destruction of the object.  */
+ 	__typeof__ (_set){}.swap (_set);
+ #endif
  #ifndef MEM_SHARED
        #pragma omp target
  	_set.~set ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__span-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 2,8 ****
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__span-concurrent.C"
--- 2,8 ----
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__span-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__span-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 53,58 ****
--- 53,63 ----
    #pragma omp target map (from: ok)
      {
        ok = validate (span, data);
+ 
+ #ifdef OMP_USM
+       /* (By construction) we're not allocating memory during device
+ 	 execution, so have nothing to clean up.  */
+ #endif
  #ifndef MEM_SHARED
        span.~span ();
  #endif
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ #define OMP_USM
+ #define MEM_SHARED
+ 
+ #include "target-std__unordered_map-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_map-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 38,44 ****
--- 38,46 ----
    init (keys, true);
    init (data, false);
  
+ #ifndef MEM_SHARED
    #pragma omp target enter data map (to: keys[ :N], data[ :N]) map (alloc: _map)
+ #endif
  
    #pragma omp target
      {
*************** int main (void)
*** 54,65 ****
--- 56,77 ----
      for (int i = 0; i < N; ++i)
        sum += (long long) keys[i] * _map[keys[i]];
  
+ #ifdef OMP_USM
+   #pragma omp target
+     /* Restore the object into pristine state.  In particular, deallocate
+        any memory allocated during device execution, which otherwise, back
+        on the host, we'd SIGSEGV on, when attempting to deallocate during
+        destruction of the object.  */
+     __typeof__ (_map){}.swap (_map);
+ #endif
  #ifndef MEM_SHARED
    #pragma omp target
      _map.~unordered_map ();
  #endif
  
+ #ifndef MEM_SHARED
    #pragma omp target exit data map (release: _map)
+ #endif
  
    bool ok = validate (sum, keys, data);
    return ok ? 0 : 1;
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ #define OMP_USM
+ #define MEM_SHARED
+ 
+ #include "target-std__unordered_multimap-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_multimap-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 32,38 ****
--- 32,40 ----
    init (keys, KEY_MAX);
    init (data, RAND_MAX);
  
+ #ifndef MEM_SHARED
    #pragma omp target enter data map (to: keys[ :N], data[ :N]) map (alloc: _map)
+ #endif
  
    #pragma omp target
      {
*************** int main (void)
*** 53,64 ****
--- 55,76 ----
  	}
        }
  
+ #ifdef OMP_USM
+   #pragma omp target
+     /* Restore the object into pristine state.  In particular, deallocate
+        any memory allocated during device execution, which otherwise, back
+        on the host, we'd SIGSEGV on, when attempting to deallocate during
+        destruction of the object.  */
+     __typeof__ (_map){}.swap (_map);
+ #endif
  #ifndef MEM_SHARED
    #pragma omp target
      _map.~unordered_multimap ();
  #endif
  
+ #ifndef MEM_SHARED
    #pragma omp target exit data map (release: _map)
+ #endif
  
    bool ok = validate (sum, keys, data);
    return ok ? 0 : 1;
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ #define OMP_USM
+ #define MEM_SHARED
+ 
+ #include "target-std__unordered_multiset-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_multiset-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 33,39 ****
--- 33,41 ----
    srand (time (NULL));
    init (data);
  
+ #ifndef MEM_SHARED
    #pragma omp target data map (to: data[ :N]) map (alloc: set)
+ #endif
      {
        #pragma omp target
  	{
*************** int main (void)
*** 48,53 ****
--- 50,63 ----
  	for (int i = 0; i < MAX; ++i)
  	  sum += i * set.count (i);
  
+ #ifdef OMP_USM
+       #pragma omp target
+ 	/* Restore the object into pristine state.  In particular, deallocate
+ 	   any memory allocated during device execution, which otherwise, back
+ 	   on the host, we'd SIGSEGV on, when attempting to deallocate during
+ 	   destruction of the object.  */
+ 	__typeof__ (set){}.swap (set);
+ #endif
  #ifndef MEM_SHARED
        #pragma omp target
  	set.~unordered_multiset ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent-usm.C	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ #define OMP_USM
+ #define MEM_SHARED
+ 
+ #include "target-std__unordered_set-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__unordered_set-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 39,45 ****
--- 39,47 ----
    srand (time (NULL));
    init (data);
  
+ #ifndef MEM_SHARED
    #pragma omp target data map (to: data[ :N]) map (alloc: _set)
+ #endif
      {
        #pragma omp target
  	{
*************** int main (void)
*** 55,60 ****
--- 57,70 ----
  	  if (_set.count (i) > 0)
  	    sum += i;
  
+ #ifdef OMP_USM
+       #pragma omp target
+ 	/* Restore the object into pristine state.  In particular, deallocate
+ 	   any memory allocated during device execution, which otherwise, back
+ 	   on the host, we'd SIGSEGV on, when attempting to deallocate during
+ 	   destruction of the object.  */
+ 	__typeof__ (_set){}.swap (_set);
+ #endif
  #ifndef MEM_SHARED
        #pragma omp target
  	_set.~unordered_set ();
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,7 ****
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__valarray-concurrent.C"
--- 1,7 ----
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__valarray-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__valarray-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 56,61 ****
--- 56,66 ----
        #pragma omp target map (from: ok)
  	{
  	  ok = validate (arr, data);
+ 
+ #ifdef OMP_USM
+ 	  /* (By construction) we're not allocating memory during device
+ 	     execution, so have nothing to clean up.  */
+ #endif
  #ifndef MEM_SHARED
  	  arr.~valarray ();
  #endif
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent-usm.C	Sun Jan 18 22:32:15 2026
***************
*** 1,7 ****
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! 
  #define MEM_SHARED
  
  #include "target-std__vector-concurrent.C"
--- 1,7 ----
  /* { dg-require-effective-target omp_usm } */
  // { dg-additional-options "-Wno-deprecated-openmp" }
  #pragma omp requires unified_shared_memory self_maps
! #define OMP_USM
  #define MEM_SHARED
  
  #include "target-std__vector-concurrent.C"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C
*** gcc-16-20260111/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.c++/target-std__vector-concurrent.C	Sun Jan 18 22:32:15 2026
*************** int main (void)
*** 53,58 ****
--- 53,63 ----
        #pragma omp target map (from: ok)
  	{
  	  ok = validate (vec, data);
+ 
+ #ifdef OMP_USM
+ 	  /* (By construction) we're not allocating memory during device
+ 	     execution, so have nothing to clean up.  */
+ #endif
  #ifndef MEM_SHARED
  	  vec.~vector ();
  #endif
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-2-usm.c gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-2-usm.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-2-usm.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-2-usm.c	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #include "map-arrayofstruct-2.c"
+ 
+ /* No 'dg-shouldfail'.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-3-usm.c gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-3-usm.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-3-usm.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/map-arrayofstruct-3-usm.c	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #include "map-arrayofstruct-3.c"
+ 
+ /* No 'dg-shouldfail'.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/struct-elem-5-usm.c gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/struct-elem-5-usm.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/struct-elem-5-usm.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/struct-elem-5-usm.c	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #include "struct-elem-5.c"
+ 
+ /* No 'dg-shouldfail'.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/target-present-1-usm.c gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/target-present-1-usm.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/target-present-1-usm.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/target-present-1-usm.c	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #include "target-present-1.c"
+ 
+ /* No 'dg-shouldfail'.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/target-present-2-usm.c gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/target-present-2-usm.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/target-present-2-usm.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/target-present-2-usm.c	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #include "target-present-2.c"
+ 
+ /* No 'dg-shouldfail'.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/target-present-3-usm.c gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/target-present-3-usm.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.c-c++-common/target-present-3-usm.c	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.c-c++-common/target-present-3-usm.c	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,6 ----
+ /* { dg-require-effective-target omp_usm } */
+ #pragma omp requires unified_shared_memory self_maps
+ 
+ #include "target-present-3.c"
+ 
+ /* No 'dg-shouldfail'.  */
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/alloc-managed-1.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/alloc-managed-1.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/alloc-managed-1.f90	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/alloc-managed-1.f90	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,6 ----
  ! { dg-do run }
  ! { dg-require-effective-target omp_managedmem }
+ ! { dg-additional-options -Wno-deprecated-openmp }
  ! { dg-additional-options -foffload-options=amdgcn-amdhsa=-mxnack=on { target offload_target_amdgcn_with_xnack } }
  
  ! Check that omp_alloc can allocate Managed Memory, and that host and target
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/map-alloc-comp-9-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/map-alloc-comp-9-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/map-alloc-comp-9-usm.f90	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/map-alloc-comp-9-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 1,3 ****
--- 1,4 ----
+ ! { dg-require-effective-target omp_usm }
  ! { dg-additional-options "-cpp -DUSE_USM_REQUIREMENT=1 -Wno-openmp" }
  !
  ! We silence the warning:
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/map-subarray-5-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/map-subarray-5-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/map-subarray-5-usm.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/map-subarray-5-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,8 ----
+ ! { dg-do run }
+ 
+ ! { dg-require-effective-target omp_usm }
+ !$omp requires unified_shared_memory self_maps
+ 
+ include 'map-subarray-5.f90'
+ 
+ ! No 'dg-shouldfail'.
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/map-subarray-6-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/map-subarray-6-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/map-subarray-6-usm.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/map-subarray-6-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,8 ----
+ ! { dg-do run }
+ 
+ ! { dg-require-effective-target omp_usm }
+ !$omp requires unified_shared_memory self_maps
+ 
+ include 'map-subarray-6.f90'
+ 
+ ! No 'dg-shouldfail'.
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/map-subarray-7-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/map-subarray-7-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/map-subarray-7-usm.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/map-subarray-7-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,6 ----
+ ! { dg-require-effective-target omp_usm }
+ !$omp requires unified_shared_memory self_maps
+ 
+ include 'map-subarray-7.f90'
+ 
+ ! No 'dg-shouldfail'.
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1-usm.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ ! { dg-do run }
+ ! { dg-additional-options "-cpp" }
+ ! { dg-require-effective-target omp_usm }
+ ! { dg-additional-options "-DOMP_USM" }
+ ! { dg-additional-options "-DMEM_SHARED" }
+ 
+ #include "target-allocatable-1-1.f90"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90	Sun Jan 18 22:32:16 2026
***************
*** 8,13 ****
--- 8,17 ----
  
  program main
    implicit none
+ #ifdef OMP_USM
+   !$omp requires unified_shared_memory self_maps
+ #endif
+ 
    integer, allocatable :: a, b, c, d, e
  
    allocate (a)
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2-usm.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ ! { dg-do run }
+ ! { dg-additional-options "-cpp" }
+ ! { dg-require-effective-target omp_usm }
+ ! { dg-additional-options "-DOMP_USM" }
+ ! { dg-additional-options "-DMEM_SHARED" }
+ 
+ #include "target-allocatable-1-2.f90"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90	Sun Jan 18 22:32:16 2026
***************
*** 8,13 ****
--- 8,17 ----
  ! { dg-additional-options "-DMEM_SHARED" { target offload_device_shared_as } }
  
  module m
+ #ifdef OMP_USM
+   !$omp requires unified_shared_memory self_maps
+ #endif
+ 
  contains
    subroutine r (a, b, c, d, e)
      implicit none
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-enter-data-2-usm.F90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-enter-data-2-usm.F90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-enter-data-2-usm.F90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-enter-data-2-usm.F90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ ! { dg-additional-options "-DMEM_SHARED" }
+ ! { dg-do run }
+ 
+ ! { dg-require-effective-target omp_usm }
+ !$omp requires unified_shared_memory self_maps
+ 
+ #include "target-enter-data-2.F90"
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-1-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-1-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-1-usm.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-1-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ ! { dg-additional-options -cpp }
+ ! { dg-require-effective-target omp_usm }
+ ! { dg-additional-options -DOMP_USM }
+ 
+ #include "target-present-1.f90"
+ 
+ ! No 'dg-shouldfail'.
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-1.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-1.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-1.f90	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-1.f90	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,11 ----
+ ! { dg-additional-options -cpp }
+ 
  program main
    implicit none
+ #ifdef OMP_USM
+   !$omp requires unified_shared_memory self_maps
+ #endif
+ 
    integer, parameter :: N = 100
    integer :: a(N), b(N), c(N), i
  
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-2-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-2-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-2-usm.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-2-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ ! { dg-additional-options -cpp }
+ ! { dg-require-effective-target omp_usm }
+ ! { dg-additional-options -DOMP_USM }
+ 
+ #include "target-present-2.f90"
+ 
+ ! No 'dg-shouldfail'.
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-2.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-2.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-2.f90	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-2.f90	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,11 ----
+ ! { dg-additional-options -cpp }
+ 
  program main
    implicit none
+ #ifdef OMP_USM
+   !$omp requires unified_shared_memory self_maps
+ #endif
+ 
    integer, parameter :: N = 100
    integer :: a(N), b(N), c(N), i
  
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-3-usm.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-3-usm.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-3-usm.f90	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-3-usm.f90	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,7 ----
+ ! { dg-additional-options -cpp }
+ ! { dg-require-effective-target omp_usm }
+ ! { dg-additional-options -DOMP_USM }
+ 
+ #include "target-present-3.f90"
+ 
+ ! No 'dg-shouldfail'.
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-3.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-3.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target-present-3.f90	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target-present-3.f90	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,11 ----
+ ! { dg-additional-options -cpp }
+ 
  program main
    implicit none
+ #ifdef OMP_USM
+   !$omp requires unified_shared_memory self_maps
+ #endif
+ 
    integer, parameter :: N = 100
    integer :: a(N), b(N), c(N), i
  
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target9.f90 gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target9.f90
*** gcc-16-20260111/libgomp/testsuite/libgomp.fortran/target9.f90	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.fortran/target9.f90	Sun Jan 18 22:32:16 2026
***************
*** 1,5 ****
--- 1,6 ----
  ! { dg-do run }
  ! { dg-require-effective-target offload_device_nonshared_as } */
+ ! { dg-additional-options -Wno-deprecated-openmp }
  
  module target_test
    implicit none (type, external)
diff -Nrcpad gcc-16-20260111/libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c gcc-16-20260118/libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c
*** gcc-16-20260111/libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c	Sun Jan 18 22:32:16 2026
***************
*** 3,9 ****
  /* { dg-additional-options "-DEXPENSIVE" { target run_expensive_tests } } */
  
  /* { dg-additional-options -Wuninitialized } */
- // { dg-additional-options "-Wno-deprecated-openmp" }
  
  #include <assert.h>
  
--- 3,8 ----
diff -Nrcpad gcc-16-20260111/libiberty/ChangeLog gcc-16-20260118/libiberty/ChangeLog
*** gcc-16-20260111/libiberty/ChangeLog	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libiberty/ChangeLog	Sun Jan 18 22:32:16 2026
***************
*** 1,3 ****
--- 1,8 ----
+ 2026-01-12  Maciej W. Rozycki  <macro@redhat.com>
+ 
+ 	* objalloc.c (objalloc_free): Don't use the pointer passed if
+ 	null.
+ 
  2026-01-09  Jan Beulich  <jbeulich@suse.com>
  
  	* testsuite/test-pexecute.c (main): Adjust a tracing fprintf().
diff -Nrcpad gcc-16-20260111/libiberty/objalloc.c gcc-16-20260118/libiberty/objalloc.c
*** gcc-16-20260111/libiberty/objalloc.c	Sun Jan 11 22:32:16 2026
--- gcc-16-20260118/libiberty/objalloc.c	Sun Jan 18 22:32:16 2026
*************** objalloc_free (struct objalloc *o)
*** 178,183 ****
--- 178,187 ----
  {
    struct objalloc_chunk *l;
  
+   /* Handle a nullptr as being a no-op. */
+   if (o == NULL)
+     return;
+ 
    l = (struct objalloc_chunk *) o->chunks;
    while (l != NULL)
      {
diff -Nrcpad gcc-16-20260111/libstdc++-v3/ChangeLog gcc-16-20260118/libstdc++-v3/ChangeLog
*** gcc-16-20260111/libstdc++-v3/ChangeLog	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/ChangeLog	Sun Jan 18 22:32:16 2026
***************
*** 1,3 ****
--- 1,76 ----
+ 2026-01-15  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* include/std/type_traits (std::is_reflection, std::is_fundamental,
+ 	std::is_reflection_v, std::is_consteval_only): Compare
+ 	__cpp_impl_reflection >= 202506L instead of 202500L.
+ 	* testsuite/20_util/variable_templates_for_traits.cc: Likewise.
+ 
+ 2026-01-15  Marek Polacek  <polacek@redhat.com>
+ 	    Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	PR c++/120775
+ 	PR c++/123081
+ 	PR c++/122634
+ 	* include/Makefile.am (std_headers): Add ${std_srcdir}/meta.
+ 	* include/Makefile.in: Regenerate.
+ 	* include/bits/iterator_concepts.h (std::ranges::__access::__begin): Add
+ 	constexpr.
+ 	* include/bits/version.def (reflection): New.
+ 	* include/bits/version.h: Regenerate.
+ 	* include/precompiled/stdc++.h: Include <meta> for C++26.
+ 	* include/std/meta: New file.
+ 	* include/std/type_traits (std::is_reflection): New trait.
+ 	(std::is_fundamental): Include is_reflection for C++26 -freflection.
+ 	(std::is_reflection_v): New variable template.
+ 	(std::is_consteval_only): New trait.
+ 	(std::is_consteval_only_v): New variable template.
+ 	* src/c++23/std.cc.in: Add <meta> exports.
+ 	* testsuite/20_util/variable_templates_for_traits.cc: Add -freflection as
+ 	dg-additional-options for C++26.  Add std::is_reflection_v test in that case.
+ 	* testsuite/20_util/is_consteval_only/requirements/explicit_instantiation.cc: New test.
+ 	* testsuite/20_util/is_consteval_only/requirements/typedefs.cc: New test.
+ 	* testsuite/20_util/is_consteval_only/value.cc: New test.
+ 	* testsuite/20_util/is_reflection/requirements/explicit_instantiation.cc: New test.
+ 	* testsuite/20_util/is_reflection/requirements/typedefs.cc: New test.
+ 	* testsuite/20_util/is_reflection/value.cc: New test.
+ 
+ 2026-01-14  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* testsuite/util/testsuite_iterators.h: Modify comment.
+ 
+ 2026-01-13  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* include/bits/stl_heap.h (std::__is_heap_until, std::__push_heap)
+ 	(std::__adjust_heap): Replace subscript with dereference of
+ 	advanced iterator.
+ 	* testsuite/util/testsuite_iterators.h (__gnu_test::subscript_proxy)
+ 	(__gnu_test::proxy_random_access_iterator_wrapper): Define.
+ 	* testsuite/25_algorithms/sort_heap/check_proxy_brackets.cc: New test.
+ 
+ 2026-01-12  Jakub Jelinek  <jakub@redhat.com>
+ 
+ 	* config/abi/pre/gnu.ver (CXXABI_1.3.14): Don't export _ZTI*DF16_ on
+ 	s390x.
+ 	(CXXABI_1.3.17): Export _ZTI*DF16_ on s390x.
+ 	* config/abi/post/s390x-linux-gnu/baseline_symbols.txt: Remove
+ 	_ZTI{,P,K}DF16_.
+ 
+ 2026-01-12  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* src/c++20/atomic.cc (__detail::__spin_impl): Do not use
+ 	reserved names for variables.
+ 
+ 2026-01-12  Jonathan Wakely  <jwakely@redhat.com>
+ 
+ 	* include/bits/atomic_wait.h (__wait_args): Improve comments.
+ 	* src/c++20/atomic.cc (__wait_args::_M_setup_proxy_wait):
+ 	Improve comment.
+ 
+ 2026-01-12  Tomasz Kamiński  <tkaminsk@redhat.com>
+ 
+ 	* testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon.cc:
+ 	Updated test.
+ 
  2026-01-10  Stefan Schulze Frielinghaus  <stefansf@gcc.gnu.org>
  
  	* config/abi/post/s390x-linux-gnu/baseline_symbols.txt: Add
diff -Nrcpad gcc-16-20260111/libstdc++-v3/config/abi/post/s390x-linux-gnu/baseline_symbols.txt gcc-16-20260118/libstdc++-v3/config/abi/post/s390x-linux-gnu/baseline_symbols.txt
*** gcc-16-20260111/libstdc++-v3/config/abi/post/s390x-linux-gnu/baseline_symbols.txt	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/config/abi/post/s390x-linux-gnu/baseline_symbols.txt	Sun Jan 18 22:32:16 2026
*************** OBJECT:15:_ZTSSt8messagesIwE@@GLIBCXX_3.
*** 4951,4957 ****
  OBJECT:15:_ZTSSt8numpunctIcE@@GLIBCXX_3.4
  OBJECT:15:_ZTSSt8numpunctIwE@@GLIBCXX_3.4
  OBJECT:16:_ZTIDF128_@@CXXABI_1.3.14
- OBJECT:16:_ZTIDF16_@@CXXABI_1.3.14
  OBJECT:16:_ZTIDF32_@@CXXABI_1.3.14
  OBJECT:16:_ZTIDF32x@@CXXABI_1.3.14
  OBJECT:16:_ZTIDF64_@@CXXABI_1.3.14
--- 4951,4956 ----
*************** OBJECT:30:_ZTSSt7codecvtIDsDu11__mbstate
*** 5616,5622 ****
  OBJECT:32:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
  OBJECT:32:_ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
  OBJECT:32:_ZTIPDF128_@@CXXABI_1.3.14
- OBJECT:32:_ZTIPDF16_@@CXXABI_1.3.14
  OBJECT:32:_ZTIPDF32_@@CXXABI_1.3.14
  OBJECT:32:_ZTIPDF32x@@CXXABI_1.3.14
  OBJECT:32:_ZTIPDF64_@@CXXABI_1.3.14
--- 5615,5620 ----
*************** OBJECT:32:_ZTIPDn@@CXXABI_1.3.5
*** 5629,5635 ****
  OBJECT:32:_ZTIPDs@@CXXABI_1.3.3
  OBJECT:32:_ZTIPDu@@CXXABI_1.3.12
  OBJECT:32:_ZTIPKDF128_@@CXXABI_1.3.14
- OBJECT:32:_ZTIPKDF16_@@CXXABI_1.3.14
  OBJECT:32:_ZTIPKDF32_@@CXXABI_1.3.14
  OBJECT:32:_ZTIPKDF32x@@CXXABI_1.3.14
  OBJECT:32:_ZTIPKDF64_@@CXXABI_1.3.14
--- 5627,5632 ----
diff -Nrcpad gcc-16-20260111/libstdc++-v3/config/abi/pre/gnu.ver gcc-16-20260118/libstdc++-v3/config/abi/pre/gnu.ver
*** gcc-16-20260111/libstdc++-v3/config/abi/pre/gnu.ver	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/config/abi/pre/gnu.ver	Sun Jan 18 22:32:16 2026
*************** CXXABI_1.3.14 {
*** 2899,2907 ****
--- 2899,2914 ----
  
      # typeinfo for _Float{16,32,64,128,32x,64x,128x} and
      # __bf16/bfloat16_t
+ #ifndef __s390x__
      _ZTIDF[0-9]*[_x];
      _ZTIPDF[0-9]*[_x];
      _ZTIPKDF[0-9]*[_x];
+ #else
+     # No _Float16 on s390x in GCC 13.
+     _ZTIDF[0-9]*[0-57-9][_x];
+     _ZTIPDF[0-9]*[0-57-9][_x];
+     _ZTIPKDF[0-9]*[0-57-9][_x];
+ #endif
  #ifndef __riscv
      _ZTIDF16b;
      _ZTIPDF16b;
*************** CXXABI_1.3.16 {
*** 2933,2938 ****
--- 2940,2952 ----
  CXXABI_1.3.17 {
      # std::exception_ptr::_M_exception_ptr_cast
      _ZNKSt15__exception_ptr13exception_ptr21_M_exception_ptr_castERKSt9type_info;
+ 
+ #ifdef __s390x__
+     _ZTIDF16_;
+     _ZTIPDF16_;
+     _ZTIPKDF16_;
+ #endif
+ 
  #ifdef __riscv
  } CXXABI_1.3.16;
  #else
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/Makefile.am gcc-16-20260118/libstdc++-v3/include/Makefile.am
*** gcc-16-20260111/libstdc++-v3/include/Makefile.am	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/Makefile.am	Sun Jan 18 22:32:16 2026
*************** std_headers = \
*** 89,94 ****
--- 89,95 ----
  	${std_srcdir}/locale \
  	${std_srcdir}/map \
  	${std_srcdir}/memory_resource \
+ 	${std_srcdir}/meta \
  	${std_srcdir}/mutex \
  	${std_srcdir}/ostream \
  	${std_srcdir}/print \
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/Makefile.in gcc-16-20260118/libstdc++-v3/include/Makefile.in
*** gcc-16-20260111/libstdc++-v3/include/Makefile.in	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/Makefile.in	Sun Jan 18 22:32:16 2026
*************** std_freestanding = \
*** 448,453 ****
--- 448,454 ----
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/locale \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/map \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/memory_resource \
+ @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/meta \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/mutex \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/ostream \
  @GLIBCXX_HOSTED_TRUE@	${std_srcdir}/print \
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/bits/atomic_wait.h gcc-16-20260118/libstdc++-v3/include/bits/atomic_wait.h
*** gcc-16-20260111/libstdc++-v3/include/bits/atomic_wait.h	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/bits/atomic_wait.h	Sun Jan 18 22:32:16 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 162,170 ****
      struct __wait_args_base
      {
        __wait_flags _M_flags;
!       int _M_order = __ATOMIC_ACQUIRE;
!       __wait_value_type _M_old = 0;
!       void* _M_wait_state = nullptr;
        const void* _M_obj = nullptr;  // The address of the object to wait on.
        unsigned char _M_obj_size = 0; // The size of that object.
  
--- 162,170 ----
      struct __wait_args_base
      {
        __wait_flags _M_flags;
!       int _M_order = __ATOMIC_ACQUIRE; // Memory order for loads from _M_obj.
!       __wait_value_type _M_old = 0;  // Previous value of *_M_obj.
!       void* _M_wait_state = nullptr; // For proxy wait and tracking contention.
        const void* _M_obj = nullptr;  // The address of the object to wait on.
        unsigned char _M_obj_size = 0; // The size of that object.
  
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 286,294 ****
  	  return __val;
  	}
  
!       // Returns true if a proxy wait will be used for __addr, false otherwise.
!       // If true, _M_wait_state, _M_obj, _M_obj_size, and _M_old are set.
!       // If false, data members are unchanged.
        bool
        _M_setup_proxy_wait(const void* __addr);
  
--- 286,293 ----
  	  return __val;
  	}
  
!       // Prepare `*this` for a call to `__wait_impl` or `__wait_until_impl`.
!       // See comments in src/c++20/atomic.cc for more details.
        bool
        _M_setup_proxy_wait(const void* __addr);
  
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/bits/iterator_concepts.h gcc-16-20260118/libstdc++-v3/include/bits/iterator_concepts.h
*** gcc-16-20260111/libstdc++-v3/include/bits/iterator_concepts.h	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/bits/iterator_concepts.h	Sun Jan 18 22:32:16 2026
*************** namespace ranges
*** 1005,1011 ****
      // for use by __range_iter_t below.
      template<typename _Tp>
        requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
!       auto
        __begin(_Tp& __t)
        {
  	if constexpr (is_array_v<_Tp>)
--- 1005,1011 ----
      // for use by __range_iter_t below.
      template<typename _Tp>
        requires is_array_v<_Tp> || __member_begin<_Tp&> || __adl_begin<_Tp&>
!       constexpr auto
        __begin(_Tp& __t)
        {
  	if constexpr (is_array_v<_Tp>)
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/bits/stl_heap.h gcc-16-20260118/libstdc++-v3/include/bits/stl_heap.h
*** gcc-16-20260111/libstdc++-v3/include/bits/stl_heap.h	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/bits/stl_heap.h	Sun Jan 18 22:32:16 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 85,91 ****
        _Distance __parent = 0;
        for (_Distance __child = 1; __child < __n; ++__child)
  	{
! 	  if (__comp(__first[__parent], __first[__child]))
  	    return __child;
  	  if ((__child & 1) == 0)
  	    ++__parent;
--- 85,91 ----
        _Distance __parent = 0;
        for (_Distance __child = 1; __child < __n; ++__child)
  	{
! 	  if (__comp(*(__first + __parent), *(__first + __child)))
  	    return __child;
  	  if ((__child & 1) == 0)
  	    ++__parent;
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 143,149 ****
  		_Compare& __comp)
      {
        _Distance __parent = (__holeIndex - 1) / 2;
!       while (__holeIndex > __topIndex && __comp(__first[__parent], __value))
  	{
  	  *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __parent));
  	  __holeIndex = __parent;
--- 143,149 ----
  		_Compare& __comp)
      {
        _Distance __parent = (__holeIndex - 1) / 2;
!       while (__holeIndex > __topIndex && __comp(*(__first + __parent), __value))
  	{
  	  *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __parent));
  	  __holeIndex = __parent;
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 233,240 ****
        while (__secondChild < (__len - 1) / 2)
  	{
  	  __secondChild = 2 * (__secondChild + 1);
! 	  if (__comp(__first[__secondChild],
! 		     __first[__secondChild - 1]))
  	    __secondChild--;
  	  *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild));
  	  __holeIndex = __secondChild;
--- 233,240 ----
        while (__secondChild < (__len - 1) / 2)
  	{
  	  __secondChild = 2 * (__secondChild + 1);
! 	  if (__comp(*(__first + __secondChild),
! 		     *(__first + _Distance(__secondChild - 1))))
  	    __secondChild--;
  	  *(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild));
  	  __holeIndex = __secondChild;
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/bits/version.def gcc-16-20260118/libstdc++-v3/include/bits/version.def
*** gcc-16-20260111/libstdc++-v3/include/bits/version.def	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/bits/version.def	Sun Jan 18 22:32:16 2026
*************** ftms = {
*** 2254,2259 ****
--- 2254,2268 ----
  };
  
  ftms = {
+   name = reflection;
+   values = {
+     v = 202506;
+     cxxmin = 26;
+     extra_cond = "__cpp_impl_reflection >= 202506L";
+   };
+ };
+ 
+ ftms = {
    name = is_implicit_lifetime;
    values = {
      v =  202302;
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/bits/version.h gcc-16-20260118/libstdc++-v3/include/bits/version.h
*** gcc-16-20260111/libstdc++-v3/include/bits/version.h	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/bits/version.h	Sun Jan 18 22:32:16 2026
***************
*** 2536,2539 ****
--- 2536,2549 ----
  #endif /* !defined(__cpp_lib_is_implicit_lifetime) */
  #undef __glibcxx_want_is_implicit_lifetime
  
+ #if !defined(__cpp_lib_reflection)
+ # if (__cplusplus >  202302L) && (__cpp_impl_reflection >= 202506L)
+ #  define __glibcxx_reflection 202506L
+ #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_reflection)
+ #   define __cpp_lib_reflection 202506L
+ #  endif
+ # endif
+ #endif /* !defined(__cpp_lib_reflection) */
+ #undef __glibcxx_want_reflection
+ 
  #undef __glibcxx_want_all
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/precompiled/stdc++.h gcc-16-20260118/libstdc++-v3/include/precompiled/stdc++.h
*** gcc-16-20260111/libstdc++-v3/include/precompiled/stdc++.h	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/precompiled/stdc++.h	Sun Jan 18 22:32:16 2026
***************
*** 234,239 ****
--- 234,240 ----
  #if __cplusplus > 202302L
  #include <debugging>
  #include <inplace_vector>
+ #include <meta>
  #include <text_encoding>
  #include <stdbit.h>
  #include <stdckdint.h>
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/std/meta gcc-16-20260118/libstdc++-v3/include/std/meta
*** gcc-16-20260111/libstdc++-v3/include/std/meta	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libstdc++-v3/include/std/meta	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,653 ----
+ // <meta> -*- C++ -*-
+ 
+ // Copyright (C) 2025-2026 Free Software Foundation, Inc.
+ //
+ // This file is part of the GNU ISO C++ Library.  This library 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.
+ 
+ // This library 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 include/meta
+  *  This is a Standard C++ Library header.
+  */
+ 
+ #ifndef _GLIBCXX_META
+ #define _GLIBCXX_META 1
+ 
+ #ifdef _GLIBCXX_SYSHDR
+ #pragma GCC system_header
+ #endif
+ 
+ #define __glibcxx_want_reflection
+ #include <bits/version.h>
+ 
+ #if __glibcxx_reflection >= 202506L // C++ >= 26 && __cpp_impl_reflection
+ 
+ #include <array>
+ #include <initializer_list>
+ #include <optional>
+ #include <source_location>
+ #include <span>
+ #include <string>
+ #include <string_view>
+ #include <vector>
+ 
+ namespace std _GLIBCXX_VISIBILITY(default)
+ {
+ _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ 
+ #if __has_builtin(__builtin_is_string_literal)
+   // [meta.string.literal], checking string literals
+   consteval bool is_string_literal(const char* __p)
+   {
+     return __builtin_is_string_literal(__p);
+   }
+ 
+   consteval bool is_string_literal(const wchar_t* __p)
+   {
+     return __builtin_is_string_literal(__p);
+   }
+ 
+ #ifdef _GLIBCXX_USE_CHAR8_T
+   consteval bool is_string_literal(const char8_t* __p)
+   {
+     return __builtin_is_string_literal(__p);
+   }
+ #endif
+ 
+   consteval bool is_string_literal(const char16_t* __p)
+   {
+     return __builtin_is_string_literal(__p);
+   }
+ 
+   consteval bool is_string_literal(const char32_t* __p)
+   {
+     return __builtin_is_string_literal(__p);
+   }
+ #endif
+ 
+   namespace meta
+   {
+     using info = decltype(^^int);
+ 
+     // [meta.reflection.exception], class exception
+     class exception : public std::exception {
+     private:
+       string _M_what;
+       u8string _M_u8what;
+       info _M_from;
+       source_location _M_where;
+ 
+     public:
+       consteval
+       exception(u8string_view __what, info __from,
+ 		source_location __where = source_location::current()) noexcept
+ 	: _M_what{_S_exception_cvt_from_utf8(__what)}, _M_u8what{__what},
+ 	  _M_from{__from}, _M_where{__where} {}
+ 
+       consteval
+       exception(string_view __what, info __from,
+ 		source_location __where = source_location::current()) noexcept
+ 	: _M_what{__what}, _M_u8what{_S_exception_cvt_to_utf8(__what)},
+ 	  _M_from{__from}, _M_where{__where} {}
+ 
+       consteval exception(const exception&) = default;
+       consteval exception(exception&&) = default;
+ 
+       consteval exception& operator=(const exception&) = default;
+       consteval exception& operator=(exception&&) = default;
+ 
+       consteval const char*
+       what() const noexcept override
+       {
+ 	// If u8string is not empty and string is empty, conversion
+ 	// from UTF-8 to ordinary literal encoding failed.
+ 	// In that case what() should be non-constant.
+ 	if (_M_what.size() == 0 && _M_u8what.size() != 0)
+ 	  asm("");
+ 	return _M_what.c_str();
+       }
+       consteval u8string_view u8what() const noexcept { return _M_u8what; }
+       consteval info from() const noexcept { return _M_from; }
+       consteval source_location where() const noexcept { return _M_where; }
+     private:
+       // Helper special template metafunctions to convert from UTF-8 to
+       // ordinary literal encoding and vice versa.  On conversion failure
+       // they just return an empty {,u8}string_view.
+       template<ranges::input_range _Rg>
+ 	static consteval u8string_view _S_exception_cvt_to_utf8(_Rg&&);
+       template<ranges::input_range _Rg>
+ 	static consteval string_view _S_exception_cvt_from_utf8(_Rg&&);
+     };
+ 
+     // [meta.reflection.operators], operator representations
+     enum class operators {
+       op_new = 1,
+       op_delete,
+       op_array_new,
+       op_array_delete,
+       op_co_await,
+       op_parentheses,
+       op_square_brackets,
+       op_arrow,
+       op_arrow_star,
+       op_tilde,
+       op_exclamation,
+       op_plus,
+       op_minus,
+       op_star,
+       op_slash,
+       op_percent,
+       op_caret,
+       op_ampersand,
+       op_equals,
+       op_pipe,
+       op_plus_equals,
+       op_minus_equals,
+       op_star_equals,
+       op_slash_equals,
+       op_percent_equals,
+       op_caret_equals,
+       op_ampersand_equals,
+       op_pipe_equals,
+       op_equals_equals,
+       op_exclamation_equals,
+       op_less,
+       op_greater,
+       op_less_equals,
+       op_greater_equals,
+       op_spaceship,
+       op_ampersand_ampersand,
+       op_pipe_pipe,
+       op_less_less,
+       op_greater_greater,
+       op_less_less_equals,
+       op_greater_greater_equals,
+       op_plus_plus,
+       op_minus_minus,
+       op_comma
+     };
+     using enum operators;
+     consteval operators operator_of(info);
+     consteval string_view symbol_of(operators);
+     consteval u8string_view u8symbol_of(operators);
+ 
+     // [meta.reflection.names], reflection names and locations
+     consteval bool has_identifier(info);
+ 
+     consteval string_view identifier_of(info);
+     consteval u8string_view u8identifier_of(info);
+ 
+     consteval string_view display_string_of(info);
+     consteval u8string_view u8display_string_of(info);
+ 
+     consteval source_location source_location_of(info);
+ 
+     // [meta.reflection.queries], reflection queries
+     consteval info type_of(info);
+     consteval info object_of(info);
+     consteval info constant_of(info);
+ 
+     consteval bool is_public(info);
+     consteval bool is_protected(info);
+     consteval bool is_private(info);
+ 
+     consteval bool is_virtual(info);
+     consteval bool is_pure_virtual(info);
+     consteval bool is_override(info);
+     consteval bool is_final(info);
+ 
+     consteval bool is_deleted(info);
+     consteval bool is_defaulted(info);
+     consteval bool is_user_provided(info);
+     consteval bool is_user_declared(info);
+     consteval bool is_explicit(info);
+     consteval bool is_noexcept(info);
+ 
+     consteval bool is_bit_field(info);
+     consteval bool is_enumerator(info);
+     consteval bool is_annotation(info);
+ 
+     consteval bool is_const(info);
+     consteval bool is_volatile(info);
+     consteval bool is_mutable_member(info);
+     consteval bool is_lvalue_reference_qualified(info);
+     consteval bool is_rvalue_reference_qualified(info);
+ 
+     consteval bool has_static_storage_duration(info);
+     consteval bool has_thread_storage_duration(info);
+     consteval bool has_automatic_storage_duration(info);
+ 
+     consteval bool has_internal_linkage(info);
+     consteval bool has_module_linkage(info);
+     consteval bool has_external_linkage(info);
+     consteval bool has_c_language_linkage(info);
+     consteval bool has_linkage(info);
+ 
+     consteval bool is_complete_type(info);
+     consteval bool is_enumerable_type(info);
+ 
+     consteval bool is_variable(info);
+     consteval bool is_type(info);
+     consteval bool is_namespace(info);
+     consteval bool is_type_alias(info);
+     consteval bool is_namespace_alias(info);
+ 
+     consteval bool is_function(info);
+     consteval bool is_conversion_function(info);
+     consteval bool is_operator_function(info);
+     consteval bool is_literal_operator(info);
+     consteval bool is_special_member_function(info);
+     consteval bool is_constructor(info);
+     consteval bool is_default_constructor(info);
+     consteval bool is_copy_constructor(info);
+     consteval bool is_move_constructor(info);
+     consteval bool is_assignment(info);
+     consteval bool is_copy_assignment(info);
+     consteval bool is_move_assignment(info);
+     consteval bool is_destructor(info);
+ 
+     consteval bool is_function_parameter(info);
+     consteval bool is_explicit_object_parameter(info);
+     consteval bool has_default_argument(info);
+     consteval bool has_ellipsis_parameter(info);
+ 
+     consteval bool is_template(info);
+     consteval bool is_function_template(info);
+     consteval bool is_variable_template(info);
+     consteval bool is_class_template(info);
+     consteval bool is_alias_template(info);
+     consteval bool is_conversion_function_template(info);
+     consteval bool is_operator_function_template(info);
+     consteval bool is_literal_operator_template(info);
+     consteval bool is_constructor_template(info);
+     consteval bool is_concept(info);
+ 
+     consteval bool is_value(info);
+     consteval bool is_object(info);
+ 
+     consteval bool is_structured_binding(info);
+ 
+     consteval bool is_class_member(info);
+     consteval bool is_namespace_member(info);
+     consteval bool is_nonstatic_data_member(info);
+     consteval bool is_static_member(info);
+     consteval bool is_base(info);
+ 
+     consteval bool has_default_member_initializer(info);
+ 
+     consteval bool has_parent(info);
+     consteval info parent_of(info);
+ 
+     consteval info dealias(info);
+ 
+     consteval bool has_template_arguments(info);
+     consteval info template_of(info);
+     consteval vector<info> template_arguments_of(info);
+     consteval vector<info> parameters_of(info);
+     consteval info variable_of(info);
+     consteval info return_type_of(info);
+ 
+     // [meta.reflection.access.context], access control context
+     struct access_context {
+     private:
+       consteval access_context(info __scope, info __designating_class) noexcept
+ 	: _M_scope{__scope}, _M_designating_class{__designating_class} { }
+     public:
+       access_context() = delete;
+       consteval access_context(const access_context &) = default;
+       consteval access_context(access_context &&) = default;
+ 
+       consteval info scope() const { return _M_scope; }
+       consteval info designating_class() const { return _M_designating_class; }
+ 
+       static consteval access_context current() noexcept;
+       static consteval access_context unprivileged() noexcept
+       { return access_context { ^^::, info {} }; }
+       static consteval access_context unchecked() noexcept
+       { return access_context { info {}, info {} }; }
+       consteval access_context via(info) const;
+ 
+       info _M_scope;
+       info _M_designating_class;
+     };
+ 
+     // [meta.reflection.access.queries], member accessibility queries
+     consteval bool is_accessible(info, access_context);
+     consteval bool has_inaccessible_nonstatic_data_members(info,
+ 							   access_context);
+     consteval bool has_inaccessible_bases(info, access_context);
+     consteval bool has_inaccessible_subobjects(info, access_context);
+ 
+     // [meta.reflection.member.queries], reflection member queries
+     consteval vector<info> members_of(info, access_context);
+     consteval vector<info> bases_of(info, access_context);
+     consteval vector<info> static_data_members_of(info, access_context);
+     consteval vector<info> nonstatic_data_members_of(info, access_context);
+     consteval vector<info> subobjects_of(info, access_context);
+     consteval vector<info> enumerators_of(info);
+ 
+     // [meta.reflection.layout], reflection layout queries
+     struct member_offset {
+       ptrdiff_t bytes;
+       ptrdiff_t bits;
+ 
+       constexpr ptrdiff_t
+       total_bits() const
+       { return bytes * __CHAR_BIT__ + bits; }
+ 
+       auto operator<=>(const member_offset&) const = default;
+     };
+ 
+     consteval member_offset offset_of(info);
+     consteval size_t size_of(info);
+     consteval size_t alignment_of(info);
+     consteval size_t bit_size_of(info);
+ 
+     // [meta.reflection.extract], value extraction
+     template<class _Tp>
+       consteval _Tp extract(info);
+ 
+     // [meta.reflection.substitute], reflection substitution
+     template<class _Rg>
+       concept reflection_range = ranges::input_range<_Rg>
+ 	&& same_as<ranges::range_value_t<_Rg>, info>
+ 	&& same_as<remove_cvref_t<ranges::range_reference_t<_Rg>>, info>;
+ 
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval bool can_substitute(info, _Rg&&);
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval info substitute(info, _Rg&&);
+ 
+     // [meta.reflection.result], expression result reflection
+     template<typename _Tp>
+       requires (is_copy_constructible_v<_Tp>)
+       consteval info reflect_constant(_Tp);
+     template<typename _Tp>
+       requires (!is_function_v<remove_reference_t<_Tp>>)
+       consteval info reflect_object(_Tp&);
+     template<typename _Tp>
+       requires (is_function_v<remove_reference_t<_Tp>>)
+       consteval info reflect_function(_Tp&);
+ 
+     // [meta.reflection.array], promoting to static storage arrays
+     template<ranges::input_range _Rg>
+       consteval info reflect_constant_string(_Rg&&);
+ 
+     template<ranges::input_range _Rg>
+       consteval info reflect_constant_array(_Rg&&);
+ 
+     // [meta.reflection.define.aggregate], class definition generation
+     struct data_member_options {
+       struct _Name {
+ 	template<class _Tp>
+ 	  requires constructible_from<u8string, _Tp>
+ 	  consteval _Name(_Tp&& __n) : _M_is_u8(true), _M_u8s((_Tp&&) __n) {}
+ 
+ 	template<class _Tp>
+ 	  requires constructible_from<string, _Tp>
+ 	  consteval _Name(_Tp&& __n) : _M_is_u8(false), _M_s((_Tp&&) __n) {}
+ 
+       private:
+ 	bool _M_is_u8;
+ 	u8string _M_u8s;
+ 	string _M_s;
+ 	info _M_unused = {};
+       };
+ 
+       optional<_Name> name;
+       optional<int> alignment;
+       optional<int> bit_width;
+       bool no_unique_address = false;
+     };
+     consteval info data_member_spec(info, data_member_options);
+     consteval bool is_data_member_spec(info);
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval info define_aggregate(info, _Rg&&);
+ 
+     // associated with [meta.unary.cat], primary type categories
+     consteval bool is_void_type(info);
+     consteval bool is_null_pointer_type(info);
+     consteval bool is_integral_type(info);
+     consteval bool is_floating_point_type(info);
+     consteval bool is_array_type(info);
+     consteval bool is_pointer_type(info);
+     consteval bool is_lvalue_reference_type(info);
+     consteval bool is_rvalue_reference_type(info);
+     consteval bool is_member_object_pointer_type(info);
+     consteval bool is_member_function_pointer_type(info);
+     consteval bool is_enum_type(info);
+     consteval bool is_union_type(info);
+     consteval bool is_class_type(info);
+     consteval bool is_function_type(info);
+     consteval bool is_reflection_type(info);
+ 
+     // associated with [meta.unary.comp], composite type categories
+     consteval bool is_reference_type(info);
+     consteval bool is_arithmetic_type(info);
+     consteval bool is_fundamental_type(info);
+     consteval bool is_object_type(info);
+     consteval bool is_scalar_type(info);
+     consteval bool is_compound_type(info);
+     consteval bool is_member_pointer_type(info);
+ 
+     // associated with [meta.unary.prop], type properties
+     consteval bool is_const_type(info);
+     consteval bool is_volatile_type(info);
+     consteval bool is_trivially_copyable_type(info);
+     consteval bool is_standard_layout_type(info);
+     consteval bool is_empty_type(info);
+     consteval bool is_polymorphic_type(info);
+     consteval bool is_abstract_type(info);
+     consteval bool is_final_type(info);
+     consteval bool is_aggregate_type(info);
+     consteval bool is_consteval_only_type(info);
+     consteval bool is_signed_type(info);
+     consteval bool is_unsigned_type(info);
+     consteval bool is_bounded_array_type(info);
+     consteval bool is_unbounded_array_type(info);
+     consteval bool is_scoped_enum_type(info);
+ 
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval bool is_constructible_type(info, _Rg&&);
+     consteval bool is_default_constructible_type(info);
+     consteval bool is_copy_constructible_type(info);
+     consteval bool is_move_constructible_type(info);
+ 
+     consteval bool is_assignable_type(info, info);
+     consteval bool is_copy_assignable_type(info);
+     consteval bool is_move_assignable_type(info);
+ 
+     consteval bool is_swappable_with_type(info, info);
+     consteval bool is_swappable_type(info);
+ 
+     consteval bool is_destructible_type(info);
+ 
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval bool is_trivially_constructible_type(info, _Rg&&);
+     consteval bool is_trivially_default_constructible_type(info);
+     consteval bool is_trivially_copy_constructible_type(info);
+     consteval bool is_trivially_move_constructible_type(info);
+ 
+     consteval bool is_trivially_assignable_type(info, info);
+     consteval bool is_trivially_copy_assignable_type(info);
+     consteval bool is_trivially_move_assignable_type(info);
+     consteval bool is_trivially_destructible_type(info);
+ 
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval bool is_nothrow_constructible_type(info, _Rg&&);
+     consteval bool is_nothrow_default_constructible_type(info);
+     consteval bool is_nothrow_copy_constructible_type(info);
+     consteval bool is_nothrow_move_constructible_type(info);
+ 
+     consteval bool is_nothrow_assignable_type(info, info);
+     consteval bool is_nothrow_copy_assignable_type(info);
+     consteval bool is_nothrow_move_assignable_type(info);
+ 
+     consteval bool is_nothrow_swappable_with_type(info, info);
+     consteval bool is_nothrow_swappable_type(info);
+ 
+     consteval bool is_nothrow_destructible_type(info);
+ 
+     consteval bool is_implicit_lifetime_type(info);
+ 
+     consteval bool has_virtual_destructor(info);
+ 
+     consteval bool has_unique_object_representations(info);
+ 
+     consteval bool reference_constructs_from_temporary(info, info);
+     consteval bool reference_converts_from_temporary(info, info);
+ 
+     // associated with [meta.unary.prop.query], type property queries
+     consteval size_t rank(info);
+     consteval size_t extent(info, unsigned = 0);
+ 
+     // associated with [meta.rel], type relations
+     consteval bool is_same_type(info, info);
+     consteval bool is_base_of_type(info, info);
+     consteval bool is_virtual_base_of_type(info, info);
+     consteval bool is_convertible_type(info, info);
+     consteval bool is_nothrow_convertible_type(info, info);
+     consteval bool is_layout_compatible_type(info, info);
+     consteval bool is_pointer_interconvertible_base_of_type(info, info);
+ 
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval bool is_invocable_type(info, _Rg&&);
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval bool is_invocable_r_type(info, info, _Rg&&);
+ 
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval bool is_nothrow_invocable_type(info, _Rg&&);
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval bool is_nothrow_invocable_r_type(info, info, _Rg&&);
+ 
+     // associated with [meta.trans.cv], const-volatile modifications
+     consteval info remove_const(info);
+     consteval info remove_volatile(info);
+     consteval info remove_cv(info);
+     consteval info add_const(info);
+     consteval info add_volatile(info);
+     consteval info add_cv(info);
+ 
+     // associated with [meta.trans.ref], reference modifications
+     consteval info remove_reference(info);
+     consteval info add_lvalue_reference(info);
+     consteval info add_rvalue_reference(info);
+ 
+     // associated with [meta.trans.sign], sign modifications
+     consteval info make_signed(info);
+     consteval info make_unsigned(info);
+ 
+     // associated with [meta.trans.arr], array modifications
+     consteval info remove_extent(info);
+     consteval info remove_all_extents(info);
+ 
+     // associated with [meta.trans.ptr], pointer modifications
+     consteval info remove_pointer(info);
+     consteval info add_pointer(info);
+ 
+     // associated with [meta.trans.other], other transformations
+     consteval info remove_cvref(info);
+     consteval info decay(info);
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval info common_type(_Rg&&);
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval info common_reference(_Rg&&);
+     consteval info underlying_type(info);
+     template<reflection_range _Rg = initializer_list<info>>
+       consteval info invoke_result(info, _Rg&&);
+     consteval info unwrap_reference(info);
+     consteval info unwrap_ref_decay(info);
+ 
+     consteval size_t tuple_size(info);
+     consteval info tuple_element(size_t, info);
+ 
+     consteval size_t variant_size(info);
+     consteval info variant_alternative(size_t, info);
+ 
+     consteval strong_ordering type_order(info, info);
+ 
+     // [meta.reflection.annotation], annotation reflection
+     consteval vector<info> annotations_of(info);
+     consteval vector<info> annotations_of_with_type(info, info);
+ 
+     consteval access_context
+     access_context::via(info __cls) const
+     {
+       if (__cls != info {}
+ 	  && (!std::meta::is_class_type(__cls)
+ 	      || !std::meta::is_complete_type(__cls)))
+ 	{
+ #if __cpp_exceptions
+ 	  throw std::meta::exception(u8"via argument other than null "
+ 				       "or complete class type reflection",
+ 				     ^^access_context::via);
+ #else
+ 	  asm("");
+ 	  return *this;
+ #endif
+ 	}
+       return access_context { _M_scope, __cls };
+     }
+ 
+   } // namespace meta
+ 
+   // [meta.define.static], promoting to static storage strings
+   template<ranges::input_range _Rg>
+     consteval const ranges::range_value_t<_Rg>*
+     define_static_string(_Rg&& __r)
+     {
+       auto __str = meta::reflect_constant_string(__r);
+       return meta::extract<const ranges::range_value_t<_Rg>*>(__str);
+     }
+ 
+   template<ranges::input_range _Rg>
+     consteval span<const ranges::range_value_t<_Rg>>
+     define_static_array(_Rg&& __r)
+     {
+       using _Tp = ranges::range_value_t<_Rg>;
+       auto __array = meta::reflect_constant_array(__r);
+       auto __type = meta::type_of(__array);
+       if (meta::is_array_type(__type))
+ 	return span<const _Tp>(meta::extract<const _Tp*>(__array),
+ 			       meta::extent(__type, 0U));
+       else
+ 	return span<const _Tp>();
+     }
+ 
+   template<class _Tp>
+     consteval const remove_cvref_t<_Tp>*
+     define_static_object(_Tp&& __t)
+     {
+       using _Up = remove_cvref_t<_Tp>;
+       if constexpr (meta::is_class_type(^^_Up))
+ 	{
+ 	  auto __cst = meta::reflect_constant(std::forward<_Tp>(__t));
+ 	  return std::addressof(meta::extract<const _Up&>(__cst));
+ 	}
+       else
+ 	return std::define_static_array(span<const _Up>(std::addressof(__t),
+ 							1)).data();
+     }
+ 
+ _GLIBCXX_END_NAMESPACE_VERSION
+ } // namespace std
+ 
+ #endif // C++26
+ 
+ #endif // _GLIBCXX_META
diff -Nrcpad gcc-16-20260111/libstdc++-v3/include/std/type_traits gcc-16-20260118/libstdc++-v3/include/std/type_traits
*** gcc-16-20260111/libstdc++-v3/include/std/type_traits	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/include/std/type_traits	Sun Jan 18 22:32:16 2026
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 749,754 ****
--- 749,777 ----
      : public false_type { };
  #endif
  
+ #if __cpp_impl_reflection >= 202506L // C++ >= 26
+   /// is_reflection
+   template<typename _Tp>
+     struct is_reflection
+     : public false_type { };
+ 
+   template<>
+     struct is_reflection<decltype(^^int)>
+     : public true_type { };
+ 
+   template<>
+     struct is_reflection<const decltype(^^int)>
+     : public true_type { };
+ 
+   template<>
+     struct is_reflection<volatile decltype(^^int)>
+     : public true_type { };
+ 
+   template<>
+     struct is_reflection<const volatile decltype(^^int)>
+     : public true_type { };
+ #endif
+ 
  #ifdef __cpp_lib_is_null_pointer // C++ >= 11
    /// is_null_pointer (LWG 2247).
    template<typename _Tp>
*************** _GLIBCXX_BEGIN_NAMESPACE_VERSION
*** 814,820 ****
    template<typename _Tp>
      struct is_fundamental
      : public __or_<is_arithmetic<_Tp>, is_void<_Tp>,
! 		   is_null_pointer<_Tp>>::type
      { };
  
    /// is_object
--- 837,847 ----
    template<typename _Tp>
      struct is_fundamental
      : public __or_<is_arithmetic<_Tp>, is_void<_Tp>,
! 		   is_null_pointer<_Tp>
! #if __cpp_impl_reflection >= 202506L
! 		   , is_reflection<_Tp>
! #endif
! 		   >::type
      { };
  
    /// is_object
*************** template <typename _Tp>
*** 3528,3533 ****
--- 3555,3573 ----
      is_member_function_pointer<_Tp>::value;
  #endif
  
+ #if __cpp_impl_reflection >= 202506L // C++ >= 26
+ template <typename _Tp>
+   inline constexpr bool is_reflection_v = false;
+ template <>
+   inline constexpr bool is_reflection_v<decltype(^^int)> = true;
+ template <>
+   inline constexpr bool is_reflection_v<const decltype(^^int)> = true;
+ template <>
+   inline constexpr bool is_reflection_v<volatile decltype(^^int)> = true;
+ template <>
+   inline constexpr bool is_reflection_v<const volatile decltype(^^int)> = true;
+ #endif
+ 
  template <typename _Tp>
    inline constexpr bool is_enum_v = __is_enum(_Tp);
  template <typename _Tp>
*************** template<typename _Ret, typename _Fn, ty
*** 3860,3865 ****
--- 3900,3923 ----
  # endif
  #endif
  
+ #if __cpp_impl_reflection >= 202506L \
+     && _GLIBCXX_USE_BUILTIN_TRAIT(__builtin_is_consteval_only) // C++ >= 26
+   /// is_consteval_only - true if the type is consteval-only.
+   /// @since C++26
+   template<typename _Tp>
+     struct is_consteval_only
+     : bool_constant<__builtin_is_consteval_only(_Tp)>
+     { };
+ 
+   /** is_consteval_only_v - true if the type is consteval-only.
+    *  @ingroup variable_templates
+    *  @since C++26
+    */
+   template<typename _Tp>
+     inline constexpr bool is_consteval_only_v
+       = __builtin_is_consteval_only(_Tp);
+ #endif
+ 
    /** * Remove references and cv-qualifiers.
     * @since C++20
     * @{
diff -Nrcpad gcc-16-20260111/libstdc++-v3/src/c++20/atomic.cc gcc-16-20260118/libstdc++-v3/src/c++20/atomic.cc
*** gcc-16-20260111/libstdc++-v3/src/c++20/atomic.cc	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/src/c++20/atomic.cc	Sun Jan 18 22:32:16 2026
*************** namespace
*** 248,268 ****
      bool _M_track_contention;
    };
  
!   constexpr auto __atomic_spin_count_relax = 12;
!   constexpr auto __atomic_spin_count = 16;
  
!   // This function always returns _M_has_val == true and _M_val == *__addr.
!   // _M_timeout == (*__addr == __args._M_old).
    __wait_result_type
!   __spin_impl(const __platform_wait_t* __addr, const __wait_args_base& __args)
    {
      __wait_value_type wval;
!     for (auto __i = 0; __i < __atomic_spin_count; ++__i)
        {
! 	wval = __atomic_load_n(__addr, __args._M_order);
! 	if (wval != __args._M_old)
  	  return { ._M_val = wval, ._M_has_val = true, ._M_timeout = false };
! 	if (__i < __atomic_spin_count_relax)
  	  __thread_relax();
  	else
  	  __thread_yield();
--- 248,268 ----
      bool _M_track_contention;
    };
  
!   constexpr auto atomic_spin_count_relax = 12;
!   constexpr auto atomic_spin_count = 16;
  
!   // This function always returns _M_has_val == true and _M_val == *addr.
!   // _M_timeout == (*addr == args._M_old).
    __wait_result_type
!   __spin_impl(const __platform_wait_t* addr, const __wait_args_base& args)
    {
      __wait_value_type wval;
!     for (auto i = 0; i < atomic_spin_count; ++i)
        {
! 	wval = __atomic_load_n(addr, args._M_order);
! 	if (wval != args._M_old)
  	  return { ._M_val = wval, ._M_has_val = true, ._M_timeout = false };
! 	if (i < atomic_spin_count_relax)
  	  __thread_relax();
  	else
  	  __thread_yield();
*************** namespace
*** 308,321 ****
  
  } // namespace
  
! // Return false (and don't change any data members) if we can do a non-proxy
! // wait for the object of size `_M_obj_size` at address `addr`.
! // Otherwise, we will use a proxy wait. If addr == _M_obj this is the initial
! // setup of the proxy wait, so set _M_wait_state to the proxy state for addr,
! // and set _M_obj and _M_obj_size to refer to the _M_wait_state->_M_ver proxy.
! // For both the initial setup of a proxy wait and for subsequent calls to this
! // function for proxy waits, we load the current value from _M_obj (the proxy)
! // and store it in _M_old, then return true.
  bool
  __wait_args::_M_setup_proxy_wait(const void* addr)
  {
--- 308,329 ----
  
  } // namespace
  
! // Returns true if a proxy wait will be used for addr, false otherwise.
! //
! // For the first call (from `_M_setup_wait`) `_M_obj` will equal `addr`,
! // and this function will decide whether to use a proxy wait.
! //
! // If it returns false, there are no effects (all data members are unchanged),
! // and this function should not be called again on `*this` (because calling it
! // again will just return false again, so is a waste of cycles).
! //
! // The first call that returns true does the initial setup of the proxy wait,
! // setting `_M_wait_state` to the waitable state for `addr` and setting
! // `_M_obj` and `_M_obj_size` to refer to the `_M_wait_state->_M_ver` proxy.
! // For subsequent calls (from `_M_on_wake`) the argument can be null,
! // because any value not equal to `_M_obj` has the same effect.
! // All calls that return true will load a value from `_M_obj` (i.e. the proxy)
! // and store it in `_M_old`.
  bool
  __wait_args::_M_setup_proxy_wait(const void* addr)
  {
diff -Nrcpad gcc-16-20260111/libstdc++-v3/src/c++23/std.cc.in gcc-16-20260118/libstdc++-v3/src/c++23/std.cc.in
*** gcc-16-20260111/libstdc++-v3/src/c++23/std.cc.in	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/src/c++23/std.cc.in	Sun Jan 18 22:32:16 2026
*************** export namespace std::pmr
*** 2057,2062 ****
--- 2057,2317 ----
    using std::pmr::unsynchronized_pool_resource;
  }
  
+ // <meta>
+ #if __glibcxx_reflection >= 202506L
+ export namespace std
+ {
+ #if __has_builtin(__builtin_is_string_literal)
+   using std::is_string_literal;
+ #endif
+   using std::define_static_string;
+   using std::define_static_array;
+   using std::define_static_object;
+   namespace meta
+   {
+     using std::meta::info;
+     using std::meta::exception;
+     using std::meta::operators;
+     using enum std::meta::operators;
+     using std::meta::operator_of;
+     using std::meta::symbol_of;
+     using std::meta::u8symbol_of;
+     using std::meta::has_identifier;
+     using std::meta::identifier_of;
+     using std::meta::u8identifier_of;
+     using std::meta::display_string_of;
+     using std::meta::u8display_string_of;
+     using std::meta::source_location_of;
+     using std::meta::type_of;
+     using std::meta::object_of;
+     using std::meta::constant_of;
+     using std::meta::is_public;
+     using std::meta::is_protected;
+     using std::meta::is_private;
+     using std::meta::is_virtual;
+     using std::meta::is_pure_virtual;
+     using std::meta::is_override;
+     using std::meta::is_final;
+     using std::meta::is_deleted;
+     using std::meta::is_defaulted;
+     using std::meta::is_user_provided;
+     using std::meta::is_user_declared;
+     using std::meta::is_explicit;
+     using std::meta::is_noexcept;
+     using std::meta::is_bit_field;
+     using std::meta::is_enumerator;
+     using std::meta::is_annotation;
+     using std::meta::is_const;
+     using std::meta::is_volatile;
+     using std::meta::is_mutable_member;
+     using std::meta::is_lvalue_reference_qualified;
+     using std::meta::is_rvalue_reference_qualified;
+     using std::meta::has_static_storage_duration;
+     using std::meta::has_thread_storage_duration;
+     using std::meta::has_automatic_storage_duration;
+     using std::meta::has_internal_linkage;
+     using std::meta::has_module_linkage;
+     using std::meta::has_external_linkage;
+     using std::meta::has_c_language_linkage;
+     using std::meta::has_linkage;
+     using std::meta::is_complete_type;
+     using std::meta::is_enumerable_type;
+     using std::meta::is_variable;
+     using std::meta::is_type;
+     using std::meta::is_namespace;
+     using std::meta::is_type_alias;
+     using std::meta::is_namespace_alias;
+     using std::meta::is_function;
+     using std::meta::is_conversion_function;
+     using std::meta::is_operator_function;
+     using std::meta::is_literal_operator;
+     using std::meta::is_special_member_function;
+     using std::meta::is_constructor;
+     using std::meta::is_default_constructor;
+     using std::meta::is_copy_constructor;
+     using std::meta::is_move_constructor;
+     using std::meta::is_assignment;
+     using std::meta::is_copy_assignment;
+     using std::meta::is_move_assignment;
+     using std::meta::is_destructor;
+     using std::meta::is_function_parameter;
+     using std::meta::is_explicit_object_parameter;
+     using std::meta::has_default_argument;
+     using std::meta::has_ellipsis_parameter;
+     using std::meta::is_template;
+     using std::meta::is_function_template;
+     using std::meta::is_variable_template;
+     using std::meta::is_class_template;
+     using std::meta::is_alias_template;
+     using std::meta::is_conversion_function_template;
+     using std::meta::is_operator_function_template;
+     using std::meta::is_literal_operator_template;
+     using std::meta::is_constructor_template;
+     using std::meta::is_concept;
+     using std::meta::is_value;
+     using std::meta::is_object;
+     using std::meta::is_structured_binding;
+     using std::meta::is_class_member;
+     using std::meta::is_namespace_member;
+     using std::meta::is_nonstatic_data_member;
+     using std::meta::is_static_member;
+     using std::meta::is_base;
+     using std::meta::has_default_member_initializer;
+     using std::meta::has_parent;
+     using std::meta::parent_of;
+     using std::meta::dealias;
+     using std::meta::has_template_arguments;
+     using std::meta::template_of;
+     using std::meta::template_arguments_of;
+     using std::meta::parameters_of;
+     using std::meta::variable_of;
+     using std::meta::return_type_of;
+     using std::meta::access_context;
+     using std::meta::is_accessible;
+     using std::meta::has_inaccessible_nonstatic_data_members;
+     using std::meta::has_inaccessible_bases;
+     using std::meta::has_inaccessible_subobjects;
+     using std::meta::members_of;
+     using std::meta::bases_of;
+     using std::meta::static_data_members_of;
+     using std::meta::nonstatic_data_members_of;
+     using std::meta::subobjects_of;
+     using std::meta::enumerators_of;
+     using std::meta::member_offset;
+     using std::meta::offset_of;
+     using std::meta::size_of;
+     using std::meta::alignment_of;
+     using std::meta::bit_size_of;
+     using std::meta::extract;
+     using std::meta::reflection_range;
+     using std::meta::can_substitute;
+     using std::meta::substitute;
+     using std::meta::reflect_constant;
+     using std::meta::reflect_object;
+     using std::meta::reflect_function;
+     using std::meta::reflect_constant_string;
+     using std::meta::reflect_constant_array;
+     using std::meta::data_member_options;
+     using std::meta::data_member_spec;
+     using std::meta::is_data_member_spec;
+     using std::meta::define_aggregate;
+     using std::meta::is_void_type;
+     using std::meta::is_null_pointer_type;
+     using std::meta::is_integral_type;
+     using std::meta::is_floating_point_type;
+     using std::meta::is_array_type;
+     using std::meta::is_pointer_type;
+     using std::meta::is_lvalue_reference_type;
+     using std::meta::is_rvalue_reference_type;
+     using std::meta::is_member_object_pointer_type;
+     using std::meta::is_member_function_pointer_type;
+     using std::meta::is_enum_type;
+     using std::meta::is_union_type;
+     using std::meta::is_class_type;
+     using std::meta::is_function_type;
+     using std::meta::is_reflection_type;
+     using std::meta::is_reference_type;
+     using std::meta::is_arithmetic_type;
+     using std::meta::is_fundamental_type;
+     using std::meta::is_object_type;
+     using std::meta::is_scalar_type;
+     using std::meta::is_compound_type;
+     using std::meta::is_member_pointer_type;
+     using std::meta::is_const_type;
+     using std::meta::is_volatile_type;
+     using std::meta::is_trivially_copyable_type;
+     using std::meta::is_standard_layout_type;
+     using std::meta::is_empty_type;
+     using std::meta::is_polymorphic_type;
+     using std::meta::is_abstract_type;
+     using std::meta::is_final_type;
+     using std::meta::is_aggregate_type;
+     using std::meta::is_consteval_only_type;
+     using std::meta::is_signed_type;
+     using std::meta::is_unsigned_type;
+     using std::meta::is_bounded_array_type;
+     using std::meta::is_unbounded_array_type;
+     using std::meta::is_scoped_enum_type;
+     using std::meta::is_constructible_type;
+     using std::meta::is_default_constructible_type;
+     using std::meta::is_copy_constructible_type;
+     using std::meta::is_move_constructible_type;
+     using std::meta::is_assignable_type;
+     using std::meta::is_copy_assignable_type;
+     using std::meta::is_move_assignable_type;
+     using std::meta::is_swappable_with_type;
+     using std::meta::is_swappable_type;
+     using std::meta::is_destructible_type;
+     using std::meta::is_trivially_constructible_type;
+     using std::meta::is_trivially_default_constructible_type;
+     using std::meta::is_trivially_copy_constructible_type;
+     using std::meta::is_trivially_move_constructible_type;
+     using std::meta::is_trivially_assignable_type;
+     using std::meta::is_trivially_copy_assignable_type;
+     using std::meta::is_trivially_move_assignable_type;
+     using std::meta::is_trivially_destructible_type;
+     using std::meta::is_nothrow_constructible_type;
+     using std::meta::is_nothrow_default_constructible_type;
+     using std::meta::is_nothrow_copy_constructible_type;
+     using std::meta::is_nothrow_move_constructible_type;
+     using std::meta::is_nothrow_assignable_type;
+     using std::meta::is_nothrow_copy_assignable_type;
+     using std::meta::is_nothrow_move_assignable_type;
+     using std::meta::is_nothrow_swappable_with_type;
+     using std::meta::is_nothrow_swappable_type;
+     using std::meta::is_nothrow_destructible_type;
+     using std::meta::is_implicit_lifetime_type;
+     using std::meta::has_virtual_destructor;
+     using std::meta::has_unique_object_representations;
+     using std::meta::reference_constructs_from_temporary;
+     using std::meta::reference_converts_from_temporary;
+     using std::meta::rank;
+     using std::meta::extent;
+     using std::meta::is_same_type;
+     using std::meta::is_base_of_type;
+     using std::meta::is_virtual_base_of_type;
+     using std::meta::is_convertible_type;
+     using std::meta::is_nothrow_convertible_type;
+     using std::meta::is_layout_compatible_type;
+     using std::meta::is_pointer_interconvertible_base_of_type;
+     using std::meta::is_invocable_type;
+     using std::meta::is_invocable_r_type;
+     using std::meta::is_nothrow_invocable_type;
+     using std::meta::is_nothrow_invocable_r_type;
+     using std::meta::remove_const;
+     using std::meta::remove_volatile;
+     using std::meta::remove_cv;
+     using std::meta::add_const;
+     using std::meta::add_volatile;
+     using std::meta::add_cv;
+     using std::meta::remove_reference;
+     using std::meta::add_lvalue_reference;
+     using std::meta::add_rvalue_reference;
+     using std::meta::make_signed;
+     using std::meta::make_unsigned;
+     using std::meta::remove_extent;
+     using std::meta::remove_all_extents;
+     using std::meta::remove_pointer;
+     using std::meta::add_pointer;
+     using std::meta::remove_cvref;
+     using std::meta::decay;
+     using std::meta::common_type;
+     using std::meta::common_reference;
+     using std::meta::underlying_type;
+     using std::meta::invoke_result;
+     using std::meta::unwrap_reference;
+     using std::meta::unwrap_ref_decay;
+     using std::meta::tuple_size;
+     using std::meta::tuple_element;
+     using std::meta::variant_size;
+     using std::meta::variant_alternative;
+     using std::meta::type_order;
+     using std::meta::annotations_of;
+     using std::meta::annotations_of_with_type;
+   }
+ }
+ #endif
+ 
  // <mutex>
  export namespace std
  {
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/explicit_instantiation.cc gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/explicit_instantiation.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/explicit_instantiation.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/explicit_instantiation.cc	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ // NB: This file is for testing type_traits with NO OTHER INCLUDES.
+ 
+ #include <type_traits>
+ 
+ namespace std
+ {
+   typedef short test_type;
+   template struct is_consteval_only<test_type>;
+ }
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/typedefs.cc gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/typedefs.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/typedefs.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_consteval_only/requirements/typedefs.cc	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ // NB: This file is for testing type_traits with NO OTHER INCLUDES.
+ 
+ #include <type_traits>
+ 
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::is_consteval_only<decltype (^^int)> test_type;
+   typedef test_type::value_type               value_type;
+   typedef test_type::type                     type;
+   typedef test_type::type::value_type         type_value_type;
+   typedef test_type::type::type               type_type;
+ }
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_consteval_only/value.cc gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_consteval_only/value.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_consteval_only/value.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_consteval_only/value.cc	Sun Jan 18 22:32:16 2026
***************
*** 0 ****
--- 1,30 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <type_traits>
+ #include <testsuite_tr1.h>
+ 
+ void test01()
+ {
+   using std::is_consteval_only;
+   using namespace __gnu_test;
+   int v = 1;
+   struct S1 { decltype(^^long) a; };
+   union U2 { int a; decltype(^^test01) b; };
+   struct S3 { const decltype(^^__gnu_test) *c; };
+   struct S4 : public S3 {};
+   struct S5 { int a; long *b; };
+ 
+   static_assert(test_category<is_consteval_only, decltype(^^long)>(true), "");
+   static_assert(test_category<is_consteval_only, const decltype(^^test01)>(true), "");
+   static_assert(test_category<is_consteval_only, volatile decltype(^^__gnu_test)>(true), "");
+   static_assert(test_category<is_consteval_only, const volatile decltype(^^v)>(true), "");
+   static_assert(test_category<is_consteval_only, const S1>(true), "");
+   static_assert(test_category<is_consteval_only, U2>(true), "");
+   static_assert(test_category<is_consteval_only, S3>(true), "");
+   static_assert(test_category<is_consteval_only, S4>(true), "");
+ 
+   // Sanity check.
+   static_assert(test_category<is_consteval_only, int>(false), "");
+   static_assert(test_category<is_consteval_only, S5>(false), "");
+ }
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_reflection/requirements/explicit_instantiation.cc gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_reflection/requirements/explicit_instantiation.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_reflection/requirements/explicit_instantiation.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_reflection/requirements/explicit_instantiation.cc	Sun Jan 18 22:32:17 2026
***************
*** 0 ****
--- 1,12 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ // NB: This file is for testing type_traits with NO OTHER INCLUDES.
+ 
+ #include <type_traits>
+ 
+ namespace std
+ {
+   typedef short test_type;
+   template struct is_reflection<test_type>;
+ }
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_reflection/requirements/typedefs.cc gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_reflection/requirements/typedefs.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_reflection/requirements/typedefs.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_reflection/requirements/typedefs.cc	Sun Jan 18 22:32:17 2026
***************
*** 0 ****
--- 1,16 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ // NB: This file is for testing type_traits with NO OTHER INCLUDES.
+ 
+ #include <type_traits>
+ 
+ void test01()
+ {
+   // Check for required typedefs
+   typedef std::is_reflection<decltype (^^int)> test_type;
+   typedef test_type::value_type               value_type;
+   typedef test_type::type                     type;
+   typedef test_type::type::value_type         type_value_type;
+   typedef test_type::type::type               type_type;
+ }
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_reflection/value.cc gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_reflection/value.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/20_util/is_reflection/value.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libstdc++-v3/testsuite/20_util/is_reflection/value.cc	Sun Jan 18 22:32:17 2026
***************
*** 0 ****
--- 1,20 ----
+ // { dg-do compile { target c++26 } }
+ // { dg-additional-options "-freflection" }
+ 
+ #include <type_traits>
+ #include <testsuite_tr1.h>
+ 
+ void test01()
+ {
+   using std::is_reflection;
+   using namespace __gnu_test;
+   int v = 1;
+ 
+   static_assert(test_category<is_reflection, decltype(^^long)>(true), "");
+   static_assert(test_category<is_reflection, const decltype(^^test01)>(true), "");
+   static_assert(test_category<is_reflection, volatile decltype(^^__gnu_test)>(true), "");
+   static_assert(test_category<is_reflection, const volatile decltype(^^v)>(true), "");
+ 
+   // Sanity check.
+   static_assert(test_category<is_reflection, int>(false), "");
+ }
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/20_util/variable_templates_for_traits.cc gcc-16-20260118/libstdc++-v3/testsuite/20_util/variable_templates_for_traits.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/20_util/variable_templates_for_traits.cc	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/testsuite/20_util/variable_templates_for_traits.cc	Sun Jan 18 22:32:17 2026
***************
*** 1,5 ****
--- 1,6 ----
  // { dg-additional-options "-Wno-deprecated-declarations" { target c++2a } }
  // { dg-do compile { target c++17 } }
+ // { dg-additional-options "-freflection" { target c++26 } }
  
  // Copyright (C) 2014-2026 Free Software Foundation, Inc.
  //
*************** static_assert(is_convertible_v<int&, con
*** 330,335 ****
--- 331,345 ----
  static_assert(!is_convertible_v<const int&, int&>
  	      && !is_convertible<const int&, int&>::value, "");
  
+ #if __cpp_impl_reflection >= 202506L
+ static_assert(is_reflection_v<decltype(^^int)>
+ 	      && is_reflection<decltype(^^int)>::value, "");
+ static_assert(!is_reflection_v<int> && !is_reflection<int>::value, "");
+ static_assert(is_consteval_only_v<decltype(^^int)>
+ 	      && is_consteval_only<decltype(^^int)>::value, "");
+ static_assert(!is_consteval_only_v<int> && !is_consteval_only<int>::value, "");
+ #endif
+ 
  static_assert(negation_v<false_type>, "");
  static_assert(!negation_v<true_type>, "");
  static_assert(conjunction_v<>, "");
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/25_algorithms/sort_heap/check_proxy_brackets.cc gcc-16-20260118/libstdc++-v3/testsuite/25_algorithms/sort_heap/check_proxy_brackets.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/25_algorithms/sort_heap/check_proxy_brackets.cc	Thu Jan  1 00:00:00 1970
--- gcc-16-20260118/libstdc++-v3/testsuite/25_algorithms/sort_heap/check_proxy_brackets.cc	Sun Jan 18 22:32:17 2026
***************
*** 0 ****
--- 1,67 ----
+ // { dg-do run  }
+ 
+ #undef _GLIBCXX_CONCEPT_CHECKS
+ 
+ #include <algorithm>
+ #include <testsuite_hooks.h>
+ #include <testsuite_iterators.h>
+ #include <utility>
+ 
+ using __gnu_test::test_container;
+ using __gnu_test::proxy_random_access_iterator_wrapper;
+ 
+ typedef std::pair<int, int> V;
+ typedef test_container<V, proxy_random_access_iterator_wrapper> Container;
+ 
+ struct Deduced
+ {
+   template<typename A, typename B>
+   bool operator()(const std::pair<A, B>& lhs,
+ 		  const std::pair<A, B>& rhs) const
+   { return lhs.first < rhs.first; }
+ };
+ 
+ struct Conversion
+ {
+   struct First
+   {
+     First(const V& p) : v(p.first)
+     {}
+ 
+     int v;
+   };
+ 
+   bool operator()(First lhs, First rhs) const
+   { return lhs.v < rhs.v; }
+ };
+ 
+ template<typename Cmp>
+ void
+ test01(Cmp cmp)
+ {
+   V s1[] = { V(0, 10), V(8, 18), V(6, 16), V(7, 17), V(9, 19),
+ 	     V(5, 15), V(4, 14), V(3, 13), V(2, 12), V(1, 11) };
+   const int N = sizeof(s1) / sizeof(V);
+   Container con(s1, s1 + N);
+ 
+   std::make_heap(con.begin(), con.end() - std::ptrdiff_t(2), cmp);
+   std::push_heap(con.begin(), con.end() - std::ptrdiff_t(1), cmp);
+   std::push_heap(con.begin(), con.end(), cmp);
+ #if __cplusplus >= 201103L 
+   (void)std::is_heap_until(con.begin(), con.end(), cmp);
+ #endif  
+   std::sort_heap(con.begin(), con.end(), cmp);
+   for(int i = 0; i < N; ++i)
+   {
+     VERIFY( s1[i].first == i );
+     VERIFY( s1[i].second == 10 + i );
+   }
+ }
+ 
+ int
+ main()
+ {
+   test01(Deduced());
+   test01(Conversion());
+   return 0;
+ }
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon.cc gcc-16-20260118/libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon.cc
*** gcc-16-20260111/libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon.cc	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/testsuite/26_numerics/random/uniform_real_distribution/operators/gencanon.cc	Sun Jan 18 22:32:17 2026
*************** struct local_rng : std::mt19937
*** 25,37 ****
  // sixth iteration for float, and not at all for double.
  // However, each double iteration requires two calls to the RNG.
  
  template <typename T, typename RNG>
  void
! test01(RNG& rng, RNG& rng2,
!   int& deviation, int& max, int& rms, int& zero, int& skips)
  {
    const auto size = 1000000, buckets = 100;
    std::array<int, buckets> histo{};
    for (auto i = 0; i != size; ++i) {
      T sample = std::generate_canonical<T, -1u>(rng);
      VERIFY(sample >= T(0.0));
--- 25,49 ----
  // sixth iteration for float, and not at all for double.
  // However, each double iteration requires two calls to the RNG.
  
+ template<typename T>
+ int ifloor(T t)
+ { return static_cast<int>(std::floor(t)); }
+ 
+ #ifdef __SIZEOF_FLOAT128__
+ int ifloor(__float128 t)
+ { return static_cast<int>(t); }
+ #endif
+ 
  template <typename T, typename RNG>
  void
! test01(RNG& rng, RNG& rng2, int& skips)
  {
+   constexpr size_t mantissa = std::numeric_limits<T>::digits;
+   constexpr size_t call_per_elem = (mantissa + 31) / 32;
+ 
    const auto size = 1000000, buckets = 100;
    std::array<int, buckets> histo{};
+   int zero = 0;
    for (auto i = 0; i != size; ++i) {
      T sample = std::generate_canonical<T, -1u>(rng);
      VERIFY(sample >= T(0.0));
*************** test01(RNG& rng, RNG& rng2,
*** 39,54 ****
      if (sample == T(0.0)) {
        ++zero;
      }
!     auto bucket = static_cast<int>(std::floor(sample * buckets));
      ++histo[bucket];
!     rng2.discard(1);
      if (rng != rng2) {
        ++skips;
!       rng2.discard(1);
        VERIFY(rng == rng2);
      }
    }
!   int devsquare = 0;
    for (int i = 0; i < buckets; ++i) {
      const auto expected = size / buckets;
      auto count = histo[i];
--- 51,70 ----
      if (sample == T(0.0)) {
        ++zero;
      }
!     auto bucket = ifloor(sample * buckets);
      ++histo[bucket];
!     rng2.discard(call_per_elem);
      if (rng != rng2) {
        ++skips;
!       rng2.discard(call_per_elem);
        VERIFY(rng == rng2);
      }
    }
! 
!   if (!std::numeric_limits<T>::is_iec559)
!     return;
! 
!   int deviation = 0, max = 0, rms = 0, devsquare = 0;
    for (int i = 0; i < buckets; ++i) {
      const auto expected = size / buckets;
      auto count = histo[i];
*************** test01(RNG& rng, RNG& rng2,
*** 59,64 ****
--- 75,106 ----
      if (diff > max) max = diff;
    }
    rms = std::sqrt(devsquare);
+ 
+   switch (mantissa)
+   {
+   case 24: // ieee32
+     VERIFY(deviation == 7032);
+     VERIFY(max == 276);
+     VERIFY(rms == 906);
+     VERIFY(zero == 0);
+     break;
+   case 53: // ieee64
+   case 64: // ieee80 
+     VERIFY(deviation == 7650);
+     VERIFY(max == 259);
+     VERIFY(rms == 975);
+     VERIFY(zero == 0);
+     break;
+   case 113: // ieee128
+     VERIFY(deviation == 9086);
+     VERIFY(max == 290);
+     VERIFY(rms == 1142);
+     VERIFY(zero == 0);
+     break;
+   default:
+     VERIFY(false);
+     break;
+   }
  }
  
  // This one is for use with local_rng
*************** test00()
*** 145,191 ****
    rng.discard(12 * 629143);
  
    { // float
!     int deviation{}, max{}, rms{}, zero{}, skips{};
      auto rng2{rng};
      auto rng3{rng};
!     test01<float>(rng2, rng3, deviation, max, rms, zero, skips);
! 
!     if (std::numeric_limits<float>::is_iec559) {
!       VERIFY(deviation == 7032);
!       VERIFY(max == 276);
!       VERIFY(rms == 906);
!       VERIFY(zero == 0);
!     }
      VERIFY(skips == 1);
    }
    { // double
!     int deviation{}, max{}, rms{}, zero{}, skips{};
      auto rng2{rng};
      auto rng3{rng};
!     test01<double>(rng2, rng3, deviation, max, rms, zero, skips);
! 
!     if (std::numeric_limits<double>::is_iec559) {
!       VERIFY(deviation == 7650);
!       VERIFY(max == 259);
!       VERIFY(rms == 975);
!       VERIFY(zero == 0);
!     }
!     VERIFY(skips == 1000000);
    }
!   { // long double, same answers as double
!     int deviation{}, max{}, rms{}, zero{}, skips{};
      auto rng2{rng};
      auto rng3{rng};
!     test01<long double>(rng2, rng3, deviation, max, rms, zero, skips);
! 
!     if (std::numeric_limits<double>::is_iec559) {
!       VERIFY(deviation == 7650);
!       VERIFY(max == 259);
!       VERIFY(rms == 975);
!       VERIFY(zero == 0);
!     }
!     VERIFY(skips == 1000000);
    }
  
    { // local RNG, returns [0..999'999)
      int deviation{}, max{}, rms{}, zero{}, skips{};
--- 187,223 ----
    rng.discard(12 * 629143);
  
    { // float
!     int skips{};
      auto rng2{rng};
      auto rng3{rng};
!     test01<float>(rng2, rng3, skips);
      VERIFY(skips == 1);
    }
    { // double
!     int skips{};
      auto rng2{rng};
      auto rng3{rng};
!     test01<double>(rng2, rng3, skips);
!     VERIFY(skips == 0);
    }
!   { // long double
!     int skips{};
      auto rng2{rng};
      auto rng3{rng};
!     test01<long double>(rng2, rng3, skips);
!     VERIFY(skips == 0);
    }
+ #ifndef _GLIBCXX_GENERATE_CANONICAL_STRICT
+ #  ifdef __SIZEOF_FLOAT128__
+   {
+     int skips{};
+     auto rng2{rng};
+     auto rng3{rng};
+     test01<__float128>(rng2, rng3, skips);
+     VERIFY(skips == 0);
+   }
+ #  endif
+ #endif
  
    { // local RNG, returns [0..999'999)
      int deviation{}, max{}, rms{}, zero{}, skips{};
diff -Nrcpad gcc-16-20260111/libstdc++-v3/testsuite/util/testsuite_iterators.h gcc-16-20260118/libstdc++-v3/testsuite/util/testsuite_iterators.h
*** gcc-16-20260111/libstdc++-v3/testsuite/util/testsuite_iterators.h	Sun Jan 11 22:32:17 2026
--- gcc-16-20260118/libstdc++-v3/testsuite/util/testsuite_iterators.h	Sun Jan 18 22:32:17 2026
*************** namespace __gnu_test
*** 664,669 ****
--- 664,870 ----
  #endif
  
  
+   template<typename T>
+   struct subscript_proxy
+   {
+     _GLIBCXX_CONSTEXPR
+     operator T&() const
+     { return *ptr; }
+ 
+     _GLIBCXX14_CONSTEXPR
+     subscript_proxy& operator=(const T& val)
+     { 
+       *ptr = val;
+       return *this;
+     }
+     
+     T* ptr;
+   };
+ 
+   template<typename T>
+   struct subscript_proxy<const T>
+   {
+     _GLIBCXX_CONSTEXPR
+     operator const T&() const
+     { return *ptr; }
+     
+     const T* ptr;
+   };
+ 
+   /**
+    * @brief random_access_iterator wrapper for pointer,
+    * that returns proxy from subscript.
+    *
+    * This is separate from random_access_iterator_wrapper (that returns
+    * T& from operator subscript), as it meets the requirements of
+    * Cpp17RandomAccessIterator (C++20 [tab:randomaccessiterator])
+    * that allows to return type that is convertible to reference,
+    * but does not satisfy random_access_iterator concept
+    * (C++20 [random_access_iterator]).
+    */
+   template<class T>
+   struct proxy_random_access_iterator_wrapper
+   : public bidirectional_iterator_wrapper<T>
+   {
+     typedef BoundsContainer<T> ContainerType;
+     typedef std::random_access_iterator_tag iterator_category;
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper(T* _ptr, ContainerType* SharedInfo_in)
+     : bidirectional_iterator_wrapper<T>(_ptr, SharedInfo_in)
+     { }
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper()
+     : bidirectional_iterator_wrapper<T>()
+     { }
+ 
+ #if __cplusplus >= 201103L
+     proxy_random_access_iterator_wrapper(
+ 	const proxy_random_access_iterator_wrapper&) = default;
+ 
+     proxy_random_access_iterator_wrapper&
+     operator=(const proxy_random_access_iterator_wrapper&) = default;
+ #endif
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper&
+     operator++()
+     {
+       ITERATOR_VERIFY(this->SharedInfo && this->ptr < this->SharedInfo->last);
+       this->ptr++;
+       return *this;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper
+     operator++(int)
+     {
+       proxy_random_access_iterator_wrapper<T> tmp = *this;
+       ++*this;
+       return tmp;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper&
+     operator--()
+     {
+       ITERATOR_VERIFY(this->SharedInfo && this->ptr > this->SharedInfo->first);
+       this->ptr--;
+       return *this;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper
+     operator--(int)
+     {
+       proxy_random_access_iterator_wrapper<T> tmp = *this;
+       --*this;
+       return tmp;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper&
+     operator+=(std::ptrdiff_t n)
+     {
+       if(n > 0)
+ 	{
+ 	  ITERATOR_VERIFY(n <= this->SharedInfo->last - this->ptr);
+ 	  this->ptr += n;
+ 	}
+       else
+ 	{
+ 	  ITERATOR_VERIFY(-n <= this->ptr - this->SharedInfo->first);
+ 	  this->ptr += n;
+ 	}
+       return *this;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper&
+     operator-=(std::ptrdiff_t n)
+     { return *this += -n; }
+ 
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper
+     operator-(std::ptrdiff_t n) const
+     {
+       proxy_random_access_iterator_wrapper<T> tmp = *this;
+       return tmp -= n;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     std::ptrdiff_t
+     operator-(const proxy_random_access_iterator_wrapper<T>& in) const
+     {
+       ITERATOR_VERIFY(this->SharedInfo == in.SharedInfo);
+       return this->ptr - in.ptr;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     subscript_proxy<T>
+     operator[](std::ptrdiff_t n) const
+     {
+       subscript_proxy<T> tmp = { *this + n };
+       return tmp;
+     }
+ 
+ #if __cplusplus >= 201103L
+     // Ensure that the iterator's difference_type is always used.
+     template<typename D> void operator+=(D) = delete;
+     template<typename D> void operator-=(D) = delete;
+     template<typename D> void operator[](D) const = delete;
+     template<typename D>
+       typename std::enable_if<std::is_integral<D>::value>::type
+       operator-(D) const = delete;
+ #endif
+ 
+     _GLIBCXX14_CONSTEXPR
+     bool operator<(const proxy_random_access_iterator_wrapper<T>& in) const
+     {
+       ITERATOR_VERIFY(this->SharedInfo == in.SharedInfo);
+       return this->ptr < in.ptr;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     bool operator>(const proxy_random_access_iterator_wrapper<T>& in) const
+     {
+       return in < *this;
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     bool operator>=(const proxy_random_access_iterator_wrapper<T>& in) const
+     {
+       return !(*this < in);
+     }
+ 
+     _GLIBCXX14_CONSTEXPR
+     bool operator<=(const proxy_random_access_iterator_wrapper<T>& in) const
+     {
+       return !(*this > in);
+     }
+   };
+ 
+   template<typename T>
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper<T>
+     operator+(proxy_random_access_iterator_wrapper<T> it, std::ptrdiff_t n)
+     { return it += n; }
+ 
+   template<typename T>
+     _GLIBCXX14_CONSTEXPR
+     proxy_random_access_iterator_wrapper<T>
+     operator+(std::ptrdiff_t n, proxy_random_access_iterator_wrapper<T> it)
+     { return it += n; }
+ 
+ #if __cplusplus >= 201103L
+     // Ensure that the iterator's difference_type is always used.
+     template<typename T, typename D>
+       void operator+(proxy_random_access_iterator_wrapper<T>, D) = delete;
+     template<typename T, typename D>
+       void operator+(D, proxy_random_access_iterator_wrapper<T>) = delete;
+ #endif
+ 
    /**
     * @brief A container-type class for holding iterator wrappers
     * test_container takes two parameters, a class T and an iterator
